apache / apache/datafusion

Incorrect result when use volatile function alias in having clause

Aperta
#7,976 3 commenti 0 reazioni 0 assegnatari Vedi su GitHub
bug
Lingua principale
Rust
Stelle
9.3k
Fork
2.4k
Merge medio
3g 11h
PR unite (30g)
360

Descrizione

### Is your feature request related to a problem or challenge?

related to #7876
when we do the query like
```sql
select a, random() as r from test group by a having r > 0.5;
```
we will get the incorrect result like
```
+----+---------------------+
| a | r |
+----+---------------------+
| c | 0.1664909010224056 |
| e | 0.35292520754684475 |
| b | 0.26159048688135855 |
+----+---------------------+
```
this is because when we convert the Statement into a LogicalPlan, we will "dereferences" any aliases in the HAVING clause in the below section
https://github.com/apache/arrow-datafusion/blob/1dd887cdff518ede1d1de457f4b20c22a9c7228f/datafusion/sql/src/select.rs#L110-L122

### Describe the solution you'd like

Based on the way we implemented alias in having clause, I think we should disable the use of aliases for volatile functions in the having clause and report a error.
and we can use subqueries to implement the above SQL
```sql
select t.a, t.r from (select a, random() as r from test group by a) as t where t.r > 0.5;
```

### Describe alternatives you've considered

support the sql like
```sql
select a, random() as r from test group by a having r > 0.5;
```
but this method is more complicated

### Additional context

duchdb also do this query incorrect
```
D select t.c1, random() as r from agg.csv as t group by t.c1 having r > 0.5;
┌─────────┬─────────────────────┐
│ c1 │ r │
│ varchar │ double │
├─────────┼─────────────────────┤
│ b │ 0.5120539779309183 │
│ d │ 0.20845546829514205 │
└─────────┴─────────────────────┘
```
mysql can get correct result
postgres disallow use alias in having clause

Guida per i contributori

Apri la guida per i contributori

Direzione di ricerca

Riproduci la query dell'issue, quindi esamina datafusion/sql/src/select.rs intorno alle righe 110-122, dove gli alias HAVING vengono dereferenziati durante la conversione in LogicalPlan. La modifica dovrebbe impedire che gli alias di funzioni volatili vengano accettati in HAVING e segnalare un errore, usando la query di esempio dell'issue come verifica del comportamento.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Valutazione

Stack tecnologico
rust, sql
Ambito
databases
Tipo di issue
Bug
Difficoltà
4/5
Tempo stimato
3-5 giorni
Stato di attività
Ferma
Chiarezza
Abbastanza chiara
Idoneità per principianti
35/100

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.