7 ParsedData *parsedData;
10 void yyerror(const char* Msg);
26 %token <stringval> STRING FIELD NUMBER_STRING BINARY_STRING DOUBLE OPERATOR PARAMETER
27 %token <stringval> SELECT FROM WHERE BETWEEN IN AND OR NOT
28 %token <stringval> INSERT INTO VALUES
29 %token <stringval> DELETE UPDATE SET NULL_VALUE
30 %token <stringval> CREATE TABLE PRIMARY KEY DEFAULT INDEX ON HASH TREE UNIQUE DROP
31 %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
32 %token <stringval> MIN MAX AVG SUM COUNT GROUP BY
33 %token ';' ',' '(' ')'
34 %type <stringval> ident field value not_opt doub_value num_value
35 %type <predicate> conditions condition
36 %type <Expression> stmt_exp atom
38 command: select_statement { YYACCEPT; }
39 | insert_statement { YYACCEPT; }
40 | delete_statement { YYACCEPT; }
41 | update_statement { YYACCEPT; }
42 | ddl_statement { YYACCEPT; }
45 select_statement: SELECT field_list FROM table_list where_clause_opt group_by_opt semicolon_opt
47 parsedData->setStmtType(SelectStatement);
48 //parsedData->setTableName($4);
53 field_list: field_list field_list_L
56 field_list_L: ',' field
58 table_list: table_list table_list_L
61 table_list_L: ',' table
64 insert_statement: INSERT INTO ident field_list_opt VALUES '(' value_list ')' semicolon_opt
66 parsedData->setStmtType(InsertStatement);
67 parsedData->setTableName($3);
76 value_list: value_list value_list_L
79 parsedData->insertValue((char*)$1);
83 value_list_L: ',' value
85 parsedData->insertValue((char*)$2);
90 invalue_list: invalue_list invalue_list_L
93 parsedData->insertInValue((char*)$1);
97 invalue_list_L: ',' value
99 parsedData->insertInValue((char*)$2);
104 delete_statement: DELETE FROM ident where_clause_opt semicolon_opt
106 parsedData->setStmtType(DeleteStatement);
107 parsedData->setTableName($3);
112 update_statement: UPDATE ident SET assign_list where_clause_opt semicolon_opt
114 parsedData->setStmtType(UpdateStatement);
115 parsedData->setTableName($2);
124 assign_list: assign_list assign_list_L
128 assign_list_L: ',' assign_stmt
130 assign_stmt: ident OPERATOR stmt_exp
132 parsedData->insertUpdateExpression( (char*) $1, (Expression* ) $3);
133 free( $1 ); free($2);
135 | ident OPERATOR value
137 parsedData->insertUpdateValue( (char*) $1, (char*) $3);
138 free( $1 ); free($2);free( $3 );
140 | ident OPERATOR NULL_VALUE
142 parsedData->insertUpdateValue( (char*) $1, (char*) $3);
143 free( $1 ); free($2);free( $3 );
146 stmt_exp: stmt_exp '/' stmt_exp
149 exp=parsedData->insertExpression((Expression *)$1, division, (Expression *)$3);
152 | stmt_exp '%' stmt_exp
155 exp=parsedData->insertExpression((Expression *)$1, modulus, (Expression *)$3);
158 | stmt_exp '*' stmt_exp
161 exp=parsedData->insertExpression((Expression *)$1, multiplication, (Expression *)$3);
164 | stmt_exp '+' stmt_exp
167 exp=parsedData->insertExpression((Expression *)$1, addition, (Expression *)$3);
170 | stmt_exp '-' stmt_exp
173 exp=parsedData->insertExpression((Expression *)$1, subtraction, (Expression *)$3);
180 | '-' stmt_exp %prec UMINUS
184 | '+' stmt_exp %prec UMINUS
193 exp=parsedData->insertExpression((char *)$1);
201 exp=parsedData->insertExpression((char *)$1, flag);
208 exp=parsedData->insertExpression("NULL");
214 where_clause_opt: WHERE conditions
217 group_by_opt: GROUP BY group_field_list
220 group_field_list: group_field_list group_field_list_L
223 group_field_list_L: ',' group_field
227 parsedData->insertGroupField((char*)$1);
231 conditions: conditions OR conditions
234 pred = parsedData->insertPredicate((Predicate*) $1, OpOr, (Predicate*) $3);
235 parsedData->setCondition((Predicate*)pred);
239 | conditions AND conditions
242 pred = parsedData->insertPredicate((Predicate*) $1, OpAnd, (Predicate*) $3);
243 parsedData->setCondition((Predicate*)pred);
246 | '(' conditions ')' { $$=$2; }
247 | NOT '(' conditions ')'
250 pred = parsedData->insertPredicate((Predicate*) $3, OpNot, NULL);
251 parsedData->setCondition((Predicate*)pred);
257 if( $1 == (char*) 1 )
260 pred = parsedData->insertPredicate((Predicate*) $2, OpNot, NULL);
261 parsedData->setCondition((Predicate*)pred);
266 parsedData->setCondition((Predicate*)$2);
271 condition: ident OPERATOR value
273 ComparisionOp op = AllDataType::getComparisionOperator((char*)$2);
276 char *c = (char *)$3;
278 if (*c == '_') *c = '?';
279 else if(*c == '%') *c = '*';
285 void **ptr = parsedData->insertCondValueAndGetPtr((char*)$1, (char*)$3, opLike);
286 pred = parsedData->insertPredicate((char*) $1, op, ptr);
287 free( $1 ); free($2); free( $3 );
290 | ident OPERATOR ident
292 ComparisionOp op = AllDataType::getComparisionOperator((char*)$2);
294 parsedData->insertCondValue((char*) $1);
295 parsedData->insertCondValue((char*) $3);
296 pred = parsedData->insertPredicate((char*) $1, op, (char*) $3);
297 free( $1 ); free($2); free( $3 );
301 | ident not_opt BETWEEN value AND value
303 void **ptr1 = parsedData->insertCondValueAndGetPtr((char*)$1, (char*)$4);
304 void **ptr2 = parsedData->insertCondValueAndGetPtr((char*)$1, (char*)$6);
305 Predicate *finalPred;
306 // pred1 = parsedData->insertPredicate((char*) $1, OpGreaterThanEquals, ptr1);
307 // pred2 = parsedData->insertPredicate((char*) $1, OpLessThanEquals, ptr2);
308 finalPred = parsedData->insertBetPredicate((char*) $1,
309 OpGreaterThanEquals, ptr1, OpLessThanEquals, ptr2);
310 //OpLessThanEquals, ptr2, OpGreaterThanEquals, ptr1);
312 if( $2 == (char*) 1 )
313 finalPred = parsedData->insertPredicate(finalPred, OpNot, NULL);
314 free( $1 ); free( $4 ); free( $6 );
317 | ident not_opt IN '(' invalue_list ')'
319 ListIterator valIter = parsedData->getInValueList().getIterator();
320 FieldValue *value1, *value2;
321 Predicate *pred1, *pred2, *finalPred;
323 if (valIter.hasElement()) {
324 value1 = (FieldValue*) valIter.nextElement();
325 ptr1 = parsedData->insertCondValueAndGetPtr((char*)$1, value1->parsedString);
326 pred1 = parsedData->insertPredicate((char*) $1, OpEquals, ptr1);
329 while (valIter.hasElement()) {
330 value2 = (FieldValue*) valIter.nextElement();
331 ptr2 = parsedData->insertCondValueAndGetPtr((char*)$1, value2->parsedString);
332 pred2 = parsedData->insertPredicate((char*) $1, OpEquals, ptr2);
333 finalPred = parsedData->insertPredicate(pred1, OpOr, pred2);
337 finalPred = parsedData->insertPredicate(finalPred, OpNot, NULL);
351 parsedData->insertTableName((char*)$1);
357 parsedData->insertField((char*)$1);
363 parsedData->insertField((char*)$3, AGG_MIN);
368 parsedData->insertField((char*)$3, AGG_MAX);
373 parsedData->insertField((char*)$3, AGG_SUM);
378 parsedData->insertField((char*)$3, AGG_AVG);
381 | COUNT '(' ident ')'
383 parsedData->insertField((char*)$3, AGG_COUNT);
388 parsedData->insertField("*", AGG_COUNT);
393 parsedData->insertField("*");
396 ident: FIELD { $$ = $1; }
398 value: STRING { $$ = $1; }
400 | BINARY_STRING { $$ = $1; }
402 | PARAMETER { $$ = $1; }
403 | NULL_VALUE { $$ = (char*) 0; }
405 num_value: NUMBER_STRING { $$ = $1; }
406 | '-' NUMBER_STRING %prec UMINUS
415 | '+' NUMBER_STRING %prec UMINUS{ $$ = $2; }
417 doub_value : DOUBLE { $$ = $1; }
418 | '-' DOUBLE %prec UMINUS
427 | '+' DOUBLE %prec UMINUS{ $$ = $2; }
430 ddl_statement: CREATE TABLE ident '(' create_defn_list_con ')' semicolon_opt
432 parsedData->setStmtType(CreateTableStatement);
433 parsedData->setTableName($3);
436 | CREATE INDEX ident ON ident '(' field_list ')' opt_constr_type opt_ind_type semicolon_opt
438 parsedData->setStmtType(CreateIndexStatement);
439 parsedData->setIndexName($3);
440 parsedData->setTableName($5);
446 parsedData->setStmtType(DropTableStatement);
447 parsedData->setTableName($3);
452 parsedData->setStmtType(DropIndexStatement);
453 parsedData->setIndexName($3);
458 | HASH opt_constr_type
460 parsedData->setIndexType(hashIndex);
462 | TREE opt_constr_type
464 parsedData->setIndexType(treeIndex);
468 parsedData->setIndexType(hashIndex);
474 parsedData->setUnique(true);
478 parsedData->setUnique(true);
479 parsedData->setPrimary(true);
483 parsedData->setUnique(false);
484 parsedData->setPrimary(false);
487 create_defn_list_con:create_defn_list
488 |create_defn_list ',' constraint_defn
490 create_defn_list: create_defn_list create_defn_list_L
494 create_defn_list_L: ',' create_defn
497 create_defn: field_defn
499 parsedData->insertFldDef();
503 field_defn: field_name field_type size_opt null_expr_opt default_expr_opt
508 parsedData->setFldName($1);
512 | '(' NUMBER_STRING ')'
514 DbRetVal rv = parsedData->setFldLength(atoi($2)+1);
516 yyerror("Binary field length < 256");
527 parsedData->setDefaultValue($2);
535 parsedData->setFldNotNull(true);
538 constraint_defn: primary_key_constraint
541 primary_key_constraint: PRIMARY KEY '(' field_list ')'
543 parsedData->setPrimary(true);
549 parsedData->setFldType(typeInt);
553 parsedData->setFldType(typeLong);
557 parsedData->setFldType(typeShort);
561 parsedData->setFldType(typeLongLong);
565 parsedData->setFldType(typeByteInt);
569 parsedData->setFldType(typeFloat);
573 parsedData->setFldType(typeDouble);
578 parsedData->setFldType(typeDate);
583 parsedData->setFldType(typeTime);
588 parsedData->setFldType(typeTimeStamp);
593 parsedData->setFldType(typeString);
594 parsedData->setFldLength(2);
599 parsedData->setFldType(typeBinary);
600 parsedData->setFldLength(1);
606 void yyerror(const char* Msg) {
608 fprintf(stderr, "[Parser: %s] %s\n", Msg, yytext);