Skip to content

Commit 953009d

Browse files
committed
Add semicolon skipping in trigger/try-catch statement bodies
Fixes parsing of SQL with multiple semicolons before statements in: - CREATE TRIGGER statement body (after AS) - TRY block statements - CATCH block statements Also enables continuous parsing of all statements in trigger body until GO/EOF instead of stopping after first statement. Enables 3 previously failing tests: - SemicolonsBeforeStatementTests2 - CreateTriggerStatementTests - BaselinesCommon_CreateTriggerStatementTests
1 parent 98179f2 commit 953009d

5 files changed

Lines changed: 25 additions & 7 deletions

File tree

parser/marshal.go

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6817,24 +6817,32 @@ func (p *Parser) parseCreateTriggerStatement() (*ast.CreateTriggerStatement, err
68176817
p.nextToken()
68186818
}
68196819

6820-
// Parse statement list
6820+
// Skip leading semicolons
6821+
for p.curTok.Type == TokenSemicolon {
6822+
p.nextToken()
6823+
}
6824+
6825+
// Parse statement list (all statements until GO/EOF)
68216826
stmtList := &ast.StatementList{}
68226827
for p.curTok.Type != TokenEOF {
68236828
// Check for GO or end of batch
68246829
if p.curTok.Type == TokenIdent && strings.ToUpper(p.curTok.Literal) == "GO" {
68256830
break
68266831
}
68276832

6833+
// Skip semicolons between statements
6834+
if p.curTok.Type == TokenSemicolon {
6835+
p.nextToken()
6836+
continue
6837+
}
6838+
68286839
innerStmt, err := p.parseStatement()
68296840
if err != nil {
68306841
return nil, err
68316842
}
68326843
if innerStmt != nil {
68336844
stmtList.Statements = append(stmtList.Statements, innerStmt)
68346845
}
6835-
6836-
// For simple triggers, stop after parsing one statement
6837-
break
68386846
}
68396847
stmt.StatementList = stmtList
68406848

parser/parse_statements.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1165,6 +1165,11 @@ func (p *Parser) parseTryCatchStatement() (*ast.TryCatchStatement, error) {
11651165

11661166
// Parse statements until END TRY
11671167
for p.curTok.Type != TokenEnd && p.curTok.Type != TokenEOF {
1168+
// Skip semicolons
1169+
if p.curTok.Type == TokenSemicolon {
1170+
p.nextToken()
1171+
continue
1172+
}
11681173
s, err := p.parseStatement()
11691174
if err != nil {
11701175
return nil, err
@@ -1194,6 +1199,11 @@ func (p *Parser) parseTryCatchStatement() (*ast.TryCatchStatement, error) {
11941199

11951200
// Parse catch statements until END CATCH
11961201
for p.curTok.Type != TokenEnd && p.curTok.Type != TokenEOF {
1202+
// Skip semicolons
1203+
if p.curTok.Type == TokenSemicolon {
1204+
p.nextToken()
1205+
continue
1206+
}
11971207
s, err := p.parseStatement()
11981208
if err != nil {
11991209
return nil, err
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{"todo": true}
1+
{}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{"todo": true}
1+
{}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{"todo": true}
1+
{}

0 commit comments

Comments
 (0)