Hi All,
How can we register a custom udf? I found some solutions on Stackoverflow
but they are out of date (
https://stackoverflow.com/questions/44147819/adding-a-user-defined-function-to-calcite
)
So far what I have:
// top level class
class CustomUdf {
def foo(in: Double): Double = in + 1
}
// somewhere else
val typeFactory = new JavaTypeFactoryImpl()
val root = CalciteSchema.createRootSchema(false)
root.plus().add("foo", ScalarFunctionImpl.create(classOf[CustomUdf], "foo"))
val catalogReader = new CalciteCatalogReader(
root,
Collections.emptyList(),
typeFactory,
CalciteConnectionConfig.DEFAULT
)
val operators =
SqlLibraryOperatorTableFactory.INSTANCE.getOperatorTable(
SqlLibrary.STANDARD,
SqlLibrary.SPARK
)
val sqlValidator = SqlValidatorUtil.newValidator(
operators,
catalogReader,
typeFactory,
SqlValidator.Config.DEFAULT
)
simple expression failed to
validate,org.apache.calcite.runtime.CalciteContextException: From line 1,
column 1 to line 1, column 22: No match found for function signature
toto(<NUMERIC>))
>From what I saw on Stackoverflow, it looks like I need to also add the
function to the operator table.
Thanks!
Guillaume Massé (马赛卫)