Skip to content

Commit

Permalink
scanner more safe whitespace skip (#8499)
Browse files Browse the repository at this point in the history
  • Loading branch information
max-hoffman authored Oct 30, 2024
1 parent b4fda6b commit 2fe3344
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 21 deletions.
47 changes: 26 additions & 21 deletions go/cmd/dolt/commands/sql_statement_scanner.go
Original file line number Diff line number Diff line change
Expand Up @@ -96,20 +96,8 @@ func (s *streamScanner) Scan() bool {
}

// discard leading whitespace
for {
if s.i >= s.fill {
if err := s.read(); err != nil {
s.err = err
return false
}
}
if !unicode.IsSpace(rune(s.buf[s.i])) {
break
}
if s.buf[s.i] == '\n' {
s.lineNum++
}
s.i++
if !s.skipWhitespace() {
return false
}
s.truncate()

Expand Down Expand Up @@ -143,6 +131,28 @@ func (s *streamScanner) Scan() bool {
}
}

func (s *streamScanner) skipWhitespace() bool {
for {
if s.i >= s.fill {
if err := s.read(); err != nil {
s.err = err
return false
}
}
if s.isEOF {
return true
}
if !unicode.IsSpace(rune(s.buf[s.i])) {
break
}
if s.buf[s.i] == '\n' {
s.lineNum++
}
s.i++
}
return true
}

func (s *streamScanner) truncate() {
// copy size should be 4k or less
s.state.start = s.i
Expand Down Expand Up @@ -213,13 +223,8 @@ func (s *streamScanner) isDelimiterExpr() (error, bool) {
if s.fill-s.i >= delimPrefixLen && bytes.EqualFold(s.buf[s.i:s.i+delimPrefixLen], delimPrefix) {
delimTokenIdx := s.i
s.i += delimPrefixLen
for ; !s.isEOF && unicode.IsSpace(rune(s.buf[s.i])); s.i++ {
if s.i >= s.fill {
if err := s.read(); err != nil {
s.err = err
return err, false
}
}
if !s.skipWhitespace() {
return nil, false
}
if s.isEOF {
// invalid delimiter
Expand Down
9 changes: 9 additions & 0 deletions go/cmd/dolt/commands/sql_statement_scanner_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -195,6 +195,15 @@ insert into foo values (1,2,3)|`,
},
lineNums: []int{1, 2},
},
{
input: "DELIMITER" + strings.Repeat(" ", 4096) + `|
insert into foo values (1,2,3)|`,
statements: []string{
"",
"insert into foo values (1,2,3)",
},
lineNums: []int{1, 2},
},
}

for _, tt := range testcases {
Expand Down

0 comments on commit 2fe3344

Please sign in to comment.