apache / apache/datafusion-sqlparser-rs

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

Open
#1,800 1 comment 0 reactions 0 assignees View on GitHub
Dominant language
Rust
Stars
3.5k
Forks
772
Avg merge
4d 9h
Merged PRs (30d)
17

Description

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

Contributor guide

No contributing guide indexed for this repository

Research direction

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.

Written by the indexing model from the issue text.

Assessment

Tech stack
rust, sql
Domain
compilers
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.