Adjust COPY FREEZE error message to be more accurate and consistent.
authorBruce Momjian <bruce@momjian.us>
Sat, 2 Feb 2013 17:56:14 +0000 (12:56 -0500)
committerBruce Momjian <bruce@momjian.us>
Sat, 2 Feb 2013 17:56:52 +0000 (12:56 -0500)
Per suggestions from Noah and Tom.

src/backend/commands/copy.c
src/test/regress/expected/copy2.out

index 49cc8dd88f4550f2bac73ad2d7d18bb80b078ee0..523c1e03315952c0abd41da625d0d6bdeb4b4ad3 100644 (file)
@@ -1996,36 +1996,32 @@ CopyFrom(CopyState cstate)
                hi_options |= HEAP_INSERT_SKIP_FSM;
                if (!XLogIsNeeded())
                        hi_options |= HEAP_INSERT_SKIP_WAL;
+       }
 
-               /*
-                * Optimize if new relfilenode was created in this subxact or
-                * one of its committed children and we won't see those rows later
-                * as part of an earlier scan or command. This ensures that if this
-                * subtransaction aborts then the frozen rows won't be visible
-                * after xact cleanup. Note that the stronger test of exactly
-                * which subtransaction created it is crucial for correctness
-                * of this optimisation.
-                */
-               if (cstate->freeze)
-               {
-                       if (!ThereAreNoPriorRegisteredSnapshots() || !ThereAreNoReadyPortals())
-                               ereport(ERROR,
-                                               (ERRCODE_INVALID_TRANSACTION_STATE,
-                                               errmsg("cannot perform FREEZE because of prior transaction activity")));
+       /*
+        * Optimize if new relfilenode was created in this subxact or
+        * one of its committed children and we won't see those rows later
+        * as part of an earlier scan or command. This ensures that if this
+        * subtransaction aborts then the frozen rows won't be visible
+        * after xact cleanup. Note that the stronger test of exactly
+        * which subtransaction created it is crucial for correctness
+        * of this optimisation.
+        */
+       if (cstate->freeze)
+       {
+               if (!ThereAreNoPriorRegisteredSnapshots() || !ThereAreNoReadyPortals())
+                       ereport(ERROR,
+                                       (ERRCODE_INVALID_TRANSACTION_STATE,
+                                       errmsg("cannot perform FREEZE because of prior transaction activity")));
 
-                       if (cstate->rel->rd_createSubid == GetCurrentSubTransactionId() ||
-                               cstate->rel->rd_newRelfilenodeSubid == GetCurrentSubTransactionId())
-                               hi_options |= HEAP_INSERT_FROZEN;
-                       else
-                               ereport(ERROR,
-                                               (ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE,
-                                               errmsg("cannot perform FREEZE because of transaction activity after table creation or truncation")));
-               }
+               if (cstate->rel->rd_createSubid != GetCurrentSubTransactionId() &&
+                       cstate->rel->rd_newRelfilenodeSubid != GetCurrentSubTransactionId())
+                       ereport(ERROR,
+                                       (ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE,
+                                        errmsg("cannot perform FREEZE because the table was not created or truncated in the current subtransaction")));
+
+               hi_options |= HEAP_INSERT_FROZEN;
        }
-       else if (cstate->freeze)
-               ereport(ERROR,
-                               (ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE,
-                                errmsg("cannot perform FREEZE because the table was not created or truncated in the current transaction")));
 
        /*
         * We need a ResultRelInfo so we can use the regular executor's
index 5777b242747d2ef91cb84fae5ac8d4546fd17573..34fa131c52bb69f5dbbf76ae85a42a188e8ecb30 100644 (file)
@@ -334,12 +334,12 @@ SELECT * FROM vistest;
 COMMIT;
 TRUNCATE vistest;
 COPY vistest FROM stdin CSV FREEZE;
-ERROR:  cannot perform FREEZE because the table was not created or truncated in the current transaction
+ERROR:  cannot perform FREEZE because the table was not created or truncated in the current subtransaction
 BEGIN;
 TRUNCATE vistest;
 SAVEPOINT s1;
 COPY vistest FROM stdin CSV FREEZE;
-ERROR:  cannot perform FREEZE because of transaction activity after table creation or truncation
+ERROR:  cannot perform FREEZE because the table was not created or truncated in the current subtransaction
 COMMIT;
 BEGIN;
 INSERT INTO vistest VALUES ('z');
@@ -347,7 +347,7 @@ SAVEPOINT s1;
 TRUNCATE vistest;
 ROLLBACK TO SAVEPOINT s1;
 COPY vistest FROM stdin CSV FREEZE;
-ERROR:  cannot perform FREEZE because the table was not created or truncated in the current transaction
+ERROR:  cannot perform FREEZE because the table was not created or truncated in the current subtransaction
 COMMIT;
 CREATE FUNCTION truncate_in_subxact() RETURNS VOID AS
 $$