Skip to content

Commit fdaaa77

Browse files
author
Dmitry Voronov
committed
parser improvement: disallow non-identifier table names
even if it's back-quoted. Porting from Vitess. Fixes test cases like this: select from t: <nil>, want syntax error at position 9 near '1' select from t: <nil>, want syntax error at position 9 near ':' select from t: <nil>, want syntax error at position 14 near 'table'
1 parent b5563e5 commit fdaaa77

File tree

2 files changed

+19
-2
lines changed

2 files changed

+19
-2
lines changed

sqlparser/router.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,10 @@
55
package sqlparser
66

77
import (
8-
"github.com/maxencoder/mixer/router"
98
"sort"
109
"strconv"
10+
11+
"github.com/maxencoder/mixer/router"
1112
)
1213

1314
const (

sqlparser/token.go

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -238,7 +238,7 @@ func (tkn *Tokenizer) Scan() (int, []byte) {
238238
case '\'', '"':
239239
return tkn.scanString(ch, STRING)
240240
case '`':
241-
return tkn.scanString(ch, ID)
241+
return tkn.scanLiteralIdentifier()
242242
default:
243243
return LEX_ERROR, []byte{byte(ch)}
244244
}
@@ -266,6 +266,22 @@ func (tkn *Tokenizer) scanIdentifier() (int, []byte) {
266266
return ID, buffer.Bytes()
267267
}
268268

269+
func (tkn *Tokenizer) scanLiteralIdentifier() (int, []byte) {
270+
buffer := bytes.NewBuffer(make([]byte, 0, 8))
271+
buffer.WriteByte(byte(tkn.lastChar))
272+
if !isLetter(tkn.lastChar) {
273+
return LEX_ERROR, buffer.Bytes()
274+
}
275+
for tkn.next(); isLetter(tkn.lastChar) || isDigit(tkn.lastChar); tkn.next() {
276+
buffer.WriteByte(byte(tkn.lastChar))
277+
}
278+
if tkn.lastChar != '`' {
279+
return LEX_ERROR, buffer.Bytes()
280+
}
281+
tkn.next()
282+
return ID, buffer.Bytes()
283+
}
284+
269285
func (tkn *Tokenizer) scanBindVar() (int, []byte) {
270286
buffer := bytes.NewBuffer(make([]byte, 0, 8))
271287
buffer.WriteByte(byte(tkn.lastChar))

0 commit comments

Comments
 (0)