Hi Dan,

Yes, I want to add some udf defined in Spark.

Initially, I had:

SqlLibraryOperatorTableFactory.INSTANCE.getOperatorTable(
  SqlLibrary.STANDARD,
  SqlLibrary.SPARK
)

but it looks like some functions are not available, in my case it was:
* sha2 (not defined)
* from_unixtime (not defined)
* to_timestamp (available in POSTGRESQL, ORACLE)

I will take some time later this month to find the missing functions in
https://github.com/apache/calcite/blob/main/core/src/main/java/org/apache/calcite/sql/fun/SqlLibraryOperators.java

and submit a PR.

functions doc:
https://spark.apache.org/docs/latest/api/sql/index.html

马赛卫

On Mon, Mar 20, 2023 at 10:48 PM Dan Zou <[email protected]> wrote:

> 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