Back-patch fix for errors reported at transaction end.
authorTom Lane <[email protected]>
Wed, 27 Feb 2002 23:17:01 +0000 (23:17 +0000)
committerTom Lane <[email protected]>
Wed, 27 Feb 2002 23:17:01 +0000 (23:17 +0000)
src/backend/tcop/postgres.c

index 717d4f76049e49d2a9ecc9a5c9e9f349a92f0cb4..7a1b148edb8f21b3bc240ac5bd66c10d0b528b2f 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/tcop/postgres.c,v 1.245.2.1 2002/02/26 23:48:45 tgl Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/tcop/postgres.c,v 1.245.2.2 2002/02/27 23:17:01 tgl Exp $
  *
  * NOTES
  *   this is the "main" module of the postgres backend and
@@ -645,6 +645,15 @@ pg_exec_query_string(char *query_string,       /* string to execute */
        /* Transaction control statements need some special handling */
        isTransactionStmt = IsA(parsetree, TransactionStmt);
 
+       /*
+        * First we set the command-completion tag to the main query
+        * (as opposed to each of the others that may be generated by
+        * analyze and rewrite).  Also set ps_status to the main query tag.
+        */
+       commandTag = CreateCommandTag(parsetree);
+
+       set_ps_display(commandTag);
+
        /*
         * If we are in an aborted transaction, ignore all commands except
         * COMMIT/ABORT.  It is important that this test occur before we
@@ -707,18 +716,7 @@ pg_exec_query_string(char *query_string,       /* string to execute */
 
        /*
         * OK to analyze and rewrite this query.
-        */
-        
-       /*
-        * First we set the command-completion tag to the main query
-        * (as opposed to each of the others that may be generated by
-        * analyze and rewrite).  Also set ps_status to the main query tag.
-        */
-       commandTag = CreateCommandTag(parsetree);
-
-       set_ps_display(commandTag);
-
-       /*
+        *
         * Switch to appropriate context for constructing querytrees (again,
         * these must outlive the execution context).
         */
@@ -858,6 +856,22 @@ pg_exec_query_string(char *query_string,       /* string to execute */
        }                       /* end loop over queries generated from a
                                 * parsetree */
 
+       /*
+        * If this is the last parsetree of the query string, close down
+        * transaction statement before reporting command-complete.  This is
+        * so that any end-of-transaction errors are reported before the
+        * command-complete message is issued, to avoid confusing clients
+        * who will expect either a command-complete message or an error,
+        * not one and then the other.  But for compatibility with
+        * historical Postgres behavior, we do not force a transaction
+        * boundary between queries appearing in a single query string.
+        */
+       if (lnext(parsetree_item) == NIL && xact_started)
+       {
+           finish_xact_command();
+           xact_started = false;
+       }
+
        /*
         * It is possible that the original query was removed due to
         * a DO INSTEAD rewrite rule.  In that case we will still have
@@ -877,13 +891,15 @@ pg_exec_query_string(char *query_string,      /* string to execute */
         * Tell client that we're done with this query.  Note we emit
         * exactly one EndCommand report for each raw parsetree, thus
         * one for each SQL command the client sent, regardless of
-        * rewriting.
+        * rewriting.  (But a command aborted by error will not send
+        * an EndCommand report at all.)
         */
        EndCommand(commandTag, dest);
    }                           /* end loop over parsetrees */
 
    /*
     * Close down transaction statement, if one is open.
+    * (Note that this will only happen if the querystring was empty.)
     */
    if (xact_started)
        finish_xact_command();
@@ -1688,7 +1704,7 @@ PostgresMain(int argc, char *argv[], const char *username)
    if (!IsUnderPostmaster)
    {
        puts("\nPOSTGRES backend interactive interface ");
-       puts("$Revision: 1.245.2.1 $ $Date: 2002/02/26 23:48:45 $\n");
+       puts("$Revision: 1.245.2.2 $ $Date: 2002/02/27 23:17:01 $\n");
    }
 
    /*