Index: doc/src/sgml/reference.sgml =================================================================== RCS file: /var/lib/cvs/pgsql/doc/src/sgml/reference.sgml,v retrieving revision 1.31 diff -c -r1.31 reference.sgml *** doc/src/sgml/reference.sgml 22 Jul 2002 08:57:15 -0000 1.31 --- doc/src/sgml/reference.sgml 27 Jul 2002 05:22:28 -0000 *************** *** 120,125 **** --- 120,126 ---- &setSessionAuth; &setTransaction; &show; + &startTransaction; &truncate; &unlisten; &update; Index: doc/src/sgml/ref/allfiles.sgml =================================================================== RCS file: /var/lib/cvs/pgsql/doc/src/sgml/ref/allfiles.sgml,v retrieving revision 1.42 diff -c -r1.42 allfiles.sgml *** doc/src/sgml/ref/allfiles.sgml 22 Jul 2002 08:57:15 -0000 1.42 --- doc/src/sgml/ref/allfiles.sgml 27 Jul 2002 05:22:28 -0000 *************** *** 111,116 **** --- 111,117 ---- + Index: doc/src/sgml/ref/begin.sgml =================================================================== RCS file: /var/lib/cvs/pgsql/doc/src/sgml/ref/begin.sgml,v retrieving revision 1.17 diff -c -r1.17 begin.sgml *** doc/src/sgml/ref/begin.sgml 21 Apr 2002 19:02:39 -0000 1.17 --- doc/src/sgml/ref/begin.sgml 27 Jul 2002 05:22:28 -0000 *************** *** 21,27 **** 1999-07-20 ! BEGIN [ WORK | TRANSACTION ] --- 21,27 ---- 1999-07-20 ! BEGIN [ WORK | TRANSACTION ] Index: doc/src/sgml/ref/set_transaction.sgml =================================================================== RCS file: /var/lib/cvs/pgsql/doc/src/sgml/ref/set_transaction.sgml,v retrieving revision 1.8 diff -c -r1.8 set_transaction.sgml *** doc/src/sgml/ref/set_transaction.sgml 20 Jan 2002 22:19:57 -0000 1.8 --- doc/src/sgml/ref/set_transaction.sgml 27 Jul 2002 05:22:28 -0000 *************** *** 97,107 **** SQL92, SQL99 ! SERIALIZABLE is the default level in SQL. ! PostgreSQL does not provide the ! isolation levels ! and . Because ! of multiversion concurrency control, the serializable level is not truly serializable. See the User's Guide for details. --- 97,107 ---- SQL92, SQL99 ! is the default level in ! SQL. PostgreSQL does ! not provide the isolation levels ! and . Because of multiversion ! concurrency control, the level is not truly serializable. See the User's Guide for details. Index: doc/src/sgml/ref/start_transaction.sgml =================================================================== RCS file: doc/src/sgml/ref/start_transaction.sgml diff -N doc/src/sgml/ref/start_transaction.sgml *** /dev/null 1 Jan 1970 00:00:00 -0000 --- doc/src/sgml/ref/start_transaction.sgml 27 Jul 2002 05:22:28 -0000 *************** *** 0 **** --- 1,137 ---- + + + + 2002-07-26 + + + + START TRANSACTION + SQL - Language Statements + + + + START TRANSACTION + start a transaction block + + + + + START TRANSACTION [ ISOLATION LEVEL { READ COMMITTED | SERIALIZABLE } ] + + + + + 1998-09-27 + + + Inputs + + + + None. + + + + + + 1998-09-27 + + + Outputs + + + + + + + + START TRANSACTION + + + + Message returned if successful. + + + + + + WARNING: BEGIN: already a transaction in progress + + + + If there is already a transaction in progress when the + command is issued. + + + + + + + + + + Description + + + This command begins a new transaction. If the isolation level is + specified, the new transaction has that isolation level. In all other + respects, the behavior of this command is identical to the + BEGIN. + + + + + + Notes + + + The isolation level of a transaction can also be set with the . + If no isolation level is specified, the level defaults to + . + + + + + Compatibility + + + SQL99 + + + is the default level in + SQL. PostgreSQL + does not provide the isolation levels + and . Because of multiversion + concurrency control, the level is + not truly serializable. See the User's Guide + for details. + + + + In SQL99 this statement can specify two other + properties of the new transaction: whether the transaction is + read-only and the size of the diagnostics area. Neither of these + concepts are currently supported in + PostgreSQL. + + + + + + Index: src/backend/nodes/copyfuncs.c =================================================================== RCS file: /var/lib/cvs/pgsql/src/backend/nodes/copyfuncs.c,v retrieving revision 1.197 diff -c -r1.197 copyfuncs.c *** src/backend/nodes/copyfuncs.c 24 Jul 2002 19:11:10 -0000 1.197 --- src/backend/nodes/copyfuncs.c 27 Jul 2002 05:22:29 -0000 *************** *** 2213,2218 **** --- 2213,2219 ---- TransactionStmt *newnode = makeNode(TransactionStmt); newnode->command = from->command; + Node_Copy(from, newnode, options); return newnode; } Index: src/backend/nodes/equalfuncs.c =================================================================== RCS file: /var/lib/cvs/pgsql/src/backend/nodes/equalfuncs.c,v retrieving revision 1.144 diff -c -r1.144 equalfuncs.c *** src/backend/nodes/equalfuncs.c 24 Jul 2002 19:11:10 -0000 1.144 --- src/backend/nodes/equalfuncs.c 27 Jul 2002 05:22:29 -0000 *************** *** 1043,1048 **** --- 1043,1050 ---- { if (a->command != b->command) return false; + if (!equal(a->options, b->options)) + return false; return true; } Index: src/backend/parser/gram.y =================================================================== RCS file: /var/lib/cvs/pgsql/src/backend/parser/gram.y,v retrieving revision 2.349 diff -c -r2.349 gram.y *** src/backend/parser/gram.y 24 Jul 2002 19:11:10 -0000 2.349 --- src/backend/parser/gram.y 27 Jul 2002 05:22:29 -0000 *************** *** 195,201 **** %type opt_id, all_Op, MathOp, opt_name, SpecialRuleRelation ! %type opt_level, opt_encoding %type grantee %type grantee_list %type privilege --- 195,201 ---- %type opt_id, all_Op, MathOp, opt_name, SpecialRuleRelation ! %type iso_level, opt_encoding %type grantee %type grantee_list %type privilege *************** *** 218,224 **** target_list, update_target_list, insert_column_list, insert_target_list, def_list, opt_indirection, group_clause, TriggerFuncArgs, select_limit, ! opt_select_limit %type into_clause, OptTempTableName --- 218,224 ---- target_list, update_target_list, insert_column_list, insert_target_list, def_list, opt_indirection, group_clause, TriggerFuncArgs, select_limit, ! opt_select_limit, trans_options %type into_clause, OptTempTableName *************** *** 845,858 **** n->args = makeList1($3); $$ = n; } ! | TRANSACTION ISOLATION LEVEL opt_level opt_mode { VariableSetStmt *n = makeNode(VariableSetStmt); n->name = "TRANSACTION ISOLATION LEVEL"; n->args = makeList1(makeStringConst($4, NULL)); $$ = n; } ! | SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL opt_level { VariableSetStmt *n = makeNode(VariableSetStmt); n->name = "default_transaction_isolation"; --- 845,858 ---- n->args = makeList1($3); $$ = n; } ! | TRANSACTION ISOLATION LEVEL iso_level opt_mode { VariableSetStmt *n = makeNode(VariableSetStmt); n->name = "TRANSACTION ISOLATION LEVEL"; n->args = makeList1(makeStringConst($4, NULL)); $$ = n; } ! | SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL iso_level { VariableSetStmt *n = makeNode(VariableSetStmt); n->name = "default_transaction_isolation"; *************** *** 900,906 **** { $$ = makeAConst($1); } ; ! opt_level: READ COMMITTED { $$ = "read committed"; } | SERIALIZABLE { $$ = "serializable"; } ; --- 900,906 ---- { $$ = makeAConst($1); } ; ! iso_level: READ COMMITTED { $$ = "read committed"; } | SERIALIZABLE { $$ = "serializable"; } ; *************** *** 3373,3439 **** { TransactionStmt *n = makeNode(TransactionStmt); n->command = ROLLBACK; $$ = (Node *)n; } | BEGIN_TRANS opt_trans { TransactionStmt *n = makeNode(TransactionStmt); n->command = BEGIN_TRANS; $$ = (Node *)n; } ! | COMMIT opt_trans { TransactionStmt *n = makeNode(TransactionStmt); ! n->command = COMMIT; $$ = (Node *)n; } ! | COMMIT opt_trans opt_chain { TransactionStmt *n = makeNode(TransactionStmt); n->command = COMMIT; $$ = (Node *)n; } | END_TRANS opt_trans { TransactionStmt *n = makeNode(TransactionStmt); n->command = COMMIT; $$ = (Node *)n; } | ROLLBACK opt_trans { TransactionStmt *n = makeNode(TransactionStmt); n->command = ROLLBACK; ! $$ = (Node *)n; ! } ! | ROLLBACK opt_trans opt_chain ! { ! TransactionStmt *n = makeNode(TransactionStmt); ! n->command = ROLLBACK; $$ = (Node *)n; } ; opt_trans: WORK {} | TRANSACTION {} | /*EMPTY*/ {} ; - opt_chain: AND NO CHAIN {} - | AND CHAIN - { - /* SQL99 asks that conforming dbs reject AND CHAIN - * if they don't support it. So we can't just ignore it. - * - thomas 2000-08-06 - */ - elog(ERROR, "COMMIT/AND CHAIN not yet supported"); - } - ; - - /***************************************************************************** * * QUERY: ! * define view '('target-list ')' [where ] * *****************************************************************************/ --- 3373,3432 ---- { TransactionStmt *n = makeNode(TransactionStmt); n->command = ROLLBACK; + n->options = NIL; $$ = (Node *)n; } | BEGIN_TRANS opt_trans { TransactionStmt *n = makeNode(TransactionStmt); n->command = BEGIN_TRANS; + n->options = NIL; $$ = (Node *)n; } ! | START TRANSACTION trans_options { TransactionStmt *n = makeNode(TransactionStmt); ! n->command = START; ! n->options = $3; $$ = (Node *)n; } ! | COMMIT opt_trans { TransactionStmt *n = makeNode(TransactionStmt); n->command = COMMIT; + n->options = NIL; $$ = (Node *)n; } | END_TRANS opt_trans { TransactionStmt *n = makeNode(TransactionStmt); n->command = COMMIT; + n->options = NIL; $$ = (Node *)n; } | ROLLBACK opt_trans { TransactionStmt *n = makeNode(TransactionStmt); n->command = ROLLBACK; ! n->options = NIL; $$ = (Node *)n; } ; + trans_options: ISOLATION LEVEL iso_level + { $$ = makeList1(makeStringConst($3, NULL)); } + | /* EMPTY */ { $$ = NIL; } + ; + opt_trans: WORK {} | TRANSACTION {} | /*EMPTY*/ {} ; /***************************************************************************** * * QUERY: ! * create view '('target-list ')' AS * *****************************************************************************/ Index: src/backend/tcop/postgres.c =================================================================== RCS file: /var/lib/cvs/pgsql/src/backend/tcop/postgres.c,v retrieving revision 1.272 diff -c -r1.272 postgres.c *** src/backend/tcop/postgres.c 18 Jul 2002 23:11:28 -0000 1.272 --- src/backend/tcop/postgres.c 27 Jul 2002 05:22:29 -0000 *************** *** 2160,2165 **** --- 2160,2169 ---- tag = "BEGIN"; break; + case START: + tag = "START TRANSACTION"; + break; + case COMMIT: tag = "COMMIT"; break; Index: src/backend/tcop/utility.c =================================================================== RCS file: /var/lib/cvs/pgsql/src/backend/tcop/utility.c,v retrieving revision 1.165 diff -c -r1.165 utility.c *** src/backend/tcop/utility.c 25 Jul 2002 10:07:11 -0000 1.165 --- src/backend/tcop/utility.c 27 Jul 2002 05:22:29 -0000 *************** *** 205,210 **** --- 205,232 ---- BeginTransactionBlock(); break; + /* + * START TRANSACTION, as defined by SQL99: Identical to BEGIN, + * except that it takes a few additional options. + */ + case START: + { + BeginTransactionBlock(); + + /* + * Currently, the only option that can be set is + * the transaction isolation level by START + * TRANSACTION. + */ + if (stmt->options) + { + SetPGVariable("TRANSACTION ISOLATION LEVEL", + stmt->options, + false); + } + } + break; + case COMMIT: EndTransactionBlock(); break; Index: src/include/nodes/parsenodes.h =================================================================== RCS file: /var/lib/cvs/pgsql/src/include/nodes/parsenodes.h,v retrieving revision 1.194 diff -c -r1.194 parsenodes.h *** src/include/nodes/parsenodes.h 24 Jul 2002 19:11:14 -0000 1.194 --- src/include/nodes/parsenodes.h 27 Jul 2002 05:22:29 -0000 *************** *** 1354,1366 **** } UnlistenStmt; /* ---------------------- ! * {Begin|Abort|End} Transaction Statement * ---------------------- */ typedef struct TransactionStmt { NodeTag type; ! int command; /* BEGIN|END|ABORT */ } TransactionStmt; /* ---------------------- --- 1354,1367 ---- } UnlistenStmt; /* ---------------------- ! * {Begin|Commit|Rollback} Transaction Statement * ---------------------- */ typedef struct TransactionStmt { NodeTag type; ! int command; /* BEGIN_TRANS|START|COMMIT|ROLLBACK */ ! List *options; } TransactionStmt; /* ---------------------- Index: src/test/regress/expected/transactions.out =================================================================== RCS file: /var/lib/cvs/pgsql/src/test/regress/expected/transactions.out,v retrieving revision 1.2 diff -c -r1.2 transactions.out *** src/test/regress/expected/transactions.out 9 Jan 2000 03:48:39 -0000 1.2 --- src/test/regress/expected/transactions.out 27 Jul 2002 05:22:29 -0000 *************** *** 40,42 **** --- 40,56 ---- 42 | 324.78 (4 rows) + SHOW TRANSACTION ISOLATION LEVEL; + TRANSACTION ISOLATION LEVEL + ----------------------------- + READ COMMITTED + (1 row) + + START TRANSACTION ISOLATION LEVEL serializable; + SHOW TRANSACTION ISOLATION LEVEL; + TRANSACTION ISOLATION LEVEL + ----------------------------- + SERIALIZABLE + (1 row) + + ROLLBACK; Index: src/test/regress/sql/transactions.sql =================================================================== RCS file: /var/lib/cvs/pgsql/src/test/regress/sql/transactions.sql,v retrieving revision 1.2 diff -c -r1.2 transactions.sql *** src/test/regress/sql/transactions.sql 6 Jan 2000 06:41:55 -0000 1.2 --- src/test/regress/sql/transactions.sql 27 Jul 2002 05:22:29 -0000 *************** *** 33,35 **** --- 33,42 ---- -- should have members again SELECT * FROM aggtest; + SHOW TRANSACTION ISOLATION LEVEL; + + START TRANSACTION ISOLATION LEVEL serializable; + + SHOW TRANSACTION ISOLATION LEVEL; + + ROLLBACK;