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);
152 opt_explain: EXPLAIN PLAN
154 parsedData->setExplain();
158 opt_distinct: DISTINCT
160 parsedData->setDistinct();
164 field_list: field_list field_list_L
167 field_list_L: ',' field_with_as
172 parsedData->insertFieldAlias((char*)$3);
176 table_list: table_list table_list_L
180 join_exp: INNER opt_join table ON conditions join_exp
182 parsedData->insertJoinType(INNER_JOIN);
184 Condition *cond = parsedData->getCondition();
185 Predicate *pred = cond->getPredicate();
186 if (pred == NULL) parsedData->setCondition((Predicate*)$5);
189 newPred = parsedData->insertPredicate(pred, OpAnd, (Predicate*)$5);
190 parsedData->setCondition(newPred);
194 | LEFT opt_outer opt_join table ON conditions join_exp
196 parsedData->insertJoinType(LEFT_JOIN);
197 Condition *cond = parsedData->getCondition();
198 Predicate *pred = cond->getPredicate();
199 if (pred == NULL) parsedData->setCondition((Predicate*)$6);
202 newPred = parsedData->insertPredicate(pred, OpAnd, (Predicate*)$6);
203 parsedData->setCondition(newPred);
206 | CROSS opt_join table join_exp
208 parsedData->insertJoinType(INNER_JOIN);
218 table_list_L: ',' table
220 parsedData->insertJoinType(INNER_JOIN);
224 insert_statement: INSERT INTO ident field_list_opt VALUES '(' value_list ')' semicolon_opt
226 parsedData->setStmtType(InsertStatement);
227 parsedData->setTableName($3);
236 value_list: value_list value_list_L
239 parsedData->insertValue((char*)$1);
243 value_list_L: ',' value
245 parsedData->insertValue((char*)$2);
250 invalue_list: invalue_list invalue_list_L
253 parsedData->insertInValue((char*)$1);
257 invalue_list_L: ',' value
259 parsedData->insertInValue((char*)$2);
264 delete_statement: DELETE FROM ident where_clause_opt semicolon_opt
266 parsedData->setStmtType(DeleteStatement);
267 parsedData->setTableName($3);
272 update_statement: UPDATE ident SET assign_list where_clause_opt semicolon_opt
274 parsedData->setStmtType(UpdateStatement);
275 parsedData->setTableName($2);
284 assign_list: assign_list assign_list_L
288 assign_list_L: ',' assign_stmt
290 assign_stmt: ident OPERATOR stmt_exp
292 parsedData->insertUpdateExpression( (char*) $1, (Expression* ) $3);
293 free( $1 ); free($2);
295 | ident OPERATOR value
297 parsedData->insertUpdateValue( (char*) $1, (char*) $3);
298 free( $1 ); free($2);free( $3 );
300 | ident OPERATOR NULL_VALUE
302 parsedData->insertUpdateValue( (char*) $1, (char*) $3);
303 free( $1 ); free($2);free( $3 );
306 stmt_exp: stmt_exp '/' stmt_exp
309 exp=parsedData->insertExpression((Expression *)$1, division, (Expression *)$3);
312 | stmt_exp '%' stmt_exp
315 exp=parsedData->insertExpression((Expression *)$1, modulus, (Expression *)$3);
318 | stmt_exp '*' stmt_exp
321 exp=parsedData->insertExpression((Expression *)$1, multiplication, (Expression *)$3);
324 | stmt_exp '+' stmt_exp
327 exp=parsedData->insertExpression((Expression *)$1, addition, (Expression *)$3);
330 | stmt_exp '-' stmt_exp
333 exp=parsedData->insertExpression((Expression *)$1, subtraction, (Expression *)$3);
340 | '-' stmt_exp %prec UMINUS
344 | '+' stmt_exp %prec UMINUS
353 exp=parsedData->insertExpression((char *)$1);
361 exp=parsedData->insertExpression((char *)$1, flag);
368 exp=parsedData->insertExpression("NULL");
374 where_clause_opt: WHERE conditions
376 parsedData->setCondition((Predicate*)$2);
380 group_by_opt: GROUP BY group_field_list
383 order_by_opt: ORDER BY order_field_list
386 limit_opt: LIMIT NUMBER_STRING
388 parsedData->setLimit(atoi($2), 0);
390 | LIMIT NUMBER_STRING OFFSET NUMBER_STRING
392 parsedData->setLimit(atoi($2), atoi($4));
396 having_opt: HAVING hconditions
399 group_field_list: group_field_list group_field_list_L
402 group_field_list_L: ',' group_field
406 parsedData->insertGroupField((char*)$1);
410 order_field_list: order_field_list order_field_list_L
413 order_field_list_L: ',' order_field
417 parsedData->insertOrderByField((char*)$1);
422 parsedData->insertOrderByField((char*)$1);
427 parsedData->insertOrderByField((char*)$1, true);
431 conditions: conditions OR conditions
434 pred = parsedData->insertPredicate((Predicate*) $1, OpOr, (Predicate*) $3);
435 //parsedData->setCondition((Predicate*)pred);
439 | conditions AND conditions
442 pred = parsedData->insertPredicate((Predicate*) $1, OpAnd, (Predicate*) $3);
443 //parsedData->setCondition((Predicate*)pred);
446 | '(' conditions ')' { $$=$2; }
447 | NOT '(' conditions ')'
450 pred = parsedData->insertPredicate((Predicate*) $3, OpNot, NULL);
451 //parsedData->setCondition((Predicate*)pred);
457 if( $1 == (char*) 1 )
460 pred = parsedData->insertPredicate((Predicate*) $2, OpNot, NULL);
461 //parsedData->setCondition((Predicate*)pred);
466 //parsedData->setCondition((Predicate*)$2);
471 hconditions: hconditions OR hconditions
474 pred = parsedData->insertPredicate((Predicate*) $1, OpOr, (Predicate*) $3);
475 parsedData->setHavingCondition((Predicate*)pred);
479 | hconditions AND hconditions
482 pred = parsedData->insertPredicate((Predicate*) $1, OpAnd, (Predicate*) $3);
483 parsedData->setHavingCondition((Predicate*)pred);
486 | '(' hconditions ')' { $$=$2; }
487 | NOT '(' hconditions ')'
490 pred = parsedData->insertPredicate((Predicate*) $3, OpNot, NULL);
491 parsedData->setHavingCondition((Predicate*)pred);
497 if( $1 == (char*) 1 )
500 pred = parsedData->insertPredicate((Predicate*) $2, OpNot, NULL);
501 parsedData->setHavingCondition((Predicate*)pred);
506 parsedData->setHavingCondition((Predicate*)$2);
511 hcondition: MIN '(' ident ')' OPERATOR value
513 ComparisionOp op = AllDataType::getComparisionOperator((char*)$5);
515 void **ptr = parsedData->insertCondValueAndGetPtr((char*)$3, (char*)$6, false, AGG_MIN, true);
516 pred = parsedData->insertPredicate((char*) $3, op, ptr, AGG_MIN);
517 free( $1 ); free ($3); free ($5); free ($6);
520 | MAX '(' ident ')' OPERATOR value
522 ComparisionOp op = AllDataType::getComparisionOperator((char*)$5);
524 void **ptr = parsedData->insertCondValueAndGetPtr((char*)$3, (char*)$6, false, AGG_MAX, true);
525 pred = parsedData->insertPredicate((char*) $3, op, ptr, AGG_MAX);
526 free( $1 ); free ($3); free ($5); free ($6);
529 | SUM '(' ident ')' OPERATOR value
531 ComparisionOp op = AllDataType::getComparisionOperator((char*)$5);
533 void **ptr = parsedData->insertCondValueAndGetPtr((char*)$3, (char*)$6, false, AGG_SUM, true);
534 pred = parsedData->insertPredicate((char*) $3, op, ptr, AGG_SUM);
535 free( $1 ); free ($3); free ($5); free ($6);
538 | AVG '(' ident ')' OPERATOR value
540 ComparisionOp op = AllDataType::getComparisionOperator((char*)$5);
542 void **ptr = parsedData->insertCondValueAndGetPtr((char*)$3, (char*)$6, false, AGG_AVG, true);
543 pred = parsedData->insertPredicate((char*) $3, op, ptr, AGG_AVG);
544 free( $1 ); free ($3); free ($5); free ($6);
547 | COUNT '(' ident ')' OPERATOR value
549 ComparisionOp op = AllDataType::getComparisionOperator((char*)$5);
551 void **ptr = parsedData->insertCondValueAndGetPtr((char*)$3, (char*)$6, false, AGG_COUNT, true);
552 pred = parsedData->insertPredicate((char*) $3, op, ptr, AGG_COUNT);
553 free( $1 ); free ($3); free ($5); free ($6);
558 condition: ident OPERATOR value
560 ComparisionOp op = AllDataType::getComparisionOperator((char*)$2);
563 char *c = (char *)$3;
564 //if (*c == '%' && *(c+1) == '\0')
565 Util::changeWildcardChar(c);
569 void **ptr = parsedData->insertCondValueAndGetPtr((char*)$1, (char*)$3, opLike);
570 pred = parsedData->insertPredicate((char*) $1, op, ptr);
571 free( $1 ); free($2); free( $3 );
574 | ident OPERATOR ident
576 ComparisionOp op = AllDataType::getComparisionOperator((char*)$2);
578 parsedData->insertCondValue((char*) $1);
579 parsedData->insertCondValue((char*) $3);
580 pred = parsedData->insertPredicate((char*) $1, op, (char*) $3);
581 free( $1 ); free($2); free( $3 );
585 | ident not_opt BETWEEN value AND value
587 void **ptr1 = parsedData->insertCondValueAndGetPtr((char*)$1, (char*)$4);
588 void **ptr2 = parsedData->insertCondValueAndGetPtr((char*)$1, (char*)$6);
589 Predicate *finalPred;
590 // pred1 = parsedData->insertPredicate((char*) $1, OpGreaterThanEquals, ptr1);
591 // pred2 = parsedData->insertPredicate((char*) $1, OpLessThanEquals, ptr2);
592 finalPred = parsedData->insertBetPredicate((char*) $1,
593 OpGreaterThanEquals, ptr1, OpLessThanEquals, ptr2);
594 //OpLessThanEquals, ptr2, OpGreaterThanEquals, ptr1);
596 if( $2 == (char*) 1 )
597 finalPred = parsedData->insertPredicate(finalPred, OpNot, NULL);
598 free( $1 ); free( $4 ); free( $6 );
601 | ident not_opt IN '(' invalue_list ')'
603 ListIterator valIter = parsedData->getInValueList().getIterator();
604 FieldValue *value1, *value2;
605 Predicate *pred1, *pred2, *finalPred;
607 if (valIter.hasElement()) {
608 value1 = (FieldValue*) valIter.nextElement();
609 ptr1 = parsedData->insertCondValueAndGetPtr((char*)$1, value1->parsedString);
610 pred1 = parsedData->insertPredicate((char*) $1, OpEquals, ptr1);
613 while (valIter.hasElement()) {
614 value2 = (FieldValue*) valIter.nextElement();
615 ptr2 = parsedData->insertCondValueAndGetPtr((char*)$1, value2->parsedString);
616 pred2 = parsedData->insertPredicate((char*) $1, OpEquals, ptr2);
617 finalPred = parsedData->insertPredicate(pred1, OpOr, pred2);
621 finalPred = parsedData->insertPredicate(finalPred, OpNot, NULL);
626 | ident IS NOT NULL_VALUE
629 parsedData->insertCondValue((char*) $1);
630 pred = parsedData->insertNullPredicate((char*) $1, OpIsNull, false);
631 free( $1 ); free($2); free( $3 );
634 | ident IS NULL_VALUE
637 parsedData->insertCondValue((char*) $1);
638 pred = parsedData->insertNullPredicate((char*) $1, OpIsNull, true);
639 free( $1 ); free($2); free( $3 );
651 parsedData->insertTableName((char*)$1);
656 parsedData->insertTableName((char*)$1, (char*)$3);
657 free( $1 ); free($3);
661 parsedData->insertTableName((char*)$1, (char*)$2);
662 free( $1 ); free($2);
667 parsedData->insertField((char*)$1);
673 parsedData->insertField((char*)$3, AGG_MIN);
678 parsedData->insertField((char*)$3, AGG_MAX);
683 parsedData->insertField((char*)$3, AGG_SUM);
688 parsedData->insertField((char*)$3, AGG_AVG);
691 | COUNT '(' ident ')'
693 parsedData->insertField((char*)$3, AGG_COUNT);
698 parsedData->insertField("*", AGG_COUNT);
703 parsedData->insertField("*");
707 parsedData->insertField("*");
710 ident: FIELD { $$ = $1; }
711 | '`'FIELD'`' { $$ = $2; }
713 value: STRING { $$ = $1; }
715 | BINARY_STRING { $$ = $1; }
717 | PARAMETER { $$ = $1; }
718 | NULL_VALUE { $$ = (char*) 0; }
720 num_value: NUMBER_STRING { $$ = $1; }
721 | '-' NUMBER_STRING %prec UMINUS
730 | '+' NUMBER_STRING %prec UMINUS{ $$ = $2; }
732 doub_value : DOUBLE { $$ = $1; }
733 | '-' DOUBLE %prec UMINUS
742 | '+' DOUBLE %prec UMINUS{ $$ = $2; }
744 cache_statement: CACHE TABLE ident cache_opt semicolon_opt
746 if (!Conf::config.useCache())
748 printf("CACHE_TABLE is set to FALSE in csql.conf file.\n");
752 parsedData->setStmtType(CacheTableStatement);
753 parsedData->setTableName($3);
755 | UNCACHE TABLE ident semicolon_opt
757 parsedData->setStmtType(CacheTableStatement);
758 parsedData->setUnCache(true);
759 parsedData->setTableName($3);
762 cache_opt: hcond_cache vcond_cache pk_cache direct_opt dsn_opt no_schema
767 parsedData->setHCondFld(true);
768 parsedData->setHCondition((char*)$2);
774 parsedData->setVCondFld(true);
775 parsedData->setVCondition((char*)$2);
782 parsedData->setPkFld(true);
783 parsedData->setIndexName((char*)$2);
790 parsedData->setDirect(true);
796 parsedData->setDSN(true);
797 parsedData->setPKTableName((char*)$2);
803 parsedData->setNoSchema(true);
806 ddl_statement: CREATE TABLE ident '(' create_defn_list_con ')' semicolon_opt
808 parsedData->setStmtType(CreateTableStatement);
809 parsedData->setTableName($3);
812 | CREATE INDEX ident ON ident '(' field_list ')' opt_constr_type opt_ind_type opt_bucket semicolon_opt
814 parsedData->setStmtType(CreateIndexStatement);
815 parsedData->setIndexName($3);
816 parsedData->setTableName($5);
822 parsedData->setStmtType(DropTableStatement);
823 parsedData->setTableName($3);
828 parsedData->setStmtType(DropIndexStatement);
829 parsedData->setIndexName($3);
834 | HASH opt_constr_type
836 parsedData->setIndexType(hashIndex);
838 | TREE opt_constr_type
840 parsedData->setIndexType(treeIndex);
844 parsedData->setIndexType(hashIndex);
850 parsedData->setUnique(true);
854 parsedData->setUnique(true);
855 parsedData->setPrimary(true);
859 parsedData->setUnique(false);
860 parsedData->setPrimary(false);
866 parsedData->setBucketSize(atoi($2));
870 create_defn_list_con:create_defn_list
871 |create_defn_list ',' constraint_defn
873 create_defn_list: create_defn_list create_defn_list_L
877 create_defn_list_L: ',' create_defn
880 create_defn: field_defn
882 parsedData->insertFldDef();
886 field_defn: field_name field_type size_opt null_expr_opt default_expr_opt auto_increment_key
891 parsedData->setFldName($1);
895 | '(' NUMBER_STRING ')'
897 DbRetVal rv = parsedData->setFldLength(atoi($2));
899 yyerror("Binary field length < 256");
910 parsedData->setDefaultValue($2);
918 parsedData->setFldNotNull(true);
921 constraint_defn : primary_key_constraint
922 | foreign_key_constraint
923 | primary_key_constraint ',' foreign_key_constraint
925 foreign_key_constraint: foreign_key_constraint foreign_key_constraint_L
928 foreign_key_constraint_L: ',' foreign_key_create
930 foreign_key_create: FOREIGN KEY '(' fkField_list ')' REFERENCES ident'(' pkField_list ')'
932 parsedData->setForeign(true);
933 parsedData->setPKTableName((char*)$7);
934 parsedData->insertForeignKeyList();
937 fkField_list: fkField_list fkField_list_L
940 fkField_list_L: ',' fkField
944 parsedData->insertFKField((char*)$1);
948 pkField_list: pkField_list pkField_list_L
951 pkField_list_L: ',' pkField
955 parsedData->insertPKField((char*)$1);
960 primary_key_constraint: PRIMARY KEY '(' field_list ')' opt_bucket
962 parsedData->setPrimary(true);
968 DataType type = parsedData->getFldType();
971 yyerror("AUTO_INCREMENT KEY can't be created other than INTEGER field ");
975 DbRetVal ret = parsedData->setAutoIncreament(true);
977 yyerror("A table should have ony one AUTO_INCREMENT KEY ");
981 parsedData->setFldNotNull(true);
982 parsedData->setAutoFldName(parsedData->getFldName());
983 parsedData->setPrimary(true);
989 parsedData->setFldType(typeInt);
993 parsedData->setFldType(typeLong);
997 parsedData->setFldType(typeShort);
1001 parsedData->setFldType(typeLongLong);
1005 parsedData->setFldType(typeByteInt);
1009 parsedData->setFldType(typeFloat);
1013 parsedData->setFldType(typeDouble);
1018 parsedData->setFldType(typeDate);
1023 parsedData->setFldType(typeTime);
1028 parsedData->setFldType(typeTimeStamp);
1033 parsedData->setFldType(typeString);
1034 parsedData->setFldLength(2);
1039 parsedData->setFldType(typeBinary);
1040 parsedData->setFldLength(1);
1046 void yyerror(const char* Msg) {
1048 fprintf(stderr, "[Parser: %s] %s\n", Msg, yytext);