Skip to content

Commit 5b460aa

Browse files
committed
Enable GO to terminate an IF statement
1 parent dc5556d commit 5b460aa

2 files changed

Lines changed: 85 additions & 1 deletion

File tree

src/parser/mod.rs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -527,8 +527,16 @@ impl<'a> Parser<'a> {
527527
}
528528

529529
let statement = self.parse_statement()?;
530+
expecting_statement_delimiter = match &statement {
531+
Statement::If(s) => match &s.if_block.conditional_statements {
532+
// the `END` keyword doesn't need to be followed by a statement delimiter, so it shouldn't be expected here
533+
ConditionalStatements::BeginEnd { .. } => false,
534+
// parsing the statement sequence consumes the statement delimiter, so it shouldn't be expected here
535+
ConditionalStatements::Sequence { .. } => false,
536+
},
537+
_ => true,
538+
};
530539
stmts.push(statement);
531-
expecting_statement_delimiter = true;
532540
}
533541
Ok(stmts)
534542
}

tests/sqlparser_mssql.rs

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2924,3 +2924,79 @@ fn parse_mssql_go_keyword() {
29242924
"sql parser error: Expected: end of statement, found: x"
29252925
);
29262926
}
2927+
2928+
#[test]
2929+
fn test_mssql_if_and_go() {
2930+
let sql = r#"
2931+
IF 1 = 2
2932+
SELECT 3;
2933+
GO
2934+
"#;
2935+
let statements = ms().parse_sql_statements(sql).unwrap();
2936+
assert_eq!(2, statements.len());
2937+
assert_eq!(
2938+
statements[0],
2939+
Statement::If(IfStatement {
2940+
if_block: ConditionalStatementBlock {
2941+
start_token: AttachedToken(TokenWithSpan::wrap(sqlparser::tokenizer::Token::Word(
2942+
sqlparser::tokenizer::Word {
2943+
value: "IF".to_string(),
2944+
quote_style: None,
2945+
keyword: Keyword::IF
2946+
}
2947+
))),
2948+
condition: Some(Expr::BinaryOp {
2949+
left: Box::new(Expr::Value((number("1")).with_empty_span())),
2950+
op: sqlparser::ast::BinaryOperator::Eq,
2951+
right: Box::new(Expr::Value((number("2")).with_empty_span())),
2952+
}),
2953+
then_token: None,
2954+
conditional_statements: ConditionalStatements::Sequence {
2955+
statements: vec![Statement::Query(Box::new(Query {
2956+
with: None,
2957+
limit_clause: None,
2958+
fetch: None,
2959+
locks: vec![],
2960+
for_clause: None,
2961+
order_by: None,
2962+
settings: None,
2963+
format_clause: None,
2964+
pipe_operators: vec![],
2965+
body: Box::new(SetExpr::Select(Box::new(Select {
2966+
select_token: AttachedToken::empty(),
2967+
optimizer_hints: vec![],
2968+
distinct: None,
2969+
select_modifiers: None,
2970+
top: None,
2971+
top_before_distinct: false,
2972+
projection: vec![SelectItem::UnnamedExpr(Expr::Value(
2973+
(number("3")).with_empty_span()
2974+
))],
2975+
exclude: None,
2976+
into: None,
2977+
from: vec![],
2978+
lateral_views: vec![],
2979+
prewhere: None,
2980+
selection: None,
2981+
group_by: GroupByExpr::Expressions(vec![], vec![]),
2982+
cluster_by: vec![],
2983+
distribute_by: vec![],
2984+
sort_by: vec![],
2985+
having: None,
2986+
named_window: vec![],
2987+
window_before_qualify: false,
2988+
qualify: None,
2989+
value_table_mode: None,
2990+
connect_by: vec![],
2991+
flavor: SelectFlavor::Standard,
2992+
}))),
2993+
}))],
2994+
},
2995+
},
2996+
elseif_blocks: vec![],
2997+
else_block: None,
2998+
end_token: None,
2999+
})
3000+
);
3001+
assert_eq!(statements[1], Statement::Go(GoStatement { count: None }));
3002+
}

0 commit comments

Comments
 (0)