Hi Guillaume, are you using your own udf and some functions in SqlStdOperatorTable at the same time? If yes, SqlOperatorTables#chain is the right way to organize multiple SqlOperatorTable.
Best, Dan Zou > 2023年3月21日 02:59,Guillaume Masse <[email protected]> 写道: > > 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é (马赛卫) >>> >>
