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é (马赛卫)
>>> 
>> 

Reply via email to