diff options
Diffstat (limited to 'src/backend/parser/gram.y')
-rw-r--r-- | src/backend/parser/gram.y | 87 |
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: |