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 IN 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 FLOAT_TYPE TINYINT_TYPE
28 %token <stringval> MIN MAX AVG SUM COUNT GROUP BY
29 %token ';' ',' '(' ')'
30 %type <stringval> ident field value not_opt
31 %type <predicate> conditions condition
34 command: select_statement { YYACCEPT; }
35 | insert_statement { YYACCEPT; }
36 | delete_statement { YYACCEPT; }
37 | update_statement { YYACCEPT; }
38 | ddl_statement { YYACCEPT; }
41 select_statement: SELECT field_list FROM ident where_clause_opt group_by_opt semicolon_opt
43 parsedData->setStmtType(SelectStatement);
44 parsedData->setTableName($4);
49 field_list: field_list field_list_L
52 field_list_L: ',' field
55 insert_statement: INSERT INTO ident field_list_opt VALUES '(' value_list ')' semicolon_opt
57 parsedData->setStmtType(InsertStatement);
58 parsedData->setTableName($3);
67 value_list: value_list value_list_L
70 parsedData->insertValue((char*)$1);
74 value_list_L: ',' value
76 parsedData->insertValue((char*)$2);
81 invalue_list: invalue_list invalue_list_L
84 parsedData->insertInValue((char*)$1);
88 invalue_list_L: ',' value
90 parsedData->insertInValue((char*)$2);
95 delete_statement: DELETE FROM ident where_clause_opt semicolon_opt
97 parsedData->setStmtType(DeleteStatement);
98 parsedData->setTableName($3);
103 update_statement: UPDATE ident SET assign_list where_clause_opt semicolon_opt
105 parsedData->setStmtType(UpdateStatement);
106 parsedData->setTableName($2);
115 assign_list: assign_list assign_list_L
119 assign_list_L: ',' assign_stmt
121 assign_stmt: ident OPERATOR value
123 parsedData->insertUpdateValue( (char*) $1, (char*) $3);
124 free( $1 ); free($2);free( $3 );
128 where_clause_opt: WHERE conditions
131 group_by_opt: GROUP BY group_field_list
134 group_field_list: group_field_list group_field_list_L
137 group_field_list_L: ',' group_field
141 parsedData->insertGroupField((char*)$1);
145 conditions: conditions AND conditions
148 pred = parsedData->insertPredicate((Predicate*) $1, OpAnd, (Predicate*) $3);
149 parsedData->setCondition((Predicate*)pred);
153 | conditions OR conditions
156 pred = parsedData->insertPredicate((Predicate*) $1, OpOr, (Predicate*) $3);
157 parsedData->setCondition((Predicate*)pred);
163 pred = parsedData->insertPredicate((Predicate*) $2, OpNot, NULL);
164 parsedData->setCondition((Predicate*)pred);
167 | '(' conditions ')' { }
170 parsedData->setCondition((Predicate*)$1);
171 //((Predicate*)$1)->print();
175 condition: ident OPERATOR value
177 ComparisionOp op = AllDataType::getComparisionOperator((char*)$2);
179 void **ptr = parsedData->insertCondValueAndGetPtr((char*)$1, (char*)$3);
180 pred = parsedData->insertPredicate((char*) $1, op, ptr);
181 free( $1 ); free($2); free( $3 );
184 | ident OPERATOR ident
186 ComparisionOp op = AllDataType::getComparisionOperator((char*)$2);
188 pred = parsedData->insertPredicate((char*) $1, op, (char*) $3);
189 free( $1 ); free($2); free( $3 );
193 | ident not_opt BETWEEN value AND value
195 void **ptr1 = parsedData->insertCondValueAndGetPtr((char*)$1, (char*)$4);
196 void **ptr2 = parsedData->insertCondValueAndGetPtr((char*)$1, (char*)$6);
197 Predicate *pred1, *pred2, *pred3, *finalPred;
198 pred1 = parsedData->insertPredicate((char*) $1, OpGreaterThanEquals, ptr1);
199 pred2 = parsedData->insertPredicate((char*) $1, OpLessThanEquals, ptr2);
200 finalPred = parsedData->insertPredicate(pred1, OpAnd, pred2);
201 if( $2 == (char*) 1 )
202 finalPred = parsedData->insertPredicate(finalPred, OpNot, NULL);
203 free( $1 ); free( $4 ); free( $6 );
206 | ident not_opt IN '(' invalue_list ')'
208 ListIterator valIter = parsedData->getInValueList().getIterator();
209 FieldValue *value1, *value2;
210 Predicate *pred1, *pred2, *finalPred;
212 if (valIter.hasElement()) {
213 value1 = (FieldValue*) valIter.nextElement();
214 ptr1 = parsedData->insertCondValueAndGetPtr((char*)$1, value1->parsedString);
215 pred1 = parsedData->insertPredicate((char*) $1, OpEquals, ptr1);
218 while (valIter.hasElement()) {
219 value2 = (FieldValue*) valIter.nextElement();
220 ptr2 = parsedData->insertCondValueAndGetPtr((char*)$1, value2->parsedString);
221 pred2 = parsedData->insertPredicate((char*) $1, OpEquals, ptr2);
222 finalPred = parsedData->insertPredicate(pred1, OpOr, pred2);
226 finalPred = parsedData->insertPredicate(finalPred, OpNot, NULL);
240 parsedData->insertField((char*)$1);
245 parsedData->insertField((char*)$3, AGG_MIN);
250 parsedData->insertField((char*)$3, AGG_MAX);
255 parsedData->insertField((char*)$3, AGG_SUM);
260 parsedData->insertField((char*)$3, AGG_AVG);
263 | COUNT '(' ident ')'
265 parsedData->insertField((char*)$3, AGG_COUNT);
270 parsedData->insertField((char*)$1);
274 ident: FIELD { $$ = $1; }
276 value: STRING { $$ = $1; }
277 | NUMBER_STRING { $$ = $1; }
278 | BINARY_STRING { $$ = $1; }
279 | DOUBLE { $$ = $1; }
280 | PARAMETER { $$ = $1; }
281 | NULL_VALUE { $$ = (char*) 0; }
284 ddl_statement: CREATE TABLE ident '(' create_defn_list ')' semicolon_opt
286 parsedData->setStmtType(CreateTableStatement);
287 parsedData->setTableName($3);
290 | CREATE INDEX ident ON ident '(' field_list ')' opt_constr_type opt_ind_type semicolon_opt
292 parsedData->setStmtType(CreateIndexStatement);
293 parsedData->setIndexName($3);
294 parsedData->setTableName($5);
300 parsedData->setStmtType(DropTableStatement);
301 parsedData->setTableName($3);
306 parsedData->setStmtType(DropIndexStatement);
307 parsedData->setIndexName($3);
312 | HASH opt_constr_type
314 parsedData->setIndexType(hashIndex);
316 | TREE opt_constr_type
318 parsedData->setIndexType(treeIndex);
322 parsedData->setIndexType(hashIndex);
328 parsedData->setUnique(true);
332 parsedData->setUnique(true);
333 parsedData->setPrimary(true);
337 parsedData->setUnique(false);
338 parsedData->setPrimary(false);
341 create_defn_list: create_defn_list create_defn_list_L
345 create_defn_list_L: ',' create_defn
348 create_defn: field_defn
350 parsedData->insertFldDef();
355 field_defn: field_name field_type size_opt null_expr_opt default_expr_opt
360 parsedData->setFldName($1);
364 | '(' NUMBER_STRING ')'
366 parsedData->setFldLength(atoi($2)+1);
374 parsedData->setDefaultValue($2);
382 parsedData->setFldNotNull(true);
385 constraint_defn: primary_key_constraint
388 primary_key_constraint: PRIMARY KEY '(' field_list ')'
390 parsedData->setPrimary(true);
396 parsedData->setFldType(typeInt);
400 parsedData->setFldType(typeLong);
404 parsedData->setFldType(typeShort);
408 parsedData->setFldType(typeLongLong);
412 parsedData->setFldType(typeByteInt);
416 parsedData->setFldType(typeFloat);
420 parsedData->setFldType(typeDouble);
425 parsedData->setFldType(typeDate);
430 parsedData->setFldType(typeTime);
435 parsedData->setFldType(typeTimeStamp);
440 parsedData->setFldType(typeString);
441 parsedData->setFldLength(2);
447 void yyerror(const char* Msg) {
449 fprintf(stderr, "[Parser: %s] %s\n", Msg, yytext);