File tree Expand file tree Collapse file tree 3 files changed +77
-0
lines changed
Expand file tree Collapse file tree 3 files changed +77
-0
lines changed Original file line number Diff line number Diff 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+
6469func (s * SelectStatement ) statementNode () {}
6570func (s * ResultStatement ) statementNode () {}
6671func (s * FromStatement ) statementNode () {}
6772func (s * WhereStatement ) statementNode () {}
6873func (s * CreateTableStatement ) statementNode () {}
6974func (s * OrderByStatement ) statementNode () {}
75+ func (s * LimitStatement ) statementNode () {}
7076
7177// IdentExpr node represents an identifier.
7278type IdentExpr struct {
Original file line number Diff line number Diff 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+
274299func (p * Parser ) parsePrimaryExpr () (ast.Expression , error ) {
275300 expr , err := p .parseExpr (LOWEST )
276301 if err != nil {
Original file line number Diff line number Diff 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 {
You can’t perform that action at this time.
0 commit comments