PostgreSQL dialect: unary minus binds more loosely than `^`, so `-1 ^ 0` returns -1
I maintainer di solito rispondono entro 1 giorno
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 2/5
- Tempo stimato
- 1-3 ore
- Idoneità per principianti
- 76/100
Direzione di ricerca
Il seguito si svolge in DataFusion dopo la correzione in apache/datafusion-sqlparser-rs#2819. Verifica prima quale versione di sqlparser include la correzione e come DataFusion blocca o aggiorna sqlparser; poi individua i casi sqllogictest esistenti per l’analisi del dialetto PostgreSQL. Il lavoro è completato quando la dipendenza include la correzione e i test coprono -1 ^ 0 e -2 ^ 2 con risultati corrispondenti a PostgreSQL.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
This issue tracks the parser fix in apache/datafusion-sqlparser-rs#2819. The cause is in sqlparser, and DataFusion needs follow-up work after the fix lands.
Describe the bug
With the PostgreSQL dialect, ^ is the power operator. Unary minus binds more loosely than ^, so -1 ^ 0 is planned as -(1 ^ 0) and returns -1.
In PostgreSQL, unary minus binds more tightly than ^ (operator precedence table). PostgreSQL computes (-1) ^ 0 and returns 1.
To Reproduce
SET datafusion.sql_parser.dialect = 'PostgreSQL';
SELECT -1 ^ 0;
SELECT -2 ^ 2;
EXPLAIN SELECT -2 ^ 2;
On main (c120619de), datafusion-cli returns:
+------------------------------+
| (- power(Int64(1),Int64(0))) |
+------------------------------+
| -1.0 |
+------------------------------+
+------------------------------+
| (- power(Int64(2),Int64(2))) |
+------------------------------+
| -4.0 |
+------------------------------+
The plan shows (- power(Int64(2),Int64(2))), so the minus is applied after the power.
Expected behavior
The same results as PostgreSQL 17:
postgres=# SELECT -1 ^ 0, -2 ^ 2;
?column? | ?column?
----------+----------
1 | 4
DuckDB gives the same results (1 and 4).
Additional context
The cause is in sqlparser: the operand of a unary - or + is parsed at Precedence::MulDivModOp, but PostgreSqlDialect puts ^ above that level. The details are in apache/datafusion-sqlparser-rs#2819.
Work in DataFusion after the parser fix:
- Upgrade to a
sqlparserrelease that has the fix. - Add a
sqllogictestcase for-1 ^ 0and-2 ^ 2with the PostgreSQL dialect.
Related: #22461 (binary operator precedence against PostgreSQL).
- Lingua principale
- Rust
- Stelle
- 9.6k
- Fork
- 2.6k
- Merge medio
- 3g 19h
- PR unite (30g)
- 326
Preparare l'ambiente
Avvia il container di sviluppo del progetto nel browser, con il tuo account GitHub.
- Nessun Dockerfile né file Docker Compose
- Ha un modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di apache/datafusion
-
Substrait consumer doesn't recognise `shift_left` / `shift_right` from functions_arithmetic.yamlForse già presa @jonasHanhan l’ha presa 1 giorno fa. Apertabug
Difficoltà 2/5 1-3 ore Idoneità per principianti 76/100
apache/datafusion#27059 ·
I maintainer di solito rispondono entro 1 giorno
-
`ProjectionExprs::project_statistics` computes approximate `Statistics::total_byte_size` ignoring column statsForse già presa @joseph-isaacs l’ha presa 2 giorni fa. Apertabug
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
apache/datafusion#27050 ·
I maintainer di solito rispondono entro 1 giorno
-
physical-plan: decoding an Unnest or Explain node with an unset field panicsForse già presa @geoHeil l’ha presa 1 giorno fa. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 75/100
apache/datafusion#26999 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
datafusion-proto: decoding an AvroScan node without the avro feature panicsForse già presa @geoHeil l’ha presa 1 giorno fa. Aperta
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 85/100
apache/datafusion#26998 ·
I maintainer di solito rispondono entro 1 giorno
-
`repeat` on `LargeUtf8` aborts the process on a result size no allocation can satisfyForse già presa @huong8373tt-beep l’ha presa 3 giorni fa. Apertabug good first issue
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
apache/datafusion#26948 · 1 commento · 1 assegnatario ·
I maintainer di solito rispondono entro 1 giorno
Tutte le issue di apache/datafusion
Issue simili
-
area/tools bug session-analysis
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 80/100
oracle/rust-oracledb#66 ·
-
p3 testing
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 75/100
respanai/respan-gateway#166 ·
I maintainer di solito rispondono entro 1 giorno
-
fixes
Difficoltà 2/5 1-3 ore Idoneità per principianti 70/100
astral-sh/ruff#30076 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno