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