Skip to content

Commit b988cac

Browse files
committed
Fix panic bugs
1 parent 094ad9a commit b988cac

File tree

4 files changed

+43
-15
lines changed

4 files changed

+43
-15
lines changed

query/checker.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -268,5 +268,5 @@ func (e *FieldAccessExpr) Check() error {
268268
return nil
269269
}
270270
}
271-
return NewSyntaxError(e.GetPos(), "Invalid field name")
271+
return NewSyntaxError(e.FieldName.GetPos(), "Invalid field name")
272272
}

query/errors.go

+3
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,9 @@ func (e *ExecuteError) queryError() string {
8787
func outputQueryAndErrPos(query string, pos int, adjust int) string {
8888
tquery := strings.TrimSpace(query)
8989
qlen := len(tquery)
90+
if pos == -1 {
91+
pos = qlen
92+
}
9093
trimLeft := false
9194
trimRight := false
9295
if qlen > 70 {

query/optimizer.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ func (o *Optimizer) buildFinalPlan(t Txn, fp Plan) (FinalPlan, error) {
8282
hasAggr = allInSelect
8383
}
8484
var ffp FinalPlan
85-
if !hasAggr && len(o.stmt.GroupBy.Fields) > 0 {
85+
if !hasAggr && o.stmt.GroupBy != nil && len(o.stmt.GroupBy.Fields) > 0 {
8686
return nil, NewSyntaxError(o.stmt.Pos, "No aggregate fields in select statement")
8787
}
8888
if !hasAggr {

query/parser.go

+38-13
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ func (p *Parser) next() *Token {
5555

5656
func (p *Parser) expect(tok *Token) error {
5757
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)
5959
}
6060
if p.tok.Tp != tok.Tp {
6161
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) {
145145
defer func() {
146146
p.decNestLev()
147147
}()
148+
if p.tok == nil {
149+
return nil, NewSyntaxError(-1, "Unexpected EOF")
150+
}
148151
switch p.tok.Tp {
149152
case OPERATOR:
150153
switch p.tok.Data {
151154
case "!":
155+
pos := p.tok.Pos
152156
p.next()
153157
x, err := p.parseUnaryExpr()
154158
if err != nil {
155159
return nil, err
156160
}
157-
return &NotExpr{Pos: p.tok.Pos, Right: x}, nil
161+
return &NotExpr{Pos: pos, Right: x}, nil
158162
}
159163
}
160164
return p.parsePrimaryExpr(nil)
@@ -216,7 +220,7 @@ func (p *Parser) parseFieldAccess(pos int, left Expression) (Expression, error)
216220
return nil, err
217221
}
218222
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")
220224
}
221225
return &FieldAccessExpr{Pos: pos, Left: left, FieldName: fieldNames[0]}, nil
222226
}
@@ -408,7 +412,7 @@ func (p *Parser) parseSelect() (*SelectStmt, error) {
408412
}
409413
p.exprLev--
410414
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")
412416
}
413417

414418
if allFields {
@@ -459,7 +463,11 @@ func (p *Parser) parseLimit() (*LimitStmt, error) {
459463
}
460464
switch len(exprs) {
461465
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+
}
463471
case 1:
464472
ret.Count = int(exprs[0].Int)
465473
case 2:
@@ -656,21 +664,38 @@ func (p *Parser) Parse() (*SelectStmt, error) {
656664
if err != nil {
657665
return nil, err
658666
}
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+
}
660672
p.next()
661673
} else {
662674
if p.tok.Tp != WHERE {
663675
return nil, NewSyntaxError(p.tok.Pos, "Expect where keyword")
664676
}
665-
wherePos = p.tok.Pos
677+
if p.tok != nil {
678+
wherePos = p.tok.Pos
679+
}
666680
p.next()
667681
}
668682

683+
if p.tok == nil {
684+
return nil, NewSyntaxError(-1, "Expect where statement")
685+
}
686+
669687
expr, err := p.parseExpr()
670688
if err != nil {
671689
return nil, err
672690
}
673691

692+
if selectStmt == nil {
693+
selectStmt = &SelectStmt{
694+
Fields: nil,
695+
AllFields: true,
696+
}
697+
}
698+
674699
for p.tok != nil {
675700
switch p.tok.Tp {
676701
case ORDER:
@@ -681,6 +706,9 @@ func (p *Parser) Parse() (*SelectStmt, error) {
681706
if err != nil {
682707
return nil, err
683708
}
709+
if len(orderStmt.Orders) == 0 {
710+
return nil, NewSyntaxError(orderStmt.Pos, "Require order by fields")
711+
}
684712
case GROUP:
685713
if groupByStmt != nil {
686714
return nil, NewSyntaxError(p.tok.Pos, "Duplicate group by expression")
@@ -689,6 +717,9 @@ func (p *Parser) Parse() (*SelectStmt, error) {
689717
if err != nil {
690718
return nil, err
691719
}
720+
if len(groupByStmt.Fields) == 0 {
721+
return nil, NewSyntaxError(groupByStmt.Pos, "Require group by fields")
722+
}
692723
case LIMIT:
693724
if limitStmt != nil {
694725
return nil, NewSyntaxError(p.tok.Pos, "Duplicate limit expression")
@@ -717,12 +748,6 @@ func (p *Parser) Parse() (*SelectStmt, error) {
717748
Pos: wherePos,
718749
Expr: expr,
719750
}
720-
if selectStmt == nil {
721-
selectStmt = &SelectStmt{
722-
Fields: nil,
723-
AllFields: true,
724-
}
725-
}
726751
selectStmt.Where = whereStmt
727752
selectStmt.Limit = limitStmt
728753
selectStmt.Order = orderStmt

0 commit comments

Comments
 (0)