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 BINARY_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);
180 char *c = (char *)$3;
182 if (*c == '_') *c = '?';
183 else if(*c == '%') *c = '*';
189 void **ptr = parsedData->insertCondValueAndGetPtr((char*)$1, (char*)$3, opLike);
190 pred = parsedData->insertPredicate((char*) $1, op, ptr);
191 free( $1 ); free($2); free( $3 );
194 | ident OPERATOR ident
196 ComparisionOp op = AllDataType::getComparisionOperator((char*)$2);
198 pred = parsedData->insertPredicate((char*) $1, op, (char*) $3);
199 free( $1 ); free($2); free( $3 );
203 | ident not_opt BETWEEN value AND value
205 void **ptr1 = parsedData->insertCondValueAndGetPtr((char*)$1, (char*)$4);
206 void **ptr2 = parsedData->insertCondValueAndGetPtr((char*)$1, (char*)$6);
207 Predicate *pred1, *pred2, *pred3, *finalPred;
208 pred1 = parsedData->insertPredicate((char*) $1, OpGreaterThanEquals, ptr1);
209 pred2 = parsedData->insertPredicate((char*) $1, OpLessThanEquals, ptr2);
210 finalPred = parsedData->insertPredicate(pred1, OpAnd, pred2);
211 if( $2 == (char*) 1 )
212 finalPred = parsedData->insertPredicate(finalPred, OpNot, NULL);
213 free( $1 ); free( $4 ); free( $6 );
216 | ident not_opt IN '(' invalue_list ')'
218 ListIterator valIter = parsedData->getInValueList().getIterator();
219 FieldValue *value1, *value2;
220 Predicate *pred1, *pred2, *finalPred;
222 if (valIter.hasElement()) {
223 value1 = (FieldValue*) valIter.nextElement();
224 ptr1 = parsedData->insertCondValueAndGetPtr((char*)$1, value1->parsedString);
225 pred1 = parsedData->insertPredicate((char*) $1, OpEquals, ptr1);
228 while (valIter.hasElement()) {
229 value2 = (FieldValue*) valIter.nextElement();
230 ptr2 = parsedData->insertCondValueAndGetPtr((char*)$1, value2->parsedString);
231 pred2 = parsedData->insertPredicate((char*) $1, OpEquals, ptr2);
232 finalPred = parsedData->insertPredicate(pred1, OpOr, pred2);
236 finalPred = parsedData->insertPredicate(finalPred, OpNot, NULL);
250 parsedData->insertField((char*)$1);
255 parsedData->insertField((char*)$3, AGG_MIN);
260 parsedData->insertField((char*)$3, AGG_MAX);
265 parsedData->insertField((char*)$3, AGG_SUM);
270 parsedData->insertField((char*)$3, AGG_AVG);
273 | COUNT '(' ident ')'
275 parsedData->insertField((char*)$3, AGG_COUNT);
280 parsedData->insertField("*", AGG_COUNT);
285 parsedData->insertField((char*)$1);
289 ident: FIELD { $$ = $1; }
291 value: STRING { $$ = $1; }
292 | NUMBER_STRING { $$ = $1; }
293 | BINARY_STRING { $$ = $1; }
294 | DOUBLE { $$ = $1; }
295 | PARAMETER { $$ = $1; }
296 | NULL_VALUE { $$ = (char*) 0; }
299 ddl_statement: CREATE TABLE ident '(' create_defn_list ')' semicolon_opt
301 parsedData->setStmtType(CreateTableStatement);
302 parsedData->setTableName($3);
305 | CREATE INDEX ident ON ident '(' field_list ')' opt_constr_type opt_ind_type semicolon_opt
307 parsedData->setStmtType(CreateIndexStatement);
308 parsedData->setIndexName($3);
309 parsedData->setTableName($5);
315 parsedData->setStmtType(DropTableStatement);
316 parsedData->setTableName($3);
321 parsedData->setStmtType(DropIndexStatement);
322 parsedData->setIndexName($3);
327 | HASH opt_constr_type
329 parsedData->setIndexType(hashIndex);
331 | TREE opt_constr_type
333 parsedData->setIndexType(treeIndex);
337 parsedData->setIndexType(hashIndex);
343 parsedData->setUnique(true);
347 parsedData->setUnique(true);
348 parsedData->setPrimary(true);
352 parsedData->setUnique(false);
353 parsedData->setPrimary(false);
356 create_defn_list: create_defn_list create_defn_list_L
360 create_defn_list_L: ',' create_defn
363 create_defn: field_defn
365 parsedData->insertFldDef();
370 field_defn: field_name field_type size_opt null_expr_opt default_expr_opt
375 parsedData->setFldName($1);
379 | '(' NUMBER_STRING ')'
381 parsedData->setFldLength(atoi($2)+1);
389 parsedData->setDefaultValue($2);
397 parsedData->setFldNotNull(true);
400 constraint_defn: primary_key_constraint
403 primary_key_constraint: PRIMARY KEY '(' field_list ')'
405 parsedData->setPrimary(true);
411 parsedData->setFldType(typeInt);
415 parsedData->setFldType(typeLong);
419 parsedData->setFldType(typeShort);
423 parsedData->setFldType(typeLongLong);
427 parsedData->setFldType(typeByteInt);
431 parsedData->setFldType(typeFloat);
435 parsedData->setFldType(typeDouble);
440 parsedData->setFldType(typeDate);
445 parsedData->setFldType(typeTime);
450 parsedData->setFldType(typeTimeStamp);
455 parsedData->setFldType(typeString);
456 parsedData->setFldLength(2);
461 parsedData->setFldType(typeBinary);
462 parsedData->setFldLength(1);
468 void yyerror(const char* Msg) {
470 fprintf(stderr, "[Parser: %s] %s\n", Msg, yytext);