8 ParsedData *parsedData;
11 void yyerror(const char* Msg);
21 %token <stringval> STRING FIELD NUMBER_STRING BINARY_STRING DOUBLE OPERATOR PARAMETER
22 %token <stringval> SELECT FROM WHERE BETWEEN IN AND OR NOT
23 %token <stringval> STAR
24 %token <stringval> INSERT INTO VALUES
25 %token <stringval> DELETE UPDATE SET NULL_VALUE
26 %token <stringval> CREATE TABLE PRIMARY KEY DEFAULT INDEX ON HASH TREE UNIQUE DROP
27 %token <stringval> INT_TYPE LONG_TYPE SHORT_TYPE DOUBLE_TYPE TIMESTAMP_TYPE DATE_TYPE CHAR_TYPE TIME_TYPE BIGINT_TYPE
28 %token ';' ',' '(' ')'
29 %type <stringval> ident field value not_opt
30 %type <predicate> conditions condition
33 command: select_statement { YYACCEPT; }
34 | insert_statement { YYACCEPT; }
35 | delete_statement { YYACCEPT; }
36 | update_statement { YYACCEPT; }
37 | ddl_statement { YYACCEPT; }
40 select_statement: SELECT field_list FROM ident where_clause_opt semicolon_opt
42 parsedData->setStmtType(SelectStatement);
43 parsedData->setTableName($4);
48 field_list: field_list field_list_L
51 field_list_L: ',' field
54 insert_statement: INSERT INTO ident field_list_opt VALUES '(' value_list ')' semicolon_opt
56 parsedData->setStmtType(InsertStatement);
57 parsedData->setTableName($3);
66 value_list: value_list value_list_L
69 parsedData->insertValue((char*)$1);
73 value_list_L: ',' value
75 parsedData->insertValue((char*)$2);
80 delete_statement: DELETE FROM ident where_clause_opt semicolon_opt
82 parsedData->setStmtType(DeleteStatement);
83 parsedData->setTableName($3);
88 update_statement: UPDATE ident SET assign_list where_clause_opt semicolon_opt
90 parsedData->setStmtType(UpdateStatement);
91 parsedData->setTableName($2);
100 assign_list: assign_list assign_list_L
104 assign_list_L: ',' assign_stmt
106 assign_stmt: ident OPERATOR value
108 parsedData->insertUpdateValue( (char*) $1, (char*) $3);
109 free( $1 ); free( $3 );
113 where_clause_opt: WHERE conditions
117 conditions: conditions AND conditions
120 pred = parsedData->insertPredicate((Predicate*) $1, OpAnd, (Predicate*) $3);
121 parsedData->setCondition((Predicate*)pred);
125 | conditions OR conditions
128 pred = parsedData->insertPredicate((Predicate*) $1, OpOr, (Predicate*) $3);
129 parsedData->setCondition((Predicate*)pred);
135 pred = parsedData->insertPredicate((Predicate*) $2, OpNot, NULL);
136 parsedData->setCondition((Predicate*)pred);
139 | '(' conditions ')' { }
142 parsedData->setCondition((Predicate*)$1);
143 //((Predicate*)$1)->print();
147 condition: ident OPERATOR value
149 ComparisionOp op = AllDataType::getComparisionOperator((char*)$2);
151 void **ptr = parsedData->insertCondValueAndGetPtr((char*)$1, (char*)$3);
152 pred = parsedData->insertPredicate((char*) $1, op, ptr);
153 free( $1 ); free( $3 );
156 | ident OPERATOR ident
158 ComparisionOp op = AllDataType::getComparisionOperator((char*)$2);
160 pred = parsedData->insertPredicate((char*) $1, op, (char*) $3);
161 free( $1 ); free( $3 );
165 | ident not_opt BETWEEN value AND value
167 void **ptr1 = parsedData->insertCondValueAndGetPtr((char*)$1, (char*)$4);
168 void **ptr2 = parsedData->insertCondValueAndGetPtr((char*)$1, (char*)$6);
169 Predicate *pred1, *pred2, *pred3, *finalPred;
170 pred1 = parsedData->insertPredicate((char*) $1, OpGreaterThanEquals, ptr1);
171 pred2 = parsedData->insertPredicate((char*) $1, OpLessThanEquals, ptr2);
172 finalPred = parsedData->insertPredicate(pred1, OpAnd, pred2);
173 if( $2 == (char*) 1 )
174 finalPred = parsedData->insertPredicate(finalPred, OpNot, NULL);
175 free( $1 ); free( $4 ); free( $6 );
178 | ident not_opt IN '(' value_list ')'
180 ListIterator valIter = parsedData->getFieldValueList().getIterator();
181 FieldValue *value1, *value2;
182 Predicate *pred1, *pred2, *finalPred;
184 if (valIter.hasElement()) {
185 value1 = (FieldValue*) valIter.nextElement();
186 ptr1 = parsedData->insertCondValueAndGetPtr((char*)$1, value1->parsedString);
187 pred1 = parsedData->insertPredicate((char*) $1, OpEquals, ptr1);
190 while (valIter.hasElement()) {
191 value2 = (FieldValue*) valIter.nextElement();
192 ptr2 = parsedData->insertCondValueAndGetPtr((char*)$1, value2->parsedString);
193 pred2 = parsedData->insertPredicate((char*) $1, OpEquals, ptr2);
194 finalPred = parsedData->insertPredicate(pred1, OpOr, pred2);
198 finalPred = parsedData->insertPredicate(finalPred, OpNot, NULL);
212 parsedData->insertField((char*)$1);
217 parsedData->insertField((char*)$1);
221 ident: FIELD { $$ = $1; }
223 value: STRING { $$ = $1; }
224 | NUMBER_STRING { $$ = $1; }
225 | BINARY_STRING { $$ = $1; }
226 | DOUBLE { $$ = $1; }
227 | PARAMETER { $$ = $1; }
228 | NULL_VALUE { $$ = (char*) 0; }
231 ddl_statement: CREATE TABLE ident '(' create_defn_list ')' semicolon_opt
233 parsedData->setStmtType(CreateTableStatement);
234 parsedData->setTableName($3);
237 | CREATE INDEX ident ON ident '(' field_list ')' opt_constr_type opt_ind_type semicolon_opt
239 parsedData->setStmtType(CreateIndexStatement);
240 parsedData->setIndexName($3);
241 parsedData->setTableName($5);
247 parsedData->setStmtType(DropTableStatement);
248 parsedData->setTableName($3);
253 parsedData->setStmtType(DropIndexStatement);
254 parsedData->setIndexName($3);
259 | HASH opt_constr_type
261 parsedData->setIndexType(hashIndex);
263 | TREE opt_constr_type
265 parsedData->setIndexType(treeIndex);
269 parsedData->setIndexType(hashIndex);
275 parsedData->setUnique(true);
279 parsedData->setUnique(true);
280 parsedData->setPrimary(true);
284 parsedData->setUnique(false);
285 parsedData->setPrimary(false);
288 create_defn_list: create_defn_list create_defn_list_L
292 create_defn_list_L: ',' create_defn
295 create_defn: field_defn
297 parsedData->insertFldDef();
302 field_defn: field_name field_type size_opt null_expr_opt default_expr_opt
307 parsedData->setFldName($1);
311 | '(' NUMBER_STRING ')'
313 parsedData->setFldLength(atoi($2)+1);
321 parsedData->setDefaultValue($2);
329 parsedData->setFldNotNull(true);
332 constraint_defn: primary_key_constraint
335 primary_key_constraint: PRIMARY KEY '(' field_list ')'
337 parsedData->setPrimary(true);
343 parsedData->setFldType(typeInt);
347 parsedData->setFldType(typeLong);
351 parsedData->setFldType(typeShort);
355 parsedData->setFldType(typeLongLong);
359 parsedData->setFldType(typeFloat);
363 parsedData->setFldType(typeDouble);
368 parsedData->setFldType(typeDate);
373 parsedData->setFldType(typeTime);
378 parsedData->setFldType(typeTimeStamp);
383 parsedData->setFldType(typeString);
384 parsedData->setFldLength(2);
390 void yyerror(const char* Msg) {
392 fprintf(stderr, "[Parser: %s] %s\n", Msg, yytext);