75 Set<ExtTableFunction> candidateOverloads =
new HashSet<ExtTableFunction>(
80 candidateOverloads.removeIf(
81 tf -> tf.getArgTypes().size() != callBinding.getOperandCount());
83 SqlNode[] operandArray =
new SqlNode[callBinding.getCall().getOperandList().size()];
84 for (Ord<SqlNode> arg : Ord.zip(callBinding.getCall().getOperandList())) {
85 operandArray[arg.i] = arg.e;
91 HashMap<ExtTableFunction, SqlCallBinding> candidateBindings =
92 new HashMap<>(candidateOverloads.size());
93 for (ExtTableFunction tf : candidateOverloads) {
94 SqlBasicCall newCall =
new SqlBasicCall(
95 tf, operandArray, callBinding.getCall().getParserPosition());
96 SqlCallBinding candidateBinding =
new SqlCallBinding(
97 callBinding.getValidator(), callBinding.getScope(), newCall);
98 candidateBindings.put(tf, candidateBinding);
101 for (
int i = 0; i < operandArray.length; i++) {
103 candidateOverloads.removeIf(tf
105 tf, candidateBindings.get(tf), operandArray[idx], idx));
109 if (candidateOverloads.size() == 0) {
110 if (throwOnFailure) {
111 throw(callBinding.newValidationSignatureError());
118 if (!candidateOverloads.isEmpty()
119 && !candidateOverloads.contains(callBinding.getOperator())) {
120 ExtTableFunction optimal = candidateOverloads.iterator().next();
121 ((SqlBasicCall) callBinding.getCall()).setOperator(optimal);
List< ExtTableFunction > getOperatorOverloads(SqlOperator op)
boolean doesOperandTypeMatch(ExtTableFunction tf, SqlCallBinding callBinding, SqlNode node, int iFormalOperand)