You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@calcite.apache.org by "Feng Jin (Jira)" <ji...@apache.org> on 2024/02/06 07:06:00 UTC

[jira] [Created] (CALCITE-6245) Permute operands of SqlCall everywhere when validating and Converting to Rel

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)