8 ParsedData *parsedData;
11 void yyerror(const char* Msg);
21 %token <stringval> STRING FIELD NUMBER_STRING BINARY_STRING DOUBLE OPERATOR PARAMETER
22 %token <stringval> SELECT FROM WHERE BETWEEN AND OR NOT
23 %token <stringval> STAR
24 %token <stringval> INSERT INTO VALUES
25 %token <stringval> DELETE UPDATE SET NULL_VALUE
26 %token <stringval> CREATE TABLE PRIMARY KEY DEFAULT INDEX ON HASH TREE UNIQUE DROP
27 %token <stringval> INT_TYPE LONG_TYPE SHORT_TYPE DOUBLE_TYPE TIMESTAMP_TYPE DATE_TYPE CHAR_TYPE TIME_TYPE BIGINT_TYPE
28 %token ';' ',' '(' ')'
29 %type <stringval> ident field value not_opt
30 %type <predicate> conditions condition
33 command: select_statement { YYACCEPT; }
34 | insert_statement { YYACCEPT; }
35 | delete_statement { YYACCEPT; }
36 | update_statement { YYACCEPT; }
37 | ddl_statement { YYACCEPT; }
40 select_statement: SELECT field_list FROM ident where_clause_opt semicolon_opt
42 parsedData->setStmtType(SelectStatement);
43 parsedData->setTableName($4);
48 field_list: field_list field_list_L
51 field_list_L: ',' field
54 insert_statement: INSERT INTO ident field_list_opt VALUES '(' value_list ')' semicolon_opt
56 parsedData->setStmtType(InsertStatement);
57 parsedData->setTableName($3);
66 value_list: value_list value_list_L
69 parsedData->insertValue((char*)$1);
73 value_list_L: ',' value
75 parsedData->insertValue((char*)$2);
80 delete_statement: DELETE FROM ident where_clause_opt semicolon_opt
82 parsedData->setStmtType(DeleteStatement);
83 parsedData->setTableName($3);
88 update_statement: UPDATE ident SET assign_list where_clause_opt semicolon_opt
90 parsedData->setStmtType(UpdateStatement);
91 parsedData->setTableName($2);
100 assign_list: assign_list assign_list_L
104 assign_list_L: ',' assign_stmt
106 assign_stmt: ident OPERATOR value
108 parsedData->insertUpdateValue( (char*) $1, (char*) $3);
109 free( $1 ); free( $3 );
113 where_clause_opt: WHERE conditions
117 conditions: conditions AND conditions
120 pred = parsedData->insertPredicate((Predicate*) $1, OpAnd, (Predicate*) $3);
121 parsedData->setCondition((Predicate*)pred);
125 | conditions OR conditions
128 pred = parsedData->insertPredicate((Predicate*) $1, OpOr, (Predicate*) $3);
129 parsedData->setCondition((Predicate*)pred);
135 pred = parsedData->insertPredicate((Predicate*) $2, OpNot, NULL);
136 parsedData->setCondition((Predicate*)pred);
139 | '(' conditions ')' { }
142 parsedData->setCondition((Predicate*)$1);
143 //((Predicate*)$1)->print();
147 condition: ident OPERATOR value
149 ComparisionOp op = AllDataType::getComparisionOperator((char*)$2);
151 void **ptr = parsedData->insertCondValueAndGetPtr((char*)$1, (char*)$3);
152 pred = parsedData->insertPredicate((char*) $1, op, ptr);
153 free( $1 ); free( $3 );
156 | ident OPERATOR ident
158 ComparisionOp op = AllDataType::getComparisionOperator((char*)$2);
160 pred = parsedData->insertPredicate((char*) $1, op, (char*) $3);
161 free( $1 ); free( $3 );
165 | ident not_opt BETWEEN value AND value
167 void **ptr1 = parsedData->insertCondValueAndGetPtr((char*)$1, (char*)$4);
168 void **ptr2 = parsedData->insertCondValueAndGetPtr((char*)$1, (char*)$6);
169 Predicate *pred1, *pred2, *pred3, *finalPred;
170 pred1 = parsedData->insertPredicate((char*) $1, OpGreaterThanEquals, ptr1);
171 pred2 = parsedData->insertPredicate((char*) $1, OpLessThanEquals, ptr2);
172 finalPred = parsedData->insertPredicate(pred1, OpAnd, pred2);
173 if( $2 == (char*) 1 )
174 finalPred = parsedData->insertPredicate(finalPred, OpNot, NULL);
175 free( $1 ); free( $4 ); free( $6 );
187 parsedData->insertField((char*)$1);
192 parsedData->insertField((char*)$1);
196 ident: FIELD { $$ = $1; }
198 value: STRING { $$ = $1; }
199 | NUMBER_STRING { $$ = $1; }
200 | BINARY_STRING { $$ = $1; }
201 | DOUBLE { $$ = $1; }
202 | PARAMETER { $$ = $1; }
203 | NULL_VALUE { $$ = (char*) 0; }
206 ddl_statement: CREATE TABLE ident '(' create_defn_list ')' semicolon_opt
208 parsedData->setStmtType(CreateTableStatement);
209 parsedData->setTableName($3);
212 | CREATE INDEX ident ON ident '(' field_list ')' opt_constr_type opt_ind_type semicolon_opt
214 parsedData->setStmtType(CreateIndexStatement);
215 parsedData->setIndexName($3);
216 parsedData->setTableName($5);
222 parsedData->setStmtType(DropTableStatement);
223 parsedData->setTableName($3);
228 parsedData->setStmtType(DropIndexStatement);
229 parsedData->setIndexName($3);
234 | HASH opt_constr_type
236 parsedData->setIndexType(hashIndex);
238 | TREE opt_constr_type
240 parsedData->setIndexType(treeIndex);
244 parsedData->setIndexType(hashIndex);
250 parsedData->setUnique(true);
254 parsedData->setUnique(true);
255 parsedData->setPrimary(true);
259 parsedData->setUnique(false);
260 parsedData->setPrimary(false);
263 create_defn_list: create_defn_list create_defn_list_L
267 create_defn_list_L: ',' create_defn
270 create_defn: field_defn
272 parsedData->insertFldDef();
277 field_defn: field_name field_type size_opt null_expr_opt default_expr_opt
282 parsedData->setFldName($1);
286 | '(' NUMBER_STRING ')'
288 parsedData->setFldLength(atoi($2));
300 parsedData->setFldNotNull(true);
303 constraint_defn: primary_key_constraint
306 primary_key_constraint: PRIMARY KEY '(' field_list ')'
311 parsedData->setFldType(typeInt);
315 parsedData->setFldType(typeLong);
319 parsedData->setFldType(typeShort);
323 parsedData->setFldType(typeLongLong);
327 parsedData->setFldType(typeFloat);
331 parsedData->setFldType(typeDouble);
336 parsedData->setFldType(typeDate);
341 parsedData->setFldType(typeTime);
346 parsedData->setFldType(typeTimeStamp);
351 parsedData->setFldType(typeString);
357 void yyerror(const char* Msg) {
359 fprintf(stderr, "[Parser: %s] %s\n", Msg, yytext);