diff options
Diffstat (limited to 'ndb/src/old_files/client/odbc/codegen/SimpleGram.ypp')
-rw-r--r-- | ndb/src/old_files/client/odbc/codegen/SimpleGram.ypp | 1649 |
1 files changed, 0 insertions, 1649 deletions
diff --git a/ndb/src/old_files/client/odbc/codegen/SimpleGram.ypp b/ndb/src/old_files/client/odbc/codegen/SimpleGram.ypp deleted file mode 100644 index 07d8017e5ed..00000000000 --- a/ndb/src/old_files/client/odbc/codegen/SimpleGram.ypp +++ /dev/null @@ -1,1649 +0,0 @@ -%{ - -#include <NdbApi.hpp> -#include <common/StmtArea.hpp> -#include <common/DataRow.hpp> -#include "CodeGen.hpp" -#include <FlexLexer.h> -#include "SimpleParser.hpp" - -/* redefine globals after headers */ -#define yyparse SimpleParser_yyparse -#if YYDEBUG -#define yydebug SimpleParser_yydebug -#endif - -#define YYLEX_PARAM simpleParserPtr -#define YYPARSE_PARAM simpleParserPtr -#define simpleParser (*static_cast<SimpleParser*>(simpleParserPtr)) - -static int yylex(YYSTYPE* lvalp, void* simpleParserPtr); - -#define yyerror(s) simpleParser.parseError(s) - -#if YYDEBUG -// does not work in bison 1.75 -#undef stderr -#define stderr 0 -#define YYFPRINTF simpleParser.ctx().print -#endif - -// scanner states - -#define pushState(sc) simpleParser.pushState(sc) -#define popState() simpleParser.popState() - -#define StateEval SimpleParser_stateEval -#define StateType SimpleParser_stateType -#define StatePhys SimpleParser_statePhys -extern int SimpleParser_stateEval; -extern int SimpleParser_stateType; -extern int SimpleParser_statePhys; - -struct LimitPair { int off; int cnt; }; - -struct PhysAttr { int storage; int logging; }; - -%} - -%defines -%pure-parser -%verbose - -%union { - Plan_root* m_root; - Plan_stmt* m_stmt; - Plan_select* m_select; - Insert_op m_insert_op; - Plan_insert* m_insert; - Plan_update* m_update; - Plan_delete* m_delete; - Plan_create_table* m_create_table; - Plan_create_index* m_create_index; - NdbDictionary::Object::Type m_index_type; - Plan_create_row* m_create_row; - Plan_ddl_row* m_ddl_row; - Plan_ddl_column* m_ddl_column; - Plan_ddl_constr* m_ddl_constr; - Plan_idx_column* m_idx_column; - Plan_data_type* m_data_type; - Plan_drop_table* m_drop_table; - Plan_drop_index* m_drop_index; - Plan_set_row* m_set_row; - Plan_expr_row* m_expr_row; - bool m_asc_desc; - Plan_pred* m_pred; - Pred_op::Opcode m_pred_opcode; - Comp_op::Opcode m_comp_opcode; - Plan_expr* m_expr; - Expr_op::Opcode m_expr_opcode; - Plan_dml_row* m_dml_row; - Plan_dml_column* m_dml_column; - Plan_table* m_table; - Plan_table_list* m_table_list; - const char* m_string; - struct LimitPair* m_limit; - int m_signed_integer; - bool m_distinct; - struct PhysAttr* m_phys_attr; - NdbDictionary::Object::FragmentType m_storage_attr; - bool m_logging_attr; - SqlType::Type m_sql_type; -} - -/* keywords */ -%token - T_AND - T_ASC - T_AUTO_INCREMENT - T_BIGINT - T_BINARY - T_BLOB - T_BY - T_CHAR - T_CLOB - T_CONSTRAINT - T_CREATE - T_DATETIME - T_DEFAULT - T_DELETE - T_DESC - T_DISTINCT - T_DOUBLE - T_DROP - T_FLOAT - T_FOREIGN - T_FROM - T_GROUP - T_HASH - T_HAVING - T_IN - T_INDEX - T_INSERT - T_INT - T_INTEGER - T_INTO - T_IS - T_KEY - T_LARGE - T_LIKE - T_LIMIT - T_LOGGING - T_LONGBLOB - T_LONGCLOB - T_MEDIUM - T_NOLOGGING - T_NOT - T_NULL - T_OFFSET - T_ON - T_OR - T_ORDER - T_PRECISION - T_PRIMARY - T_REAL - T_REFERENCES - T_ROWNUM - T_SELECT - T_SET - T_SINGLE - T_SMALL - T_SMALLINT - T_STORAGE - T_SYSDATE - T_TABLE - T_UNIQUE - T_UNSIGNED - T_UPDATE - T_VALUES - T_VARBINARY - T_VARCHAR - T_WHERE - T_WRITE - -/* identifiers and constants */ -%token - <m_string> T_IDENTIFIER - <m_string> T_LINTEGER - <m_string> T_LDECIMAL - <m_string> T_LREAL - <m_string> T_STRING - -/* expressions and predicates */ -%token - T_PLUS - T_MINUS - T_TIMES - T_DIVIDE - T_EQ - T_NOTEQ - T_LT - T_LTEQ - T_GT - T_GTEQ - T_QUES - -/* common special symbols */ -%token - T_PERIOD - T_COMMA - T_PARENLEFT - T_PARENRIGHT - T_ASTERISK - T_ASSIGN - -%type <m_root> root -%type <m_stmt> stmt -%type <m_select> stmt_select -%type <m_insert> stmt_insert -%type <m_insert_op> insert_op -%type <m_update> stmt_update -%type <m_delete> stmt_delete -%type <m_create_table> create_table -%type <m_create_index> create_index -%type <m_index_type> index_type -%type <m_create_row> create_row -%type <m_ddl_column> create_column -%type <m_ddl_constr> create_constr -%type <m_idx_column> idx_column -%type <m_data_type> data_type -%type <m_ddl_row> ddl_row -%type <m_ddl_column> ddl_column -%type <m_drop_table> drop_table -%type <m_drop_index> drop_index -%type <m_asc_desc> asc_desc -%type <m_set_row> set_row -%type <m_expr_row> expr_row -%type <m_expr_row> sort_row -%type <m_pred> where_clause -%type <m_expr_row> order_clause -%type <m_pred> pred -%type <m_pred> pred1 -%type <m_pred_opcode> pred1_op -%type <m_pred> pred2 -%type <m_pred_opcode> pred2_op -%type <m_pred> pred3 -%type <m_pred_opcode> pred3_op -%type <m_pred> pred4 -%type <m_comp_opcode> comp_op -%type <m_expr> expr -%type <m_expr> expr1 -%type <m_expr_opcode> expr1_op -%type <m_expr> expr2 -%type <m_expr_opcode> expr2_op -%type <m_expr> expr3 -%type <m_expr_opcode> expr3_op -%type <m_expr> expr4 -%type <m_expr> expr_column -%type <m_dml_row> dml_row -%type <m_dml_column> dml_column -%type <m_expr_row> value_row -%type <m_expr> value_expr -%type <m_table> table -%type <m_table_list> table_list -%type <m_string> dot_identifier -%type <m_limit> limit_clause -%type <m_signed_integer> signed_integer -%type <m_distinct> distinct_clause -%type <m_expr_row> group_clause -%type <m_pred> having_clause -%type <m_phys_attr> phys_attr -%type <m_phys_attr> phys_attr2 -%type <m_storage_attr> storage_attr -%type <m_logging_attr> logging_attr -%type <m_sql_type> blob_type - -%% - -root: - stmt - { - Plan_root* root = simpleParser.root(); - root->setStmt($1); - } - ; -stmt: - stmt_select - { - $$ = $1; - } - | - stmt_insert - { - $$ = $1; - } - | - stmt_update - { - $$ = $1; - } - | - stmt_delete - { - $$ = $1; - } - | - create_table - { - $$ = $1; - } - | - create_index - { - $$ = $1; - } - | - drop_table - { - $$ = $1; - } - | - drop_index - { - $$ = $1; - } - ; -stmt_select: - T_SELECT distinct_clause expr_row T_FROM table_list where_clause group_clause having_clause order_clause limit_clause - { - Plan_root* root = simpleParser.root(); - Plan_select* stmt = new Plan_select(root); - root->saveNode(stmt); - stmt->setDistinct($2); - stmt->setRow($3); - stmt->setList($5); - if ($6 != 0) - stmt->setPred($6); - if ($7 != 0) - stmt->setGroup($7); - if ($8 != 0) - stmt->setHaving($8); - if ($9 != 0) - stmt->setSort($9); - if ($10 != 0) { - stmt->setLimit($10->off, $10->cnt); - delete $10; - } - $$ = stmt; - } - ; -stmt_insert: - insert_op T_INTO table T_VALUES T_PARENLEFT value_row T_PARENRIGHT - { - Plan_root* root = simpleParser.root(); - Plan_insert* stmt = new Plan_insert(root, $1); - root->saveNode(stmt); - stmt->setTable($3); - stmt->setExprRow($6); - $$ = stmt; - } - | - insert_op T_INTO table T_PARENLEFT dml_row T_PARENRIGHT T_VALUES T_PARENLEFT value_row T_PARENRIGHT - { - Plan_root* root = simpleParser.root(); - Plan_insert* stmt = new Plan_insert(root, $1); - root->saveNode(stmt); - stmt->setTable($3); - stmt->setDmlRow($5); - stmt->setExprRow($9); - $$ = stmt; - } - | - insert_op T_INTO table stmt_select - { - Plan_root* root = simpleParser.root(); - Plan_insert* stmt = new Plan_insert(root, $1); - root->saveNode(stmt); - stmt->setTable($3); - stmt->setSelect($4); - $$ = stmt; - } - | - insert_op T_INTO table T_PARENLEFT dml_row T_PARENRIGHT stmt_select - { - Plan_root* root = simpleParser.root(); - Plan_insert* stmt = new Plan_insert(root, $1); - root->saveNode(stmt); - stmt->setTable($3); - stmt->setDmlRow($5); - stmt->setSelect($7); - $$ = stmt; - } - | - insert_op T_INTO table T_SET set_row - { - Plan_root* root = simpleParser.root(); - Plan_insert* stmt = new Plan_insert(root, $1); - root->saveNode(stmt); - stmt->setTable($3); - stmt->setMysqlRow($5); - $$ = stmt; - } - ; -insert_op: - T_INSERT - { - $$ = Insert_op_insert; - } - | - T_WRITE - { - $$ = Insert_op_write; - } - ; -stmt_update: - T_UPDATE table T_SET set_row where_clause - { - Plan_root* root = simpleParser.root(); - Plan_update* stmt = new Plan_update(root); - root->saveNode(stmt); - stmt->setTable($2); - stmt->setRow($4); - if ($5 != 0) - stmt->setPred($5); - $$ = stmt; - } - ; -stmt_delete: - T_DELETE T_FROM table where_clause - { - Plan_root* root = simpleParser.root(); - Plan_delete* stmt = new Plan_delete(root); - root->saveNode(stmt); - stmt->setTable($3); - if ($4 != 0) - stmt->setPred($4); - $$ = stmt; - } - ; -create_table: - T_CREATE T_TABLE dot_identifier T_PARENLEFT create_row T_PARENRIGHT phys_attr - { - Plan_root* root = simpleParser.root(); - Plan_create_table* stmt = new Plan_create_table(root, $3); - root->saveNode(stmt); - delete[] $3; - stmt->setCreateRow($5); - if ($7->storage != -1) - stmt->setFragmentType((NdbDictionary::Object::FragmentType)$7->storage); - if ($7->logging != -1) - stmt->setLogging($7->logging); - delete $7; - $$ = stmt; - } - ; -create_row: - create_column - { - Plan_root* root = simpleParser.root(); - Plan_create_row* createRow = new Plan_create_row(root); - root->saveNode(createRow); - createRow->addColumn($1); - $$ = createRow; - } - | - create_constr - { - Plan_root* root = simpleParser.root(); - Plan_create_row* createRow = new Plan_create_row(root); - root->saveNode(createRow); - createRow->addConstr($1); - $$ = createRow; - } - | - create_row T_COMMA create_column - { - Plan_create_row* createRow = $1; - createRow->addColumn($3); - $$ = createRow; - } - | - create_row T_COMMA create_constr - { - Plan_create_row* createRow = $1; - createRow->addConstr($3); - $$ = createRow; - } - | - create_row T_COMMA create_ignore - { - $$ = $1; - } - ; -create_column: - T_IDENTIFIER { pushState(StateType); } data_type { popState(); } - { - Plan_root* root = simpleParser.root(); - Plan_ddl_column* ddlColumn = new Plan_ddl_column(root, $1); - root->saveNode(ddlColumn); - delete[] $1; - ddlColumn->setType($3); - simpleParser.curr(ddlColumn); - } - create_column_rest - { - $$ = simpleParser.curr((Plan_ddl_column*)0); - } - ; -data_type: - T_CHAR T_PARENLEFT T_LINTEGER T_PARENRIGHT dummy_binary - { - Plan_root* root = simpleParser.root(); - SqlType sqlType(simpleParser.ctx(), SqlType::Char, atoi($3), true); - delete[] $3; - if (! simpleParser.ctx().ok()) { - YYABORT; - } - Plan_data_type* dataType = new Plan_data_type(root, sqlType); - root->saveNode(dataType); - $$ = dataType; - } - | - T_BINARY T_PARENLEFT T_LINTEGER T_PARENRIGHT - { - Plan_root* root = simpleParser.root(); - SqlType sqlType(simpleParser.ctx(), SqlType::Binary, atoi($3), true); - delete[] $3; - if (! simpleParser.ctx().ok()) { - YYABORT; - } - Plan_data_type* dataType = new Plan_data_type(root, sqlType); - root->saveNode(dataType); - $$ = dataType; - } - | - T_VARCHAR T_PARENLEFT T_LINTEGER T_PARENRIGHT dummy_binary - { - Plan_root* root = simpleParser.root(); - SqlType sqlType(simpleParser.ctx(), SqlType::Varchar, atoi($3), true); - delete[] $3; - if (! simpleParser.ctx().ok()) { - YYABORT; - } - Plan_data_type* dataType = new Plan_data_type(root, sqlType); - root->saveNode(dataType); - $$ = dataType; - } - | - T_VARBINARY T_PARENLEFT T_LINTEGER T_PARENRIGHT - { - Plan_root* root = simpleParser.root(); - SqlType sqlType(simpleParser.ctx(), SqlType::Varbinary, atoi($3), true); - delete[] $3; - if (! simpleParser.ctx().ok()) { - YYABORT; - } - Plan_data_type* dataType = new Plan_data_type(root, sqlType); - root->saveNode(dataType); - $$ = dataType; - } - | - T_SMALLINT - { - Plan_root* root = simpleParser.root(); - SqlType sqlType(SqlType::Smallint, true); - Plan_data_type* dataType = new Plan_data_type(root, sqlType); - root->saveNode(dataType); - $$ = dataType; - } - | - T_INTEGER - { - Plan_root* root = simpleParser.root(); - SqlType sqlType(SqlType::Integer, true); - Plan_data_type* dataType = new Plan_data_type(root, sqlType); - root->saveNode(dataType); - $$ = dataType; - } - | - T_INT - { - Plan_root* root = simpleParser.root(); - SqlType sqlType(SqlType::Integer, true); - Plan_data_type* dataType = new Plan_data_type(root, sqlType); - root->saveNode(dataType); - $$ = dataType; - } - | - T_BIGINT - { - Plan_root* root = simpleParser.root(); - SqlType sqlType(SqlType::Bigint, true); - Plan_data_type* dataType = new Plan_data_type(root, sqlType); - root->saveNode(dataType); - $$ = dataType; - } - | - T_REAL - { - Plan_root* root = simpleParser.root(); - SqlType sqlType(SqlType::Real, true); - Plan_data_type* dataType = new Plan_data_type(root, sqlType); - root->saveNode(dataType); - $$ = dataType; - } - | - T_FLOAT - { - Plan_root* root = simpleParser.root(); - SqlType sqlType(SqlType::Double, true); - Plan_data_type* dataType = new Plan_data_type(root, sqlType); - root->saveNode(dataType); - $$ = dataType; - } - | - T_DOUBLE T_PRECISION - { - Plan_root* root = simpleParser.root(); - SqlType sqlType(SqlType::Double, true); - Plan_data_type* dataType = new Plan_data_type(root, sqlType); - root->saveNode(dataType); - $$ = dataType; - } - | - T_DATETIME - { - Plan_root* root = simpleParser.root(); - SqlType sqlType(SqlType::Datetime, true); - Plan_data_type* dataType = new Plan_data_type(root, sqlType); - root->saveNode(dataType); - $$ = dataType; - } - | - blob_type - { - Plan_root* root = simpleParser.root(); - SqlType sqlType($1, true); - Plan_data_type* dataType = new Plan_data_type(root, sqlType); - root->saveNode(dataType); - $$ = dataType; - } - ; -dummy_binary: - /* empty */ - | - T_BINARY - ; -blob_type: - T_BLOB - { - $$ = SqlType::Blob; - } - | - T_LONGBLOB - { - $$ = SqlType::Blob; - } - | - T_CLOB - { - $$ = SqlType::Clob; - } - | - T_LONGCLOB - { - $$ = SqlType::Clob; - } - ; -create_column_rest: - /* empty */ - | - data_constr_list - ; -data_constr_list: - data_constr - | - data_constr_list data_constr - ; -data_constr: - T_NULL - | - T_NOT T_NULL - { - Plan_ddl_column* ddlColumn = simpleParser.curr((Plan_ddl_column*)0); - ddlColumn->setNotNull(); - } - | - T_UNSIGNED - { - Plan_ddl_column* ddlColumn = simpleParser.curr((Plan_ddl_column*)0); - ddlColumn->setUnSigned(); - } - | - T_PRIMARY T_KEY - { - Plan_ddl_column* ddlColumn = simpleParser.curr((Plan_ddl_column*)0); - ddlColumn->setPrimaryKey(); - } - | - T_AUTO_INCREMENT - { - Plan_ddl_column* ddlColumn = simpleParser.curr((Plan_ddl_column*)0); - ddlColumn->setAutoIncrement(); - } - | - T_DEFAULT expr - { - Plan_ddl_column* ddlColumn = simpleParser.curr((Plan_ddl_column*)0); - ddlColumn->setDefaultValue($2); - } - ; -create_constr: - T_PRIMARY T_KEY T_PARENLEFT ddl_row T_PARENRIGHT - { - Plan_root* root = simpleParser.root(); - Plan_ddl_constr* ddlConstr = new Plan_ddl_constr(root); - root->saveNode(ddlConstr); - ddlConstr->setRow($4); - $$ = ddlConstr; - } - | - T_CONSTRAINT dot_identifier T_PRIMARY T_KEY T_PARENLEFT ddl_row T_PARENRIGHT - { - Plan_root* root = simpleParser.root(); - Plan_ddl_constr* ddlConstr = new Plan_ddl_constr(root); - root->saveNode(ddlConstr); - ddlConstr->setRow($6); - $$ = ddlConstr; - } - ; -create_ignore: - T_INDEX dot_identifier T_PARENLEFT ddl_row T_PARENRIGHT - | - T_FOREIGN T_KEY T_PARENLEFT ddl_row T_PARENRIGHT T_REFERENCES dot_identifier T_PARENLEFT ddl_row T_PARENRIGHT - ; -ddl_row: - ddl_column - { - Plan_root* root = simpleParser.root(); - Plan_ddl_row* ddlRow = new Plan_ddl_row(root); - root->saveNode(ddlRow); - ddlRow->addColumn($1); - $$ = ddlRow; - } - | - ddl_row T_COMMA ddl_column - { - Plan_ddl_row* ddlRow = $1; - ddlRow->addColumn($3); - $$ = ddlRow; - } - ; -ddl_column: - T_IDENTIFIER - { - Plan_root* root = simpleParser.root(); - Plan_ddl_column* column = new Plan_ddl_column(root, $1); - root->saveNode(column); - delete[] $1; - $$ = column; - } - ; -create_index: - T_CREATE index_type T_INDEX dot_identifier T_ON table - { - Plan_root* root = simpleParser.root(); - Plan_create_index* stmt = new Plan_create_index(root, $4); - root->saveNode(stmt); - delete[] $4; - stmt->setType($2); - stmt->setTable($6); - simpleParser.curr(stmt); - } - T_PARENLEFT idx_row T_PARENRIGHT phys_attr - { - $$ = simpleParser.curr((Plan_create_index*)0); - if ($11->storage != -1) - $$->setFragmentType((NdbDictionary::Object::FragmentType)$11->storage); - if ($11->logging != -1) - $$->setLogging($11->logging); - delete $11; - } - ; -index_type: - T_HASH - { - $$ = NdbDictionary::Object::HashIndex; - } - | - T_UNIQUE T_HASH - { - $$ = NdbDictionary::Object::UniqueHashIndex; - } - | - /* empty */ - { - $$ = NdbDictionary::Object::OrderedIndex; - } - | - T_UNIQUE - { - $$ = NdbDictionary::Object::UniqueOrderedIndex; - } - ; -idx_row: - idx_column - { - } - | - idx_row T_COMMA idx_column - { - } - ; -idx_column: - T_IDENTIFIER - { - Plan_root* root = simpleParser.root(); - Plan_idx_column* column = new Plan_idx_column(root, $1); - root->saveNode(column); - delete[] $1; - Plan_create_index* stmt = simpleParser.curr((Plan_create_index*)0); - stmt->addColumn(column); - } - ; -phys_attr: - { pushState(StatePhys); } phys_attr2 { popState(); } - { - $$ = $2; - } - ; -phys_attr2: - /* empty */ - { - $$ = new PhysAttr(); - $$->storage = $$->logging = -1; - } - | - phys_attr2 storage_attr - { - if ($1->storage != -1 && $1->storage != $2) { - simpleParser.ctx().pushStatus(Sqlstate::_42000, Error::Gen, "conflicting STORAGE clauses"); - YYABORT; - } - $$->storage = $2; - } - | - phys_attr2 logging_attr - { - if ($1->logging != -1 && $1->logging != $2) { - simpleParser.ctx().pushStatus(Sqlstate::_42000, Error::Gen, "conflicting LOGGING clauses"); - YYABORT; - } - $$->logging = $2; - } - ; -logging_attr: - T_LOGGING - { - $$ = true; - } - | - T_NOLOGGING - { - $$ = false; - } - ; -storage_attr: - T_STORAGE T_PARENLEFT T_SINGLE T_PARENRIGHT - { - $$ = NdbDictionary::Object::FragSingle; - } - | - T_STORAGE T_PARENLEFT T_SMALL T_PARENRIGHT - { - $$ = NdbDictionary::Object::FragAllSmall; - } - | - T_STORAGE T_PARENLEFT T_MEDIUM T_PARENRIGHT - { - $$ = NdbDictionary::Object::FragAllMedium; - } - | - T_STORAGE T_PARENLEFT T_LARGE T_PARENRIGHT - { - $$ = NdbDictionary::Object::FragAllLarge; - } - ; -drop_table: - T_DROP T_TABLE dot_identifier - { - Plan_root* root = simpleParser.root(); - Plan_drop_table* stmt = new Plan_drop_table(root, $3); - root->saveNode(stmt); - delete[] $3; - $$ = stmt; - } - ; -drop_index: - T_DROP T_INDEX dot_identifier - { - Plan_root* root = simpleParser.root(); - Plan_drop_index* stmt = new Plan_drop_index(root, $3); - root->saveNode(stmt); - delete[] $3; - $$ = stmt; - } - | - T_DROP T_INDEX dot_identifier T_ON dot_identifier - { - Plan_root* root = simpleParser.root(); - Plan_drop_index* stmt = new Plan_drop_index(root, $3, $5); - root->saveNode(stmt); - delete[] $3; - delete[] $5; - $$ = stmt; - } - ; -distinct_clause: - /* empty */ - { - $$ = false; - } - | - T_DISTINCT - { - $$ = true; - } - ; -where_clause: - /* empty */ - { - $$ = 0; - } - | - T_WHERE pred - { - $$ = $2; - } - ; -group_clause: - /* empty */ - { - $$ = 0; - } - | - T_GROUP T_BY value_row - { - $$ = $3; - } - ; -having_clause: - /* empty */ - { - $$ = 0; - } - | - T_HAVING pred - { - $$ = $2; - } - ; -order_clause: - /* empty */ - { - $$ = 0; - } - | - T_ORDER T_BY sort_row - { - $$ = $3; - } - ; -limit_clause: - /* empty */ - { - $$ = 0; - } - | - T_LIMIT signed_integer - { - LimitPair* p = new LimitPair; - p->off = 0; - p->cnt = $2; - $$ = p; - } - | - T_LIMIT signed_integer T_COMMA signed_integer - { - LimitPair* p = new LimitPair; - p->off = $2, - p->cnt = $4; - $$ = p; - } - | - T_LIMIT signed_integer T_OFFSET signed_integer - { - LimitPair* p = new LimitPair; - p->off = $4; - p->cnt = $2; - $$ = p; - } - ; -signed_integer: - T_LINTEGER - { - $$ = atoi($1); - delete[] $1; - } - | - T_MINUS T_LINTEGER - { - $$ = (-1) * atoi($2); - delete[] $2; - } - ; -set_row: - dml_column T_ASSIGN expr - { - Plan_root* root = simpleParser.root(); - Plan_set_row* row = new Plan_set_row(root); - root->saveNode(row); - row->addColumn($1); - row->addExpr($3); - $$ = row; - } - | - set_row T_COMMA dml_column T_ASSIGN expr - { - Plan_set_row* row = $1; - row->addColumn($3); - row->addExpr($5); - $$ = row; - } - ; -dml_row: - dml_column - { - Plan_root* root = simpleParser.root(); - Plan_dml_row* row = new Plan_dml_row(root); - root->saveNode(row); - row->addColumn($1); - $$ = row; - } - | - dml_row T_COMMA dml_column - { - Plan_dml_row* row = $1; - row->addColumn($3); - $$ = row; - } - ; -dml_column: - T_IDENTIFIER - { - Plan_root* root = simpleParser.root(); - Plan_dml_column* column = new Plan_dml_column(root, $1); - root->saveNode(column); - delete[] $1; - $$ = column; - } - ; -value_row: - value_expr - { - Plan_root* root = simpleParser.root(); - Plan_expr_row* row = new Plan_expr_row(root); - root->saveNode(row); - row->addExpr($1); - $$ = row; - } - | - value_row T_COMMA value_expr - { - Plan_expr_row* row = $1; - row->addExpr($3); - $$ = row; - } - ; -value_expr: - expr - { - $$ = $1; - } - ; -sort_row: - expr asc_desc - { - Plan_root* root = simpleParser.root(); - Plan_expr_row* row = new Plan_expr_row(root); - root->saveNode(row); - row->addExpr($1, $2); - $$ = row; - } - | - sort_row T_COMMA expr asc_desc - { - Plan_expr_row* row = $1; - row->addExpr($3, $4); - $$ = row; - } - ; -asc_desc: - /* empty */ - { - $$ = true; - } - | - T_ASC - { - $$ = true; - } - | - T_DESC - { - $$ = false; - } - ; -expr_row: - T_ASTERISK - { - Plan_root* root = simpleParser.root(); - Plan_expr_row* row = new Plan_expr_row(root); - root->saveNode(row); - row->setAsterisk(); - $$ = row; - } - | - T_TIMES /* XXX fix scanner state */ - { - Plan_root* root = simpleParser.root(); - Plan_expr_row* row = new Plan_expr_row(root); - root->saveNode(row); - row->setAsterisk(); - $$ = row; - } - | - expr - { - Plan_root* root = simpleParser.root(); - Plan_expr_row* row = new Plan_expr_row(root); - root->saveNode(row); - row->addExpr($1); - $$ = row; - } - | - expr T_IDENTIFIER - { - Plan_root* root = simpleParser.root(); - Plan_expr_row* row = new Plan_expr_row(root); - root->saveNode(row); - row->addExpr($1, BaseString($2)); - $$ = row; - } - | - expr_row T_COMMA expr - { - Plan_expr_row* row = $1; - row->addExpr($3); - $$ = row; - } - | - expr_row T_COMMA expr T_IDENTIFIER - { - Plan_expr_row* row = $1; - row->addExpr($3, BaseString($4)); - $$ = row; - } - ; -pred: - { pushState(StateEval); } pred1 { popState(); } - { - $$ = $2; - } - ; -pred1: - pred2 - { - $$ = $1; - } - | - pred1 pred1_op pred2 - { - Plan_root* root = simpleParser.root(); - Pred_op op($2); - Plan_pred_op* pred = new Plan_pred_op(root, op); - root->saveNode(pred); - pred->setPred(1, $1); - pred->setPred(2, $3); - $$ = pred; - } - ; -pred1_op: - T_OR - { - $$ = Pred_op::Or; - } - ; -pred2: - pred3 - { - $$ = $1; - } - | - pred2 pred2_op pred3 - { - Plan_root* root = simpleParser.root(); - Pred_op op($2); - Plan_pred_op* pred = new Plan_pred_op(root, op); - root->saveNode(pred); - pred->setPred(1, $1); - pred->setPred(2, $3); - $$ = pred; - } - ; -pred2_op: - T_AND - { - $$ = Pred_op::And; - } - ; -pred3: - pred4 - { - $$ = $1; - } - | - pred3_op pred3 - { - Plan_root* root = simpleParser.root(); - Pred_op op($1); - Plan_pred_op* pred = new Plan_pred_op(root, op); - root->saveNode(pred); - pred->setPred(1, $2); - $$ = pred; - } - ; -pred3_op: - T_NOT - { - $$ = Pred_op::Not; - } - ; -pred4: - T_PARENLEFT pred1 T_PARENRIGHT - { - $$ = $2; - } - | - expr1 comp_op expr1 - { - Plan_root* root = simpleParser.root(); - Comp_op op($2); - Plan_comp_op* comp = new Plan_comp_op(root, op); - root->saveNode(comp); - comp->setExpr(1, $1); - comp->setExpr(2, $3); - $$ = comp; - } - | - expr1 T_IS T_NULL - { - Plan_root* root = simpleParser.root(); - Comp_op op(Comp_op::Isnull); - Plan_comp_op* comp = new Plan_comp_op(root, op); - root->saveNode(comp); - comp->setExpr(1, $1); - $$ = comp; - } - | - expr1 T_IS T_NOT T_NULL - { - Plan_root* root = simpleParser.root(); - Comp_op op(Comp_op::Isnotnull); - Plan_comp_op* comp = new Plan_comp_op(root, op); - root->saveNode(comp); - comp->setExpr(1, $1); - $$ = comp; - } - | - expr1 T_IN T_PARENLEFT value_row T_PARENRIGHT - { - Plan_root* root = simpleParser.root(); - Plan_pred* predOut = 0; // hack directly into Or of Eq - Plan_expr* exprLeft = $1; - Plan_expr_row* row = $4; - for (unsigned i = row->getSize(); i >= 1; i--) { - Plan_expr* exprRight = row->getExpr(i); - Plan_comp_op* comp = new Plan_comp_op(root, Comp_op::Eq); - root->saveNode(comp); - comp->setExpr(1, exprLeft); - comp->setExpr(2, exprRight); - if (predOut == 0) { - predOut = comp; - } else { - Plan_pred_op* pred = new Plan_pred_op(root, Pred_op::Or); - root->saveNode(pred); - pred->setPred(1, predOut); - pred->setPred(2, comp); - predOut = pred; - } - } - $$ = predOut; - } - | - expr1 T_NOT T_IN T_PARENLEFT value_row T_PARENRIGHT - { - Plan_root* root = simpleParser.root(); - Plan_pred* predOut = 0; // hack directly into And of Noteq - Plan_expr* exprLeft = $1; - Plan_expr_row* row = $5; - for (unsigned i = row->getSize(); i >= 1; i--) { - Plan_expr* exprRight = row->getExpr(i); - Plan_comp_op* comp = new Plan_comp_op(root, Comp_op::Noteq); - root->saveNode(comp); - comp->setExpr(1, exprLeft); - comp->setExpr(2, exprRight); - if (predOut == 0) { - predOut = comp; - } else { - Plan_pred_op* pred = new Plan_pred_op(root, Pred_op::And); - root->saveNode(pred); - pred->setPred(1, predOut); - pred->setPred(2, comp); - predOut = pred; - } - } - $$ = predOut; - } - ; -comp_op: - T_EQ - { - $$ = Comp_op::Eq; - } - | - T_NOTEQ - { - $$ = Comp_op::Noteq; - } - | - T_LT - { - $$ = Comp_op::Lt; - } - | - T_LTEQ - { - $$ = Comp_op::Lteq; - } - | - T_GT - { - $$ = Comp_op::Gt; - } - | - T_GTEQ - { - $$ = Comp_op::Gteq; - } - | - T_LIKE - { - $$ = Comp_op::Like; - } - | - T_NOT T_LIKE - { - $$ = Comp_op::Notlike; - } - ; -expr: - { pushState(StateEval); } expr1 { popState(); } - { - $$ = $2; - } - ; -expr1: - expr2 - { - $$ = $1; - } - | - expr1 expr1_op expr2 - { - Plan_root* root = simpleParser.root(); - Expr_op op($2); - Plan_expr_op* expr = new Plan_expr_op(root, op); - root->saveNode(expr); - expr->setExpr(1, $1); - expr->setExpr(2, $3); - $$ = expr; - } - ; -expr1_op: - T_PLUS - { - $$ = Expr_op::Add; - } - | - T_MINUS - { - $$ = Expr_op::Subtract; - } - ; -expr2: - expr3 - { - $$ = $1; - } - | - expr2 expr2_op expr3 - { - Plan_root* root = simpleParser.root(); - Expr_op op($2); - Plan_expr_op* expr = new Plan_expr_op(root, op); - root->saveNode(expr); - expr->setExpr(1, $1); - expr->setExpr(2, $3); - $$ = expr; - } - ; -expr2_op: - T_TIMES - { - $$ = Expr_op::Multiply; - } - | - T_DIVIDE - { - $$ = Expr_op::Divide; - } - ; -expr3: - expr4 - { - $$ = $1; - } - | - expr3_op expr3 - { - Plan_root* root = simpleParser.root(); - Expr_op op($1); - Plan_expr_op* expr = new Plan_expr_op(root, op); - root->saveNode(expr); - expr->setExpr(1, $2); - $$ = expr; - } - ; -expr3_op: - T_PLUS - { - $$ = Expr_op::Plus; - } - | - T_MINUS - { - $$ = Expr_op::Minus; - } - ; -expr4: - T_PARENLEFT expr1 T_PARENRIGHT - { - $$ = $2; - } - | - T_IDENTIFIER T_PARENLEFT expr_row T_PARENRIGHT - { - Plan_root* root = simpleParser.root(); - const Expr_func& spec = Expr_func::find($1); - if (spec.m_name == 0) { - simpleParser.ctx().pushStatus(Sqlstate::_42000, Error::Gen, "unknown function %s", $1); - delete[] $1; - YYABORT; - } - Plan_expr_func* func = new Plan_expr_func(root, spec); - root->saveNode(func); - delete[] $1; - func->setArgs($3); - $$ = func; - } - | - T_ROWNUM - { - Plan_root* root = simpleParser.root(); - const Expr_func& spec = Expr_func::find("ROWNUM"); - ctx_assert(spec.m_name != 0); - Plan_expr_func* func = new Plan_expr_func(root, spec); - root->saveNode(func); - func->setArgs(0); - $$ = func; - } - | - T_SYSDATE - { - Plan_root* root = simpleParser.root(); - const Expr_func& spec = Expr_func::find("SYSDATE"); - ctx_assert(spec.m_name != 0); - Plan_expr_func* func = new Plan_expr_func(root, spec); - root->saveNode(func); - func->setArgs(0); - $$ = func; - } - | - expr_column - { - $$ = $1; - } - | - T_STRING - { - Plan_root* root = simpleParser.root(); - LexType lexType(LexType::Char); - Plan_expr_const* expr = new Plan_expr_const(root, lexType, $1); - root->saveNode(expr); - delete[] $1; - $$ = expr; - } - | - T_LINTEGER - { - Plan_root* root = simpleParser.root(); - LexType lexType(LexType::Integer); - Plan_expr_const* expr = new Plan_expr_const(root, lexType, $1); - root->saveNode(expr); - delete[] $1; - $$ = expr; - } - | - T_LDECIMAL - { - Plan_root* root = simpleParser.root(); - LexType lexType(LexType::Float); - Plan_expr_const* expr = new Plan_expr_const(root, lexType, $1); - root->saveNode(expr); - delete[] $1; - $$ = expr; - } - | - T_LREAL - { - Plan_root* root = simpleParser.root(); - LexType lexType(LexType::Float); - Plan_expr_const* expr = new Plan_expr_const(root, lexType, $1); - root->saveNode(expr); - delete[] $1; - $$ = expr; - } - | - T_NULL - { - Plan_root* root = simpleParser.root(); - LexType lexType(LexType::Null); - Plan_expr_const* expr = new Plan_expr_const(root, lexType, ""); - root->saveNode(expr); - $$ = expr; - } - | - T_QUES - { - Plan_root* root = simpleParser.root(); - unsigned paramNumber = simpleParser.paramNumber(); - ctx_assert(paramNumber != 0); - Plan_expr_param* expr = new Plan_expr_param(root, paramNumber); - root->saveNode(expr); - $$ = expr; - } - ; -expr_column: - T_IDENTIFIER - { - Plan_root* root = simpleParser.root(); - Plan_expr_column* column = new Plan_expr_column(root, $1); - root->saveNode(column); - delete[] $1; - $$ = column; - } - | - T_IDENTIFIER T_PERIOD T_IDENTIFIER - { - Plan_root* root = simpleParser.root(); - Plan_expr_column* column = new Plan_expr_column(root, $3); - root->saveNode(column); - delete[] $3; - column->setCname($1); - $$ = column; - } - | - T_IDENTIFIER T_PERIOD T_IDENTIFIER T_PERIOD T_IDENTIFIER - { - Plan_root* root = simpleParser.root(); - BaseString str; - str.append($1); - str.append("."); - str.append($3); - delete[] $1; - delete[] $3; - Plan_expr_column* column = new Plan_expr_column(root, $5); - root->saveNode(column); - delete[] $5; - column->setCname(str); - $$ = column; - } - ; -table_list: - table - { - Plan_root* root = simpleParser.root(); - Plan_table_list* tableList = new Plan_table_list(root); - root->saveNode(tableList); - tableList->addTable($1); - $$ = tableList; - } - | - table_list T_COMMA table - { - Plan_table_list* tableList = $1; - tableList->addTable($3); - $$ = tableList; - } - ; -table: - dot_identifier - { - Plan_root* root = simpleParser.root(); - Plan_table* table = new Plan_table(root, $1); - root->saveNode(table); - delete[] $1; - $$ = table; - } - | - dot_identifier T_IDENTIFIER - { - Plan_root* root = simpleParser.root(); - Plan_table* table = new Plan_table(root, $1); - root->saveNode(table); - delete[] $1; - table->setCname($2); - delete[] $2; - $$ = table; - } - ; -dot_identifier: - T_IDENTIFIER - { - $$ = $1; - } - | - T_IDENTIFIER T_PERIOD T_IDENTIFIER - { - char* s = new char[strlen($1) + 1 + strlen($3) + 1]; - strcpy(s, $1); - strcat(s, "."); - strcat(s, $3); - delete[] $1; - delete[] $3; - $$ = s; - } - ; - -%% - -static int -yylex(YYSTYPE* lvalp, void* simpleParserPtr) -{ - int ret = simpleParser.yylex(); - *lvalp = simpleParser.yylval(); - return ret; -} - -/* vim: set filetype=yacc: */ |