Skip to content
This repository was archived by the owner on Jan 28, 2021. It is now read-only.

Commit 4dcaf78

Browse files
authored
Fix parsing of quoted identifiers in SHOW CREATE TABLE queries (#737)
Fix parsing of quoted identifiers in SHOW CREATE TABLE queries
2 parents 0966c4b + 0fd62c4 commit 4dcaf78

File tree

2 files changed

+60
-4
lines changed

2 files changed

+60
-4
lines changed

sql/parse/parse_test.go

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1007,9 +1007,15 @@ var fixtures = map[string]sql.Node{
10071007
),
10081008
plan.NewShowCollation(),
10091009
),
1010-
`ROLLBACK`: plan.NewRollback(),
1011-
"SHOW CREATE TABLE `mytable`": plan.NewShowCreateTable("", nil, "mytable"),
1012-
"SHOW CREATE TABLE `mydb`.`mytable`": plan.NewShowCreateTable("mydb", nil, "mytable"),
1010+
`ROLLBACK`: plan.NewRollback(),
1011+
"SHOW CREATE TABLE `mytable`": plan.NewShowCreateTable("", nil, "mytable"),
1012+
"SHOW CREATE TABLE `mydb`.`mytable`": plan.NewShowCreateTable("mydb", nil, "mytable"),
1013+
"SHOW CREATE TABLE `my.table`": plan.NewShowCreateTable("", nil, "my.table"),
1014+
"SHOW CREATE TABLE `my.db`.`my.table`": plan.NewShowCreateTable("my.db", nil, "my.table"),
1015+
"SHOW CREATE TABLE `my``table`": plan.NewShowCreateTable("", nil, "my`table"),
1016+
"SHOW CREATE TABLE `my``db`.`my``table`": plan.NewShowCreateTable("my`db", nil, "my`table"),
1017+
"SHOW CREATE TABLE ````": plan.NewShowCreateTable("", nil, "`"),
1018+
"SHOW CREATE TABLE `.`": plan.NewShowCreateTable("", nil, "."),
10131019
`SELECT '2018-05-01' + INTERVAL 1 DAY`: plan.NewProject(
10141020
[]sql.Expression{expression.NewArithmetic(
10151021
expression.NewLiteral("2018-05-01", sql.Text),

sql/parse/util.go

Lines changed: 51 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,36 @@ func readValidIdentRune(r *bufio.Reader, buf *bytes.Buffer) error {
144144
return nil
145145
}
146146

147+
func readValidQuotedIdentRune(r *bufio.Reader, buf *bytes.Buffer) error {
148+
bs, err := r.Peek(2)
149+
if err != nil {
150+
return err
151+
}
152+
153+
if bs[0] == '`' && bs[1] == '`' {
154+
if _, _, err := r.ReadRune(); err != nil {
155+
return err
156+
}
157+
if _, _, err := r.ReadRune(); err != nil {
158+
return err
159+
}
160+
buf.WriteRune('`')
161+
return nil
162+
}
163+
164+
if bs[0] == '`' && bs[1] != '`' {
165+
return io.EOF
166+
}
167+
168+
if _, _, err := r.ReadRune(); err != nil {
169+
return err
170+
}
171+
172+
buf.WriteByte(bs[0])
173+
174+
return nil
175+
}
176+
147177
func unreadString(r *bufio.Reader, str string) {
148178
nr := *r
149179
r.Reset(io.MultiReader(strings.NewReader(str), &nr))
@@ -169,6 +199,26 @@ func readIdent(ident *string) parseFunc {
169199
}
170200
}
171201

202+
func readQuotedIdent(ident *string) parseFunc {
203+
return func(r *bufio.Reader) error {
204+
var buf bytes.Buffer
205+
if err := readValidQuotedIdentRune(r, &buf); err != nil {
206+
return err
207+
}
208+
209+
for {
210+
if err := readValidQuotedIdentRune(r, &buf); err == io.EOF {
211+
break
212+
} else if err != nil {
213+
return err
214+
}
215+
}
216+
217+
*ident = strings.ToLower(buf.String())
218+
return nil
219+
}
220+
}
221+
172222
func oneOf(options ...string) parseFunc {
173223
return func(r *bufio.Reader) error {
174224
var ident string
@@ -235,7 +285,7 @@ func readQuotableIdent(ident *string) parseFunc {
235285
if nextChar[0] == '`' {
236286
steps = parseFuncs{
237287
expectQuote,
238-
readIdent(ident),
288+
readQuotedIdent(ident),
239289
expectQuote,
240290
}
241291
} else {

0 commit comments

Comments
 (0)