]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
The attached patch implements START TRANSACTION, per SQL99. The
authorBruce Momjian <bruce@momjian.us>
Sun, 4 Aug 2002 04:31:44 +0000 (04:31 +0000)
committerBruce Momjian <bruce@momjian.us>
Sun, 4 Aug 2002 04:31:44 +0000 (04:31 +0000)
functionality of the command is basically identical to that of
BEGIN; it just accepts a few extra options (only one of which
PostgreSQL currently implements), and is standards-compliant.
The patch includes a simple regression test and documentation.

[ Regression tests removed, per Peter.]

Neil Conway

doc/src/sgml/ref/allfiles.sgml
doc/src/sgml/ref/begin.sgml
doc/src/sgml/ref/set_transaction.sgml
doc/src/sgml/reference.sgml
src/backend/nodes/copyfuncs.c
src/backend/nodes/equalfuncs.c
src/backend/parser/gram.y
src/backend/tcop/postgres.c
src/backend/tcop/utility.c
src/include/nodes/parsenodes.h

index 1ee6f2f2004b07890a822b370d691d34c22150e7..502cdb0e42c713cd508f1a2407af916995bfbdf0 100644 (file)
@@ -1,5 +1,5 @@
 <!--
-$Header: /cvsroot/pgsql/doc/src/sgml/ref/allfiles.sgml,v 1.43 2002/07/29 22:14:10 tgl Exp $
+$Header: /cvsroot/pgsql/doc/src/sgml/ref/allfiles.sgml,v 1.44 2002/08/04 04:31:44 momjian Exp $
 PostgreSQL documentation
 Complete list of usable sgml source files in this directory.
 -->
@@ -113,6 +113,7 @@ Complete list of usable sgml source files in this directory.
 <!entity setSessionAuth     system "set_session_auth.sgml">
 <!entity setTransaction     system "set_transaction.sgml">
 <!entity show               system "show.sgml">
+<!entity startTransaction      system "start_transaction.sgml">
 <!entity truncate           system "truncate.sgml">
 <!entity unlisten           system "unlisten.sgml">
 <!entity update             system "update.sgml">
index 53899f85560c215b434be5cb4aab9446c19746f6..850bfd77e68c98ec6884418bca6db0cff37d3fea 100644 (file)
@@ -1,5 +1,5 @@
 <!--
-$Header: /cvsroot/pgsql/doc/src/sgml/ref/begin.sgml,v 1.17 2002/04/21 19:02:39 thomas Exp $
+$Header: /cvsroot/pgsql/doc/src/sgml/ref/begin.sgml,v 1.18 2002/08/04 04:31:44 momjian Exp $
 PostgreSQL documentation
 -->
 
@@ -21,7 +21,7 @@ PostgreSQL documentation
   <refsynopsisdivinfo>
    <date>1999-07-20</date>
   </refsynopsisdivinfo>
-  <synopsis>  
+  <synopsis>
 BEGIN [ WORK | TRANSACTION ]
   </synopsis>
   
index 5a253d85806ade2d6dc33aa5cc5e917e92ac4ce8..315a999330f12478930a5e5931df1fdb5123c55e 100644 (file)
@@ -1,4 +1,4 @@
-<!-- $Header: /cvsroot/pgsql/doc/src/sgml/ref/set_transaction.sgml,v 1.8 2002/01/20 22:19:57 petere Exp $ -->
+<!-- $Header: /cvsroot/pgsql/doc/src/sgml/ref/set_transaction.sgml,v 1.9 2002/08/04 04:31:44 momjian Exp $ -->
 <refentry id="SQL-SET-TRANSACTION">
  <docinfo>
   <date>2000-11-24</date>
@@ -97,11 +97,11 @@ SET default_transaction_isolation = '<replaceable>value</replaceable>'
    <title>SQL92, SQL99</title>
 
    <para>
