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);
747 if (op == OpLike) opLike = true;
749 void **ptr = parsedData->insertCondValueAndGetPtr((char*)$1, (char*)$3, opLike);
750 pred = parsedData->insertPredicate((char*) $1, op, ptr);
751 free( $1 ); free($2); free( $3 );
754 | ident OPERATOR ident
756 ComparisionOp op = AllDataType::getComparisionOperator((char*)$2);
758 parsedData->insertCondValue((char*) $1);
759 parsedData->insertCondValue((char*) $3);
760 pred = parsedData->insertPredicate((char*) $1, op, (char*) $3);
761 free( $1 ); free($2); free( $3 );
765 | ident not_opt BETWEEN value AND value
767 void **ptr1 = parsedData->insertCondValueAndGetPtr((char*)$1, (char*)$4);
768 void **ptr2 = parsedData->insertCondValueAndGetPtr((char*)$1, (char*)$6);
769 Predicate *finalPred;
770 // pred1 = parsedData->insertPredicate((char*) $1, OpGreaterThanEquals, ptr1);
771 // pred2 = parsedData->insertPredicate((char*) $1, OpLessThanEquals, ptr2);
772 finalPred = parsedData->insertBetPredicate((char*) $1,
773 OpGreaterThanEquals, ptr1, OpLessThanEquals, ptr2);
774 //OpLessThanEquals, ptr2, OpGreaterThanEquals, ptr1);
776 if( $2 == (char*) 1 )
777 finalPred = parsedData->insertPredicate(finalPred, OpNot, NULL);
778 free( $1 ); free( $4 ); free( $6 );
781 | ident not_opt IN '(' invalue_list ')'
783 ListIterator valIter = parsedData->getInValueList().getIterator();
784 FieldValue *value1, *value2;
785 Predicate *pred1, *pred2, *finalPred;
787 if (valIter.hasElement()) {
788 value1 = (FieldValue*) valIter.nextElement();
789 ptr1 = parsedData->insertCondValueAndGetPtr((char*)$1, value1->parsedString);
790 pred1 = parsedData->insertPredicate((char*) $1, OpEquals, ptr1);
793 while (valIter.hasElement()) {
794 value2 = (FieldValue*) valIter.nextElement();
795 ptr2 = parsedData->insertCondValueAndGetPtr((char*)$1, value2->parsedString);
796 pred2 = parsedData->insertPredicate((char*) $1, OpEquals, ptr2);
797 finalPred = parsedData->insertPredicate(pred1, OpOr, pred2);
801 finalPred = parsedData->insertPredicate(finalPred, OpNot, NULL);
806 | ident IS NOT NULL_VALUE
809 parsedData->insertCondValue((char*) $1);
810 pred = parsedData->insertNullPredicate((char*) $1, OpIsNull, false);
811 free( $1 ); free($2); free( $3 );
814 | ident IS NULL_VALUE
817 parsedData->insertCondValue((char*) $1);
818 pred = parsedData->insertNullPredicate((char*) $1, OpIsNull, true);
819 free( $1 ); free($2); free( $3 );
822 | function_opt OPERATOR function_opt
824 ComparisionOp op = AllDataType::getComparisionOperator((char*)$2);
826 pred = parsedData->insertPredicate(((Expression*)$1), op, ((Expression*)$3));
830 | function_opt OPERATOR ident
833 ComparisionOp op = AllDataType::getComparisionOperator((char*)$2);
834 parsedData->insertCondValue((char*) $3);
836 pred = parsedData->insertPredicate(((Expression*)$1), op, (char*) $3);
840 | function_opt OPERATOR value
842 ComparisionOp op = AllDataType::getComparisionOperator((char*)$2);
843 void **ptr = parsedData->insertCondValueAndGetPtr((char*)"dummy", (char*)$3, false, AGG_UNKNOWN, false, true);
845 pred = parsedData->insertPredicate(((Expression*)$1), op, ptr);
857 parsedData->insertTableName((char*)$1);
862 parsedData->insertTableName((char*)$1, (char*)$3);
863 free( $1 ); free($3);
867 parsedData->insertTableName((char*)$1, (char*)$2);
868 free( $1 ); free($2);
873 parsedData->insertField((char*)$1);
879 parsedData->insertField((char*)$3, AGG_MIN);
884 parsedData->insertField((char*)$3, AGG_MAX);
889 parsedData->insertField((char*)$3, AGG_SUM);
894 parsedData->insertField((char*)$3, AGG_AVG);
897 | COUNT '(' ident ')'
899 parsedData->insertField((char*)$3, AGG_COUNT);
904 parsedData->insertField("*", AGG_COUNT);
909 parsedData->insertField("*");
913 parsedData->insertField("*");
916 ident: FIELD { $$ = $1; }
917 | '`'FIELD'`' { $$ = $2; }
919 value: STRING { $$ = $1; }
921 | BINARY_STRING { $$ = $1; }
923 | PARAMETER { $$ = $1; }
924 | NULL_VALUE { $$ = (char*) 0; }
927 char *str=(char*)malloc(20);
929 struct tm * timeinfo;
931 timeinfo = localtime ( &rawtime );
932 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);
938 num_value: NUMBER_STRING { $$ = $1; }
939 | '-' NUMBER_STRING %prec UMINUS
948 | '+' NUMBER_STRING %prec UMINUS{ $$ = $2; }
950 doub_value : DOUBLE { $$ = $1; }
951 | '-' DOUBLE %prec UMINUS
960 | '+' DOUBLE %prec UMINUS{ $$ = $2; }
962 cache_statement: CACHE TABLE ident cache_opt semicolon_opt
964 if (!Conf::config.useCache())
966 printf("CACHE_TABLE is set to FALSE in csql.conf file.\n");
970 parsedData->setStmtType(CacheTableStatement);
971 parsedData->setTableName($3);
973 | UNCACHE TABLE ident semicolon_opt
975 parsedData->setStmtType(CacheTableStatement);
976 parsedData->setUnCache(true);
977 parsedData->setTableName($3);
980 cache_opt: hcond_cache vcond_cache pk_cache direct_opt dsn_opt no_schema
985 parsedData->setHCondFld(true);
986 parsedData->setHCondition((char*)$2);
992 parsedData->setVCondFld(true);
993 parsedData->setVCondition((char*)$2);
1000 parsedData->setPkFld(true);
1001 parsedData->setIndexName((char*)$2);
1008 parsedData->setDirect(true);
1014 parsedData->setDSN(true);
1015 parsedData->setPKTableName((char*)$2);
1021 parsedData->setNoSchema(true);
1024 ddl_statement: CREATE TABLE ident '(' create_defn_list_con ')' semicolon_opt
1026 parsedData->setStmtType(CreateTableStatement);
1027 parsedData->setTableName($3);
1030 | CREATE INDEX ident ON ident '(' field_list ')' opt_constr_type opt_ind_type opt_bucket semicolon_opt
1032 parsedData->setStmtType(CreateIndexStatement);
1033 parsedData->setIndexName($3);
1034 parsedData->setTableName($5);
1040 parsedData->setStmtType(DropTableStatement);
1041 parsedData->setTableName($3);
1046 parsedData->setStmtType(DropIndexStatement);
1047 parsedData->setIndexName($3);
1050 | TRUNCATE TABLE ident semicolon_opt
1052 parsedData->setStmtType(TruncateStatement);
1053 parsedData->setTableName($3);
1058 | HASH opt_constr_type
1060 parsedData->setIndexType(hashIndex);
1062 | TREE opt_constr_type
1064 parsedData->setIndexType(treeIndex);
1068 parsedData->setIndexType(hashIndex);
1074 parsedData->setUnique(true);
1078 parsedData->setUnique(true);
1079 parsedData->setPrimary(true);
1083 parsedData->setUnique(false);
1084 parsedData->setPrimary(false);
1088 | SIZE NUMBER_STRING
1090 parsedData->setBucketSize(atoi($2));
1094 create_defn_list_con:create_defn_list
1095 |create_defn_list ',' constraint_defn
1097 create_defn_list: create_defn_list create_defn_list_L
1101 create_defn_list_L: ',' create_defn
1104 create_defn: field_defn
1106 parsedData->insertFldDef();
1110 field_defn: field_name field_type size_opt null_expr_opt default_expr_opt auto_increment_key
1115 parsedData->setFldName($1);
1119 | '(' NUMBER_STRING ')'
1121 DbRetVal rv = parsedData->setFldLength(atoi($2));
1123 yyerror("Binary field length < 256");
1134 DbRetVal rv = parsedData->setDefaultValue($2);
1136 yyerror("Invalid Default value.");
1147 parsedData->setFldNotNull(true);
1150 constraint_defn : primary_key_constraint
1151 | foreign_key_constraint
1152 | primary_key_constraint ',' foreign_key_constraint
1154 foreign_key_constraint: foreign_key_constraint foreign_key_constraint_L
1155 | foreign_key_create
1157 foreign_key_constraint_L: ',' foreign_key_create
1159 foreign_key_create: FOREIGN KEY '(' fkField_list ')' REFERENCES ident'(' pkField_list ')'
1161 parsedData->setForeign(true);
1162 parsedData->setPKTableName((char*)$7);
1163 parsedData->insertForeignKeyList();
1166 fkField_list: fkField_list fkField_list_L
1169 fkField_list_L: ',' fkField
1173 parsedData->insertFKField((char*)$1);
1177 pkField_list: pkField_list pkField_list_L
1180 pkField_list_L: ',' pkField
1184 parsedData->insertPKField((char*)$1);
1189 primary_key_constraint: PRIMARY KEY '(' field_list ')' opt_bucket
1191 parsedData->setPrimary(true);
1197 DataType type = parsedData->getFldType();
1200 yyerror("AUTO_INCREMENT KEY can't be created other than INTEGER field ");
1204 DbRetVal ret = parsedData->setAutoIncreament(true);
1206 yyerror("A table should have ony one AUTO_INCREMENT KEY ");
1210 parsedData->setFldNotNull(true);
1211 parsedData->setAutoFldName(parsedData->getFldName());
1212 parsedData->setPrimary(true);
1216 field_type: INT_TYPE
1218 parsedData->setFldType(typeInt);
1222 parsedData->setFldType(typeLong);
1226 parsedData->setFldType(typeShort);
1230 parsedData->setFldType(typeLongLong);
1234 parsedData->setFldType(typeByteInt);
1238 parsedData->setFldType(typeFloat);
1242 parsedData->setFldType(typeDouble);
1247 parsedData->setFldType(typeDate);
1252 parsedData->setFldType(typeTime);
1257 parsedData->setFldType(typeTimeStamp);
1262 parsedData->setFldType(typeString);
1263 parsedData->setFldLength(2);
1268 parsedData->setFldType(typeVarchar);
1269 parsedData->setFldLength(2);
1274 parsedData->setFldType(typeBinary);
1275 parsedData->setFldLength(1);
1281 void yyerror(const char* Msg) {
1283 fprintf(stderr, "[Parser: %s] %s\n", Msg, yytext);