I found the solution here: https://stackoverflow.com/questions/58268828/apache-calcite-registering-udfs-for-use-in-relbuilder
The idea is to use `SqlOperatorTables.of`` to register a list of SqlFunction then use `SqlOperatorTables.chain` to join it with `SqlStdOperatorTable.instance()` On Mon, Mar 20, 2023 at 1:39 PM Guillaume Masse < [email protected]> wrote: > ah this is Scala, it's a bit shorter to write > > On Mon, Mar 20, 2023 at 1:12 PM Julian Hyde <[email protected]> > wrote: > >> What language is this? >> >> > On Mar 20, 2023, at 9:01 AM, Guillaume Masse < >> [email protected]> wrote: >> > >> > 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é (马赛卫) >> >