-    SERIALIZABLE is the default level in <acronym>SQL</acronym>.
-    <productname>PostgreSQL</productname> does not provide the
-    isolation levels <option>READ UNCOMMITTED</option> 
-    and <option>REPEATABLE READ</option>. Because
-    of multiversion concurrency control, the serializable level is not
+    <option>SERIALIZABLE</option> is the default level in
+    <acronym>SQL</acronym>.  <productname>PostgreSQL</productname> does
+    not provide the isolation levels <option>READ UNCOMMITTED</option> 
+    and <option>REPEATABLE READ</option>. Because of multiversion
+    concurrency control, the <option>SERIALIZABLE</option> level is not
     truly serializable. See the <citetitle>User's Guide</citetitle> for
     details.
    </para>
index 2101dfe8a1b3b125810514add5f8ac44b56b3b92..3c6af16730b4d9e41aeaf6b45d80a98fd3f74ce5 100644 (file)
@@ -1,5 +1,5 @@
 <!-- reference.sgml
-$Header: /cvsroot/pgsql/doc/src/sgml/reference.sgml,v 1.32 2002/07/29 22:14:10 tgl Exp $
+$Header: /cvsroot/pgsql/doc/src/sgml/reference.sgml,v 1.33 2002/08/04 04:31:44 momjian Exp $
 
 PostgreSQL Reference Manual
 -->
@@ -122,6 +122,7 @@ PostgreSQL Reference Manual
    &setSessionAuth;
    &setTransaction;
    &show;
+   &startTransaction;
    &truncate;
    &unlisten;
    &update;
index f3c19635dfe62a15493bbacc666d1431c3887a87..d7aefc9acfefda4528e56ac43f818eef9aa271e7 100644 (file)
@@ -15,7 +15,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/nodes/copyfuncs.c,v 1.198 2002/07/29 22:14:10 tgl Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/nodes/copyfuncs.c,v 1.199 2002/08/04 04:31:44 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -2226,6 +2226,7 @@ _copyTransactionStmt(TransactionStmt *from)
        TransactionStmt *newnode = makeNode(TransactionStmt);
 
        newnode->command = from->command;
+       Node_Copy(from, newnode, options);
 
        return newnode;
 }
index 55beb563c8ae5b249ed2b57925680b085ea721b1..9b655640b0dcbf99178fadb2f9ebd1f220b1e697 100644 (file)
@@ -20,7 +20,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/nodes/equalfuncs.c,v 1.145 2002/07/29 22:14:10 tgl Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/nodes/equalfuncs.c,v 1.146 2002/08/04 04:31:44 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -1055,6 +1055,8 @@ _equalTransactionStmt(TransactionStmt *a, TransactionStmt *b)
 {
        if (a->command != b->command)
                return false;
+       if (!equal(a->options, b->options))
+               return false;
 
        return true;
 }
index 73c2875d1b7e98b187bd056331b1e3f0cdba0090..76731f97d7a02e150f0400cd53ca9cbc14b80dc1 100644 (file)
@@ -11,7 +11,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.352 2002/07/31 17:19:51 tgl Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.353 2002/08/04 04:31:44 momjian Exp $
  *
  * HISTORY
  *       AUTHOR                        DATE                    MAJOR EVENT
@@ -195,7 +195,7 @@ static void doNegateFloat(Value *v);
 
 %type <str>            opt_id, all_Op, MathOp, opt_name, SpecialRuleRelation
 
-%type <str>            opt_level, opt_encoding
+%type <str>            iso_level, opt_encoding
 %type <node>   grantee
 %type <list>   grantee_list
 %type <ival>   privilege
@@ -218,7 +218,7 @@ 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
+                               opt_select_limit, opclass_item_list, trans_options
 
 %type <range>  into_clause, OptTempTableName
 
@@ -847,14 +847,14 @@ set_rest:  ColId TO var_list_or_default
                                                n->args = makeList1($3);
                                        $$ = n;
                                }
