apache / apache/datafusion-sqlparser-rs

Why custom Dialect doesn't work properly

Aberta
#1,186 8 comentários 0 reações 0 responsáveis Ver no GitHub

Ninguém assumiu esta issue ainda.

Linguagem predominante
Rust
Estrelas
3.5k
Forks
774
Merge médio
4d 9h
PRs com merge (30d)
17

Descrição

I have extended a Dialect named MyDialect, and implemented the is_identifier_start method. is_identifier_start allows the identifier to start with a number, but why does my test code report an error? The prompt says that it cannot start with a number, and if I run it with the native HiveDialect, the code No problem again

My Code:

#[derive(Debug)]
pub struct MyDialect;

    impl Dialect for MyDialect {
    fn is_delimited_identifier_start(&self, ch: char) -> bool {
        (ch == '"') || (ch == '`')
    }

    fn is_identifier_start(&self, ch: char) -> bool {
        ch.is_ascii_lowercase() || ch.is_ascii_uppercase() || ch.is_ascii_digit() || ch == '$'
    }

    fn is_identifier_part(&self, ch: char) -> bool {
        ch.is_ascii_lowercase()
            || ch.is_ascii_uppercase()
            || ch.is_ascii_digit()
            || ch == '_'
            || ch == '$'
            || ch == '{'
            || ch == '}'
    }

    fn supports_filter_during_aggregation(&self) -> bool {
        true
    }
}

#[cfg(test)]
mod tests {
    use sqlparser::parser::Parser;

    #[test]
    pub fn test_ast() {
        let sql = "SELECT * from 1_a";
        let expected_sql = "SELECT * from 1_a"
            .replace("\n", "");
        let dialect = crate::core::ast::MyDialect {};
        let ast = Parser::parse_sql(&dialect, sql).unwrap();
        assert_eq!(ast[0].to_string(), expected_sql);
    }
}

HIveDialect Code(from sqlparser-rs)
use crate::dialect::Dialect;

/// A [Dialect] for Hive.

#[derive(Debug)]
pub struct HiveDialect {}

impl Dialect for HiveDialect {
    fn is_delimited_identifier_start(&self, ch: char) -> bool {
        (ch == '"') || (ch == '`')
    }

    fn is_identifier_start(&self, ch: char) -> bool {
        ch.is_ascii_lowercase() || ch.is_ascii_uppercase() || ch.is_ascii_digit() || ch == '$'
    }

    fn is_identifier_part(&self, ch: char) -> bool {
        ch.is_ascii_lowercase()
            || ch.is_ascii_uppercase()
            || ch.is_ascii_digit()
            || ch == '_'
            || ch == '$'
            || ch == '{'
            || ch == '}'
    }

    fn supports_filter_during_aggregation(&self) -> bool {
        true
    }
}

Error:
image

Guia de contribuição

Nenhum guia de contribuição indexado para este repositório

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.

Direção de pesquisa

Comece em Parser::parse_sql e no trait Dialect; em seguida, compare a implementação personalizada com HiveDialect usando a reprodução fornecida de test_ast para SELECT * from 1_a. Rastreie como o tratamento do início de identificadores é aplicado e confirme o comportamento esperado de parsing; considera-se concluído quando a reprodução estiver explicada ou o comportamento do parser for corrigido com um teste de regressão.

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

Avaliação

Stack de tecnologia
rust, sql
Domínio
compilers, databases
Tipo de issue
Bug
Dificuldade
3/5
Tempo estimado
1-2 dias
Status de atividade
Estagnada
Clareza
Razoavelmente clara
Facilidade para iniciantes
30/100

Receba novas issues na sua caixa de entrada

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