Skip to content

Commit 6c6d18b

Browse files
committed
Fix parsing and lexing of sql create table expressions
1 parent 261fc1c commit 6c6d18b

File tree

4 files changed

+98
-80
lines changed

4 files changed

+98
-80
lines changed

lex/dialect_sql.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -951,6 +951,10 @@ func LexEngineKeyValue(l *Lexer) StateFn {
951951
l.ConsumeWord(word)
952952
l.Emit(TokenDefault)
953953
return LexEngineKeyValue
954+
case ",":
955+
l.ConsumeWord(word)
956+
l.Emit(TokenComma)
957+
return LexEngineKeyValue
954958
case "=":
955959
return LexExpression
956960
}

lex/lexer.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -708,6 +708,7 @@ func LexMatchClosure(tok TokenType, nextFn StateFn) StateFn {
708708
return nextFn
709709
}
710710
u.Warnf("unexpected token: %v peek:%s", tok, l.PeekX(20))
711+
fmt.Println("Unexpected token:", l.current())
711712
return l.errorToken("Unexpected token:" + l.current())
712713
}
713714
}
@@ -763,6 +764,7 @@ func LexDialectForStatement(l *Lexer) StateFn {
763764
}
764765

765766
}
767+
fmt.Println("Unexpected keyword:", peekWord)
766768
return l.errorToken("un recognized keyword token:" + peekWord)
767769

768770
}

rel/parse_sql.go

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -784,14 +784,18 @@ func (m *Sqlbridge) parseCreate() (*SqlCreate, error) {
784784

785785
// ENGINE
786786
discardComments(m)
787-
if strings.ToLower(m.Cur().V) != "engine" {
788-
return nil, m.ErrMsg("Expected (cols) ENGINE ... ")
789-
}
790-
engine, err := ParseWith(m.SqlTokenPager)
791-
if err != nil {
792-
return nil, err
787+
switch m.Cur().T {
788+
case lex.TokenEngine:
789+
// Engine is Optional
790+
engine, err := ParseWith(m.SqlTokenPager)
791+
if err != nil {
792+
return nil, err
793+
}
794+
req.Engine = engine
795+
case lex.TokenWith:
796+
default:
797+
return nil, m.ErrMsg("Expected (cols) ENGINE | WITH ... ")
793798
}
794-
req.Engine = engine
795799
case lex.TokenSource:
796800
// just with
797801
case lex.TokenSchema:
@@ -2049,18 +2053,20 @@ func (m *Sqlbridge) isEnd() bool {
20492053
}
20502054

20512055
func ParseWith(pg expr.TokenPager) (u.JsonHelper, error) {
2052-
if pg.Cur().T != lex.TokenWith {
2056+
if pg.Cur().T != lex.TokenWith && pg.Cur().T != lex.TokenEngine {
20532057
// This is an optional statement
20542058
return nil, nil
20552059
}
2056-
pg.Next() // consume WITH
2060+
if pg.Cur().T == lex.TokenWith {
2061+
pg.Next()
2062+
}
20572063
jh := make(u.JsonHelper)
20582064
switch pg.Cur().T {
20592065
case lex.TokenLeftBrace: // {
20602066
if err := ParseJsonObject(pg, jh); err != nil {
20612067
return nil, err
20622068
}
2063-
case lex.TokenIdentity:
2069+
case lex.TokenIdentity, lex.TokenEngine:
20642070
// name=value pairs
20652071
if err := ParseKeyValue(pg, jh); err != nil {
20662072
return nil, err
@@ -2252,11 +2258,14 @@ func ParseJsonArray(pg expr.TokenPager) ([]interface{}, error) {
22522258
}
22532259

22542260
func ParseKeyValue(pg expr.TokenPager, jh u.JsonHelper) error {
2255-
if pg.Cur().T != lex.TokenIdentity {
2261+
if pg.Cur().T != lex.TokenEngine && pg.Cur().T != lex.TokenIdentity {
22562262
return pg.ErrMsg("Expected key/identity for key=value, array")
22572263
}
22582264

22592265
for {
2266+
if pg.Cur().T == lex.TokenDefault {
2267+
pg.Next() // consume default
2268+
}
22602269
key := pg.Cur().V
22612270
pg.Next()
22622271

@@ -2305,7 +2314,7 @@ func ParseKeyValue(pg expr.TokenPager, jh u.JsonHelper) error {
23052314
return pg.ErrMsg("Expected value")
23062315
}
23072316
pg.Next() // consume value
2308-
if pg.Cur().T != lex.TokenComma {
2317+
if pg.Cur().T != lex.TokenComma && pg.Cur().T != lex.TokenDefault {
23092318
return nil
23102319
}
23112320
pg.Next() // consume comma

0 commit comments

Comments
 (0)