matanper opened a new issue, #69919:
URL: https://github.com/apache/doris/issues/69919

   ### Search before asking
   
   - [x] I had searched in the [issues](https://github.com/apache/doris/issues) 
and found no similar issues.
   
   ### Version
   
   master and branch-4.1 (the translator code is the same on both). Reproduced 
on a 4.1 build that includes the nested-lambda capture changes (#68062, #68471).
   
   ### What's wrong?
   
   `ExpressionTranslator` builds the `ColumnRef` of `array_sort`'s second 
comparator argument as a copy of the first one, and keeps the first argument's 
name:
   
   ```java
   ColumnRefExpr column2 = new ColumnRefExpr(column);
   column2.setColumnId(1);
   ```
   
   That causes two wrong results.
   
   **1. A nested lambda in the comparator reads the wrong argument.** The BE 
identifies comparator arguments by name when it rejects a nested lambda that 
captures one, and both arguments are named after the first. So a nested lambda 
that re-declares the first argument's name and reads the second passes that 
check. At run time it reads its own argument instead, the comparator returns a 
constant, and the array comes back unsorted with no error:
   
   ```sql
   select array_sort((x, y) -> if(array_contains(array_map(x -> x < y, 
array(x)), true), -1, 1), [3, 1, 2]);
   -- returns [3, 1, 2]
   ```
   
   **2. Alias functions with an `array_sort` comparator sort nothing, even with 
a flat comparator.** `CREATE ALIAS FUNCTION` stores the translated expression 
and rebuilds the function from it, so both comparator arguments come back under 
the first name, as `(x, y) -> ... (x < x) ...`:
   
   ```sql
   CREATE ALIAS FUNCTION db.asc_sort(ARRAY<INT>) WITH PARAMETER(arr)
       AS array_sort((x, y) -> IF(x < y, -1, IF(x = y, 0, 1)), arr);
   select db.asc_sort([3, 1, 2]);
   -- returns [3, 1, 2]
   ```
   
   The same comparator in a plain query returns `[1, 2, 3]`.
   
   ### What you expected to happen
   
   1. The first query is rejected, like any nested lambda that captures a 
comparator argument (`array_sort comparator does not support nested lambda 
capturing comparator argument 'y'`).
   2. The alias returns `[1, 2, 3]`.
   
   ### How to reproduce
   
   Run the statements above.
   
   ### Anything else?
   
   Fix: give the second `ColumnRef` its own name. The comparator frame is 
position-based (column ids 0 and 1), so flat comparators in queries are 
unaffected:
   
   ```diff
            arrayItemReference = lambda.getLambdaArgument(1);
            ColumnRefExpr column2 = new ColumnRefExpr(column);
   +        column2.setName(arrayItemReference.getName());
            column2.setColumnId(1);
   ```
   
   With that change, query 1 is rejected with the error above, and a flat 
comparator still sorts `[3, 1, 2]` to `[1, 2, 3]`. Aliases created before the 
fix keep the stored broken body until they are dropped and recreated.
   
   Related: #68977
   
   ### Are you willing to submit PR?
   
   - [x] Yes I am willing to submit a PR!
   
   ### Code of Conduct
   
   - [x] I agree to follow this project's [Code of 
Conduct](https://www.apache.org/foundation/policies/conduct)
   


-- 
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]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to