diff --git a/src/bison/bison_parser.y b/src/bison/bison_parser.y index 91b9716..e26ef28 100644 --- a/src/bison/bison_parser.y +++ b/src/bison/bison_parser.y @@ -62,12 +62,15 @@ typedef void* yyscan_t; double fval; int64_t ival; char* sval; - uint uintnum; + uint uval; Statement* statement; SelectStatement* select_statement; TableRef* table; Expr* expr; + OrderDescription* order; + OrderType order_type; + LimitDescription* limit; List* slist; List* explist; @@ -79,27 +82,30 @@ typedef void* yyscan_t; /********************************* ** Token Definition *********************************/ -%token SELECT FROM WHERE GROUP BY HAVING +%token SELECT FROM WHERE GROUP BY HAVING ORDER ASC DESC LIMIT %token JOIN ON INNER OUTER LEFT RIGHT CROSS USING NATURAL %token CREATE TABLE DATABASE INDEX %token AS NOT AND OR NULL LIKE %token NAME STRING COMPARISON %token FLOAT %token INT -%token EQUALS NOTEQUALS LESS GREATER LESSEQ GREATEREQ +%token EQUALS NOTEQUALS LESS GREATER LESSEQ GREATEREQ /********************************* ** Non-Terminal types (http://www.gnu.org/software/bison/manual/html_node/Type-Decl.html) *********************************/ -%type statement +%type statement %type select_statement -%type table_name -%type from_clause table_ref table_ref_atomic -%type expr scalar_expr unary_expr binary_expr function_expr star_expr -%type column_name literal -%type comp_expr where_clause -%type expr_list group_clause select_list -%type table_ref_commalist +%type table_name +%type
from_clause table_ref table_ref_atomic +%type expr scalar_expr unary_expr binary_expr function_expr star_expr +%type column_name literal int_literal num_literal +%type comp_expr where_clause +%type expr_list group_clause select_list +%type table_ref_commalist +%type order_by_clause +%type limit_clause +%type order_type /****************************** @@ -152,17 +158,15 @@ statement: // TODO: limit // TODO: order by select_statement: - SELECT select_list from_clause where_clause group_clause + SELECT select_list from_clause where_clause group_clause order_by_clause limit_clause { SelectStatement* s = new SelectStatement(); s->select_list = $2; s->from_table = $3; s->where_clause = $4; s->group_by = $5; - s->having = NULL; // TODO - s->order = NULL; // TODO - s->limit = kNoLimit; // TODO - s->offset = kNoOffset; // TODO + s->order = $6; + s->limit = $7; $$ = s; } ; @@ -190,6 +194,19 @@ group_clause: ; +order_by_clause: + ORDER BY expr order_type { $$ = new OrderDescription($4, $3); } + | /* empty */ { $$ = NULL; } + +order_type: + ASC { $$ = kOrderAsc; } + | DESC { $$ = kOrderDesc; } + | /* empty */ { $$ = kOrderAsc; } + +limit_clause: + LIMIT int_literal { $$ = new LimitDescription($2->ival, kNoOffset); delete $2; } + | /* empty */ { $$ = NULL; } + /****************************** ** Expressions ******************************/ @@ -248,8 +265,16 @@ column_name: literal: STRING { $$ = Expr::makeLiteral($1); } - | FLOAT { $$ = Expr::makeLiteral($1); } - | INT { $$ = Expr::makeLiteral($1); } + | num_literal + ; + +num_literal: + FLOAT { $$ = Expr::makeLiteral($1); } + | int_literal + ; + +int_literal: + INT { $$ = Expr::makeLiteral($1); } ; star_expr: diff --git a/src/lib/Statement.h b/src/lib/Statement.h index 06ec46d..fa350cb 100644 --- a/src/lib/Statement.h +++ b/src/lib/Statement.h @@ -19,9 +19,6 @@ typedef enum { } StatementType; -const int64_t kNoLimit = -1; -const int64_t kNoOffset = -1; - typedef enum { kOrderNone, kOrderAsc, @@ -30,10 +27,19 @@ typedef enum { struct OrderDescription { + OrderDescription(OrderType type, Expr* expr) : type(type), expr(expr) {} OrderType type; Expr* expr; }; +const int64_t kNoLimit = -1; +const int64_t kNoOffset = -1; +struct LimitDescription { + LimitDescription(int64_t limit, int64_t offset) : limit(limit), offset(offset) {} + int64_t limit; + int64_t offset; +}; + typedef enum { kJoinInner, @@ -43,6 +49,8 @@ typedef enum { } JoinType; + + struct Statement { Statement(StatementType type) : type(type) {}; StatementType type; @@ -57,11 +65,9 @@ struct SelectStatement : Statement { Expr* where_clause; List* group_by; - Expr* having; - OrderDescription *order; - int64_t limit; - int64_t offset; + OrderDescription* order; + LimitDescription* limit; };