7 ParsedData *parsedData;
10 void yyerror(const char* Msg);
27 %token <stringval> STRING FIELD NUMBER_STRING BINARY_STRING DOUBLE OPERATOR PARAMETER ALLTABLE DESCRIBE PRIMARYINFO AUTO_INCREMENT GETCATALOGS GETDATATYPES GETTABLETYPES IMPORTEDKEY EXPORTEDKEY
28 %token <stringval> SELECT FROM WHERE BETWEEN IN AND OR NOT AS LIMIT OFFSET INNER OUTER CROSS JOIN LEFT IS
29 %token <stringval> INSERT INTO VALUES EXPLAIN PLAN
30 %token <stringval> DELETE UPDATE SET NULL_VALUE
31 %token <stringval> CREATE TABLE PRIMARY KEY DEFAULT INDEX ON HASH TREE UNIQUE DROP SIZE FOREIGN REFERENCES COMPACT TRUNCATE
32 %token <stringval> CACHE CONDITION FIELDLIST PK DIRECT DSN UNCACHE NOSCHEMA
33 %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 VARCHAR_TYPE
34 %token <stringval> DATE_DIFF DATE_ADD DATE_SUB HOUR MINUTE SECOND YEAR MONTH DAY INTERVAL TIME_DIFF TIME_ADD TIME_SUB TIMESTAMP_DIFF TIMESTAMP_ADD TIMESTAMP_SUB EXTRACT NOW
35 %token <stringval> USER PASSWORD ALTER FLUSH ADD COLUMN MODIFY RENAME TO
36 %token <stringval> MIN MAX AVG SUM COUNT GROUP BY HAVING ORDER ASC DESC DISTINCT
37 %token ';' ',' '(' ')'
38 %type <stringval> ident field value not_opt doub_value num_value
39 /*%type <stringval> foreign_key_constraint foreign_key_create foreign_key_constraint_L*/
40 %type <predicate> conditions condition hconditions hcondition
41 %type <Expression> stmt_exp atom function_opt
42 %type <FunctionType> date_opt time_opt datetime_opt
44 command: select_statement { YYACCEPT; }
45 | insert_statement { YYACCEPT; }
46 | delete_statement { YYACCEPT; }
47 | update_statement { YYACCEPT; }
48 | ddl_statement { YYACCEPT; }
49 | internal_statement { YYACCEPT; }
50 | cache_statement { YYACCEPT; }
51 | copy_table_statement { YYACCEPT; }
52 | user_manager_statement { YYACCEPT; }
53 | management_statement { YYACCEPT; }
54 | alter_statement { YYACCEPT; }
57 alter_statement: ALTER TABLE ident ADD '(' create_defn_list_con ')' semicolon_opt
59 parsedData->setStmtType(AlterStatement);
60 parsedData->setAlterType(ALTERADD);
61 parsedData->setTableName($3);
64 | ALTER TABLE ident DROP COLUMN ident semicolon_opt
66 parsedData->setStmtType(AlterStatement);
67 parsedData->setAlterType(ALTERDROP);
68 parsedData->setTableName($3);
69 parsedData->setIndexName($6);
72 | ALTER TABLE ident MODIFY '(' create_defn ')' semicolon_opt
74 printf(" Not Implemented\n");
78 | RENAME TABLE ident TO ident semicolon_opt
80 parsedData->setStmtType(AlterStatement);
81 parsedData->setAlterType(ALTERTABLERENAME);
82 parsedData->setTableName($3);
83 parsedData->setIndexName($5);
87 | ALTER TABLE ident RENAME COLUMN ident TO ident semicolon_opt
89 parsedData->setStmtType(AlterStatement);
90 parsedData->setAlterType(ALTERFIELDRENAME);
91 parsedData->setTableName($3);
92 parsedData->setIndexName($6);
93 parsedData->setPKTableName($8);
94 free($3); free($5); free($8);
97 management_statement: FLUSH CACHE semicolon_opt
99 parsedData->setStmtType(MgmtStatement);
102 user_manager_statement: CREATE USER ident PASSWORD STRING semicolon_opt
104 parsedData->setStmtType(UserStatement);
105 parsedData->createUserNode((char*)$3,(char*)$5);
109 |DROP USER ident semicolon_opt
111 parsedData->setStmtType(UserStatement);
112 parsedData->dropUserNode((char*)$3);
115 | ALTER USER ident SET PASSWORD STRING semicolon_opt
117 parsedData->setStmtType(UserStatement);
118 parsedData->alterUserNode((char*)$3,(char*)$6);
123 copy_table_statement: CREATE TABLE ident AS SELECT opt_distinct field_list FROM table_list where_clause_opt group_by_opt having_opt order_by_opt limit_opt semicolon_opt
125 parsedData->setStmtType(CopyTableStatement);
126 parsedData->setPKTableName($3);
127 parsedData->setCreateTbl();
130 | INSERT INTO ident AS SELECT opt_distinct field_list FROM table_list where_clause_opt group_by_opt having_opt order_by_opt limit_opt semicolon_opt
132 parsedData->setStmtType(CopyTableStatement);
133 parsedData->setPKTableName($3);
137 internal_statement: COMPACT TABLE ident
139 parsedData->setStmtType(CompactTableStatement);
140 parsedData->setTableName($3);
146 parsedData->setStmtType(MetaStatement);
147 parsedData->setResultSetPlan(GetTables);
151 parsedData->setStmtType(MetaStatement);
152 parsedData->setResultSetPlan(GetColumns);
154 | DESCRIBE INDEX table
156 parsedData->setStmtType(MetaStatement);
157 parsedData->setResultSetPlan(GetIndexes);
162 parsedData->setStmtType(MetaStatement);
163 parsedData->setResultSetPlan(GetPriIndex);
167 parsedData->setStmtType(MetaStatement);
168 parsedData->setResultSetPlan(GetCatalogs);
172 parsedData->setStmtType(MetaStatement);
173 parsedData->setResultSetPlan(GetTableType);
177 parsedData->setStmtType(MetaStatement);
178 parsedData->setResultSetPlan(GetDataType);
182 parsedData->setStmtType(MetaStatement);
183 parsedData->setResultSetPlan(GetImportKey);
187 parsedData->setStmtType(MetaStatement);
188 parsedData->setResultSetPlan(GetExportKey);
191 select_statement: opt_explain SELECT opt_distinct field_list FROM table_list where_clause_opt group_by_opt having_opt order_by_opt limit_opt semicolon_opt
193 parsedData->setStmtType(SelectStatement);
194 parsedData->setCacheWorthy(true);
197 opt_explain: EXPLAIN PLAN
199 parsedData->setExplain();
203 opt_distinct: DISTINCT
205 parsedData->setDistinct();
209 field_list: field_list field_list_L
212 field_list_L: ',' field_with_as
217 parsedData->insertFieldAlias((char*)$3);
221 table_list: table_list table_list_L
225 join_exp: INNER opt_join table ON conditions join_exp
227 parsedData->insertJoinType(INNER_JOIN);
229 Condition *cond = parsedData->getCondition();
230 Predicate *pred = cond->getPredicate();
231 if (pred == NULL) parsedData->setCondition((Predicate*)$5);
234 newPred = parsedData->insertPredicate(pred, OpAnd, (Predicate*)$5);
235 parsedData->setCondition(newPred);
239 | LEFT opt_outer opt_join table ON conditions join_exp
241 parsedData->insertJoinType(LEFT_JOIN);
242 Condition *cond = parsedData->getCondition();
243 Predicate *pred = cond->getPredicate();
244 if (pred == NULL) parsedData->setCondition((Predicate*)$6);
247 newPred = parsedData->insertPredicate(pred, OpAnd, (Predicate*)$6);
248 parsedData->setCondition(newPred);
251 | CROSS opt_join table join_exp
253 parsedData->insertJoinType(INNER_JOIN);
263 table_list_L: ',' table
265 parsedData->insertJoinType(INNER_JOIN);
269 insert_statement: INSERT INTO ident field_list_opt VALUES '(' value_list ')' semicolon_opt
271 parsedData->setStmtType(InsertStatement);
272 parsedData->setTableName($3);
281 value_list: value_list value_list_L
284 parsedData->insertValue((char*)$1);
288 value_list_L: ',' value
290 parsedData->insertValue((char*)$2);
295 invalue_list: invalue_list invalue_list_L
298 parsedData->insertInValue((char*)$1);
302 invalue_list_L: ',' value
304 parsedData->insertInValue((char*)$2);
309 delete_statement: DELETE FROM ident where_clause_opt semicolon_opt
311 parsedData->setStmtType(DeleteStatement);
312 parsedData->setTableName($3);
317 update_statement: UPDATE ident SET assign_list where_clause_opt semicolon_opt
319 parsedData->setStmtType(UpdateStatement);
320 parsedData->setTableName($2);
329 assign_list: assign_list assign_list_L
333 assign_list_L: ',' assign_stmt
335 assign_stmt: ident OPERATOR stmt_exp
337 parsedData->insertUpdateExpression( (char*) $1, (Expression* ) $3);
338 free( $1 ); free($2);
340 | ident OPERATOR value
342 parsedData->insertUpdateValue( (char*) $1, (char*) $3);
343 free( $1 ); free($2);free( $3 );
345 | ident OPERATOR NULL_VALUE
347 parsedData->insertUpdateValue( (char*) $1, (char*) $3);
348 free( $1 ); free($2);free( $3 );
351 stmt_exp: stmt_exp '/' stmt_exp
354 exp=parsedData->insertExpression((Expression *)$1, division, (Expression *)$3);
357 | stmt_exp '%' stmt_exp
360 exp=parsedData->insertExpression((Expression *)$1, modulus, (Expression *)$3);
363 | stmt_exp '*' stmt_exp
366 exp=parsedData->insertExpression((Expression *)$1, multiplication, (Expression *)$3);
369 | stmt_exp '+' stmt_exp
372 exp=parsedData->insertExpression((Expression *)$1, addition, (Expression *)$3);
375 | stmt_exp '-' stmt_exp
378 exp=parsedData->insertExpression((Expression *)$1, subtraction, (Expression *)$3);
385 | '-' stmt_exp %prec UMINUS
389 | '+' stmt_exp %prec UMINUS
396 function_opt: DATE_DIFF '(' atom ',' atom ')'
399 parsedData->setFunctionType(DATEDIFF);
400 exp=parsedData->insertExpression((Expression *)$3, DATEDIFF, (Expression *)$5);
403 | DATE_ADD '(' atom INTERVAL atom date_opt ')'
406 parsedData->setFunctionType((*(FunctionType *)$6));
407 exp=parsedData->insertExpression((Expression *)$3, (*(FunctionType *)$6), (Expression *)$5);
410 | DATE_SUB '(' atom INTERVAL atom date_opt ')'
413 //parsedData->setFunctionType((*(FunctionType *)$6));
414 parsedData->setFunctionType((FunctionType)((int)(*(FunctionType *)$6)+3));
415 exp=parsedData->insertExpression((Expression *)$3, (FunctionType)((int)(*(FunctionType *)$6)+3), (Expression *)$5);
418 | TIME_DIFF '(' atom ',' atom ')'
421 parsedData->setFunctionType(TIMEDIFF);
422 exp=parsedData->insertExpression((Expression *)$3, TIMEDIFF, (Expression *)$5);
425 | TIME_ADD '(' atom INTERVAL atom time_opt ')'
428 parsedData->setFunctionType((*(FunctionType *)$6));
429 exp=parsedData->insertExpression((Expression *)$3, (*(FunctionType *)$6), (Expression *)$5);
432 | TIME_SUB '(' atom INTERVAL atom time_opt ')'
435 parsedData->setFunctionType((FunctionType)((int)(*(FunctionType *)$6)+3));
436 exp=parsedData->insertExpression((Expression *)$3, (FunctionType)((int)(*(FunctionType *)$6)+3), (Expression *)$5);
439 | TIMESTAMP_DIFF '(' datetime_opt ',' atom ',' atom ')'
443 FunctionType val = (*(FunctionType *)$3);
444 if( val == DATEADDWITHYEAR || val == DATEADDWITHMON || val == DATEADDWITHDAY ) diff = 24;
446 parsedData->setFunctionType((FunctionType)((int)(*(FunctionType *)$3+diff)));
447 exp=parsedData->insertExpression((Expression *)$5, (FunctionType)((int)(*(FunctionType *)$3)+diff), (Expression *)$7);
450 | TIMESTAMP_ADD '(' atom INTERVAL atom datetime_opt ')'
453 parsedData->setFunctionType((FunctionType)((int)(*(FunctionType *)$6)+12));
454 exp=parsedData->insertExpression((Expression *)$3, (FunctionType)((int)(*(FunctionType *)$6)+12), (Expression *)$5);
457 | TIMESTAMP_SUB '(' atom INTERVAL atom datetime_opt ')'
460 parsedData->setFunctionType((FunctionType)((int)(*(FunctionType *)$6)+15));
461 exp=parsedData->insertExpression((Expression *)$3, (FunctionType)((int)(*(FunctionType *)$6)+15), (Expression *)$5);
464 | EXTRACT '(' datetime_opt FROM atom ')'
466 FunctionType val = UNKNOWN_FUNCTION;
467 //if((*(FunctionType *)$3) >=8)
468 // val = (FunctionType)((int)(*(FunctionType *)$3)+36);
470 val = (FunctionType)((int)(*(FunctionType *)$3)+30);
472 parsedData->setFunctionType(val);
473 exp=parsedData->insertExpression((Expression *)$5, val,NULL);
476 | DATE_TYPE '(' atom ')'
479 parsedData->setFunctionType(DATEFROMTIMESTAMP);
480 exp=parsedData->insertExpression((Expression *)$3, DATEFROMTIMESTAMP, NULL);
484 | TIME_TYPE '(' atom ')'
487 parsedData->setFunctionType(TIMEFROMTIMESTAMP);
488 exp=parsedData->insertExpression((Expression *)$3, TIMEFROMTIMESTAMP, NULL);
492 datetime_opt: time_opt
494 FunctionType val = *(FunctionType *)$1;
499 FunctionType val = *(FunctionType *)$1;
505 FunctionType val = TIMEADDWITHHOUR;
510 FunctionType val = TIMEADDWITHMIN;
515 FunctionType val = TIMEADDWITHSEC;
521 FunctionType val = DATEADDWITHYEAR;
526 FunctionType val = DATEADDWITHMON;
531 FunctionType val = DATEADDWITHDAY;
538 exp=parsedData->insertExpression((char *)$1);
546 exp=parsedData->insertExpression((char *)$1, flag);
553 exp=parsedData->insertExpression("NULL");
559 where_clause_opt: WHERE conditions
561 parsedData->setCondition((Predicate*)$2);
565 group_by_opt: GROUP BY group_field_list
568 order_by_opt: ORDER BY order_field_list
571 limit_opt: LIMIT NUMBER_STRING
573 parsedData->setLimit(atoi($2), 0);
575 | LIMIT NUMBER_STRING OFFSET NUMBER_STRING
577 parsedData->setLimit(atoi($2), atoi($4));
581 having_opt: HAVING hconditions
584 group_field_list: group_field_list group_field_list_L
587 group_field_list_L: ',' group_field
591 parsedData->insertGroupField((char*)$1);
595 order_field_list: order_field_list order_field_list_L
598 order_field_list_L: ',' order_field
602 parsedData->insertOrderByField((char*)$1);
607 parsedData->insertOrderByField((char*)$1);
612 parsedData->insertOrderByField((char*)$1, true);
616 conditions: conditions OR conditions
619 pred = parsedData->insertPredicate((Predicate*) $1, OpOr, (Predicate*) $3);
620 //parsedData->setCondition((Predicate*)pred);
624 | conditions AND conditions
627 pred = parsedData->insertPredicate((Predicate*) $1, OpAnd, (Predicate*) $3);
628 //parsedData->setCondition((Predicate*)pred);
631 | '(' conditions ')' { $$=$2; }
632 | NOT '(' conditions ')'
635 pred = parsedData->insertPredicate((Predicate*) $3, OpNot, NULL);
636 //parsedData->setCondition((Predicate*)pred);
642 if( $1 == (char*) 1 )
645 pred = parsedData->insertPredicate((Predicate*) $2, OpNot, NULL);
646 //parsedData->setCondition((Predicate*)pred);
651 //parsedData->setCondition((Predicate*)$2);
656 hconditions: hconditions OR hconditions
659 pred = parsedData->insertPredicate((Predicate*) $1, OpOr, (Predicate*) $3);
660 parsedData->setHavingCondition((Predicate*)pred);
664 | hconditions AND hconditions
667 pred = parsedData->insertPredicate((Predicate*) $1, OpAnd, (Predicate*) $3);
668 parsedData->setHavingCondition((Predicate*)pred);
671 | '(' hconditions ')' { $$=$2; }
672 | NOT '(' hconditions ')'
675 pred = parsedData->insertPredicate((Predicate*) $3, OpNot, NULL);
676 parsedData->setHavingCondition((Predicate*)pred);
682 if( $1 == (char*) 1 )
685 pred = parsedData->insertPredicate((Predicate*) $2, OpNot, NULL);
686 parsedData->setHavingCondition((Predicate*)pred);
691 parsedData->setHavingCondition((Predicate*)$2);
696 hcondition: MIN '(' ident ')' OPERATOR value
698 ComparisionOp op = AllDataType::getComparisionOperator((char*)$5);
700 void **ptr = parsedData->insertCondValueAndGetPtr((char*)$3, (char*)$6, false, AGG_MIN, true);
701 pred = parsedData->insertPredicate((char*) $3, op, ptr, AGG_MIN);
702 free( $1 ); free ($3); free ($5); free ($6);
705 | MAX '(' ident ')' OPERATOR value
707 ComparisionOp op = AllDataType::getComparisionOperator((char*)$5);
709 void **ptr = parsedData->insertCondValueAndGetPtr((char*)$3, (char*)$6, false, AGG_MAX, true);
710 pred = parsedData->insertPredicate((char*) $3, op, ptr, AGG_MAX);
711 free( $1 ); free ($3); free ($5); free ($6);
714 | SUM '(' ident ')' OPERATOR value
716 ComparisionOp op = AllDataType::getComparisionOperator((char*)$5);
718 void **ptr = parsedData->insertCondValueAndGetPtr((char*)$3, (char*)$6, false, AGG_SUM, true);
719 pred = parsedData->insertPredicate((char*) $3, op, ptr, AGG_SUM);
720 free( $1 ); free ($3); free ($5); free ($6);
723 | AVG '(' ident ')' OPERATOR value
725 ComparisionOp op = AllDataType::getComparisionOperator((char*)$5);
727 void **ptr = parsedData->insertCondValueAndGetPtr((char*)$3, (char*)$6, false, AGG_AVG, true);
728 pred = parsedData->insertPredicate((char*) $3, op, ptr, AGG_AVG);
729 free( $1 ); free ($3); free ($5); free ($6);
732 | COUNT '(' ident ')' OPERATOR value
734 ComparisionOp op = AllDataType::getComparisionOperator((char*)$5);
736 void **ptr = parsedData->insertCondValueAndGetPtr((char*)$3, (char*)$6, false, AGG_COUNT, true);
737 pred = parsedData->insertPredicate((char*) $3, op, ptr, AGG_COUNT);
738 free( $1 ); free ($3); free ($5); free ($6);
743 condition: ident OPERATOR value
745 ComparisionOp op = AllDataType::getComparisionOperator((char*)$2);
748 char *c = (char *)$3;
749 //if (*c == '%' && *(c+1) == '\0')
750 Util::changeWildcardChar(c);
754 void **ptr = parsedData->insertCondValueAndGetPtr((char*)$1, (char*)$3, opLike);
755 pred = parsedData->insertPredicate((char*) $1, op, ptr);
756 free( $1 ); free($2); free( $3 );
759 | ident OPERATOR ident
761 ComparisionOp op = AllDataType::getComparisionOperator((char*)$2);
763 parsedData->insertCondValue((char*) $1);
764 parsedData->insertCondValue((char*) $3);
765 pred = parsedData->insertPredicate((char*) $1, op, (char*) $3);
766 free( $1 ); free($2); free( $3 );
770 | ident not_opt BETWEEN value AND value
772 void **ptr1 = parsedData->insertCondValueAndGetPtr((char*)$1, (char*)$4);
773 void **ptr2 = parsedData->insertCondValueAndGetPtr((char*)$1, (char*)$6);
774 Predicate *finalPred;
775 // pred1 = parsedData->insertPredicate((char*) $1, OpGreaterThanEquals, ptr1);
776 // pred2 = parsedData->insertPredicate((char*) $1, OpLessThanEquals, ptr2);
777 finalPred = parsedData->insertBetPredicate((char*) $1,
778 OpGreaterThanEquals, ptr1, OpLessThanEquals, ptr2);
779 //OpLessThanEquals, ptr2, OpGreaterThanEquals, ptr1);
781 if( $2 == (char*) 1 )
782 finalPred = parsedData->insertPredicate(finalPred, OpNot, NULL);
783 free( $1 ); free( $4 ); free( $6 );
786 | ident not_opt IN '(' invalue_list ')'
788 ListIterator valIter = parsedData->getInValueList().getIterator();
789 FieldValue *value1, *value2;
790 Predicate *pred1, *pred2, *finalPred;
792 if (valIter.hasElement()) {
793 value1 = (FieldValue*) valIter.nextElement();
794 ptr1 = parsedData->insertCondValueAndGetPtr((char*)$1, value1->parsedString);
795 pred1 = parsedData->insertPredicate((char*) $1, OpEquals, ptr1);
798 while (valIter.hasElement()) {
799 value2 = (FieldValue*) valIter.nextElement();
800 ptr2 = parsedData->insertCondValueAndGetPtr((char*)$1, value2->parsedString);
801 pred2 = parsedData->insertPredicate((char*) $1, OpEquals, ptr2);
802 finalPred = parsedData->insertPredicate(pred1, OpOr, pred2);
806 finalPred = parsedData->insertPredicate(finalPred, OpNot, NULL);
811 | ident IS NOT NULL_VALUE
814 parsedData->insertCondValue((char*) $1);
815 pred = parsedData->insertNullPredicate((char*) $1, OpIsNull, false);
816 free( $1 ); free($2); free( $3 );
819 | ident IS NULL_VALUE
822 parsedData->insertCondValue((char*) $1);
823 pred = parsedData->insertNullPredicate((char*) $1, OpIsNull, true);
824 free( $1 ); free($2); free( $3 );
827 | function_opt OPERATOR function_opt
829 ComparisionOp op = AllDataType::getComparisionOperator((char*)$2);
831 pred = parsedData->insertPredicate(((Expression*)$1), op, ((Expression*)$3));
835 | function_opt OPERATOR ident
838 ComparisionOp op = AllDataType::getComparisionOperator((char*)$2);
839 parsedData->insertCondValue((char*) $3);
841 pred = parsedData->insertPredicate(((Expression*)$1), op, (char*) $3);
845 | function_opt OPERATOR value
847 ComparisionOp op = AllDataType::getComparisionOperator((char*)$2);
848 void **ptr = parsedData->insertCondValueAndGetPtr((char*)"dummy", (char*)$3, false, AGG_UNKNOWN, false, true);
850 pred = parsedData->insertPredicate(((Expression*)$1), op, ptr);
862 parsedData->insertTableName((char*)$1);
867 parsedData->insertTableName((char*)$1, (char*)$3);
868 free( $1 ); free($3);
872 parsedData->insertTableName((char*)$1, (char*)$2);
873 free( $1 ); free($2);
878 parsedData->insertField((char*)$1);
884 parsedData->insertField((char*)$3, AGG_MIN);
889 parsedData->insertField((char*)$3, AGG_MAX);
894 parsedData->insertField((char*)$3, AGG_SUM);
899 parsedData->insertField((char*)$3, AGG_AVG);
902 | COUNT '(' ident ')'
904 parsedData->insertField((char*)$3, AGG_COUNT);
909 parsedData->insertField("*", AGG_COUNT);
914 parsedData->insertField("*");
918 parsedData->insertField("*");
921 ident: FIELD { $$ = $1; }
922 | '`'FIELD'`' { $$ = $2; }
924 value: STRING { $$ = $1; }
926 | BINARY_STRING { $$ = $1; }
928 | PARAMETER { $$ = $1; }
929 | NULL_VALUE { $$ = (char*) 0; }
932 char *str=(char*)malloc(20);
934 struct tm * timeinfo;
936 timeinfo = localtime ( &rawtime );
937 sprintf(str,"%d-%d-%d %d:%d:%d",timeinfo->tm_year+1900,timeinfo->tm_mon+1,timeinfo->tm_mday,timeinfo->tm_hour,timeinfo->tm_min,timeinfo->tm_sec);
943 num_value: NUMBER_STRING { $$ = $1; }
944 | '-' NUMBER_STRING %prec UMINUS
953 | '+' NUMBER_STRING %prec UMINUS{ $$ = $2; }
955 doub_value : DOUBLE { $$ = $1; }
956 | '-' DOUBLE %prec UMINUS
965 | '+' DOUBLE %prec UMINUS{ $$ = $2; }
967 cache_statement: CACHE TABLE ident cache_opt semicolon_opt
969 if (!Conf::config.useCache())
971 printf("CACHE_TABLE is set to FALSE in csql.conf file.\n");
975 parsedData->setStmtType(CacheTableStatement);
976 parsedData->setTableName($3);
978 | UNCACHE TABLE ident semicolon_opt
980 parsedData->setStmtType(CacheTableStatement);
981 parsedData->setUnCache(true);
982 parsedData->setTableName($3);
985 cache_opt: hcond_cache vcond_cache pk_cache direct_opt dsn_opt no_schema
990 parsedData->setHCondFld(true);
991 parsedData->setHCondition((char*)$2);
997 parsedData->setVCondFld(true);
998 parsedData->setVCondition((char*)$2);
1005 parsedData->setPkFld(true);
1006 parsedData->setIndexName((char*)$2);
1013 parsedData->setDirect(true);
1019 parsedData->setDSN(true);
1020 parsedData->setPKTableName((char*)$2);
1026 parsedData->setNoSchema(true);
1029 ddl_statement: CREATE TABLE ident '(' create_defn_list_con ')' semicolon_opt
1031 parsedData->setStmtType(CreateTableStatement);
1032 parsedData->setTableName($3);
1035 | CREATE INDEX ident ON ident '(' field_list ')' opt_constr_type opt_ind_type opt_bucket semicolon_opt
1037 parsedData->setStmtType(CreateIndexStatement);
1038 parsedData->setIndexName($3);
1039 parsedData->setTableName($5);
1045 parsedData->setStmtType(DropTableStatement);
1046 parsedData->setTableName($3);
1051 parsedData->setStmtType(DropIndexStatement);
1052 parsedData->setIndexName($3);
1055 | TRUNCATE TABLE ident semicolon_opt
1057 parsedData->setStmtType(TruncateStatement);
1058 parsedData->setTableName($3);
1063 | HASH opt_constr_type
1065 parsedData->setIndexType(hashIndex);
1067 | TREE opt_constr_type
1069 parsedData->setIndexType(treeIndex);
1073 parsedData->setIndexType(hashIndex);
1079 parsedData->setUnique(true);
1083 parsedData->setUnique(true);
1084 parsedData->setPrimary(true);
1088 parsedData->setUnique(false);
1089 parsedData->setPrimary(false);
1093 | SIZE NUMBER_STRING
1095 parsedData->setBucketSize(atoi($2));
1099 create_defn_list_con:create_defn_list
1100 |create_defn_list ',' constraint_defn
1102 create_defn_list: create_defn_list create_defn_list_L
1106 create_defn_list_L: ',' create_defn
1109 create_defn: field_defn
1111 parsedData->insertFldDef();
1115 field_defn: field_name field_type size_opt null_expr_opt default_expr_opt auto_increment_key
1120 parsedData->setFldName($1);
1124 | '(' NUMBER_STRING ')'
1126 DbRetVal rv = parsedData->setFldLength(atoi($2));
1128 yyerror("Binary field length < 256");
1139 DbRetVal rv = parsedData->setDefaultValue($2);
1141 yyerror("Invalid Default value.");
1152 parsedData->setFldNotNull(true);
1155 constraint_defn : primary_key_constraint
1156 | foreign_key_constraint
1157 | primary_key_constraint ',' foreign_key_constraint
1159 foreign_key_constraint: foreign_key_constraint foreign_key_constraint_L
1160 | foreign_key_create
1162 foreign_key_constraint_L: ',' foreign_key_create
1164 foreign_key_create: FOREIGN KEY '(' fkField_list ')' REFERENCES ident'(' pkField_list ')'
1166 parsedData->setForeign(true);
1167 parsedData->setPKTableName((char*)$7);
1168 parsedData->insertForeignKeyList();
1171 fkField_list: fkField_list fkField_list_L
1174 fkField_list_L: ',' fkField
1178 parsedData->insertFKField((char*)$1);
1182 pkField_list: pkField_list pkField_list_L
1185 pkField_list_L: ',' pkField
1189 parsedData->insertPKField((char*)$1);
1194 primary_key_constraint: PRIMARY KEY '(' field_list ')' opt_bucket
1196 parsedData->setPrimary(true);
1202 DataType type = parsedData->getFldType();
1205 yyerror("AUTO_INCREMENT KEY can't be created other than INTEGER field ");
1209 DbRetVal ret = parsedData->setAutoIncreament(true);
1211 yyerror("A table should have ony one AUTO_INCREMENT KEY ");
1215 parsedData->setFldNotNull(true);
1216 parsedData->setAutoFldName(parsedData->getFldName());
1217 parsedData->setPrimary(true);
1221 field_type: INT_TYPE
1223 parsedData->setFldType(typeInt);
1227 parsedData->setFldType(typeLong);
1231 parsedData->setFldType(typeShort);
1235 parsedData->setFldType(typeLongLong);
1239 parsedData->setFldType(typeByteInt);
1243 parsedData->setFldType(typeFloat);
1247 parsedData->setFldType(typeDouble);
1252 parsedData->setFldType(typeDate);
1257 parsedData->setFldType(typeTime);
1262 parsedData->setFldType(typeTimeStamp);
1267 parsedData->setFldType(typeString);
1268 parsedData->setFldLength(2);
1273 parsedData->setFldType(typeVarchar);
1274 parsedData->setFldLength(2);
1279 parsedData->setFldType(typeBinary);
1280 parsedData->setFldLength(1);
1286 void yyerror(const char* Msg) {
1288 fprintf(stderr, "[Parser: %s] %s\n", Msg, yytext);