Slice with a stride and no upper bound (`arr[1: :4]`) is displayed as `arr[1::4]`, which doesn't parse

Aberta Para iniciantes
#2,807 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
70/100
Tipo de issue
Bug
Clareza
Claramente especificada
Status de atividade
Ativa
Stack de tecnologia
rust, sql
Domínio
devtools

Direção de pesquisa

O bug está em como Subscript::Slice é impresso quando upper_bound está ausente, mas há um stride definido. Comece pela implementação de Display em src/ast/mod.rs, onde os dois dois-pontos são escritos lado a lado. Verifique o tratamento de slices do parser para [1: :4] e [1:-:4] para descobrir qual grafia precisa fazer o round-trip. Está concluído quando as três consultas de reprodução da issue são analisadas novamente, com um teste de round-trip adicionado junto aos testes de slice existentes em tests/sqlparser_common.rs.

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

Descrição

DuckDB Prolific Author

Subscript::Slice with upper_bound: None and a stride prints the two colons next to each other, and the tokenizer then reads :: (cast):

SELECT ([1, 2, 3, 4, 5, 6, 7, 8, 9])[1: :4]
  -> displays as: SELECT ([1, 2, 3, 4, 5, 6, 7, 8, 9])[1::4]
  -> reparse: Expected: a data type name, found: 4 at Line: 1, Column: 41
SELECT ([1, 2, 3, 4, 5, 6, 7, 8, 9])[: :4]
  -> displays as: SELECT ([1, 2, 3, 4, 5, 6, 7, 8, 9])[::4]
  -> reparse: Expected: an expression, found: :: at Line: 1, Column: 38
SELECT ([1, 2, 3, 4, 5, 6, 7, 8, 9])[1:-:4]
  -> round-trips (fine)

DuckDB documents [1:-:4] for this (https://duckdb.org/docs/stable/sql/functions/list#slicing), but it also runs [1: :4] (returns [1, 5, 9]), and the parser accepts it. Something like [1: :4] in Display would round-trip.

Tested with DuckDbDialect 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.