Skip to content

Commit a9a8fad

Browse files
authored
Merge pull request #143 from tursodatabase/case-inside-trigger
Handle CASE in trigger
2 parents 236aa1f + 21f3b51 commit a9a8fad

3 files changed

Lines changed: 45 additions & 4 deletions

File tree

.github/workflows/go.yml

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,12 @@ jobs:
4343
run: go vet -v $(go list ./... | grep -v "github.com/tursodatabase/libsql-client-go/sqliteparser$")
4444

4545
- name: Install sqlclosecheck
46-
run: go install github.com/ryanrolds/sqlclosecheck@latest
46+
run: |
47+
if [ "${{ matrix.go }}" = "1.20" ]; then
48+
go install github.com/ryanrolds/sqlclosecheck@v0.5.1
49+
else
50+
go install github.com/ryanrolds/sqlclosecheck@v0.6.0
51+
fi
4752
4853
- name: sqlclosecheck
4954
run: go vet -vettool=${HOME}/go/bin/sqlclosecheck ./...

sqliteparserutils/utils.go

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ func (iterator *StatementIterator) Next() (statement string, extraInfo SplitStat
2727
var (
2828
insideCreateTriggerStmt = false
2929
insideMultilineComment = false
30+
sawTriggerBegin = false
31+
triggerBlockDepth = 0
3032
startPosition = -1
3133
previousToken = iterator.currentToken
3234
)
@@ -47,9 +49,22 @@ func (iterator *StatementIterator) Next() (statement string, extraInfo SplitStat
4749
insideCreateTriggerStmt = atCreateTriggerStart(iterator.tokenizer)
4850
startPosition = iterator.currentToken.GetStart()
4951
} else if insideCreateTriggerStmt {
50-
// extend trigger creation statement to include END token after last semicolon
51-
if iterator.currentToken.GetTokenType() == sqliteparser.SQLiteLexerEND_ {
52-
insideCreateTriggerStmt = false
52+
tokenType := iterator.currentToken.GetTokenType()
53+
if !sawTriggerBegin {
54+
if tokenType == sqliteparser.SQLiteLexerBEGIN_ {
55+
sawTriggerBegin = true
56+
triggerBlockDepth = 1
57+
}
58+
} else {
59+
switch tokenType {
60+
case sqliteparser.SQLiteLexerCASE_:
61+
triggerBlockDepth++
62+
case sqliteparser.SQLiteLexerEND_:
63+
triggerBlockDepth--
64+
if triggerBlockDepth == 0 {
65+
insideCreateTriggerStmt = false
66+
}
67+
}
5368
}
5469
} else if iterator.currentToken.GetTokenType() == sqliteparser.SQLiteLexerSCOL {
5570
// finish current statement (don't forget to consume as we are breaking here)

sqliteparserutils/utils_test.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,27 @@ func TestSplitStatement(t *testing.T) {
163163
stmts: []string{"CREATE TEMP TRIGGER update_updated_at AFTER UPDATE ON users FOR EACH ROW BEGIN UPDATE users SET updated_at = 0 WHERE id = NEW.id; END"},
164164
extraInfo: generateSimpleSplitStatementExtraInfo(sqliteparser.SQLiteLexerEND_),
165165
},
166+
{
167+
name: "CompleteCreateTriggerStatementWithCaseEndInBody",
168+
value: "CREATE TRIGGER my_trigger BEFORE INSERT ON my_table BEGIN SELECT CASE WHEN TRUE THEN FALSE END; END;",
169+
stmts: []string{"CREATE TRIGGER my_trigger BEFORE INSERT ON my_table BEGIN SELECT CASE WHEN TRUE THEN FALSE END; END"},
170+
extraInfo: generateSimpleSplitStatementExtraInfo(sqliteparser.SQLiteLexerSCOL),
171+
},
172+
{
173+
name: "CompleteCreateTriggerStatementWithCaseEndInWhenClause",
174+
value: "CREATE TRIGGER my_trigger BEFORE INSERT ON my_table WHEN CASE WHEN NEW.id > 0 THEN 1 ELSE 0 END = 1 BEGIN SELECT 1; END",
175+
stmts: []string{"CREATE TRIGGER my_trigger BEFORE INSERT ON my_table WHEN CASE WHEN NEW.id > 0 THEN 1 ELSE 0 END = 1 BEGIN SELECT 1; END"},
176+
extraInfo: generateSimpleSplitStatementExtraInfo(sqliteparser.SQLiteLexerEND_),
177+
},
178+
{
179+
name: "CreateTriggerWithCaseEndInWhenClauseFollowedByStatement",
180+
value: "CREATE TRIGGER my_trigger BEFORE INSERT ON my_table WHEN CASE WHEN NEW.id > 0 THEN 1 ELSE 0 END = 1 BEGIN SELECT 1; END; SELECT 2;",
181+
stmts: []string{
182+
"CREATE TRIGGER my_trigger BEFORE INSERT ON my_table WHEN CASE WHEN NEW.id > 0 THEN 1 ELSE 0 END = 1 BEGIN SELECT 1; END",
183+
"SELECT 2",
184+
},
185+
extraInfo: generateSimpleSplitStatementExtraInfo(sqliteparser.SQLiteLexerSCOL),
186+
},
166187
{
167188
name: "IncompleteCreateTriggerStatement",
168189
value: "CREATE TRIGGER update_updated_at AFTER UPDATE ON users FOR EACH ROW BEGIN UPDATE users SET updated_at = 0 WHERE id = NEW.id;",

0 commit comments

Comments
 (0)