@@ -55,7 +55,7 @@ func (p *Parser) next() *Token {
55
55
56
56
func (p * Parser ) expect (tok * Token ) error {
57
57
if p .tok == nil {
58
- return NewSyntaxError (tok . Pos , "Expect token %s but got EOF" , tok .Data )
58
+ return NewSyntaxError (- 1 , "Expect token %s but got EOF" , tok .Data )
59
59
}
60
60
if p .tok .Tp != tok .Tp {
61
61
return NewSyntaxError (tok .Pos , "Expect token %s bug got %s" , tok .Data , p .tok .Data )
@@ -145,16 +145,20 @@ func (p *Parser) parseUnaryExpr() (Expression, error) {
145
145
defer func () {
146
146
p .decNestLev ()
147
147
}()
148
+ if p .tok == nil {
149
+ return nil , NewSyntaxError (- 1 , "Unexpected EOF" )
150
+ }
148
151
switch p .tok .Tp {
149
152
case OPERATOR :
150
153
switch p .tok .Data {
151
154
case "!" :
155
+ pos := p .tok .Pos
152
156
p .next ()
153
157
x , err := p .parseUnaryExpr ()
154
158
if err != nil {
155
159
return nil , err
156
160
}
157
- return & NotExpr {Pos : p . tok . Pos , Right : x }, nil
161
+ return & NotExpr {Pos : pos , Right : x }, nil
158
162
}
159
163
}
160
164
return p .parsePrimaryExpr (nil )
@@ -216,7 +220,7 @@ func (p *Parser) parseFieldAccess(pos int, left Expression) (Expression, error)
216
220
return nil , err
217
221
}
218
222
if len (fieldNames ) != 1 {
219
- return nil , NewSyntaxError (p . tok . Pos , "Field access operator should only have on field name" )
223
+ return nil , NewSyntaxError (pos , "Field access operator should only have one field name" )
220
224
}
221
225
return & FieldAccessExpr {Pos : pos , Left : left , FieldName : fieldNames [0 ]}, nil
222
226
}
@@ -408,7 +412,7 @@ func (p *Parser) parseSelect() (*SelectStmt, error) {
408
412
}
409
413
p .exprLev --
410
414
if len (fields ) == 0 && ! allFields {
411
- return nil , NewSyntaxError (p . tok . Pos , "Empty fields in select statement" )
415
+ return nil , NewSyntaxError (pos , "Empty fields in select statement" )
412
416
}
413
417
414
418
if allFields {
@@ -459,7 +463,11 @@ func (p *Parser) parseLimit() (*LimitStmt, error) {
459
463
}
460
464
switch len (exprs ) {
461
465
case 0 :
462
- return nil , NewSyntaxError (p .tok .Pos , "Invalid limit parameters" )
466
+ if p .tok == nil {
467
+ return nil , NewSyntaxError (- 1 , "Invalid limit parameters" )
468
+ } else {
469
+ return nil , NewSyntaxError (p .tok .Pos , "Invalid limit parameters" )
470
+ }
463
471
case 1 :
464
472
ret .Count = int (exprs [0 ].Int )
465
473
case 2 :
@@ -656,21 +664,38 @@ func (p *Parser) Parse() (*SelectStmt, error) {
656
664
if err != nil {
657
665
return nil , err
658
666
}
659
- wherePos = p .tok .Pos
667
+ if p .tok != nil {
668
+ wherePos = p .tok .Pos
669
+ } else {
670
+ return nil , NewSyntaxError (- 1 , "Expect where keyword" )
671
+ }
660
672
p .next ()
661
673
} else {
662
674
if p .tok .Tp != WHERE {
663
675
return nil , NewSyntaxError (p .tok .Pos , "Expect where keyword" )
664
676
}
665
- wherePos = p .tok .Pos
677
+ if p .tok != nil {
678
+ wherePos = p .tok .Pos
679
+ }
666
680
p .next ()
667
681
}
668
682
683
+ if p .tok == nil {
684
+ return nil , NewSyntaxError (- 1 , "Expect where statement" )
685
+ }
686
+
669
687
expr , err := p .parseExpr ()
670
688
if err != nil {
671
689
return nil , err
672
690
}
673
691
692
+ if selectStmt == nil {
693
+ selectStmt = & SelectStmt {
694
+ Fields : nil ,
695
+ AllFields : true ,
696
+ }
697
+ }
698
+
674
699
for p .tok != nil {
675
700
switch p .tok .Tp {
676
701
case ORDER :
@@ -681,6 +706,9 @@ func (p *Parser) Parse() (*SelectStmt, error) {
681
706
if err != nil {
682
707
return nil , err
683
708
}
709
+ if len (orderStmt .Orders ) == 0 {
710
+ return nil , NewSyntaxError (orderStmt .Pos , "Require order by fields" )
711
+ }
684
712
case GROUP :
685
713
if groupByStmt != nil {
686
714
return nil , NewSyntaxError (p .tok .Pos , "Duplicate group by expression" )
@@ -689,6 +717,9 @@ func (p *Parser) Parse() (*SelectStmt, error) {
689
717
if err != nil {
690
718
return nil , err
691
719
}
720
+ if len (groupByStmt .Fields ) == 0 {
721
+ return nil , NewSyntaxError (groupByStmt .Pos , "Require group by fields" )
722
+ }
692
723
case LIMIT :
693
724
if limitStmt != nil {
694
725
return nil , NewSyntaxError (p .tok .Pos , "Duplicate limit expression" )
@@ -717,12 +748,6 @@ func (p *Parser) Parse() (*SelectStmt, error) {
717
748
Pos : wherePos ,
718
749
Expr : expr ,
719
750
}
720
- if selectStmt == nil {
721
- selectStmt = & SelectStmt {
722
- Fields : nil ,
723
- AllFields : true ,
724
- }
725
- }
726
751
selectStmt .Where = whereStmt
727
752
selectStmt .Limit = limitStmt
728
753
selectStmt .Order = orderStmt
0 commit comments