[ 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)