Feng Jin created CALCITE-6245: --------------------------------- Summary: Permute operands of SqlCall everywhere when validating and Converting to Rel Key: CALCITE-6245 URL: https://issues.apache.org/jira/browse/CALCITE-6245 Project: Calcite Issue Type: Bug Reporter: Feng Jin
Currently, when using named parameters, there may be some issues due to the incorrect expansion of named parameters during validation. Specifically, several unit tests can be added to reproduce this. add a test case org.apache.calcite.test.UdfTest#testScalarFunctionWithParameter {code:java} @Test void testScalarFunctionWithParameter() { final String sql = "select \"adhoc\".my_det_plus(X => \"deptno\", Y => 100) as p\n" + "from \"adhoc\".EMPLOYEES"; final AtomicInteger c = Smalls.MyDeterministicPlusFunction.INSTANCE_COUNT.get(); final int before = c.get(); withUdf().query(sql).returnsUnordered("P=110", "P=120", "P=110", "P=110"); final int after = c.get(); assertThat(after, is(before + 1)); } {code} And we will get the following error: {code:shell} java.sql.SQLException: Error while executing SQL "select "adhoc".my_det_plus(x => "deptno", y => 100) as p from "adhoc".EMPLOYEES": At line 1, column 28: Column 'X' not found in any table at org.apache.calcite.avatica.Helper.createException(Helper.java:56) at org.apache.calcite.avatica.Helper.createException(Helper.java:41) at org.apache.calcite.avatica.AvaticaStatement.executeInternal(AvaticaStatement.java:164) at org.apache.calcite.avatica.AvaticaStatement.executeQuery(AvaticaStatement.java:228) at org.apache.calcite.test.CalciteAssert.assertQuery(CalciteAssert.java:543) at org.apache.calcite.test.CalciteAssert$AssertQuery.lambda$returns$1(CalciteAssert.java:1455) at org.apache.calcite.test.CalciteAssert$AssertQuery.withConnection(CalciteAssert.java:1394) at org.apache.calcite.test.CalciteAssert$AssertQuery.returns(CalciteAssert.java:1453) at org.apache.calcite.test.CalciteAssert$AssertQuery.returns(CalciteAssert.java:1443) at org.apache.calcite.test.CalciteAssert$AssertQuery.returnsUnordered(CalciteAssert.java:1465) at org.apache.calcite.test.UdfTest.testScalarFunctionWithParameter(UdfTest.java:227) {code} another test case: org.apache.calcite.test.UdfTest#testAggFunctionWithParameter {code:java} @Test void testAggFunctionWithParameter() { final String empDept = JdbcTest.EmpDeptTableFactory.class.getName(); final String sum = Smalls.MyStaticSumFunction.class.getName(); final String sum2 = Smalls.MySumFunction.class.getName(); final CalciteAssert.AssertThat with = CalciteAssert.model("{\n" + " version: '1.0',\n" + " schemas: [\n" + " {\n" + " name: 'adhoc',\n" + " tables: [\n" + " {\n" + " name: 'EMPLOYEES',\n" + " type: 'custom',\n" + " factory: '" + empDept + "',\n" + " operand: {'foo': true, 'bar': 345}\n" + " }\n" + " ],\n" + " functions: [\n" + " {\n" + " name: 'MY_SUM',\n" + " className: '" + sum + "'\n" + " },\n" + " {\n" + " name: 'MY_SUM2',\n" + " className: '" + sum2 + "'\n" + " }\n" + " ]\n" + " }\n" + " ]\n" + "}") .withDefaultSchema("adhoc") .with("caseSensitive", false); with.withDefaultSchema(null) .query( "select \"adhoc\".my_sum(arg1 => \"deptno\") as p from \"adhoc\".EMPLOYEES\n") .returns("P=50\n"); } {code} And we will get the following error: {code:shell} // Some comments here Caused by: org.apache.calcite.runtime.CalciteContextException: From line 1, column 23 to line 1, column 26: Column 'ARG1' not found in any table at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:423) at org.apache.calcite.runtime.Resources$ExInstWithCause.ex(Resources.java:505) at org.apache.calcite.sql.SqlUtil.newContextException(SqlUtil.java:945) at org.apache.calcite.sql.SqlUtil.newContextException(SqlUtil.java:930) at org.apache.calcite.sql.validate.SqlValidatorImpl.newValidationError(SqlValidatorImpl.java:5470) at org.apache.calcite.sql.validate.DelegatingScope.fullyQualify(DelegatingScope.java:289) at org.apache.calcite.sql.validate.SqlValidatorImpl.findTableColumnPair(SqlValidatorImpl.java:3929) at org.apache.calcite.sql.validate.SqlValidatorImpl.isRolledUpColumn(SqlValidatorImpl.java:3972) at org.apache.calcite.sql.validate.SqlValidatorImpl.checkRollUp(SqlValidatorImpl.java:3885) at org.apache.calcite.sql.validate.SqlValidatorImpl.checkRollUp(SqlValidatorImpl.java:3880) at org.apache.calcite.sql.validate.SqlValidatorImpl.checkRollUp(SqlValidatorImpl.java:3880) at org.apache.calcite.sql.validate.SqlValidatorImpl.checkRollUp(SqlValidatorImpl.java:3899) at org.apache.calcite.sql.validate.SqlValidatorImpl.checkRollUpInSelectList(SqlValidatorImpl.java:3801) at org.apache.calcite.sql.validate.SqlValidatorImpl.validateSelect(SqlValidatorImpl.java:3789) at org.apache.calcite.sql.validate.SelectNamespace.validateImpl(SelectNamespace.java:61) {code} -- This message was sent by Atlassian Jira (v8.20.10#820010)