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

Offen Anfängerfreundlich
#2,803 0 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Maintainer antworten meist innerhalb von 1 Tag

Dieses Issue hat noch niemand übernommen.

Bewertung

Schwierigkeit
2/5
Geschätzter Aufwand
1-3 Stunden
Anfängerfreundlichkeit
72/100
Issue-Typ
Bug
Klarheit
Klar beschrieben
Aktivitätsstatus
Aktiv
Tech-Stack
rust, sql
Bereich
compilers

Rechercherichtung

Der Fehler liegt in Tokenizer::next_token: Die Prüfung auf ._ akzeptiert ein vorangehendes Token::Word, meldet aber nach RParen oder RBracket einen Fehler. Vergleiche sie mit dem nahegelegenen Block, der . nach Word | RParen | RBracket | Number bereits als Punkt behandelt, wenn supports_tuple_element_access() zutrifft. Führe die vier fehlschlagenden Abfragen aus dem Issue unter den angegebenen Dialekten aus und bestätige dann, dass SELECT (c).x und t._x weiterhin geparst werden. Fertig ist, wenn alle vier geparst werden und der Round-Trip-Check besteht.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Beschreibung

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.

Vorherrschende Sprache
Rust
Sterne
3.5k
Forks
801
Ø Merge
2 T. 19 Std.
Gemergte PRs (30 T.)
108

Entwicklungsumgebung

  • Kein Dockerfile und keine Docker-Compose-Datei
  • Hat eine Pull-Request-Vorlage
  • Kein Beitragsleitfaden

Erste Schritte

  1. Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
  3. Forken Sie das Repository und arbeiten Sie in einem Branch.
  4. Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.

Mehr aus apache/datafusion-sqlparser-rs

Alle Issues in apache/datafusion-sqlparser-rs

Ähnliche Issues

Weitere Issues zu Rust

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.