-                       | TRANSACTION ISOLATION LEVEL opt_level opt_mode
+                       | 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 opt_level
+                       | SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL iso_level
                                {
                                        VariableSetStmt *n = makeNode(VariableSetStmt);
                                        n->name = "default_transaction_isolation";
@@ -902,7 +902,7 @@ var_value:  opt_boolean
                                { $$ = makeAConst($1); }
                ;
 
-opt_level:     READ COMMITTED                                                  { $$ = "read committed"; }
+iso_level:     READ COMMITTED                                                  { $$ = "read committed"; }
                        | SERIALIZABLE                                                  { $$ = "serializable"; }
                ;
 
@@ -3445,67 +3445,60 @@ TransactionStmt:
                                {
                                        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;
                                }
-                       | COMMIT opt_trans
+                       | START TRANSACTION trans_options
                                {
                                        TransactionStmt *n = makeNode(TransactionStmt);
-                                       n->command = COMMIT;
+                                       n->command = START;
+                                       n->options = $3;
                                        $$ = (Node *)n;
                                }
-                       | COMMIT opt_trans opt_chain
+                       | 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;
-                                       $$ = (Node *)n;
-                               }
-                       | ROLLBACK opt_trans opt_chain
-                               {
-                                       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*/                                                             {}
                ;
 
-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 <viewname> '('target-list ')' [where <quals> ]
+ *                             create view <viewname> '('target-list ')' AS <query>
  *
  *****************************************************************************/
 
index 8aae5f5406da82f681daf51188371a1cd3b63c5d..976d366fe78472f1293dad4019f237702c489da8 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/tcop/postgres.c,v 1.276 2002/07/30 16:55:45 momjian Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/tcop/postgres.c,v 1.277 2002/08/04 04:31:44 momjian Exp $
  *
  * NOTES
  *       this is the "main" module of the postgres backend and
@@ -1693,7 +1693,7 @@ PostgresMain(int argc, char *argv[], const char *username)
        if (!IsUnderPostmaster)
        {
                puts("\nPOSTGRES backend interactive interface ");
-               puts("$Revision: 1.276 $ $Date: 2002/07/30 16:55:45 $\n");
+               puts("$Revision: 1.277 $ $Date: 2002/08/04 04:31:44 $\n");
        }
 
        /*
@@ -2160,6 +2160,10 @@ CreateCommandTag(Node *parsetree)
                                                tag = "BEGIN";
                                                break;
 
+                                       case START:
+                                               tag = "START TRANSACTION";
+                                               break;
+
                                        case COMMIT:
                                                tag = "COMMIT";
                                                break;
index fd0f10d58aae952066e7a8cb4356a0ebf08be688..8c3af9ac9cef2731dcd3fa1b04a89800b7857e2c 100644 (file)
@@ -10,7 +10,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/tcop/utility.c,v 1.167 2002/07/30 16:55:45 momjian Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/tcop/utility.c,v 1.168 2002/08/04 04:31:44 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -205,6 +205,28 @@ ProcessUtility(Node *parsetree,
                                                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 467208c95cd34368e657ed4d962be2ca44e8d844..07e985b377bb607b971b44714c9088afdc7137ae 100644 (file)
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $Id: parsenodes.h,v 1.196 2002/07/30 16:55:45 momjian Exp $
+ * $Id: parsenodes.h,v 1.197 2002/08/04 04:31:44 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -1387,13 +1387,14 @@ typedef struct UnlistenStmt
 } UnlistenStmt;
 
 /* ----------------------
- *             {Begin|Abort|End} Transaction Statement
+ *             {Begin|Commit|Rollback} Transaction Statement
  * ----------------------
  */
 typedef struct TransactionStmt
 {
        NodeTag         type;
-       int                     command;                /* BEGIN|END|ABORT */
+       int                     command;                /* BEGIN_TRANS|START|COMMIT|ROLLBACK */
+       List       *options;
 } TransactionStmt;
 
 /* ----------------------