apache / apache/datafusion-sqlparser-rs

SQL Server: Increase support for multi statement object definitions (without semicolons)

Aperta
#1,800 1 commento 0 reazioni 0 assegnatari Vedi su GitHub
Lingua principale
Rust
Stelle
3.5k
Fork
772
Merge medio
4g 9h
PR unite (30g)
17

Descrizione

It would be extremely useful if this library was able to properly parse multiple statements, particularly in a object definition body, without requiring semi-colons which are optional for SQL Server.

---

The following otherwise valid SQL fails parsing (MSSQL dialect):

```mssql
create or alter procedure test()
as
begin
declare @x bit = 1

if @x = 1
begin
select 1
end
end
```

The error is at the `if @x = 1` line:

```
end of statement, found: if
```

The problem appears to be related to parsing multiple statements in the object definition body. The parsing concludes successfully if the code is changed to `declare @x bit = 1;` with a semi-colon.

There's also the similar case of two top level statements:

```mssql
declare @x bit = 1

if @x = 1
begin
select 1
end
```

The API I was using was parse_sql:

```rust
static DIALECT: sqlparser::dialect::MsSqlDialect = sqlparser::dialect::MsSqlDialect {};
let sql_text = ...

let mut statements = Parser::parse_sql(&DIALECT, sql_text.as_str())?; // error: end of statement, found: if
```

There's a workaround for the multiple top level statements scenario, but that won't work for the stored procedure example:

```rust
fn parse_all_statements(sql_text: &str) -> Result, Box> {
let mut parser = Parser::new(&DIALECT)
.try_with_sql(&sql_text)?;

let mut statements = Vec::new();

loop {
if let Token::EOF = parser.peek_token_ref().token {
break;
}

statements.push(parser.parse_statement()?);

while let Token::SemiColon = parser.peek_token_ref().token {
parser.advance_token();
}
}

return Ok(statements);
}
```

---

follow up from: https://github.com/apache/datafusion-sqlparser-rs/pull/1791#issuecomment-2784202219

Guida per i contributori

Nessuna guida per i contributori indicizzata per questo repository

Direzione di ricerca

Start with Parser::parse_sql and the MsSqlDialect entry points shown in the report, then reproduce both SQL Server examples without semicolons. Trace how parse_statement handles statements inside object definition bodies and at the top level. Done means both examples parse successfully while semicolon-terminated input continues to work.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Valutazione

Stack tecnologico
rust, sql
Ambito
compilers
Tipo di issue
Bug
Difficoltà
4/5
Tempo stimato
3-5 giorni
Stato di attività
Ferma
Chiarezza
Abbastanza chiara
Idoneità per principianti
35/100

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.