-/* $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 */
%{
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
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
%type Typename SimpleTypename Numeric opt_float opt_numeric
%type opt_decimal Character character opt_varying opt_charset
%type opt_timezone opt_interval table_ref fetch_direction
-%type ConstDatetime AlterDomainStmt AlterSeqStmt
+%type ConstDatetime AlterDomainStmt AlterSeqStmt alter_rel_cmds
%type SelectStmt into_clause OptTemp ConstraintAttributeSpec
%type opt_table opt_all sort_clause sortby_list ConstraintAttr
%type sortby qualified_name_list name_list ColId_or_Sconst
%type handler_name any_name_list any_name opt_as insert_column_list
%type columnref function_name insert_target_el AllConstVar
%type insert_target_list insert_column_item DropRuleStmt
-%type createfunc_opt_item set_rest var_list_or_default
+%type createfunc_opt_item set_rest var_list_or_default alter_rel_cmd
%type CreateFunctionStmt createfunc_opt_list func_table
%type DropUserStmt copy_from copy_opt_list copy_opt_item
%type opt_oids TableLikeClause key_action opt_definition
%type iso_level type_list CharacterWithLength ConstCharacter
%type CharacterWithoutLength BitWithLength BitWithoutLength
%type ConstBit GenericType TableFuncElementList opt_analyze
-%type opt_sort_clause transaction_access_mode subquery_Op
+%type opt_sort_clause subquery_Op transaction_mode_item
%type ECPGWhenever ECPGConnect connection_target ECPGOpen
%type indicator ECPGExecute ECPGPrepare ecpg_using ecpg_into
%type storage_declaration storage_clause opt_initializer c_anything
%type variable_list variable c_thing c_term ECPGKeywords_vanames
%type opt_pointer ECPGDisconnect dis_name storage_modifier
-%type ECPGRelease execstring server_name ECPGVarDeclaration
+%type execstring server_name ECPGVarDeclaration
%type connection_object opt_server opt_port c_stuff c_stuff_item
%type user_name opt_user char_variable ora_user ident opt_reference
%type var_type_declarations quoted_ident_stringvar ECPGKeywords_rest
%type col_name_keyword func_name_keyword precision opt_scale
%type ECPGTypeName using_list ECPGColLabelCommon UsingConst
%type inf_val_list inf_col_list using_descriptor into_descriptor
-%type prepared_name struct_union_type_with_symbol
+%type prepared_name struct_union_type_with_symbol OptConsTableSpace
%type ECPGunreserved ECPGunreserved_interval cvariable
%type AlterOwnerStmt OptTableSpaceOwner CreateTableSpaceStmt
%type DropTableSpaceStmt indirection indirection_el ECPGSetDescriptorHeader
whenever_action(2);
free($1);
}
- | ECPGRelease { /* output already done */ }
+ /* | ECPGRelease { / * output already done * / } */
| ECPGSetAutocommit
{
fprintf(yyout, "{ ECPGsetcommit(__LINE__, \"%s\", %s);", $1, connection ? connection : "NULL");
/*****************************************************************************
*
- * 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); }
/* ALTER TABLE CREATE TOAST TABLE */
| CREATE TOAST TABLE
{ $$ = make_str("create toast table"); }
-/* ALTER TABLE OWNER TO UserId */
- | OWNER TO UserId
- { $$ = cat_str(2, make_str("owner to"), $3); }
/* ALTER TABLE CLUSTER ON */
| CLUSTER ON name
{ $$ = cat_str(2, make_str("cluster on"), $3); }
/* ALTER TABLE SET WITHOUT CLUSTER */
| SET WITHOUT CLUSTER
{ $$ = make_str("set without cluster"); }
- /* ALTER TABLE
SET TABLESPACE */
+ ;
+
+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] OWNER TO UserId */
+ OWNER TO UserId
+ { $$ = cat_str(2, make_str("owner to"), $3); }
+ /* ALTER [TABLE|INDEX]
SET TABLESPACE */
| SET TABLESPACE name
{ $$ = cat_str(2, make_str("set tablespace"), $3); }
;
{ $$ = 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
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); }
| /*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.
| 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); }
{ $$ = 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
* (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; }
| /*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:
| /* EMPTY */ { $$ = EMPTY; }
;
-transaction_access_mode:
- READ ONLY { $$ = make_str("read only"); }
- | READ WRITE { $$ = make_str("read write"); }
- ;
-
/*****************************************************************************
*
* QUERY:
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; };
* 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");
free($1);
}
;
+*/
/*
* set/reset the automatic transaction mode, this needs a differnet handling
| 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"); }
| 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"); }
| 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"); }*/