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 TRIE 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);
96 | ALTER INDEX ident RENAME TO ident semicolon_opt
98 parsedData->setStmtType(AlterStatement);
99 parsedData->setAlterType(ALTERINDEXRENAME);
100 parsedData->setTableName($3);
101 parsedData->setIndexName($6);
105 management_statement: FLUSH CACHE semicolon_opt
107 parsedData->setStmtType(MgmtStatement);
110 user_manager_statement: CREATE USER ident PASSWORD STRING semicolon_opt
112 parsedData->setStmtType(UserStatement);
113 parsedData->createUserNode((char*)$3,(char*)$5);
117 |DROP USER ident semicolon_opt
119 parsedData->setStmtType(UserStatement);
120 parsedData->dropUserNode((char*)$3);
123 | ALTER USER ident SET PASSWORD STRING semicolon_opt
125 parsedData->setStmtType(UserStatement);
126 parsedData->alterUserNode((char*)$3,(char*)$6);
131 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
133 parsedData->setStmtType(CopyTableStatement);
134 parsedData->setPKTableName($3);
135 parsedData->setCreateTbl();
138 | 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
140 parsedData->setStmtType(CopyTableStatement);
141 parsedData->setPKTableName($3);
145 internal_statement: COMPACT TABLE ident
147 parsedData->setStmtType(CompactTableStatement);
148 parsedData->setTableName($3);
154 parsedData->setStmtType(MetaStatement);
155 parsedData->setResultSetPlan(GetTables);
159 parsedData->setStmtType(MetaStatement);
160 parsedData->setResultSetPlan(GetColumns);
162 | DESCRIBE INDEX table
164 parsedData->setStmtType(MetaStatement);
165 parsedData->setResultSetPlan(GetIndexes);
170 parsedData->setStmtType(MetaStatement);
171 parsedData->setResultSetPlan(GetPriIndex);
175 parsedData->setStmtType(MetaStatement);
176 parsedData->setResultSetPlan(GetCatalogs);
180 parsedData->setStmtType(MetaStatement);
181 parsedData->setResultSetPlan(GetTableType);
185 parsedData->setStmtType(MetaStatement);
186 parsedData->setResultSetPlan(GetDataType);
190 parsedData->setStmtType(MetaStatement);
191 parsedData->setResultSetPlan(GetImportKey);
195 parsedData->setStmtType(MetaStatement);
196 parsedData->setResultSetPlan(GetExportKey);
199 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
201 parsedData->setStmtType(SelectStatement);
202 parsedData->setCacheWorthy(true);
205 opt_explain: EXPLAIN PLAN
207 parsedData->setExplain();
211 opt_distinct: DISTINCT
213 parsedData->setDistinct();
217 field_list: field_list field_list_L
220 field_list_L: ',' field_with_as
225 parsedData->insertFieldAlias((char*)$3);
229 table_list: table_list table_list_L
233 join_exp: INNER opt_join table ON conditions join_exp
235 parsedData->insertJoinType(INNER_JOIN);
236 Condition *cond = parsedData->getCondition();
237 Predicate *pred = cond->getPredicate();
239 parsedData->setCondition((Predicate*)$5);
242 newPred = parsedData->insertPredicate(pred, OpAnd, (Predicate*)$5);
243 parsedData->setCondition(newPred);
247 | LEFT opt_outer opt_join table ON conditions join_exp
249 parsedData->insertJoinType(LEFT_JOIN);
250 Condition *cond = parsedData->getCondition();
251 Predicate *pred = cond->getPredicate();
253 parsedData->setCondition((Predicate*)$6);
256 newPred = parsedData->insertPredicate(pred, OpAnd, (Predicate*)$6);
257 parsedData->setCondition(newPred);
260 | CROSS opt_join table join_exp
262 parsedData->insertJoinType(INNER_JOIN);
272 table_list_L: ',' table
274 parsedData->insertJoinType(INNER_JOIN);
278 insert_statement: INSERT INTO ident field_list_opt VALUES '(' value_list ')' semicolon_opt
280 parsedData->setStmtType(InsertStatement);
281 parsedData->setTableName($3);
290 value_list: value_list value_list_L
293 parsedData->insertValue((char*)$1);
297 value_list_L: ',' value
299 parsedData->insertValue((char*)$2);
304 invalue_list: invalue_list invalue_list_L
307 parsedData->insertInValue((char*)$1);
311 invalue_list_L: ',' value
313 parsedData->insertInValue((char*)$2);
318 delete_statement: DELETE FROM ident where_clause_opt semicolon_opt
320 parsedData->setStmtType(DeleteStatement);
321 parsedData->setTableName($3);
326 update_statement: UPDATE ident SET assign_list where_clause_opt semicolon_opt
328 parsedData->setStmtType(UpdateStatement);
329 parsedData->setTableName($2);
338 assign_list: assign_list assign_list_L
342 assign_list_L: ',' assign_stmt
344 assign_stmt: ident OPERATOR stmt_exp
346 parsedData->insertUpdateExpression( (char*) $1, (Expression* ) $3);
347 free( $1 ); free($2);
349 | ident OPERATOR value
351 parsedData->insertUpdateValue( (char*) $1, (char*) $3);
352 free( $1 ); free($2);free( $3 );
354 | ident OPERATOR NULL_VALUE
356 parsedData->insertUpdateValue( (char*) $1, (char*) $3);
357 free( $1 ); free($2);free( $3 );
360 stmt_exp: stmt_exp '/' stmt_exp
363 exp=parsedData->insertExpression((Expression *)$1, division, (Expression *)$3);
366 | stmt_exp '%' stmt_exp
369 exp=parsedData->insertExpression((Expression *)$1, modulus, (Expression *)$3);
372 | stmt_exp '*' stmt_exp
375 exp=parsedData->insertExpression((Expression *)$1, multiplication, (Expression *)$3);
378 | stmt_exp '+' stmt_exp
381 exp=parsedData->insertExpression((Expression *)$1, addition, (Expression *)$3);
384 | stmt_exp '-' stmt_exp
387 exp=parsedData->insertExpression((Expression *)$1, subtraction, (Expression *)$3);
394 | '-' stmt_exp %prec UMINUS
398 | '+' stmt_exp %prec UMINUS
405 function_opt: DATE_DIFF '(' atom ',' atom ')'
408 parsedData->setFunctionType(DATEDIFF);
409 exp=parsedData->insertExpression((Expression *)$3, DATEDIFF, (Expression *)$5);
412 | DATE_ADD '(' atom INTERVAL atom date_opt ')'
415 parsedData->setFunctionType((*(FunctionType *)$6));
416 exp=parsedData->insertExpression((Expression *)$3, (*(FunctionType *)$6), (Expression *)$5);
419 | DATE_SUB '(' atom INTERVAL atom date_opt ')'
422 //parsedData->setFunctionType((*(FunctionType *)$6));
423 parsedData->setFunctionType((FunctionType)((int)(*(FunctionType *)$6)+3));
424 exp=parsedData->insertExpression((Expression *)$3, (FunctionType)((int)(*(FunctionType *)$6)+3), (Expression *)$5);
427 | TIME_DIFF '(' atom ',' atom ')'
430 parsedData->setFunctionType(TIMEDIFF);
431 exp=parsedData->insertExpression((Expression *)$3, TIMEDIFF, (Expression *)$5);
434 | TIME_ADD '(' atom INTERVAL atom time_opt ')'
437 parsedData->setFunctionType((*(FunctionType *)$6));
438 exp=parsedData->insertExpression((Expression *)$3, (*(FunctionType *)$6), (Expression *)$5);
441 | TIME_SUB '(' atom INTERVAL atom time_opt ')'
444 parsedData->setFunctionType((FunctionType)((int)(*(FunctionType *)$6)+3));
445 exp=parsedData->insertExpression((Expression *)$3, (FunctionType)((int)(*(FunctionType *)$6)+3), (Expression *)$5);
448 | TIMESTAMP_DIFF '(' datetime_opt ',' atom ',' atom ')'
452 FunctionType val = (*(FunctionType *)$3);
453 if( val == DATEADDWITHYEAR || val == DATEADDWITHMON || val == DATEADDWITHDAY ) diff = 24;
455 parsedData->setFunctionType((FunctionType)((int)(*(FunctionType *)$3+diff)));
456 exp=parsedData->insertExpression((Expression *)$5, (FunctionType)((int)(*(FunctionType *)$3)+diff), (Expression *)$7);
459 | TIMESTAMP_ADD '(' atom INTERVAL atom datetime_opt ')'
462 parsedData->setFunctionType((FunctionType)((int)(*(FunctionType *)$6)+12));
463 exp=parsedData->insertExpression((Expression *)$3, (FunctionType)((int)(*(FunctionType *)$6)+12), (Expression *)$5);
466 | TIMESTAMP_SUB '(' atom INTERVAL atom datetime_opt ')'
469 parsedData->setFunctionType((FunctionType)((int)(*(FunctionType *)$6)+15));
470 exp=parsedData->insertExpression((Expression *)$3, (FunctionType)((int)(*(FunctionType *)$6)+15), (Expression *)$5);
473 | EXTRACT '(' datetime_opt FROM atom ')'
475 FunctionType val = UNKNOWN_FUNCTION;
476 //if((*(FunctionType *)$3) >=8)
477 // val = (FunctionType)((int)(*(FunctionType *)$3)+36);
479 val = (FunctionType)((int)(*(FunctionType *)$3)+30);
481 parsedData->setFunctionType(val);
482 exp=parsedData->insertExpression((Expression *)$5, val,NULL);
485 | DATE_TYPE '(' atom ')'
488 parsedData->setFunctionType(DATEFROMTIMESTAMP);
489 exp=parsedData->insertExpression((Expression *)$3, DATEFROMTIMESTAMP, NULL);
493 | TIME_TYPE '(' atom ')'
496 parsedData->setFunctionType(TIMEFROMTIMESTAMP);
497 exp=parsedData->insertExpression((Expression *)$3, TIMEFROMTIMESTAMP, NULL);
501 datetime_opt: time_opt
503 FunctionType val = *(FunctionType *)$1;
508 FunctionType val = *(FunctionType *)$1;
514 FunctionType val = TIMEADDWITHHOUR;
519 FunctionType val = TIMEADDWITHMIN;
524 FunctionType val = TIMEADDWITHSEC;
530 FunctionType val = DATEADDWITHYEAR;
535 FunctionType val = DATEADDWITHMON;
540 FunctionType val = DATEADDWITHDAY;
547 exp=parsedData->insertExpression((char *)$1);
555 exp=parsedData->insertExpression((char *)$1, flag);
562 exp=parsedData->insertExpression("NULL");
568 where_clause_opt: WHERE conditions
570 Condition *cond = parsedData->getCondition();
571 Predicate *pred = cond->getPredicate();
573 parsedData->setCondition((Predicate*)$2);
576 newPred = parsedData->insertPredicate(pred, OpAnd, (Predicate*)$2);
577 parsedData->setCondition(newPred);
583 group_by_opt: GROUP BY group_field_list
586 order_by_opt: ORDER BY order_field_list
589 limit_opt: LIMIT NUMBER_STRING
591 parsedData->setLimit(atoi($2), 0);
593 | LIMIT NUMBER_STRING OFFSET NUMBER_STRING
595 parsedData->setLimit(atoi($2), atoi($4));
599 having_opt: HAVING hconditions
602 group_field_list: group_field_list group_field_list_L
605 group_field_list_L: ',' group_field
609 parsedData->insertGroupField((char*)$1);
613 order_field_list: order_field_list order_field_list_L
616 order_field_list_L: ',' order_field
620 parsedData->insertOrderByField((char*)$1);
625 parsedData->insertOrderByField((char*)$1);
630 parsedData->insertOrderByField((char*)$1, true);
634 conditions: conditions OR conditions
637 pred = parsedData->insertPredicate((Predicate*) $1, OpOr, (Predicate*) $3);
638 //parsedData->setCondition((Predicate*)pred);
642 | conditions AND conditions
645 pred = parsedData->insertPredicate((Predicate*) $1, OpAnd, (Predicate*) $3);
646 //parsedData->setCondition((Predicate*)pred);
649 | '(' conditions ')' { $$=$2; }
650 | NOT '(' conditions ')'
653 pred = parsedData->insertPredicate((Predicate*) $3, OpNot, NULL);
654 //parsedData->setCondition((Predicate*)pred);
660 if( $1 == (char*) 1 )
663 pred = parsedData->insertPredicate((Predicate*) $2, OpNot, NULL);
664 //parsedData->setCondition((Predicate*)pred);
669 //parsedData->setCondition((Predicate*)$2);
674 hconditions: hconditions OR hconditions
677 pred = parsedData->insertPredicate((Predicate*) $1, OpOr, (Predicate*) $3);
678 parsedData->setHavingCondition((Predicate*)pred);
682 | hconditions AND hconditions
685 pred = parsedData->insertPredicate((Predicate*) $1, OpAnd, (Predicate*) $3);
686 parsedData->setHavingCondition((Predicate*)pred);
689 | '(' hconditions ')' { $$=$2; }
690 | NOT '(' hconditions ')'
693 pred = parsedData->insertPredicate((Predicate*) $3, OpNot, NULL);
694 parsedData->setHavingCondition((Predicate*)pred);
700 if( $1 == (char*) 1 )
703 pred = parsedData->insertPredicate((Predicate*) $2, OpNot, NULL);
704 parsedData->setHavingCondition((Predicate*)pred);
709 parsedData->setHavingCondition((Predicate*)$2);
714 hcondition: MIN '(' ident ')' OPERATOR value
716 ComparisionOp op = AllDataType::getComparisionOperator((char*)$5);
718 void **ptr = parsedData->insertCondValueAndGetPtr((char*)$3, (char*)$6, false, AGG_MIN, true);
719 pred = parsedData->insertPredicate((char*) $3, op, ptr, AGG_MIN);
720 free( $1 ); free ($3); free ($5); free ($6);
723 | MAX '(' ident ')' OPERATOR value
725 ComparisionOp op = AllDataType::getComparisionOperator((char*)$5);
727 void **ptr = parsedData->insertCondValueAndGetPtr((char*)$3, (char*)$6, false, AGG_MAX, true);
728 pred = parsedData->insertPredicate((char*) $3, op, ptr, AGG_MAX);
729 free( $1 ); free ($3); free ($5); free ($6);
732 | SUM '(' ident ')' OPERATOR value
734 ComparisionOp op = AllDataType::getComparisionOperator((char*)$5);
736 void **ptr = parsedData->insertCondValueAndGetPtr((char*)$3, (char*)$6, false, AGG_SUM, true);
737 pred = parsedData->insertPredicate((char*) $3, op, ptr, AGG_SUM);
738 free( $1 ); free ($3); free ($5); free ($6);
741 | AVG '(' ident ')' OPERATOR value
743 ComparisionOp op = AllDataType::getComparisionOperator((char*)$5);
745 void **ptr = parsedData->insertCondValueAndGetPtr((char*)$3, (char*)$6, false, AGG_AVG, true);
746 pred = parsedData->insertPredicate((char*) $3, op, ptr, AGG_AVG);
747 free( $1 ); free ($3); free ($5); free ($6);
750 | COUNT '(' ident ')' OPERATOR value
752 ComparisionOp op = AllDataType::getComparisionOperator((char*)$5);
754 void **ptr = parsedData->insertCondValueAndGetPtr((char*)$3, (char*)$6, false, AGG_COUNT, true);
755 pred = parsedData->insertPredicate((char*) $3, op, ptr, AGG_COUNT);
756 free( $1 ); free ($3); free ($5); free ($6);
761 condition: ident OPERATOR value
763 ComparisionOp op = AllDataType::getComparisionOperator((char*)$2);
765 if (op == OpLike) opLike = true;
767 void **ptr = parsedData->insertCondValueAndGetPtr((char*)$1, (char*)$3, opLike);
768 pred = parsedData->insertPredicate((char*) $1, op, ptr);
769 free( $1 ); free($2); free( $3 );
772 | ident OPERATOR ident
774 ComparisionOp op = AllDataType::getComparisionOperator((char*)$2);
776 parsedData->insertCondValue((char*) $1);
777 parsedData->insertCondValue((char*) $3);
778 pred = parsedData->insertPredicate((char*) $1, op, (char*) $3);
779 free( $1 ); free($2); free( $3 );
783 | ident not_opt BETWEEN value AND value
785 void **ptr1 = parsedData->insertCondValueAndGetPtr((char*)$1, (char*)$4);
786 void **ptr2 = parsedData->insertCondValueAndGetPtr((char*)$1, (char*)$6);
787 Predicate *finalPred;
788 // pred1 = parsedData->insertPredicate((char*) $1, OpGreaterThanEquals, ptr1);
789 // pred2 = parsedData->insertPredicate((char*) $1, OpLessThanEquals, ptr2);
790 finalPred = parsedData->insertBetPredicate((char*) $1,
791 OpGreaterThanEquals, ptr1, OpLessThanEquals, ptr2);
792 //OpLessThanEquals, ptr2, OpGreaterThanEquals, ptr1);
794 if( $2 == (char*) 1 )
795 finalPred = parsedData->insertPredicate(finalPred, OpNot, NULL);
796 free( $1 ); free( $4 ); free( $6 );
799 | ident not_opt IN '(' invalue_list ')'
801 ListIterator valIter = parsedData->getInValueList().getIterator();
802 FieldValue *value1, *value2;
803 Predicate *pred1, *pred2, *finalPred;
805 if (valIter.hasElement()) {
806 value1 = (FieldValue*) valIter.nextElement();
807 ptr1 = parsedData->insertCondValueAndGetPtr((char*)$1, value1->parsedString);
808 pred1 = parsedData->insertPredicate((char*) $1, OpEquals, ptr1);
811 while (valIter.hasElement()) {
812 value2 = (FieldValue*) valIter.nextElement();
813 ptr2 = parsedData->insertCondValueAndGetPtr((char*)$1, value2->parsedString);
814 pred2 = parsedData->insertPredicate((char*) $1, OpEquals, ptr2);
815 finalPred = parsedData->insertPredicate(pred1, OpOr, pred2);
818 parsedData->resetInValueList();
820 finalPred = parsedData->insertPredicate(finalPred, OpNot, NULL);
825 | ident IS NOT NULL_VALUE
828 parsedData->insertCondValue((char*) $1);
829 pred = parsedData->insertNullPredicate((char*) $1, OpIsNull, false);
830 free( $1 ); free($2); free( $3 );
833 | ident IS NULL_VALUE
836 parsedData->insertCondValue((char*) $1);
837 pred = parsedData->insertNullPredicate((char*) $1, OpIsNull, true);
838 free( $1 ); free($2); free( $3 );
841 | function_opt OPERATOR function_opt
843 ComparisionOp op = AllDataType::getComparisionOperator((char*)$2);
845 pred = parsedData->insertPredicate(((Expression*)$1), op, ((Expression*)$3));
849 | function_opt OPERATOR ident
852 ComparisionOp op = AllDataType::getComparisionOperator((char*)$2);
853 parsedData->insertCondValue((char*) $3);
855 pred = parsedData->insertPredicate(((Expression*)$1), op, (char*) $3);
859 | function_opt OPERATOR value
861 ComparisionOp op = AllDataType::getComparisionOperator((char*)$2);
862 void **ptr = parsedData->insertCondValueAndGetPtr((char*)"dummy", (char*)$3, false, AGG_UNKNOWN, false, true);
864 pred = parsedData->insertPredicate(((Expression*)$1), op, ptr);
876 parsedData->insertTableName((char*)$1);
881 parsedData->insertTableName((char*)$1, (char*)$3);
882 free( $1 ); free($3);
886 parsedData->insertTableName((char*)$1, (char*)$2);
887 free( $1 ); free($2);
892 parsedData->insertField((char*)$1);
898 parsedData->insertField((char*)$3, AGG_MIN);
903 parsedData->insertField((char*)$3, AGG_MAX);
908 parsedData->insertField((char*)$3, AGG_SUM);
913 parsedData->insertField((char*)$3, AGG_AVG);
916 | COUNT '(' ident ')'
918 parsedData->insertField((char*)$3, AGG_COUNT);
923 parsedData->insertField("*", AGG_COUNT);
928 parsedData->insertField("*");
932 parsedData->insertField("*");
935 ident: FIELD { $$ = $1; }
936 | '`'FIELD'`' { $$ = $2; }
938 value: STRING { $$ = $1; }
940 | BINARY_STRING { $$ = $1; }
942 | PARAMETER { $$ = $1; }
943 | NULL_VALUE { $$ = (char*) 0; }
946 char *str=(char*)malloc(20);
948 struct tm * timeinfo;
950 timeinfo = localtime ( &rawtime );
951 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);
957 num_value: NUMBER_STRING { $$ = $1; }
958 | '-' NUMBER_STRING %prec UMINUS
967 | '+' NUMBER_STRING %prec UMINUS{ $$ = $2; }
969 doub_value : DOUBLE { $$ = $1; }
970 | '-' DOUBLE %prec UMINUS
979 | '+' DOUBLE %prec UMINUS{ $$ = $2; }
981 cache_statement: CACHE TABLE ident cache_opt semicolon_opt
983 if (!Conf::config.useCache())
985 printf("CACHE_TABLE is set to FALSE in csql.conf file.\n");
989 parsedData->setStmtType(CacheTableStatement);
990 parsedData->setTableName($3);
992 | UNCACHE TABLE ident semicolon_opt
994 parsedData->setStmtType(CacheTableStatement);
995 parsedData->setUnCache(true);
996 parsedData->setTableName($3);
999 cache_opt: hcond_cache vcond_cache pk_cache direct_opt dsn_opt no_schema
1004 parsedData->setHCondFld(true);
1005 parsedData->setHCondition((char*)$2);
1011 parsedData->setVCondFld(true);
1012 parsedData->setVCondition((char*)$2);
1019 parsedData->setPkFld(true);
1020 parsedData->setIndexName((char*)$2);
1027 parsedData->setDirect(true);
1033 parsedData->setDSN(true);
1034 parsedData->setPKTableName((char*)$2);
1040 parsedData->setNoSchema(true);
1043 ddl_statement: CREATE TABLE ident '(' create_defn_list_con ')' semicolon_opt
1045 parsedData->setStmtType(CreateTableStatement);
1046 parsedData->setTableName($3);
1049 | CREATE INDEX ident ON ident '(' field_list ')' opt_constr_type opt_ind_type opt_bucket semicolon_opt
1051 parsedData->setStmtType(CreateIndexStatement);
1052 parsedData->setIndexName($3);
1053 parsedData->setTableName($5);
1059 parsedData->setStmtType(DropTableStatement);
1060 parsedData->setTableName($3);
1065 parsedData->setStmtType(DropIndexStatement);
1066 parsedData->setIndexName($3);
1069 | TRUNCATE TABLE ident semicolon_opt
1071 parsedData->setStmtType(TruncateStatement);
1072 parsedData->setTableName($3);
1077 | HASH opt_constr_type
1079 parsedData->setIndexType(hashIndex);
1081 | TREE opt_constr_type
1083 parsedData->setIndexType(treeIndex);
1085 | TRIE opt_constr_type
1087 parsedData->setIndexType(trieIndex);
1091 parsedData->setIndexType(hashIndex);
1097 parsedData->setUnique(true);
1101 parsedData->setUnique(true);
1102 parsedData->setPrimary(true);
1106 parsedData->setUnique(false);
1107 parsedData->setPrimary(false);
1111 | SIZE NUMBER_STRING
1113 parsedData->setBucketSize(atoi($2));
1117 create_defn_list_con:create_defn_list
1118 |create_defn_list ',' constraint_defn
1120 create_defn_list: create_defn_list create_defn_list_L
1124 create_defn_list_L: ',' create_defn
1127 create_defn: field_defn
1129 parsedData->insertFldDef();
1133 field_defn: field_name field_type size_opt null_expr_opt default_expr_opt auto_increment_key
1138 parsedData->setFldName($1);
1142 | '(' NUMBER_STRING ')'
1144 DbRetVal rv = parsedData->setFldLength(atoi($2));
1146 yyerror("Binary field length < 256");
1157 DbRetVal rv = parsedData->setDefaultValue($2);
1159 yyerror("Invalid Default value.");
1170 parsedData->setFldNotNull(true);
1173 constraint_defn : primary_key_constraint
1174 | foreign_key_constraint
1175 | primary_key_constraint ',' foreign_key_constraint
1177 foreign_key_constraint: foreign_key_constraint foreign_key_constraint_L
1178 | foreign_key_create
1180 foreign_key_constraint_L: ',' foreign_key_create
1182 foreign_key_create: FOREIGN KEY '(' fkField_list ')' REFERENCES ident'(' pkField_list ')'
1184 parsedData->setForeign(true);
1185 parsedData->setPKTableName((char*)$7);
1186 parsedData->insertForeignKeyList();
1189 fkField_list: fkField_list fkField_list_L
1192 fkField_list_L: ',' fkField
1196 parsedData->insertFKField((char*)$1);
1200 pkField_list: pkField_list pkField_list_L
1203 pkField_list_L: ',' pkField
1207 parsedData->insertPKField((char*)$1);
1212 primary_key_constraint: PRIMARY KEY '(' field_list ')' opt_bucket
1214 parsedData->setPrimary(true);
1220 DataType type = parsedData->getFldType();
1223 yyerror("AUTO_INCREMENT KEY can't be created other than INTEGER field ");
1227 DbRetVal ret = parsedData->setAutoIncreament(true);
1229 yyerror("A table should have ony one AUTO_INCREMENT KEY ");
1233 parsedData->setFldNotNull(true);
1234 parsedData->setAutoFldName(parsedData->getFldName());
1235 parsedData->setPrimary(true);
1239 field_type: INT_TYPE
1241 parsedData->setFldType(typeInt);
1245 parsedData->setFldType(typeLong);
1249 parsedData->setFldType(typeShort);
1253 parsedData->setFldType(typeLongLong);
1257 parsedData->setFldType(typeByteInt);
1261 parsedData->setFldType(typeFloat);
1265 parsedData->setFldType(typeDouble);
1270 parsedData->setFldType(typeDate);
1275 parsedData->setFldType(typeTime);
1280 parsedData->setFldType(typeTimeStamp);
1285 parsedData->setFldType(typeString);
1286 parsedData->setFldLength(2);
1291 parsedData->setFldType(typeVarchar);
1292 parsedData->setFldLength(2);
1297 parsedData->setFldType(typeBinary);
1298 parsedData->setFldLength(1);
1304 void yyerror(const char* Msg) {
1306 fprintf(stderr, "[Parser: %s] %s\n", Msg, yytext);