cjj2010 commented on code in PR #4926:
URL: https://github.com/apache/calcite/pull/4926#discussion_r3272508374


##########
core/src/main/java/org/apache/calcite/sql/validate/SqlValidatorImpl.java:
##########
@@ -3135,7 +3135,11 @@ private void registerQuery(
           forceNullable);
       operands = call.getOperandList();
       for (int i = 0; i < operands.size(); i++) {
-        registerOperandSubQueries(parentScope, call, i);
+        // Use lambdaScope for the expression body (operand 1) so that
+        // nested lambdas can resolve outer lambda parameters via the
+        // scope chain, rather than treating them as table column names.
+        registerOperandSubQueries(
+            i == 1 ? lambdaScope : parentScope, call, i);

Review Comment:
   Good catch, you're right.
   SqlLambda.parameters is a SqlNodeList whose elements are always 
SqlIdentifier (the parameter names). Tracing through registerOperandSubQueries 
→ registerSubQueries:
   parameters.getKind() is not QUERY, so the SCALAR_QUERY wrapping branch is 
skipped.
   In the SqlNodeList branch, each SqlIdentifier is neither a QUERY nor a 
SqlCall/SqlNodeList, so it falls into the atomic-node branch and is ignored.
   So registerOperandSubQueries(parentScope, call, 0) is effectively a no-op on 
a lambda's parameter list, and dropping it is safe.I have updated the code.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to