mirror of
https://github.com/Syngnat/GoNavi.git
synced 2026-07-19 20:02:03 +08:00
🐛 fix(oracle): 修复过程CASE分割导致执行截断
This commit is contained in:
@@ -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])
|
||||
|
||||
Reference in New Issue
Block a user