added limit and order by to grammar
This commit is contained in:
parent
b11e52bd6e
commit
794a17c04c
|
@ -62,12 +62,15 @@ typedef void* yyscan_t;
|
||||||
double fval;
|
double fval;
|
||||||
int64_t ival;
|
int64_t ival;
|
||||||
char* sval;
|
char* sval;
|
||||||
uint uintnum;
|
uint uval;
|
||||||
|
|
||||||
Statement* statement;
|
Statement* statement;
|
||||||
SelectStatement* select_statement;
|
SelectStatement* select_statement;
|
||||||
TableRef* table;
|
TableRef* table;
|
||||||
Expr* expr;
|
Expr* expr;
|
||||||
|
OrderDescription* order;
|
||||||
|
OrderType order_type;
|
||||||
|
LimitDescription* limit;
|
||||||
|
|
||||||
List<char*>* slist;
|
List<char*>* slist;
|
||||||
List<Expr*>* explist;
|
List<Expr*>* explist;
|
||||||
|
@ -79,14 +82,14 @@ typedef void* yyscan_t;
|
||||||
/*********************************
|
/*********************************
|
||||||
** Token Definition
|
** 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 JOIN ON INNER OUTER LEFT RIGHT CROSS USING NATURAL
|
||||||
%token CREATE TABLE DATABASE INDEX
|
%token CREATE TABLE DATABASE INDEX
|
||||||
%token AS NOT AND OR NULL LIKE
|
%token AS NOT AND OR NULL LIKE
|
||||||
%token <sval> NAME STRING COMPARISON
|
%token <sval> NAME STRING COMPARISON
|
||||||
%token <fval> FLOAT
|
%token <fval> FLOAT
|
||||||
%token <ival> INT
|
%token <ival> INT
|
||||||
%token <uintnum> EQUALS NOTEQUALS LESS GREATER LESSEQ GREATEREQ
|
%token <uval> EQUALS NOTEQUALS LESS GREATER LESSEQ GREATEREQ
|
||||||
|
|
||||||
/*********************************
|
/*********************************
|
||||||
** Non-Terminal types (http://www.gnu.org/software/bison/manual/html_node/Type-Decl.html)
|
** Non-Terminal types (http://www.gnu.org/software/bison/manual/html_node/Type-Decl.html)
|
||||||
|
@ -96,10 +99,13 @@ typedef void* yyscan_t;
|
||||||
%type <sval> table_name
|
%type <sval> table_name
|
||||||
%type <table> from_clause table_ref table_ref_atomic
|
%type <table> from_clause table_ref table_ref_atomic
|
||||||
%type <expr> expr scalar_expr unary_expr binary_expr function_expr star_expr
|
%type <expr> expr scalar_expr unary_expr binary_expr function_expr star_expr
|
||||||
%type <expr> column_name literal
|
%type <expr> column_name literal int_literal num_literal
|
||||||
%type <expr> comp_expr where_clause
|
%type <expr> comp_expr where_clause
|
||||||
%type <explist> expr_list group_clause select_list
|
%type <explist> expr_list group_clause select_list
|
||||||
%type <tbllist> table_ref_commalist
|
%type <tbllist> table_ref_commalist
|
||||||
|
%type <order> order_by_clause
|
||||||
|
%type <limit> limit_clause
|
||||||
|
%type <order_type> order_type
|
||||||
|
|
||||||
|
|
||||||
/******************************
|
/******************************
|
||||||
|
@ -152,17 +158,15 @@ statement:
|
||||||
// TODO: limit
|
// TODO: limit
|
||||||
// TODO: order by
|
// TODO: order by
|
||||||
select_statement:
|
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();
|
SelectStatement* s = new SelectStatement();
|
||||||
s->select_list = $2;
|
s->select_list = $2;
|
||||||
s->from_table = $3;
|
s->from_table = $3;
|
||||||
s->where_clause = $4;
|
s->where_clause = $4;
|
||||||
s->group_by = $5;
|
s->group_by = $5;
|
||||||
s->having = NULL; // TODO
|
s->order = $6;
|
||||||
s->order = NULL; // TODO
|
s->limit = $7;
|
||||||
s->limit = kNoLimit; // TODO
|
|
||||||
s->offset = kNoOffset; // TODO
|
|
||||||
$$ = s;
|
$$ = 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
|
** Expressions
|
||||||
******************************/
|
******************************/
|
||||||
|
@ -248,8 +265,16 @@ column_name:
|
||||||
|
|
||||||
literal:
|
literal:
|
||||||
STRING { $$ = Expr::makeLiteral($1); }
|
STRING { $$ = Expr::makeLiteral($1); }
|
||||||
| FLOAT { $$ = Expr::makeLiteral($1); }
|
| num_literal
|
||||||
| INT { $$ = Expr::makeLiteral($1); }
|
;
|
||||||
|
|
||||||
|
num_literal:
|
||||||
|
FLOAT { $$ = Expr::makeLiteral($1); }
|
||||||
|
| int_literal
|
||||||
|
;
|
||||||
|
|
||||||
|
int_literal:
|
||||||
|
INT { $$ = Expr::makeLiteral($1); }
|
||||||
;
|
;
|
||||||
|
|
||||||
star_expr:
|
star_expr:
|
||||||
|
|
|
@ -19,9 +19,6 @@ typedef enum {
|
||||||
} StatementType;
|
} StatementType;
|
||||||
|
|
||||||
|
|
||||||
const int64_t kNoLimit = -1;
|
|
||||||
const int64_t kNoOffset = -1;
|
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
kOrderNone,
|
kOrderNone,
|
||||||
kOrderAsc,
|
kOrderAsc,
|
||||||
|
@ -30,10 +27,19 @@ typedef enum {
|
||||||
|
|
||||||
|
|
||||||
struct OrderDescription {
|
struct OrderDescription {
|
||||||
|
OrderDescription(OrderType type, Expr* expr) : type(type), expr(expr) {}
|
||||||
OrderType type;
|
OrderType type;
|
||||||
Expr* expr;
|
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 {
|
typedef enum {
|
||||||
kJoinInner,
|
kJoinInner,
|
||||||
|
@ -43,6 +49,8 @@ typedef enum {
|
||||||
} JoinType;
|
} JoinType;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
struct Statement {
|
struct Statement {
|
||||||
Statement(StatementType type) : type(type) {};
|
Statement(StatementType type) : type(type) {};
|
||||||
StatementType type;
|
StatementType type;
|
||||||
|
@ -57,11 +65,9 @@ struct SelectStatement : Statement {
|
||||||
Expr* where_clause;
|
Expr* where_clause;
|
||||||
|
|
||||||
List<Expr*>* group_by;
|
List<Expr*>* group_by;
|
||||||
Expr* having;
|
|
||||||
|
|
||||||
OrderDescription *order;
|
OrderDescription* order;
|
||||||
int64_t limit;
|
LimitDescription* limit;
|
||||||
int64_t offset;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue