Dmitry Sysolyatin created CALCITE-7269:
------------------------------------------

             Summary: SqlValidator throws exception if lambda parameter is ROW
                 Key: CALCITE-7269
                 URL: https://issues.apache.org/jira/browse/CALCITE-7269
             Project: Calcite
          Issue Type: Bug
          Components: core
    Affects Versions: 1.41.0
            Reporter: Dmitry Sysolyatin


Test case [1]
{code}
  @Test void testLambdaExpressionWithRowParameter() {
    final String sql = "select \"EXISTS\"(array(ROW(true, false)), x -> 
x.\"EXPR$1\")";
    fixture()
        .withFactory(c ->
            c.withOperatorTable(t -> 
SqlValidatorTest.operatorTableFor(SqlLibrary.SPARK)))
        .withSql(sql)
        .ok();
  }
{code}

Exception:
{code}
>From line 1, column 47 to line 1, column 56: Param 'X.EXPR$1' not found in 
>lambda expression '`X` -> `X`.`EXPR$1`'
org.apache.calcite.runtime.CalciteContextException: From line 1, column 47 to 
line 1, column 56: Param 'X.EXPR$1' not found in lambda expression '`X` -> 
`X`.`EXPR$1`'
        at 
java.base/jdk.internal.reflect.DirectConstructorHandleAccessor.newInstance(DirectConstructorHandleAccessor.java:62)
        at 
java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:502)
        at 
java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:486)
        at 
org.apache.calcite.runtime.Resources$ExInstWithCause.ex(Resources.java:511)
        at org.apache.calcite.sql.SqlUtil.newContextException(SqlUtil.java:960)
        at org.apache.calcite.sql.SqlUtil.newContextException(SqlUtil.java:945)
{code}



There are three things about lambda implementation:

1. SqlLambdaScope.fullyQualified returns the parameter only if the 
SqlIdentifier matches exactly. If we change it to just use getComponent(0), 
then…
2. SqlLambdaScope sets lambda parameters to ANY. But ANY does not have fields.
3. The most interesting part: LambdaOperandTypeChecker sets the actual types. I 
think this is not the right place to set actual types [2].

[1] 
https://github.com/apache/calcite/commit/44bf468d867a6623e905c98ec8e3c64daa2711b7
[2] 
https://github.com/apache/calcite/blob/7ecd358b2e4678e8c74e6689a235912361aa6a8a/core/src/main/java/org/apache/calcite/sql/type/OperandTypes.java#L1815-L1817



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to