apache / apache/datafusion-sqlparser-rs
SQL Server: Increase support for multi statement object definitions (without semicolons)
- 主要言語
- Rust
- スター
- 3.5k
- フォーク
- 772
- 平均マージ
- 4日 9時間
- マージ済み PR(30日)
- 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