You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@calcite.apache.org by "ASF GitHub Bot (Jira)" <ji...@apache.org> on 2019/11/29 11:07:00 UTC

[jira] [Updated] (CALCITE-3547) SqlValidatorException because Planner cannot find UDFs added to schema

     [ https://issues.apache.org/jira/browse/CALCITE-3547?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

ASF GitHub Bot updated CALCITE-3547:
------------------------------------
    Labels: pull-request-available  (was: )

> SqlValidatorException because Planner cannot find UDFs added to schema
> ----------------------------------------------------------------------
>
>                 Key: CALCITE-3547
>                 URL: https://issues.apache.org/jira/browse/CALCITE-3547
>             Project: Calcite
>          Issue Type: Bug
>          Components: core
>    Affects Versions: 1.21.0
>            Reporter: Chenxiao Mao
>            Priority: Minor
>              Labels: pull-request-available
>
> This could be reproduce by the below test case:
> {code}
>   @Test public void testValidateUserDefinedFunctionInSchema() throws Exception {
>     SchemaPlus rootSchema = Frameworks.createRootSchema(true);
>     rootSchema.add("my_plus",
>       ScalarFunctionImpl.create(Smalls.MyPlusFunction.class, "eval"));
>     final FrameworkConfig config = Frameworks.newConfigBuilder()
>       .defaultSchema(
>         CalciteAssert.addSchema(rootSchema, CalciteAssert.SchemaSpec.HR))
>       .build();
>     final Planner planner = Frameworks.getPlanner(config);
>     final String sql = "select \"my_plus\"(\"deptno\", 100) as \"p\"\n"
>       + "from \"hr\".\"emps\"";
>     SqlNode parse = planner.parse(sql);
>     SqlNode validate = planner.validate(parse);
>     assertThat(Util.toLinux(validate.toString()),
>       equalTo("SELECT `my_plus`(`emps`.`deptno`, 100) AS `p`\n"
>         + "FROM `hr`.`emps` AS `emps`"));
>   }
> {code}
> The exception is as below:
> {code}
> org.apache.calcite.sql.validate.SqlValidatorException: No match found for function signature my_plus(<NUMERIC>, <NUMERIC>)
> {code}
> By digging into the related code, I found that the validator inside PlannerImpl only looks for UDFs in SqlStdOperatorTable.
> If we let validator inside PlannerImpl looks for UDFs not only in SqlStdOperatorTable but also CalciteCatalogReader like what CalcitePrepareImpl does, we can avoid this validation exception.
> {code}
>   private SqlValidator createSqlValidator(Context context,
>       CalciteCatalogReader catalogReader) {
>     final SqlOperatorTable opTab0 =
>         context.config().fun(SqlOperatorTable.class,
>             SqlStdOperatorTable.instance());
>     final SqlOperatorTable opTab =
>         ChainedSqlOperatorTable.of(opTab0, catalogReader);
>     final JavaTypeFactory typeFactory = context.getTypeFactory();
>     final SqlConformance conformance = context.config().conformance();
>     return new CalciteSqlValidator(opTab, catalogReader, typeFactory,
>         conformance);
>   }
> {code}
> This seems to be the same problem discussed before at StackOverflow (https://stackoverflow.com/questions/44147819/adding-a-user-defined-function-to-calcite).



--
This message was sent by Atlassian Jira
(v8.3.4#803005)