7 ParsedData *parsedData;
10 void yyerror(const char* Msg);
26 %token <stringval> STRING FIELD NUMBER_STRING BINARY_STRING DOUBLE OPERATOR PARAMETER ALLTABLE DESCRIBE PRIMARYINFO AUTO_INCREMENT GETCATALOGS GETDATATYPES GETTABLETYPES IMPORTEDKEY EXPORTEDKEY
27 %token <stringval> SELECT FROM WHERE BETWEEN IN AND OR NOT AS LIMIT OFFSET INNER OUTER CROSS JOIN LEFT IS
28 %token <stringval> INSERT INTO VALUES EXPLAIN PLAN
29 %token <stringval> DELETE UPDATE SET NULL_VALUE
30 %token <stringval> CREATE TABLE PRIMARY KEY DEFAULT INDEX ON HASH TREE UNIQUE DROP SIZE FOREIGN REFERENCES COMPACT
31 %token <stringval> CACHE CONDITION FIELDLIST PK DIRECT DSN UNCACHE NOSCHEMA
32 %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
33 %token <stringval> USER PASSWORD ALTER FLUSH
34 %token <stringval> MIN MAX AVG SUM COUNT GROUP BY HAVING ORDER ASC DESC DISTINCT
35 %token ';' ',' '(' ')'
36 %type <stringval> ident field value not_opt doub_value num_value
37 /*%type <stringval> foreign_key_constraint foreign_key_create foreign_key_constraint_L*/
38 %type <predicate> conditions condition hconditions hcondition
39 %type <Expression> stmt_exp atom
41 command: select_statement { YYACCEPT; }
42 | insert_statement { YYACCEPT; }
43 | delete_statement { YYACCEPT; }
44 | update_statement { YYACCEPT; }
45 | ddl_statement { YYACCEPT; }
46 | internal_statement { YYACCEPT; }
47 | cache_statement { YYACCEPT; }
48 | copy_table_statement { YYACCEPT; }
49 | user_manager_statement { YYACCEPT; }
50 | management_statement { YYACCEPT; }
53 management_statement: FLUSH CACHE semicolon_opt
55 parsedData->setStmtType(MgmtStatement);
58 user_manager_statement: CREATE USER ident PASSWORD STRING semicolon_opt
60 parsedData->setStmtType(UserStatement);
61 parsedData->createUserNode((char*)$3,(char*)$5);
65 |DROP USER ident semicolon_opt
67 parsedData->setStmtType(UserStatement);
68 parsedData->dropUserNode((char*)$3);
71 | ALTER USER ident SET PASSWORD STRING semicolon_opt
73 parsedData->setStmtType(UserStatement);
74 parsedData->alterUserNode((char*)$3,(char*)$6);
79 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
81 parsedData->setStmtType(CopyTableStatement);
82 parsedData->setPKTableName($3);
83 parsedData->setCreateTbl();
86 | 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
88 parsedData->setStmtType(CopyTableStatement);
89 parsedData->setPKTableName($3);
93 internal_statement: COMPACT TABLE ident
95 parsedData->setStmtType(CompactTableStatement);
96 parsedData->setTableName($3);
102 parsedData->setStmtType(MetaStatement);
103 parsedData->setResultSetPlan(GetTables);
107 parsedData->setStmtType(MetaStatement);
108 parsedData->setResultSetPlan(GetColumns);
110 | DESCRIBE INDEX table
112 parsedData->setStmtType(MetaStatement);
113 parsedData->setResultSetPlan(GetIndexes);
118 parsedData->setStmtType(MetaStatement);
119 parsedData->setResultSetPlan(GetPriIndex);
123 parsedData->setStmtType(MetaStatement);
124 parsedData->setResultSetPlan(GetCatalogs);
128 parsedData->setStmtType(MetaStatement);
129 parsedData->setResultSetPlan(GetTableType);
133 parsedData->setStmtType(MetaStatement);
134 parsedData->setResultSetPlan(GetDataType);
138 parsedData->setStmtType(MetaStatement);
139 parsedData->setResultSetPlan(GetImportKey);
143 parsedData->setStmtType(MetaStatement);
144 parsedData->setResultSetPlan(GetExportKey);
147 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
149 parsedData->setStmtType(SelectStatement);
150 parsedData->setCacheWorthy(true);
153 opt_explain: EXPLAIN PLAN
155 parsedData->setExplain();
159 opt_distinct: DISTINCT
161 parsedData->setDistinct();
165 field_list: field_list field_list_L
168 field_list_L: ',' field_with_as
173 parsedData->insertFieldAlias((char*)$3);
177 table_list: table_list table_list_L
181 join_exp: INNER opt_join table ON conditions join_exp
183 parsedData->insertJoinType(INNER_JOIN);
185 Condition *cond = parsedData->getCondition();
186 Predicate *pred = cond->getPredicate();
187 if (pred == NULL) parsedData->setCondition((Predicate*)$5);
190 newPred = parsedData->insertPredicate(pred, OpAnd, (Predicate*)$5);
191 parsedData->setCondition(newPred);
195 | LEFT opt_outer opt_join table ON conditions join_exp
197 parsedData->insertJoinType(LEFT_JOIN);
198 Condition *cond = parsedData->getCondition();
199 Predicate *pred = cond->getPredicate();
200 if (pred == NULL) parsedData->setCondition((Predicate*)$6);
203 newPred = parsedData->insertPredicate(pred, OpAnd, (Predicate*)$6);
204 parsedData->setCondition(newPred);
207 | CROSS opt_join table join_exp
209 parsedData->insertJoinType(INNER_JOIN);
219 table_list_L: ',' table
221 parsedData->insertJoinType(INNER_JOIN);
225 insert_statement: INSERT INTO ident field_list_opt VALUES '(' value_list ')' semicolon_opt
227 parsedData->setStmtType(InsertStatement);
228 parsedData->setTableName($3);
237 value_list: value_list value_list_L
240 parsedData->insertValue((char*)$1);
244 value_list_L: ',' value
246 parsedData->insertValue((char*)$2);
251 invalue_list: invalue_list invalue_list_L
254 parsedData->insertInValue((char*)$1);
258 invalue_list_L: ',' value
260 parsedData->insertInValue((char*)$2);
265 delete_statement: DELETE FROM ident where_clause_opt semicolon_opt
267 parsedData->setStmtType(DeleteStatement);
268 parsedData->setTableName($3);
273 update_statement: UPDATE ident SET assign_list where_clause_opt semicolon_opt
275 parsedData->setStmtType(UpdateStatement);
276 parsedData->setTableName($2);
285 assign_list: assign_list assign_list_L
289 assign_list_L: ',' assign_stmt
291 assign_stmt: ident OPERATOR stmt_exp
293 parsedData->insertUpdateExpression( (char*) $1, (Expression* ) $3);
294 free( $1 ); free($2);
296 | ident OPERATOR value
298 parsedData->insertUpdateValue( (char*) $1, (char*) $3);
299 free( $1 ); free($2);free( $3 );
301 | ident OPERATOR NULL_VALUE
303 parsedData->insertUpdateValue( (char*) $1, (char*) $3);
304 free( $1 ); free($2);free( $3 );
307 stmt_exp: stmt_exp '/' stmt_exp
310 exp=parsedData->insertExpression((Expression *)$1, division, (Expression *)$3);
313 | stmt_exp '%' stmt_exp
316 exp=parsedData->insertExpression((Expression *)$1, modulus, (Expression *)$3);
319 | stmt_exp '*' stmt_exp
322 exp=parsedData->insertExpression((Expression *)$1, multiplication, (Expression *)$3);
325 | stmt_exp '+' stmt_exp
328 exp=parsedData->insertExpression((Expression *)$1, addition, (Expression *)$3);
331 | stmt_exp '-' stmt_exp
334 exp=parsedData->insertExpression((Expression *)$1, subtraction, (Expression *)$3);
341 | '-' stmt_exp %prec UMINUS
345 | '+' stmt_exp %prec UMINUS
354 exp=parsedData->insertExpression((char *)$1);
362 exp=parsedData->insertExpression((char *)$1, flag);
369 exp=parsedData->insertExpression("NULL");
375 where_clause_opt: WHERE conditions
377 parsedData->setCondition((Predicate*)$2);
381 group_by_opt: GROUP BY group_field_list
384 order_by_opt: ORDER BY order_field_list
387 limit_opt: LIMIT NUMBER_STRING
389 parsedData->setLimit(atoi($2), 0);
391 | LIMIT NUMBER_STRING OFFSET NUMBER_STRING
393 parsedData->setLimit(atoi($2), atoi($4));
397 having_opt: HAVING hconditions
400 group_field_list: group_field_list group_field_list_L
403 group_field_list_L: ',' group_field
407 parsedData->insertGroupField((char*)$1);
411 order_field_list: order_field_list order_field_list_L
414 order_field_list_L: ',' order_field
418 parsedData->insertOrderByField((char*)$1);
423 parsedData->insertOrderByField((char*)$1);
428 parsedData->insertOrderByField((char*)$1, true);
432 conditions: conditions OR conditions
435 pred = parsedData->insertPredicate((Predicate*) $1, OpOr, (Predicate*) $3);
436 //parsedData->setCondition((Predicate*)pred);
440 | conditions AND conditions
443 pred = parsedData->insertPredicate((Predicate*) $1, OpAnd, (Predicate*) $3);
444 //parsedData->setCondition((Predicate*)pred);
447 | '(' conditions ')' { $$=$2; }
448 | NOT '(' conditions ')'
451 pred = parsedData->insertPredicate((Predicate*) $3, OpNot, NULL);
452 //parsedData->setCondition((Predicate*)pred);
458 if( $1 == (char*) 1 )
461 pred = parsedData->insertPredicate((Predicate*) $2, OpNot, NULL);
462 //parsedData->setCondition((Predicate*)pred);
467 //parsedData->setCondition((Predicate*)$2);
472 hconditions: hconditions OR hconditions
475 pred = parsedData->insertPredicate((Predicate*) $1, OpOr, (Predicate*) $3);
476 parsedData->setHavingCondition((Predicate*)pred);
480 | hconditions AND hconditions
483 pred = parsedData->insertPredicate((Predicate*) $1, OpAnd, (Predicate*) $3);
484 parsedData->setHavingCondition((Predicate*)pred);
487 | '(' hconditions ')' { $$=$2; }
488 | NOT '(' hconditions ')'
491 pred = parsedData->insertPredicate((Predicate*) $3, OpNot, NULL);
492 parsedData->setHavingCondition((Predicate*)pred);
498 if( $1 == (char*) 1 )
501 pred = parsedData->insertPredicate((Predicate*) $2, OpNot, NULL);
502 parsedData->setHavingCondition((Predicate*)pred);
507 parsedData->setHavingCondition((Predicate*)$2);
512 hcondition: MIN '(' ident ')' OPERATOR value
514 ComparisionOp op = AllDataType::getComparisionOperator((char*)$5);
516 void **ptr = parsedData->insertCondValueAndGetPtr((char*)$3, (char*)$6, false, AGG_MIN, true);
517 pred = parsedData->insertPredicate((char*) $3, op, ptr, AGG_MIN);
518 free( $1 ); free ($3); free ($5); free ($6);
521 | MAX '(' ident ')' OPERATOR value
523 ComparisionOp op = AllDataType::getComparisionOperator((char*)$5);
525 void **ptr = parsedData->insertCondValueAndGetPtr((char*)$3, (char*)$6, false, AGG_MAX, true);
526 pred = parsedData->insertPredicate((char*) $3, op, ptr, AGG_MAX);
527 free( $1 ); free ($3); free ($5); free ($6);
530 | SUM '(' ident ')' OPERATOR value
532 ComparisionOp op = AllDataType::getComparisionOperator((char*)$5);
534 void **ptr = parsedData->insertCondValueAndGetPtr((char*)$3, (char*)$6, false, AGG_SUM, true);
535 pred = parsedData->insertPredicate((char*) $3, op, ptr, AGG_SUM);
536 free( $1 ); free ($3); free ($5); free ($6);
539 | AVG '(' ident ')' OPERATOR value
541 ComparisionOp op = AllDataType::getComparisionOperator((char*)$5);
543 void **ptr = parsedData->insertCondValueAndGetPtr((char*)$3, (char*)$6, false, AGG_AVG, true);
544 pred = parsedData->insertPredicate((char*) $3, op, ptr, AGG_AVG);
545 free( $1 ); free ($3); free ($5); free ($6);
548 | COUNT '(' ident ')' OPERATOR value
550 ComparisionOp op = AllDataType::getComparisionOperator((char*)$5);
552 void **ptr = parsedData->insertCondValueAndGetPtr((char*)$3, (char*)$6, false, AGG_COUNT, true);
553 pred = parsedData->insertPredicate((char*) $3, op, ptr, AGG_COUNT);
554 free( $1 ); free ($3); free ($5); free ($6);
559 condition: ident OPERATOR value
561 ComparisionOp op = AllDataType::getComparisionOperator((char*)$2);
564 char *c = (char *)$3;
565 //if (*c == '%' && *(c+1) == '\0')
566 Util::changeWildcardChar(c);
570 void **ptr = parsedData->insertCondValueAndGetPtr((char*)$1, (char*)$3, opLike);
571 pred = parsedData->insertPredicate((char*) $1, op, ptr);
572 free( $1 ); free($2); free( $3 );
575 | ident OPERATOR ident
577 ComparisionOp op = AllDataType::getComparisionOperator((char*)$2);
579 parsedData->insertCondValue((char*) $1);
580 parsedData->insertCondValue((char*) $3);
581 pred = parsedData->insertPredicate((char*) $1, op, (char*) $3);
582 free( $1 ); free($2); free( $3 );
586 | ident not_opt BETWEEN value AND value
588 void **ptr1 = parsedData->insertCondValueAndGetPtr((char*)$1, (char*)$4);
589 void **ptr2 = parsedData->insertCondValueAndGetPtr((char*)$1, (char*)$6);
590 Predicate *finalPred;
591 // pred1 = parsedData->insertPredicate((char*) $1, OpGreaterThanEquals, ptr1);
592 // pred2 = parsedData->insertPredicate((char*) $1, OpLessThanEquals, ptr2);
593 finalPred = parsedData->insertBetPredicate((char*) $1,
594 OpGreaterThanEquals, ptr1, OpLessThanEquals, ptr2);
595 //OpLessThanEquals, ptr2, OpGreaterThanEquals, ptr1);
597 if( $2 == (char*) 1 )
598 finalPred = parsedData->insertPredicate(finalPred, OpNot, NULL);
599 free( $1 ); free( $4 ); free( $6 );
602 | ident not_opt IN '(' invalue_list ')'
604 ListIterator valIter = parsedData->getInValueList().getIterator();
605 FieldValue *value1, *value2;
606 Predicate *pred1, *pred2, *finalPred;
608 if (valIter.hasElement()) {
609 value1 = (FieldValue*) valIter.nextElement();
610 ptr1 = parsedData->insertCondValueAndGetPtr((char*)$1, value1->parsedString);
611 pred1 = parsedData->insertPredicate((char*) $1, OpEquals, ptr1);
614 while (valIter.hasElement()) {
615 value2 = (FieldValue*) valIter.nextElement();
616 ptr2 = parsedData->insertCondValueAndGetPtr((char*)$1, value2->parsedString);
617 pred2 = parsedData->insertPredicate((char*) $1, OpEquals, ptr2);
618 finalPred = parsedData->insertPredicate(pred1, OpOr, pred2);
622 finalPred = parsedData->insertPredicate(finalPred, OpNot, NULL);
627 | ident IS NOT NULL_VALUE
630 parsedData->insertCondValue((char*) $1);
631 pred = parsedData->insertNullPredicate((char*) $1, OpIsNull, false);
632 free( $1 ); free($2); free( $3 );
635 | ident IS NULL_VALUE
638 parsedData->insertCondValue((char*) $1);
639 pred = parsedData->insertNullPredicate((char*) $1, OpIsNull, true);
640 free( $1 ); free($2); free( $3 );
652 parsedData->insertTableName((char*)$1);
657 parsedData->insertTableName((char*)$1, (char*)$3);
658 free( $1 ); free($3);
662 parsedData->insertTableName((char*)$1, (char*)$2);
663 free( $1 ); free($2);
668 parsedData->insertField((char*)$1);
674 parsedData->insertField((char*)$3, AGG_MIN);
679 parsedData->insertField((char*)$3, AGG_MAX);
684 parsedData->insertField((char*)$3, AGG_SUM);
689 parsedData->insertField((char*)$3, AGG_AVG);
692 | COUNT '(' ident ')'
694 parsedData->insertField((char*)$3, AGG_COUNT);
699 parsedData->insertField("*", AGG_COUNT);
704 parsedData->insertField("*");
708 parsedData->insertField("*");
711 ident: FIELD { $$ = $1; }
712 | '`'FIELD'`' { $$ = $2; }
714 value: STRING { $$ = $1; }
716 | BINARY_STRING { $$ = $1; }
718 | PARAMETER { $$ = $1; }
719 | NULL_VALUE { $$ = (char*) 0; }
721 num_value: NUMBER_STRING { $$ = $1; }
722 | '-' NUMBER_STRING %prec UMINUS
731 | '+' NUMBER_STRING %prec UMINUS{ $$ = $2; }
733 doub_value : DOUBLE { $$ = $1; }
734 | '-' DOUBLE %prec UMINUS
743 | '+' DOUBLE %prec UMINUS{ $$ = $2; }
745 cache_statement: CACHE TABLE ident cache_opt semicolon_opt
747 if (!Conf::config.useCache())
749 printf("CACHE_TABLE is set to FALSE in csql.conf file.\n");
753 parsedData->setStmtType(CacheTableStatement);
754 parsedData->setTableName($3);
756 | UNCACHE TABLE ident semicolon_opt
758 parsedData->setStmtType(CacheTableStatement);
759 parsedData->setUnCache(true);
760 parsedData->setTableName($3);
763 cache_opt: hcond_cache vcond_cache pk_cache direct_opt dsn_opt no_schema
768 parsedData->setHCondFld(true);
769 parsedData->setHCondition((char*)$2);
775 parsedData->setVCondFld(true);
776 parsedData->setVCondition((char*)$2);
783 parsedData->setPkFld(true);
784 parsedData->setIndexName((char*)$2);
791 parsedData->setDirect(true);
797 parsedData->setDSN(true);
798 parsedData->setPKTableName((char*)$2);
804 parsedData->setNoSchema(true);
807 ddl_statement: CREATE TABLE ident '(' create_defn_list_con ')' semicolon_opt
809 parsedData->setStmtType(CreateTableStatement);
810 parsedData->setTableName($3);
813 | CREATE INDEX ident ON ident '(' field_list ')' opt_constr_type opt_ind_type opt_bucket semicolon_opt
815 parsedData->setStmtType(CreateIndexStatement);
816 parsedData->setIndexName($3);
817 parsedData->setTableName($5);
823 parsedData->setStmtType(DropTableStatement);
824 parsedData->setTableName($3);
829 parsedData->setStmtType(DropIndexStatement);
830 parsedData->setIndexName($3);
835 | HASH opt_constr_type
837 parsedData->setIndexType(hashIndex);
839 | TREE opt_constr_type
841 parsedData->setIndexType(treeIndex);
845 parsedData->setIndexType(hashIndex);
851 parsedData->setUnique(true);
855 parsedData->setUnique(true);
856 parsedData->setPrimary(true);
860 parsedData->setUnique(false);
861 parsedData->setPrimary(false);
867 parsedData->setBucketSize(atoi($2));
871 create_defn_list_con:create_defn_list
872 |create_defn_list ',' constraint_defn
874 create_defn_list: create_defn_list create_defn_list_L
878 create_defn_list_L: ',' create_defn
881 create_defn: field_defn
883 parsedData->insertFldDef();
887 field_defn: field_name field_type size_opt null_expr_opt default_expr_opt auto_increment_key
892 parsedData->setFldName($1);
896 | '(' NUMBER_STRING ')'
898 DbRetVal rv = parsedData->setFldLength(atoi($2));
900 yyerror("Binary field length < 256");
911 parsedData->setDefaultValue($2);
919 parsedData->setFldNotNull(true);
922 constraint_defn : primary_key_constraint
923 | foreign_key_constraint
924 | primary_key_constraint ',' foreign_key_constraint
926 foreign_key_constraint: foreign_key_constraint foreign_key_constraint_L
929 foreign_key_constraint_L: ',' foreign_key_create
931 foreign_key_create: FOREIGN KEY '(' fkField_list ')' REFERENCES ident'(' pkField_list ')'
933 parsedData->setForeign(true);
934 parsedData->setPKTableName((char*)$7);
935 parsedData->insertForeignKeyList();
938 fkField_list: fkField_list fkField_list_L
941 fkField_list_L: ',' fkField
945 parsedData->insertFKField((char*)$1);
949 pkField_list: pkField_list pkField_list_L
952 pkField_list_L: ',' pkField
956 parsedData->insertPKField((char*)$1);
961 primary_key_constraint: PRIMARY KEY '(' field_list ')' opt_bucket
963 parsedData->setPrimary(true);
969 DataType type = parsedData->getFldType();
972 yyerror("AUTO_INCREMENT KEY can't be created other than INTEGER field ");
976 DbRetVal ret = parsedData->setAutoIncreament(true);
978 yyerror("A table should have ony one AUTO_INCREMENT KEY ");
982 parsedData->setFldNotNull(true);
983 parsedData->setAutoFldName(parsedData->getFldName());
984 parsedData->setPrimary(true);
990 parsedData->setFldType(typeInt);
994 parsedData->setFldType(typeLong);
998 parsedData->setFldType(typeShort);
1002 parsedData->setFldType(typeLongLong);
1006 parsedData->setFldType(typeByteInt);
1010 parsedData->setFldType(typeFloat);
1014 parsedData->setFldType(typeDouble);
1019 parsedData->setFldType(typeDate);
1024 parsedData->setFldType(typeTime);
1029 parsedData->setFldType(typeTimeStamp);
1034 parsedData->setFldType(typeString);
1035 parsedData->setFldLength(2);
1040 parsedData->setFldType(typeBinary);
1041 parsedData->setFldLength(1);
1047 void yyerror(const char* Msg) {
1049 fprintf(stderr, "[Parser: %s] %s\n", Msg, yytext);