...
Flink built-in functions should precede catalog functions, because 1) it always give a deterministic resolution order on ambiguous reference by invoking the built-in functions 2) catalog functions can always be precisely referenced with fully/partially qualified names. In contrary, if catalog functions precede built-in functions, built-in functions can never be referenced.
4. Code Changes
FunctionIdentifier
Code Block | ||
---|---|---|
| ||
Class FunctionIdentifier { // empty for system functions Optional<ObjectIdentifier> oi; String name; } |
Changes to CallExpression and UnresolvedCallExpression
We should replace ObjectIdentifier with FunctionIdentifier in CallExpression and UnresolvedCallExpression. This would be a breaking change for these public evolving classes.
Code Block | ||
---|---|---|
| ||
public final class CallExpression implements Expression {
private final @Nullable FunctionIdentifier functionIdentifier;
...
public Optional<FunctionIdentifier> getFunctionIdentifier() {
return Optional.ofNullable(functionIdentifier);
}
}
public final class UnresolvedCallExpression implements Expression {
private final @Nullable FunctionIdentifier functionIdentifier;
...
public Optional<FunctionIdentifier> getFunctionIdentifier() {
return Optional.ofNullable(functionIdentifier);
}
} |
Changes to FunctionLookup interface
In case of a partially qualified name (<db_name>.<function_name>) in SQL, planner/parser should recognize it with context be padding name of the current catalog of the session first to build an ObjectIdentifier.
...
Code Block | ||
---|---|---|
| ||
/** * Resolves a function. * * @param fi identifier of function * @return An optional result of FunctionLookup */ public Optional<FunctionLookup.Result> lookupFunction(FunctionIdentifier fi); |
5. Changes to FunctionCatalog class
...