aboutsummaryrefslogtreecommitdiff
path: root/src/backend/parser/gram.y
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/parser/gram.y')
-rw-r--r--src/backend/parser/gram.y87
1 files changed, 54 insertions, 33 deletions
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index fd33601cc08..2703ae8a061 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -11,7 +11,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.394 2003/01/10 21:08:13 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.395 2003/01/10 22:03:27 petere Exp $
*
* HISTORY
* AUTHOR DATE MAJOR EVENT
@@ -162,7 +162,7 @@ static void doNegateFloat(Value *v);
%type <defelt> createdb_opt_item copy_opt_item
%type <ival> opt_lock lock_type cast_context
-%type <boolean> opt_force opt_or_replace
+%type <boolean> opt_force opt_or_replace transaction_access_mode
%type <list> user_list
@@ -215,7 +215,8 @@ static void doNegateFloat(Value *v);
target_list update_target_list insert_column_list
insert_target_list def_list opt_indirection
group_clause TriggerFuncArgs select_limit
- opt_select_limit opclass_item_list trans_options
+ opt_select_limit opclass_item_list transaction_mode_list
+ transaction_mode_list_or_empty
TableFuncElementList
prep_type_clause prep_type_list
execute_param_clause
@@ -863,18 +864,18 @@ set_rest: ColId TO var_list_or_default
n->args = makeList1($3);
$$ = n;
}
- | TRANSACTION ISOLATION LEVEL iso_level opt_mode
+ | TRANSACTION transaction_mode_list
{
VariableSetStmt *n = makeNode(VariableSetStmt);
- n->name = "TRANSACTION ISOLATION LEVEL";
- n->args = makeList1(makeStringConst($4, NULL));
+ n->name = "TRANSACTION";
+ n->args = $2;
$$ = n;
}
- | SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL iso_level
+ | SESSION CHARACTERISTICS AS TRANSACTION transaction_mode_list
{
VariableSetStmt *n = makeNode(VariableSetStmt);
- n->name = "default_transaction_isolation";
- n->args = makeList1(makeStringConst($7, NULL));
+ n->name = "SESSION CHARACTERISTICS";
+ n->args = $5;
$$ = n;
}
| NAMES opt_encoding
@@ -922,16 +923,6 @@ iso_level: READ COMMITTED { $$ = "read committed"; }
| SERIALIZABLE { $$ = "serializable"; }
;
-opt_mode: READ WRITE
- {}
- | READ ONLY
- {
- elog(ERROR, "SET TRANSACTION/READ ONLY not yet supported");
- }
- | /*EMPTY*/
- {}
- ;
-
opt_boolean:
TRUE_P { $$ = "true"; }
| FALSE_P { $$ = "false"; }
@@ -1020,7 +1011,7 @@ VariableShowStmt:
| SHOW TRANSACTION ISOLATION LEVEL
{
VariableShowStmt *n = makeNode(VariableShowStmt);
- n->name = "TRANSACTION ISOLATION LEVEL";
+ n->name = "transaction_isolation";
$$ = (Node *) n;
}
| SHOW SESSION AUTHORIZATION
@@ -1053,7 +1044,7 @@ VariableResetStmt:
| RESET TRANSACTION ISOLATION LEVEL
{
VariableResetStmt *n = makeNode(VariableResetStmt);
- n->name = "TRANSACTION ISOLATION LEVEL";
+ n->name = "transaction_isolation";
$$ = (Node *) n;
}
| RESET SESSION AUTHORIZATION
@@ -3500,42 +3491,42 @@ UnlistenStmt:
*****************************************************************************/
TransactionStmt:
- ABORT_TRANS opt_trans
+ ABORT_TRANS opt_transaction
{
TransactionStmt *n = makeNode(TransactionStmt);
n->command = ROLLBACK;
n->options = NIL;
$$ = (Node *)n;
}
- | BEGIN_TRANS opt_trans
+ | BEGIN_TRANS opt_transaction
{
TransactionStmt *n = makeNode(TransactionStmt);
n->command = BEGIN_TRANS;
n->options = NIL;
$$ = (Node *)n;
}
- | START TRANSACTION trans_options
+ | START TRANSACTION transaction_mode_list_or_empty
{
TransactionStmt *n = makeNode(TransactionStmt);
n->command = START;
n->options = $3;
$$ = (Node *)n;
}
- | COMMIT opt_trans
+ | COMMIT opt_transaction
{
TransactionStmt *n = makeNode(TransactionStmt);
n->command = COMMIT;
n->options = NIL;
$$ = (Node *)n;
}
- | END_TRANS opt_trans
+ | END_TRANS opt_transaction
{
TransactionStmt *n = makeNode(TransactionStmt);
n->command = COMMIT;
n->options = NIL;
$$ = (Node *)n;
}
- | ROLLBACK opt_trans
+ | ROLLBACK opt_transaction
{
TransactionStmt *n = makeNode(TransactionStmt);
n->command = ROLLBACK;
@@ -3544,16 +3535,46 @@ TransactionStmt:
}
;
-trans_options: ISOLATION LEVEL iso_level
- { $$ = makeList1(makeStringConst($3, NULL)); }
- | /* EMPTY */ { $$ = NIL; }
- ;
-
-opt_trans: WORK {}
+opt_transaction: WORK {}
| TRANSACTION {}
| /*EMPTY*/ {}
;
+transaction_mode_list:
+ ISOLATION LEVEL iso_level
+ { $$ = makeList1(makeDefElem("transaction_isolation",
+ makeStringConst($3, NULL))); }
+ | transaction_access_mode
+ { $$ = makeList1(makeDefElem("transaction_read_only",
+ makeIntConst($1))); }
+ | ISOLATION LEVEL iso_level transaction_access_mode
+ {
+ $$ = makeList2(makeDefElem("transaction_isolation",
+ makeStringConst($3, NULL)),
+ makeDefElem("transaction_read_only",
+ makeIntConst($4)));
+ }
+ | transaction_access_mode ISOLATION LEVEL iso_level
+ {
+ $$ = makeList2(makeDefElem("transaction_read_only",
+ makeIntConst($1)),
+ makeDefElem("transaction_isolation",
+ makeStringConst($4, NULL)));
+ }
+ ;
+
+transaction_mode_list_or_empty:
+ transaction_mode_list
+ | /* EMPTY */
+ { $$ = NIL; }
+ ;
+
+transaction_access_mode:
+ READ ONLY { $$ = TRUE; }
+ | READ WRITE { $$ = FALSE; }
+ ;
+
+
/*****************************************************************************
*
* QUERY: