Skip to content

Commit d282bc7

Browse files
committed
Cover single statements in skipped SQL tails
Verify that EXPLAIN and CREATE INDEX containing quoted semicolons each retain one original statement. Consumers enforcing one statement per query pattern must not mistake these inputs for batches.
1 parent df2362a commit d282bc7

1 file changed

Lines changed: 28 additions & 0 deletions

File tree

‎parse_test.go‎

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -785,6 +785,34 @@ func TestFloatColumnPrecisionSemicolonDefault(t *testing.T) {
785785
}
786786
}
787787

788+
func TestSkippedTailSingleStatements(t *testing.T) {
789+
for _, input := range []string{
790+
"EXPLAIN SELECT 'a;select 2 --'",
791+
"create index i on t(a) where a = 'x;select 2 --'",
792+
} {
793+
t.Run(input, func(t *testing.T) {
794+
if _, err := Parse(input); err != nil {
795+
t.Fatal(err)
796+
}
797+
queries, statements, err := ParseMultiple(NewStringTokenizer(input))
798+
if err != nil || len(queries) != 1 || len(statements) != 1 || queries[0] != input {
799+
t.Fatalf("want one unchanged statement: %v, %v, %v", queries, statements, err)
800+
}
801+
for _, tokenizer := range []*Tokenizer{NewStringTokenizer(input), NewTokenizer(strings.NewReader(input))} {
802+
if _, err := ParseNext(tokenizer); err != nil {
803+
t.Fatal(err)
804+
}
805+
if tokenizer.Position != len(input)+1 {
806+
t.Errorf("stopped at %d, want EOF at %d", tokenizer.Position, len(input)+1)
807+
}
808+
if _, err := ParseNext(tokenizer); err != io.EOF {
809+
t.Errorf("after single statement: %v, want EOF", err)
810+
}
811+
}
812+
})
813+
}
814+
}
815+
788816
func TestDDLTailSemicolons(t *testing.T) {
789817
for _, prefix := range []string{"create index i on t(", "create table t (列 text check ("} {
790818
for _, expression := range []string{

0 commit comments

Comments
 (0)