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

Aberta Para iniciantes
#2,803 0 comentários 0 reações 0 responsáveis Ver no GitHub

Mantenedores costumam responder em até 1 dia

Ninguém assumiu esta issue ainda.

Avaliação

Dificuldade
2/5
Tempo estimado
1-3 horas
Facilidade para iniciantes
72/100
Tipo de issue
Bug
Clareza
Claramente especificada
Status de atividade
Ativa
Stack de tecnologia
rust, sql
Domínio
compilers

Direção de pesquisa

A falha está em Tokenizer::next_token: a verificação de ._ aceita um Token::Word anterior, mas gera erro após RParen ou RBracket. Compare-a com o bloco próximo que já trata . depois de Word | RParen | RBracket | Number como ponto quando supports_tuple_element_access() é verdadeiro. Execute as quatro consultas que falham no issue sob os dialetos indicados e depois confirme que SELECT (c).x e t._x continuam sendo analisadas corretamente. Está concluído quando as quatro são analisadas e a verificação de ida e volta (round-trip) passa.

Escrita pelo modelo de indexação a partir do texto da issue.

Descrição

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.

Linguagem predominante
Rust
Estrelas
3.5k
Forks
801
Merge médio
2d 19h
PRs com merge (30d)
108

Preparar o ambiente

  • Sem Dockerfile nem arquivo Docker Compose
  • Tem um modelo de pull request
  • Sem guia de contribuição

Primeiros passos

  1. Leia a issue inteira e depois o guia de contribuição do projeto.
  2. Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
  3. Faça um fork do repositório e trabalhe em uma branch.
  4. Abra um pull request que referencie o número da issue.

Mais de apache/datafusion-sqlparser-rs

Todas as issues de apache/datafusion-sqlparser-rs

Issues semelhantes

Mais issues de Rust

Receba novas issues na sua caixa de entrada

Um resumo curto de issues do GitHub para quem está começando.