PostgreSQL dialect: unary minus binds more loosely than `^`, so `-1 ^ 0` returns -1
Los mantenedores suelen responder en 1 día
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 2/5
- Tiempo estimado
- 1-3 horas
- Aptitud para principiantes
- 76/100
Línea de trabajo
El seguimiento se realiza en DataFusion después de la corrección en apache/datafusion-sqlparser-rs#2819. Comprueba primero qué versión de sqlparser incluye esa corrección y cómo DataFusion fija o actualiza sqlparser; después, busca los casos sqllogictest existentes para el análisis del dialecto PostgreSQL. La tarea estará completa cuando la dependencia incluya la corrección y las pruebas cubran -1 ^ 0 y -2 ^ 2 con resultados que coincidan con PostgreSQL.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
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).
- Lenguaje dominante
- Rust
- Estrellas
- 9.6k
- Forks
- 2.6k
- Merge medio
- 3 d 21 h
- PR fusionados (30 d)
- 331
Preparar el entorno
Inicia el contenedor de desarrollo del proyecto en tu navegador, con tu propia cuenta de GitHub.
- Sin Dockerfile ni archivo de Docker Compose
- Tiene una plantilla de pull request
- Leer la guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de apache/datafusion
-
Substrait consumer doesn't recognise `shift_left` / `shift_right` from functions_arithmetic.yamlPosiblemente ocupada @jonasHanhan la tomó hace 1 día. Abiertobug
Dificultad 2/5 1-3 horas Aptitud para principiantes 76/100
apache/datafusion#27059 ·
Los mantenedores suelen responder en 1 día
-
`ProjectionExprs::project_statistics` computes approximate `Statistics::total_byte_size` ignoring column statsPosiblemente ocupada @joseph-isaacs la tomó hace 1 día. Abiertobug
Dificultad 2/5 1-3 horas Aptitud para principiantes 72/100
apache/datafusion#27050 ·
Los mantenedores suelen responder en 1 día
-
physical-plan: decoding an Unnest or Explain node with an unset field panicsPosiblemente ocupada @geoHeil la tomó hoy. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 75/100
apache/datafusion#26999 · 1 comentario ·
Los mantenedores suelen responder en 1 día
-
datafusion-proto: decoding an AvroScan node without the avro feature panicsPosiblemente ocupada @geoHeil la tomó hoy. Abierto
Dificultad 1/5 Menos de una hora Aptitud para principiantes 85/100
apache/datafusion#26998 ·
Los mantenedores suelen responder en 1 día
-
`repeat` on `LargeUtf8` aborts the process on a result size no allocation can satisfyPosiblemente ocupada @huong8373tt-beep la tomó hace 2 días. Abiertobug good first issue
Dificultad 2/5 1-3 horas Aptitud para principiantes 72/100
apache/datafusion#26948 · 1 comentario · 1 asignado ·
Los mantenedores suelen responder en 1 día
Todos los issues de apache/datafusion
Issues similares
-
github_actions security
Dificultad 2/5 1-3 horas Aptitud para principiantes 85/100
dekobon/big-code-analysis#1815 ·
Los mantenedores suelen responder en 1 día
-
area: png-glitch bug P0 security
Dificultad 2/5 1-3 horas Aptitud para principiantes 72/100
chikoski/png-glitch#45 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 1/5 Menos de una hora Aptitud para principiantes 85/100
nekko-labs/nekko-agent#1756 ·
Los mantenedores suelen responder en 1 día
-
upstream
Dificultad 2/5 1-3 horas Aptitud para principiantes 74/100
yologdev/yoyo-evolve#1138 ·
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
gitbutlerapp/gitbutler#16982 ·
Los mantenedores suelen responder en 1 día