apache / apache/datafusion-sqlparser-rs

Backticks in ObjectName argument to DESCRIBE fails to parse, dialect behavior specialization

Abierto
#632 6 comentarios 0 reacciones 0 asignados Ver en GitHub
Lenguaje dominante
Rust
Estrellas
3.5k
Forks
772
Merge medio
4 d 9 h
PR fusionados (30 d)
17

Descripción

The library cannot currently parse this under the generic dialect:

```
DESCRIBE namespace.`table`;
```

I tried making my own dialect that added backticks to the delimited identifier characters, but it's not actually possible to make that work with the library modified as-is.

The reason is because of code like this that special-cases behavior based on known vs. unknown dialects:

https://github.com/sqlparser-rs/sqlparser-rs/blob/6c8f31c367ac75ea29be030bad244c0c6a2fafee/src/parser.rs#L4388

When I define my own dialect, I hit this fallback case and it fails on _many_ examples that worked fine with the GenericDialect:

https://github.com/sqlparser-rs/sqlparser-rs/blob/6c8f31c367ac75ea29be030bad244c0c6a2fafee/src/parser.rs#L4427

This is deeply problematic. The trait API gives me no way to identify my dialect with a family or type of dialect that I can tell. This means that as soon as I want to do something as simple as extending the GenericDialect with an extra identifier delimiter, all my tests start failing for reasons that were initially mysterious.

Here's the temporary hack I'm using to work around the problem:

https://github.com/bitemyapp/sqlparser-rs/commit/96c9b0df314821e5a285fb090afc629218aa2049#diff-5638cd35d93e9e77be12ed5b86d621439eb7ed698fd2eba0e8a496a9b8ba208cR60

I am willing to submit a patch to rectify this but I am fairly bothered by the `dialect_of!(…)` stuff. Is there a way to make my custom Dialect be identified as a library-defined dialect? I don't think I can override that `impl dyn Dialect` method as `dyn Dialect` is a type and not a class of types with a trait in common. Please let me know if I am wrong.

Would you mind if I submitted an MR to hoist that machinery out of the dyn/Any hack into a trait method with a default that preserves the existing behavior. I'm open to alternatives, especially ones that involve less work, as well.

Guía de contribución

No hay ninguna guía de contribución indexada para este repositorio

Línea de trabajo

Empieza en src/parser.rs alrededor de las líneas enlazadas 4388 y 4427, y compara después el comportamiento de GenericDialect con el commit del workaround para el dialecto personalizado. Determina cómo la especialización del dialecto debería conservar el análisis genérico y aceptar DESCRIBE namespace.`table`; done debería incluir una dirección de API resuelta y cobertura de regresión para este caso.

Escrito por el modelo de indexación a partir del texto del issue.

Evaluación

Stack tecnológico
rust, sql
Área
compilers, databases
Tipo de issue
Error
Dificultad
5/5
Tiempo estimado
Más de una semana
Estado de actividad
Estancado
Claridad
Bastante claro
Aptitud para principiantes
35/100

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.