🐛 fix(oracle): 修复过程CASE分割导致执行截断

This commit is contained in:
Syngnat
2026-06-25 13:52:20 +08:00
parent 16a8a763f4
commit f6556f25d5
7 changed files with 277 additions and 0 deletions

View File

@@ -20,6 +20,8 @@ type sqlStreamSplitter struct {
dollarTag string
plsqlDepth int
declareSkips int
plsqlCaseDepth int
skipCaseEnd bool
closedPLSQL bool
}
@@ -136,6 +138,16 @@ func (s *sqlStreamSplitter) Feed(chunk []byte) []string {
s.pending = text[tokenStart:]
break
}
if token == "case" && s.plsqlDepth > 0 {
if s.skipCaseEnd {
s.skipCaseEnd = false
} else {
s.plsqlCaseDepth++
s.closedPLSQL = false
}
} else if token != "case" {
s.skipCaseEnd = false
}
if token == "begin" && s.declareSkips > 0 {
s.declareSkips--
s.closedPLSQL = false
@@ -152,11 +164,20 @@ func (s *sqlStreamSplitter) Feed(chunk []byte) []string {
s.declareSkips++
}
s.closedPLSQL = false
} else if token == "end" && s.plsqlDepth > 0 && s.plsqlCaseDepth > 0 {
s.plsqlCaseDepth--
if nextSQLSignificantToken(text, tokenEnd) == "case" {
s.skipCaseEnd = true
}
s.closedPLSQL = false
} else if token == "end" && s.plsqlDepth > 0 && !isPLSQLControlEnd(text, tokenEnd) {
s.plsqlDepth--
if s.declareSkips > s.plsqlDepth {
s.declareSkips = s.plsqlDepth
}
if s.plsqlCaseDepth > s.plsqlDepth {
s.plsqlCaseDepth = s.plsqlDepth
}
s.closedPLSQL = s.plsqlDepth == 0
}
s.cur.WriteString(text[tokenStart:tokenEnd])