Incorrect result when use volatile function alias in having clause
- 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