`._name` after `)` or `]` fails with "Unexpected character '_'"
メンテナーはふだん 1 日以内に返信
まだ誰も着手していません。
評価
- 難易度
- 2/5
- 見積もり時間
- 1〜3時間
- 初心者へのやさしさ
- 72/100
調査の方向性
失敗の原因は Tokenizer::next_token にあります。._ のチェックは直前の Token::Word を受け入れますが、RParen または RBracket の後ではエラーになります。近くにあるブロックと比較してください。そちらは supports_tuple_element_access() が成り立つとき、Word | RParen | RBracket | Number の後の . をすでに句点として扱っています。issue に記載された失敗する 4 つのクエリを、指定された方言の下で実行し、その後 SELECT (c).x と t._x が引き続き正しくパースされることを確認してください。4 つすべてがパースでき、ラウンドトリップチェックが通れば完了です。
索引モデルが issue の本文から書いたものです。
説明
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.
- 主要言語
- Rust
- スター
- 3.5k
- フォーク
- 801
- 平均マージ
- 2日 19時間
- マージ済み PR(30日)
- 108
環境構築
- Dockerfile・Docker Compose ファイルなし
- プルリクエストのテンプレートあり
- コントリビューションガイドなし
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
apache/datafusion-sqlparser-rs のほかの issue
-
DuckDB Prolific Author
難易度 2/5 1〜3時間 初心者へのやさしさ 70/100
apache/datafusion-sqlparser-rs#2807 ·
メンテナーはふだん 1 日以内に返信
-
Databricks Prolific Author Spark
難易度 2/5 1〜3時間 初心者へのやさしさ 68/100
apache/datafusion-sqlparser-rs#2801 ·
メンテナーはふだん 1 日以内に返信
-
PostgreSQL: support FOR NO KEY UPDATE and FOR KEY SHARE row-locking clauses再び着手できるかも このイシューのプルリクエストはマージされずにクローズされました。 オープンPostgreSQL
難易度 2/5 1〜3時間 初心者へのやさしさ 76/100
apache/datafusion-sqlparser-rs#2778 ·
メンテナーはふだん 1 日以内に返信
-
`SHOW ... ILIKE '<pattern>'` is displayed without quotes再び着手できるかも このイシューのプルリクエストはマージされずにクローズされました。 オープンProlific Author
難易度 2/5 1〜3時間 初心者へのやさしさ 75/100
apache/datafusion-sqlparser-rs#2759 ·
メンテナーはふだん 1 日以内に返信
-
Should `DELETE + LIMIT` be supported by the generic dialect ?再び着手できるかも このイシューのプルリクエストはマージされずにクローズされました。 オープンDuckDB MySQL PostgreSQL
難易度 2/5 1〜3時間 初心者へのやさしさ 68/100
apache/datafusion-sqlparser-rs#2615 ·
メンテナーはふだん 1 日以内に返信
apache/datafusion-sqlparser-rs の issue をすべて見る
似ている issue
-
area/tools bug session-analysis
難易度 2/5 1〜3時間 初心者へのやさしさ 78/100
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 80/100
oracle/rust-oracledb#66 ·
-
p3 testing
難易度 2/5 1〜3時間 初心者へのやさしさ 78/100
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 75/100
respanai/respan-gateway#166 ·
メンテナーはふだん 1 日以内に返信
-
fixes
難易度 2/5 1〜3時間 初心者へのやさしさ 70/100
astral-sh/ruff#30076 · コメント 1 件 ·
メンテナーはふだん 1 日以内に返信