[Bug] array_sort's second comparator argument takes the first argument's name: a nested lambda reads the wrong argument, and alias functions sort nothing

Ouverte Adaptée aux débutants
#69,919 2 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Les mainteneurs répondent en général sous 1 jour

@adarshomrey y travaille déjà.

Depuis le 1/11/2026.

Évaluation

Difficulté
2/5
Temps estimé
1-3 heures
Accessibilité débutants
82/100
Type d'issue
Bug
Clarté
Clairement spécifiée
Activité
Active
Stack technique
java
Domaine
databases

Piste de recherche

Localisez la classe ExpressionTranslator où les objets ColumnRefExpr du comparateur de array_sort sont construits. Ajoutez column2.setName(arrayItemReference.getName()); comme indiqué dans le diff. Vérifiez en exécutant les exemples SQL : la fonction d'alias doit renvoyer un tableau trié et le lambda imbriqué doit être rejeté.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Description

Search before asking
  • I had searched in the 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:

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:

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) ...:

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:

         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?
  • Yes I am willing to submit a PR!
Code of Conduct
Langage dominant
Java
Étoiles
16.2k
Forks
4k
Merge moyen
1 j 16 h
PR mergées (30 j)
679

Préparer son environnement

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Autres issues de apache/doris

Toutes les issues de apache/doris

Issues similaires

Plus d'issues Java

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.