`._name` after `)` or `]` fails with "Unexpected character '_'"

Aperta Adatta ai principianti
#2,803 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub

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
72/100
Tipo di issue
Bug
Chiarezza
Specificata chiaramente
Stato di attività
Attiva
Stack tecnologico
rust, sql
Ambito
compilers

Direzione di ricerca

Il problema si trova in Tokenizer::next_token: il controllo di ._ accetta un Token::Word precedente, ma genera un errore dopo RParen o RBracket. Confrontalo con il blocco vicino che già tratta . dopo Word | RParen | RBracket | Number come un punto quando supports_tuple_element_access() è vero. Esegui le quattro query che falliscono nell'issue con i dialetti indicati, poi verifica che SELECT (c).x e t._x continuino a essere analizzate correttamente. È completato quando tutte e quattro vengono analizzate e il controllo di round-trip passa.

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

Descrizione

DuckDB PostgreSQL Prolific Author

Field access with a name starting with _ fails to tokenize when it follows ) or ]:

SELECT (c)._x FROM tt            (PostgreSqlDialect)
  -> sql parser error: Unexpected character '_' at Line: 1, Column: 11
SELECT ({'_x': 1})._x            (DuckDbDialect)
  -> Unexpected character '_' at Line: 1, Column: 19
SELECT ([{'_a': 2}])[1]._a       (DuckDbDialect)
  -> Unexpected character '_' at Line: 1, Column: 24
SELECT f()._x                    (BigQueryDialect)
  -> Unexpected character '_' at Line: 1, Column: 11
SELECT (c).x FROM tt, SELECT t._x FROM t
  -> parse (fine)

PostgreSQL 18 runs SELECT (c)._x FROM tt for a composite column with a field _x (https://www.postgresql.org/docs/current/rowtypes.html#ROWTYPES-ACCESSING), and DuckDB runs SELECT ({'_x': 1})._x, ([{'_a': 2}])[1]._a (returns 1 | 2).

In Tokenizer::next_token, the ._ check only accepts a preceding Token::Word; after RParen or RBracket it errors. The block right after it already treats . after Word | RParen | RBracket | Number as a period when supports_tuple_element_access(). Related: #1835 (added the check), #2677 (whitespace case).

Tested on main ce12f1f6 (also 0.63.0 and 0.58.0).

Found with a property-based fuzzer (round trip check); I used AI assistance for triage and verified every case above.

Lingua principale
Rust
Stelle
3.5k
Fork
801
Merge medio
2g 19h
PR unite (30g)
108

Preparare l'ambiente

  • Nessun Dockerfile né file Docker Compose
  • Ha un modello di pull request
  • Nessuna guida per i contributori

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di apache/datafusion-sqlparser-rs

Tutte le issue di apache/datafusion-sqlparser-rs

Issue simili

Altre issue su Rust

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.