diff --git a/src/interfaces/ecpg/ChangeLog b/src/interfaces/ecpg/ChangeLog index f9e3403b293b7a7f14215b1cca81959322479369..bc0c3af03e886607ec192b6445a6b0f8c4723530 100644 --- a/src/interfaces/ecpg/ChangeLog +++ b/src/interfaces/ecpg/ChangeLog @@ -1859,6 +1859,11 @@ Mon Sep 6 13:17:46 CEST 2004 - Fixed bug in Informix mode that caused a segfault. - Set pgtypes library version to 1.2. + +Mon Sep 27 11:05:49 CEST 2004 + + - Synced parser. + - Removed Oracle transaction syntax to fix shift/reduce error. - Set ecpg version to 3.2.0. - Set compat library version to 1.2. - Set ecpg library version to 4.2. diff --git a/src/interfaces/ecpg/preproc/ecpg_keywords.c b/src/interfaces/ecpg/preproc/ecpg_keywords.c index f76594dad915f654713a6645dbf8114f1b54e606..6594ada2d211eae1bf0c880888cb15090c46dd46 100644 --- a/src/interfaces/ecpg/preproc/ecpg_keywords.c +++ b/src/interfaces/ecpg/preproc/ecpg_keywords.c @@ -4,7 +4,7 @@ * lexical token lookup for reserved words in postgres embedded SQL * * IDENTIFICATION - * $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/ecpg_keywords.c,v 1.29 2003/11/29 19:52:08 pgsql Exp $ + * $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/ecpg_keywords.c,v 1.30 2004/09/27 09:59:17 meskes Exp $ * *------------------------------------------------------------------------- */ @@ -57,7 +57,6 @@ static ScanKeyword ScanKeywords[] = { {"open", SQL_OPEN}, {"output", SQL_OUTPUT}, {"reference", SQL_REFERENCE}, - {"release", SQL_RELEASE}, {"returned_length", SQL_RETURNED_LENGTH}, {"returned_octet_length", SQL_RETURNED_OCTET_LENGTH}, {"scale", SQL_SCALE}, diff --git a/src/interfaces/ecpg/preproc/keywords.c b/src/interfaces/ecpg/preproc/keywords.c index 004e533267bc09b29e627919001752ab6d5a7dac..d31a5b8bb7a49f47c8ef7691b8b41fd7588398ab 100644 --- a/src/interfaces/ecpg/preproc/keywords.c +++ b/src/interfaces/ecpg/preproc/keywords.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/keywords.c,v 1.66 2004/08/30 02:54:41 momjian Exp $ + * $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/keywords.c,v 1.67 2004/09/27 09:59:17 meskes Exp $ * *------------------------------------------------------------------------- */ @@ -249,6 +249,7 @@ static ScanKeyword ScanKeywords[] = { {"references", REFERENCES}, {"reindex", REINDEX}, {"relative", RELATIVE_P}, + {"release", RELEASE}, {"rename", RENAME}, {"repeatable", REPEATABLE}, {"replace", REPLACE}, @@ -262,6 +263,7 @@ static ScanKeyword ScanKeywords[] = { {"row", ROW}, {"rows", ROWS}, {"rule", RULE}, + {"savepoint", SAVEPOINT}, {"schema", SCHEMA}, {"scroll", SCROLL}, {"second", SECOND_P}, diff --git a/src/interfaces/ecpg/preproc/preproc.y b/src/interfaces/ecpg/preproc/preproc.y index 296b75c0ef10996130da0bec5ec342cbdebdfdbd..32e1b66f6fb97fc1309edde0d1708adbb1b0ae53 100644 --- a/src/interfaces/ecpg/preproc/preproc.y +++ b/src/interfaces/ecpg/preproc/preproc.y @@ -1,4 +1,4 @@ -/* $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/preproc.y,v 1.296 2004/09/06 11:23:07 meskes Exp $ */ +/* $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/preproc.y,v 1.297 2004/09/27 09:59:17 meskes Exp $ */ /* Copyright comment */ %{ @@ -326,7 +326,7 @@ add_additional_variables(char *name, bool insert) SQL_FREE SQL_GO SQL_GOTO SQL_IDENTIFIED SQL_INDICATOR SQL_KEY_MEMBER SQL_LENGTH SQL_LONG SQL_NAME SQL_NULLABLE SQL_OCTET_LENGTH - SQL_OPEN SQL_OUTPUT SQL_RELEASE SQL_REFERENCE + SQL_OPEN SQL_OUTPUT SQL_REFERENCE SQL_RETURNED_LENGTH SQL_RETURNED_OCTET_LENGTH SQL_SCALE SQL_SECTION SQL_SHORT SQL_SIGNED SQL_SQL SQL_SQLERROR SQL_SQLPRINT SQL_SQLWARNING SQL_START SQL_STOP @@ -395,10 +395,11 @@ add_additional_variables(char *name, bool insert) QUOTE - READ REAL RECHECK REFERENCES REINDEX RELATIVE_P RENAME REPEATABLE REPLACE - RESET RESTART RESTRICT RETURNS REVOKE RIGHT ROLLBACK ROW ROWS RULE + READ REAL RECHECK REFERENCES REINDEX RELATIVE_P RELEASE RENAME + REPEATABLE REPLACE RESET RESTART RESTRICT RETURNS REVOKE RIGHT + ROLLBACK ROW ROWS RULE - SCHEMA SCROLL SECOND_P SECURITY SELECT SEQUENCE SERIALIZABLE + SAVEPOINT SCHEMA SCROLL SECOND_P SECURITY SELECT SEQUENCE SERIALIZABLE SESSION SESSION_USER SET SETOF SHARE SHOW SIMILAR SIMPLE SMALLINT SOME STABLE START STATEMENT STATISTICS STDIN STDOUT STORAGE STRICT_P SUBSTRING SYSID @@ -472,7 +473,7 @@ add_additional_variables(char *name, bool insert) %type <str> Typename SimpleTypename Numeric opt_float opt_numeric %type <str> opt_decimal Character character opt_varying opt_charset %type <str> opt_timezone opt_interval table_ref fetch_direction -%type <str> ConstDatetime AlterDomainStmt AlterSeqStmt +%type <str> ConstDatetime AlterDomainStmt AlterSeqStmt alter_rel_cmds %type <str> SelectStmt into_clause OptTemp ConstraintAttributeSpec %type <str> opt_table opt_all sort_clause sortby_list ConstraintAttr %type <str> sortby qualified_name_list name_list ColId_or_Sconst @@ -529,7 +530,7 @@ add_additional_variables(char *name, bool insert) %type <str> handler_name any_name_list any_name opt_as insert_column_list %type <str> columnref function_name insert_target_el AllConstVar %type <str> insert_target_list insert_column_item DropRuleStmt -%type <str> createfunc_opt_item set_rest var_list_or_default +%type <str> createfunc_opt_item set_rest var_list_or_default alter_rel_cmd %type <str> CreateFunctionStmt createfunc_opt_list func_table %type <str> DropUserStmt copy_from copy_opt_list copy_opt_item %type <str> opt_oids TableLikeClause key_action opt_definition @@ -538,13 +539,13 @@ add_additional_variables(char *name, bool insert) %type <str> iso_level type_list CharacterWithLength ConstCharacter %type <str> CharacterWithoutLength BitWithLength BitWithoutLength %type <str> ConstBit GenericType TableFuncElementList opt_analyze -%type <str> opt_sort_clause transaction_access_mode subquery_Op +%type <str> opt_sort_clause subquery_Op transaction_mode_item %type <str> ECPGWhenever ECPGConnect connection_target ECPGOpen %type <str> indicator ECPGExecute ECPGPrepare ecpg_using ecpg_into %type <str> storage_declaration storage_clause opt_initializer c_anything %type <str> variable_list variable c_thing c_term ECPGKeywords_vanames %type <str> opt_pointer ECPGDisconnect dis_name storage_modifier -%type <str> ECPGRelease execstring server_name ECPGVarDeclaration +%type <str> execstring server_name ECPGVarDeclaration %type <str> connection_object opt_server opt_port c_stuff c_stuff_item %type <str> user_name opt_user char_variable ora_user ident opt_reference %type <str> var_type_declarations quoted_ident_stringvar ECPGKeywords_rest @@ -561,7 +562,7 @@ add_additional_variables(char *name, bool insert) %type <str> col_name_keyword func_name_keyword precision opt_scale %type <str> ECPGTypeName using_list ECPGColLabelCommon UsingConst %type <str> inf_val_list inf_col_list using_descriptor into_descriptor -%type <str> prepared_name struct_union_type_with_symbol +%type <str> prepared_name struct_union_type_with_symbol OptConsTableSpace %type <str> ECPGunreserved ECPGunreserved_interval cvariable %type <str> AlterOwnerStmt OptTableSpaceOwner CreateTableSpaceStmt %type <str> DropTableSpaceStmt indirection indirection_el ECPGSetDescriptorHeader @@ -816,7 +817,7 @@ stmt: AlterDatabaseSetStmt { output_statement($1, 0, connection); } whenever_action(2); free($1); } - | ECPGRelease { /* output already done */ } + /* | ECPGRelease { / * output already done * / } */ | ECPGSetAutocommit { fprintf(yyout, "{ ECPGsetcommit(__LINE__, \"%s\", %s);", $1, connection ? connection : "NULL"); @@ -1177,15 +1178,18 @@ CheckPointStmt: CHECKPOINT { $$= make_str("checkpoint"); } /***************************************************************************** * - * ALTER TABLE variations + * ALTER [ TABLE | INDEX ] variations * *****************************************************************************/ AlterTableStmt: ALTER TABLE relation_expr alter_table_cmds { $$ = cat_str(3, make_str("alter table"), $3, $4); } + | ALTER INDEX relation_expr alter_rel_cmds + { $$ = cat_str(3, make_str("alter table"), $3, $4); } ; +/* Subcommands that are for ALTER TABLE only */ alter_table_cmds: alter_table_cmd { $$ = $1; } | alter_table_cmds ',' alter_table_cmd { $$ = cat_str(3, $1, make_str(","), $3); } @@ -1228,16 +1232,24 @@ alter_table_cmd: /* ALTER TABLE <name> CREATE TOAST TABLE */ | CREATE TOAST TABLE { $$ = make_str("create toast table"); } -/* ALTER TABLE <name> OWNER TO UserId */ - | OWNER TO UserId - { $$ = cat_str(2, make_str("owner to"), $3); } /* ALTER TABLE <name> CLUSTER ON <indexname> */ | CLUSTER ON name { $$ = cat_str(2, make_str("cluster on"), $3); } /* ALTER TABLE <name> SET WITHOUT CLUSTER */ | SET WITHOUT CLUSTER { $$ = make_str("set without cluster"); } - /* ALTER TABLE <name> SET TABLESPACE <tablespacename> */ + ; + +alter_rel_cmds: alter_rel_cmd { $$ = $1; } + | alter_rel_cmds ',' alter_rel_cmd { $$ = cat_str(3, $1, make_str(","), $3); } + ; + +/* Subcommands that are for ALTER TABLE or ALTER INDEX */ +alter_rel_cmd: + /* ALTER [TABLE|INDEX] <name> OWNER TO UserId */ + OWNER TO UserId + { $$ = cat_str(2, make_str("owner to"), $3); } + /* ALTER [TABLE|INDEX] <name> SET TABLESPACE <tablespacename> */ | SET TABLESPACE name { $$ = cat_str(2, make_str("set tablespace"), $3); } ; @@ -1417,10 +1429,10 @@ ColConstraintElem: NOT NULL_P { $$ = make_str("not null"); } | NULL_P { $$ = make_str("null"); } - | UNIQUE - { $$ = make_str("unique"); } - | PRIMARY KEY - { $$ = make_str("primary key"); } + | UNIQUE OptConsTableSpace + { $$ = cat2_str(make_str("unique"), $2); } + | PRIMARY KEY OptConsTableSpace + { $$ = cat2_str(make_str("primary key"), $3); } | CHECK '(' a_expr ')' { $$ = cat_str(3, make_str("check ("), $3, make_str(")")); } | DEFAULT b_expr @@ -1470,10 +1482,10 @@ TableConstraint: CONSTRAINT name ConstraintElem ConstraintElem: CHECK '(' a_expr ')' { $$ = cat_str(3, make_str("check("), $3, make_str(")")); } - | UNIQUE '(' columnList ')' - { $$ = cat_str(3, make_str("unique("), $3, make_str(")")); } - | PRIMARY KEY '(' columnList ')' - { $$ = cat_str(3, make_str("primary key("), $4, make_str(")")); } + | UNIQUE '(' columnList ')' OptConsTableSpace + { $$ = cat_str(4, make_str("unique("), $3, make_str(")"), $5); } + | PRIMARY KEY '(' columnList ')' OptConsTableSpace + { $$ = cat_str(4, make_str("primary key("), $4, make_str(")"), $6); } | FOREIGN KEY '(' columnList ')' REFERENCES qualified_name opt_column_list key_match key_actions ConstraintAttributeSpec { $$ = cat_str(8, make_str("foreign key("), $4, make_str(") references"), $7, $8, $9, $10, $11); } @@ -1546,6 +1558,10 @@ OptTableSpace: TABLESPACE name { $$ = cat2_str(make_str("tablespace"), $2); } | /*EMPTY*/ { $$ = EMPTY; } ; +OptConsTableSpace: USING INDEX TABLESPACE name { $$ = cat2_str(make_str("using index tablespace"), $4); } + | /*EMPTY*/ { $$ = EMPTY; } + ; + /* * Note: CREATE TABLE ... AS SELECT ... is just another spelling for * SELECT ... INTO. @@ -2192,7 +2208,7 @@ index_params: index_elem { $$ = $1; } | index_params ',' index_elem { $$ = cat_str(3, $1, make_str(","), $3); } ; -index_elem: attr_name opt_class +index_elem: ColId opt_class { $$ = cat2_str($1, $2); } | func_name '(' expr_list ')' opt_class { $$ = cat_str(5, $1, make_str("("), $3, ")", $5); } @@ -2416,6 +2432,8 @@ RenameStmt: ALTER AGGREGATE func_name '(' aggr_argtype ')' RENAME TO name { $$ = cat_str(4, make_str("alter schema"), $3, make_str("rename to"), $6); } | ALTER TABLE relation_expr RENAME TO name { $$ = cat_str(4, make_str("alter table"), $3, make_str("rename to"), $6); } + | ALTER INDEX relation_expr RENAME TO name + { $$ = cat_str(4, make_str("alter index"), $3, make_str("rename to"), $6); } | ALTER TABLE relation_expr RENAME opt_column name TO name { $$ = cat_str(7, make_str("alter table"), $3, make_str("rename"), $5, $6, make_str("to"), $8); } | ALTER TRIGGER name ON relation_expr RENAME TO name @@ -2545,12 +2563,18 @@ UnlistenStmt: UNLISTEN qualified_name * (also older versions END / ABORT) * *****************************************************************************/ -TransactionStmt: ABORT_P opt_transaction { $$ = make_str("rollback"); } +TransactionStmt: ABORT_P opt_transaction { $$ = make_str("rollback"); } | BEGIN_P opt_transaction transaction_mode_list_or_empty { $$ = cat2_str(make_str("begin transaction"), $3); } | START TRANSACTION transaction_mode_list_or_empty { $$ = cat2_str(make_str("start transaction"), $3); } - | COMMIT opt_transaction { $$ = make_str("commit"); } - | END_P opt_transaction { $$ = make_str("commit"); } - | ROLLBACK opt_transaction { $$ = make_str("rollback"); } + | COMMIT opt_transaction { $$ = make_str("commit"); } + | END_P opt_transaction { $$ = make_str("commit"); } + | ROLLBACK opt_transaction { $$ = make_str("rollback"); } + | SAVEPOINT ColId { $$ = cat2_str(make_str("savepoint"), $2); } + | RELEASE SAVEPOINT ColId { $$ = cat2_str(make_str("release savepoint"), $3); } + | RELEASE ColId { $$ = cat2_str(make_str("release"), $2); } + | ROLLBACK opt_transaction TO SAVEPOINT ColId { $$ = cat_str(4, make_str("rollback"), $2, make_str("to savepoint"), $5); } + | ROLLBACK opt_transaction TO ColId { $$ = cat_str(4, make_str("rollback"), $2, make_str("to"), $4); } + ; opt_transaction: WORK { $$ = EMPTY; } @@ -2558,15 +2582,17 @@ opt_transaction: WORK { $$ = EMPTY; } | /*EMPTY*/ { $$ = EMPTY; } ; -transaction_mode_list: +transaction_mode_item: ISOLATION LEVEL iso_level { $$ = cat2_str(make_str("isolation level"), $3); } - | transaction_access_mode - { $$ = $1; } - | ISOLATION LEVEL iso_level transaction_access_mode - { $$ = cat_str(3, make_str("isolation level"), $3, $4); } - | transaction_access_mode ISOLATION LEVEL iso_level - { $$ = cat_str(3, $1, make_str("isolation level"), $4); } + | READ ONLY { $$ = make_str("read only"); } + | READ WRITE { $$ = make_str("read write"); } + ; + +transaction_mode_list: + transaction_mode_item { $$ = $1; } + | transaction_mode_list ',' transaction_mode_item { $$ = cat_str(3, $1, make_str(","), $3); } + | transaction_mode_list transaction_mode_item { $$ = cat_str(3, $1, make_str(" "), $2); } ; transaction_mode_list_or_empty: @@ -2574,11 +2600,6 @@ transaction_mode_list_or_empty: | /* EMPTY */ { $$ = EMPTY; } ; -transaction_access_mode: - READ ONLY { $$ = make_str("read only"); } - | READ WRITE { $$ = make_str("read write"); } - ; - /***************************************************************************** * * QUERY: @@ -4156,7 +4177,7 @@ name_list: name name: ColId { $$ = $1; }; database_name: ColId { $$ = $1; }; access_method: ColId { $$ = $1; }; -attr_name: ColId { $$ = $1; }; +attr_name: ColLabel { $$ = $1; }; index_name: ColId { $$ = $1; }; file_name: StringConst { $$ = $1; }; @@ -5453,7 +5474,8 @@ descriptor_item: SQL_CARDINALITY { $$ = ECPGd_cardinality; } * after a transaction statement to disconnect from the database. */ -ECPGRelease: TransactionStmt SQL_RELEASE +/* We cannot do that anymore since it causes shift/reduce conflicts. 2004-09-27 Michael Meskes +ECPGRelease: TransactionStmt RELEASE { if (strcmp($1, "begin") == 0) mmerror(PARSE_ERROR, ET_ERROR, "RELEASE does not make sense when beginning a transaction"); @@ -5467,6 +5489,7 @@ ECPGRelease: TransactionStmt SQL_RELEASE free($1); } ; +*/ /* * set/reset the automatic transaction mode, this needs a differnet handling @@ -5728,7 +5751,6 @@ ECPGKeywords_vanames: SQL_BREAK { $$ = make_str("break"); } | SQL_NAME { $$ = make_str("name"); } | SQL_NULLABLE { $$ = make_str("nullable"); } | SQL_OCTET_LENGTH { $$ = make_str("octet_length"); } - | SQL_RELEASE { $$ = make_str("release"); } | SQL_RETURNED_LENGTH { $$ = make_str("returned_length"); } | SQL_RETURNED_OCTET_LENGTH { $$ = make_str("returned_octet_length"); } | SQL_SCALE { $$ = make_str("scale"); } @@ -5978,6 +6000,7 @@ ECPGunreserved: ABORT_P { $$ = make_str("abort"); } | RECHECK { $$ = make_str("recheck"); } | REINDEX { $$ = make_str("reindex"); } | RELATIVE_P { $$ = make_str("relative"); } + | RELEASE { $$ = make_str("release"); } | RENAME { $$ = make_str("rename"); } | REPEATABLE { $$ = make_str("repeatable"); } | REPLACE { $$ = make_str("replace"); } @@ -5989,6 +6012,7 @@ ECPGunreserved: ABORT_P { $$ = make_str("abort"); } | ROLLBACK { $$ = make_str("rollback"); } | ROWS { $$ = make_str("rows"); } | RULE { $$ = make_str("rule"); } + | SAVEPOINT { $$ = make_str("savepoint"); } | SCHEMA { $$ = make_str("schema"); } | SCROLL { $$ = make_str("scroll"); } /* | SECOND_P { $$ = make_str("second"); }*/