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);
207 where_clause_opt: WHERE conditions
210 group_by_opt: GROUP BY group_field_list
213 group_field_list: group_field_list group_field_list_L
216 group_field_list_L: ',' group_field
220 parsedData->insertGroupField((char*)$1);
224 conditions: conditions OR conditions
227 pred = parsedData->insertPredicate((Predicate*) $1, OpOr, (Predicate*) $3);
228 parsedData->setCondition((Predicate*)pred);
232 | conditions AND conditions
235 pred = parsedData->insertPredicate((Predicate*) $1, OpAnd, (Predicate*) $3);
236 parsedData->setCondition((Predicate*)pred);
239 | '(' conditions ')' { $$=$2; }
240 | NOT '(' conditions ')'
243 pred = parsedData->insertPredicate((Predicate*) $3, OpNot, NULL);
244 parsedData->setCondition((Predicate*)pred);
250 if( $1 == (char*) 1 )
253 pred = parsedData->insertPredicate((Predicate*) $2, OpNot, NULL);
254 parsedData->setCondition((Predicate*)pred);
259 parsedData->setCondition((Predicate*)$2);
264 condition: ident OPERATOR value
266 ComparisionOp op = AllDataType::getComparisionOperator((char*)$2);
269 char *c = (char *)$3;
271 if (*c == '_') *c = '?';
272 else if(*c == '%') *c = '*';
278 void **ptr = parsedData->insertCondValueAndGetPtr((char*)$1, (char*)$3, opLike);
279 pred = parsedData->insertPredicate((char*) $1, op, ptr);
280 free( $1 ); free($2); free( $3 );
283 | ident OPERATOR ident
285 ComparisionOp op = AllDataType::getComparisionOperator((char*)$2);
287 pred = parsedData->insertPredicate((char*) $1, op, (char*) $3);
288 free( $1 ); free($2); free( $3 );
292 | ident not_opt BETWEEN value AND value
294 void **ptr1 = parsedData->insertCondValueAndGetPtr((char*)$1, (char*)$4);
295 void **ptr2 = parsedData->insertCondValueAndGetPtr((char*)$1, (char*)$6);
296 Predicate *pred1, *pred2, *pred3, *finalPred;
297 pred1 = parsedData->insertPredicate((char*) $1, OpGreaterThanEquals, ptr1);
298 pred2 = parsedData->insertPredicate((char*) $1, OpLessThanEquals, ptr2);
299 finalPred = parsedData->insertPredicate(pred1, OpAnd, pred2);
300 if( $2 == (char*) 1 )
301 finalPred = parsedData->insertPredicate(finalPred, OpNot, NULL);
302 free( $1 ); free( $4 ); free( $6 );
305 | ident not_opt IN '(' invalue_list ')'
307 ListIterator valIter = parsedData->getInValueList().getIterator();
308 FieldValue *value1, *value2;
309 Predicate *pred1, *pred2, *finalPred;
311 if (valIter.hasElement()) {
312 value1 = (FieldValue*) valIter.nextElement();
313 ptr1 = parsedData->insertCondValueAndGetPtr((char*)$1, value1->parsedString);
314 pred1 = parsedData->insertPredicate((char*) $1, OpEquals, ptr1);
317 while (valIter.hasElement()) {
318 value2 = (FieldValue*) valIter.nextElement();
319 ptr2 = parsedData->insertCondValueAndGetPtr((char*)$1, value2->parsedString);
320 pred2 = parsedData->insertPredicate((char*) $1, OpEquals, ptr2);
321 finalPred = parsedData->insertPredicate(pred1, OpOr, pred2);
325 finalPred = parsedData->insertPredicate(finalPred, OpNot, NULL);
339 parsedData->insertTableName((char*)$1);
345 parsedData->insertField((char*)$1);
351 parsedData->insertField((char*)$3, AGG_MIN);
356 parsedData->insertField((char*)$3, AGG_MAX);
361 parsedData->insertField((char*)$3, AGG_SUM);
366 parsedData->insertField((char*)$3, AGG_AVG);
369 | COUNT '(' ident ')'
371 parsedData->insertField((char*)$3, AGG_COUNT);
376 parsedData->insertField("*", AGG_COUNT);
381 parsedData->insertField("*");
384 ident: FIELD { $$ = $1; }
386 value: STRING { $$ = $1; }
388 | BINARY_STRING { $$ = $1; }
390 | PARAMETER { $$ = $1; }
391 | NULL_VALUE { $$ = (char*) 0; }
393 num_value: NUMBER_STRING { $$ = $1; }
394 | '-' NUMBER_STRING %prec UMINUS
403 | '+' NUMBER_STRING %prec UMINUS{ $$ = $2; }
405 doub_value : DOUBLE { $$ = $1; }
406 | '-' DOUBLE %prec UMINUS
415 | '+' DOUBLE %prec UMINUS{ $$ = $2; }
418 ddl_statement: CREATE TABLE ident '(' create_defn_list_con ')' semicolon_opt
420 parsedData->setStmtType(CreateTableStatement);
421 parsedData->setTableName($3);
424 | CREATE INDEX ident ON ident '(' field_list ')' opt_constr_type opt_ind_type semicolon_opt
426 parsedData->setStmtType(CreateIndexStatement);
427 parsedData->setIndexName($3);
428 parsedData->setTableName($5);
434 parsedData->setStmtType(DropTableStatement);
435 parsedData->setTableName($3);
440 parsedData->setStmtType(DropIndexStatement);
441 parsedData->setIndexName($3);
446 | HASH opt_constr_type
448 parsedData->setIndexType(hashIndex);
450 | TREE opt_constr_type
452 parsedData->setIndexType(treeIndex);
456 parsedData->setIndexType(hashIndex);
462 parsedData->setUnique(true);
466 parsedData->setUnique(true);
467 parsedData->setPrimary(true);
471 parsedData->setUnique(false);
472 parsedData->setPrimary(false);
475 create_defn_list_con:create_defn_list
476 |create_defn_list ',' constraint_defn
478 create_defn_list: create_defn_list create_defn_list_L
482 create_defn_list_L: ',' create_defn
485 create_defn: field_defn
487 parsedData->insertFldDef();
491 field_defn: field_name field_type size_opt null_expr_opt default_expr_opt
496 parsedData->setFldName($1);
500 | '(' NUMBER_STRING ')'
502 DbRetVal rv = parsedData->setFldLength(atoi($2)+1);
504 yyerror("Binary field length < 256");
515 parsedData->setDefaultValue($2);
523 parsedData->setFldNotNull(true);
526 constraint_defn: primary_key_constraint
529 primary_key_constraint: PRIMARY KEY '(' field_list ')'
531 parsedData->setPrimary(true);
537 parsedData->setFldType(typeInt);
541 parsedData->setFldType(typeLong);
545 parsedData->setFldType(typeShort);
549 parsedData->setFldType(typeLongLong);
553 parsedData->setFldType(typeByteInt);
557 parsedData->setFldType(typeFloat);
561 parsedData->setFldType(typeDouble);
566 parsedData->setFldType(typeDate);
571 parsedData->setFldType(typeTime);
576 parsedData->setFldType(typeTimeStamp);
581 parsedData->setFldType(typeString);
582 parsedData->setFldLength(2);
587 parsedData->setFldType(typeBinary);
588 parsedData->setFldLength(1);
594 void yyerror(const char* Msg) {
596 fprintf(stderr, "[Parser: %s] %s\n", Msg, yytext);