Skip to content

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

Open
@aharpervc

Description

@aharpervc

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):

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:

declare @x bit = 1

if @x = 1
begin
    select 1
end

The API I was using was parse_sql:

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:

fn parse_all_statements(sql_text: &str) -> Result<Vec<Statement>, Box<dyn std::error::Error>> {
    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: #1791 (comment)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions