apache / apache/datafusion-sqlparser-rs

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

未关闭
#1,800 1 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看
主要语言
Rust
星标
3.5k
派生
772
平均合并
4 天 9 小时
30 天内合并 PR
17

描述

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

贡献指南

这个仓库没有索引到贡献指南

调研方向

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.

由索引模型根据 Issue 内容生成。

评估

技术栈
rust, sql
领域
compilers
Issue 类型
缺陷
难度
4/5
预计耗时
3-5 天
活跃度
停滞
描述清晰度
基本清楚
新手友好度
35/100

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。