Skip to content

Commit 12ebccf

Browse files
authored
👍 add limit parser (#7)
* add test * add parser
1 parent 76ababf commit 12ebccf

File tree

3 files changed

+77
-0
lines changed

3 files changed

+77
-0
lines changed

internal/parser/ast/ast.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ type SelectStatement struct {
2626
From *FromStatement
2727
Where *WhereStatement
2828
OrderBy *OrderByStatement
29+
Limit *LimitStatement
2930
}
3031

3132
// ResultStatement node represents a returning expression in a SELECT statement.
@@ -61,12 +62,17 @@ type OrderByStatement struct {
6162
Direction token.TokenType
6263
}
6364

65+
type LimitStatement struct {
66+
Value Expression
67+
}
68+
6469
func (s *SelectStatement) statementNode() {}
6570
func (s *ResultStatement) statementNode() {}
6671
func (s *FromStatement) statementNode() {}
6772
func (s *WhereStatement) statementNode() {}
6873
func (s *CreateTableStatement) statementNode() {}
6974
func (s *OrderByStatement) statementNode() {}
75+
func (s *LimitStatement) statementNode() {}
7076

7177
// IdentExpr node represents an identifier.
7278
type IdentExpr struct {

internal/parser/parser.go

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,11 +69,17 @@ func (p *Parser) parseSelectStatement() (ast.Statement, error) {
6969
return nil, err
7070
}
7171

72+
limit, err := p.parseLimitStatement()
73+
if err != nil {
74+
return nil, err
75+
}
76+
7277
selectStmt := ast.SelectStatement{
7378
Result: result,
7479
From: from,
7580
Where: where,
7681
OrderBy: order,
82+
Limit: limit,
7783
}
7884

7985
return &selectStmt, nil
@@ -271,6 +277,25 @@ func (p *Parser) parseOrderByStatement() (*ast.OrderByStatement, error) {
271277
return &order, nil
272278
}
273279

280+
func (p *Parser) parseLimitStatement() (*ast.LimitStatement, error) {
281+
if p.token.Type != token.LIMIT {
282+
return nil, nil
283+
}
284+
p.nextToken()
285+
286+
value, err := p.parseScalar(token.INT)
287+
if err != nil {
288+
return nil, err
289+
}
290+
291+
p.nextToken()
292+
293+
limit := ast.LimitStatement{
294+
Value: value,
295+
}
296+
return &limit, nil
297+
}
298+
274299
func (p *Parser) parsePrimaryExpr() (ast.Expression, error) {
275300
expr, err := p.parseExpr(LOWEST)
276301
if err != nil {

internal/parser/parser_test.go

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,52 @@ func TestParser_Select(t *testing.T) {
150150
},
151151
},
152152
},
153+
{
154+
input: "SELECT id FROM customers WHERE id = 10 AND name = 'Tom' ORDER BY id ASC LIMIT 99",
155+
stmt: &ast.SelectStatement{
156+
Result: []ast.ResultStatement{
157+
{
158+
Expr: &ast.IdentExpr{
159+
Name: "id",
160+
},
161+
},
162+
},
163+
From: &ast.FromStatement{
164+
Table: "customers",
165+
},
166+
Where: &ast.WhereStatement{
167+
Expr: &ast.ConditionExpr{
168+
Left: &ast.ConditionExpr{
169+
Left: &ast.IdentExpr{Name: "id"},
170+
Operator: token.EQ,
171+
Right: &ast.ScalarExpr{
172+
Type: token.INT,
173+
Literal: "10",
174+
},
175+
},
176+
Operator: token.AND,
177+
Right: &ast.ConditionExpr{
178+
Left: &ast.IdentExpr{Name: "name"},
179+
Operator: token.EQ,
180+
Right: &ast.ScalarExpr{
181+
Type: token.TEXT,
182+
Literal: "Tom",
183+
},
184+
},
185+
},
186+
},
187+
OrderBy: &ast.OrderByStatement{
188+
Column: "id",
189+
Direction: token.ASC,
190+
},
191+
Limit: &ast.LimitStatement{
192+
Value: &ast.ScalarExpr{
193+
Type: token.INT,
194+
Literal: "99",
195+
},
196+
},
197+
},
198+
},
153199
}
154200

155201
for _, test := range tests {

0 commit comments

Comments
 (0)