Reduce scope of changes for COPY FREEZE.
authorSimon Riggs <simon@2ndQuadrant.com>
Sun, 2 Dec 2012 20:52:52 +0000 (20:52 +0000)
committerSimon Riggs <simon@2ndQuadrant.com>
Sun, 2 Dec 2012 20:52:52 +0000 (20:52 +0000)
Allow support only for freezing tuples by explicit
command. Previous coding mistakenly extended
slightly beyond what was agreed as correct on -hackers.
So essentially a partial revoke of earlier work,
leaving just the COPY FREEZE command.

src/backend/access/heap/heapam.c
src/backend/commands/copy.c
src/include/access/heapam.h
src/test/regress/expected/copy2.out
src/test/regress/sql/copy2.sql

index b66e26bebff6e47502e2bb9da6913e583c26029c..74c41fac3e96d6ac9e8f5b2a702f619346c85a0a 100644 (file)
@@ -1875,13 +1875,11 @@ FreeBulkInsertState(BulkInsertState bistate)
  * The HEAP_INSERT_SKIP_FSM option is passed directly to
  * RelationGetBufferForTuple, which see for more info.
  *
- * HEAP_INSERT_COMMITTED should only be specified for inserts into
+ * HEAP_INSERT_FROZEN should only be specified for inserts into
  * relfilenodes created during the current subtransaction and when
  * there are no prior snapshots or pre-existing portals open.
- *
- * HEAP_INSERT_FROZEN only has meaning when HEAP_INSERT_COMMITTED is
- * also set. This causes rows to be frozen, which is an MVCC violation
- * and requires explicit options chosen by user.
+ * This causes rows to be frozen, which is an MVCC violation and
+ * requires explicit options chosen by user.
  *
  * Note that these options will be applied when inserting into the heap's
  * TOAST table, too, if the tuple requires any out-of-line data.
@@ -2086,11 +2084,10 @@ heap_prepare_insert(Relation relation, HeapTuple tup, TransactionId xid,
        tup->t_data->t_infomask &= ~(HEAP_XACT_MASK);
        tup->t_data->t_infomask2 &= ~(HEAP2_XACT_MASK);
        tup->t_data->t_infomask |= HEAP_XMAX_INVALID;
-       if (options & HEAP_INSERT_COMMITTED)
+       if (options & HEAP_INSERT_FROZEN)
        {
                tup->t_data->t_infomask |= HEAP_XMIN_COMMITTED;
-               if (options & HEAP_INSERT_FROZEN)
-                       HeapTupleHeaderSetXmin(tup->t_data, FrozenTransactionId);
+               HeapTupleHeaderSetXmin(tup->t_data, FrozenTransactionId);
        }
        else
                HeapTupleHeaderSetXmin(tup->t_data, xid);
index 479c4cb17d6f59b77553633045d8500e3f5a8b8a..09f40667f68281cef6fecf6cde89aea1daf73771 100644 (file)
@@ -1994,14 +1994,11 @@ CopyFrom(CopyState cstate)
                 * which subtransaction created it is crucial for correctness
                 * of this optimisation.
                 */
-               if (ThereAreNoPriorRegisteredSnapshots() &&
+               if (cstate->freeze &&
+                       ThereAreNoPriorRegisteredSnapshots() &&
                        ThereAreNoReadyPortals() &&
                        cstate->rel->rd_newRelfilenodeSubid == GetCurrentSubTransactionId())
-               {
-                       hi_options |= HEAP_INSERT_COMMITTED;
-                       if (cstate->freeze)
-                               hi_options |= HEAP_INSERT_FROZEN;
-               }
+                       hi_options |= HEAP_INSERT_FROZEN;
        }
 
        if (cstate->freeze && (hi_options & HEAP_INSERT_FROZEN) == 0)
index 92627bfc25c8d0b9e605e27191bde20443bf0965..7259f997e6b5f64e77dbc5f60deaf07da6c010c4 100644 (file)
@@ -26,8 +26,7 @@
 /* "options" flag bits for heap_insert */
 #define HEAP_INSERT_SKIP_WAL   0x0001
 #define HEAP_INSERT_SKIP_FSM   0x0002
-#define HEAP_INSERT_COMMITTED  0x0004
-#define HEAP_INSERT_FROZEN             0x0008
+#define HEAP_INSERT_FROZEN             0x0004
 
 typedef struct BulkInsertStateData *BulkInsertState;
 
index e2fc3f511752b685f98e54d09bdf356127b44ed4..7a9e546aad6d495395d0114a34015e4d1b5ceb88 100644 (file)
@@ -259,9 +259,9 @@ BEGIN;
 TRUNCATE vistest;
 COPY vistest FROM stdin CSV;
 SELECT * FROM vistest;
- a 
----
- a
+ a  
+----
+ a1
  b
 (2 rows)
 
@@ -269,20 +269,27 @@ SAVEPOINT s1;
 TRUNCATE vistest;
 COPY vistest FROM stdin CSV;
 SELECT * FROM vistest;
- a 
----
- d
+ a  
+----
+ d1
  e
 (2 rows)
 
 COMMIT;
+SELECT * FROM vistest;
+ a  
+----
+ d1
+ e
+(2 rows)
+
 BEGIN;
 TRUNCATE vistest;
 COPY vistest FROM stdin CSV FREEZE;
 SELECT * FROM vistest;
- a 
----
- a
+ a  
+----
+ a2
  b
 (2 rows)
 
@@ -290,13 +297,20 @@ SAVEPOINT s1;
 TRUNCATE vistest;
 COPY vistest FROM stdin CSV FREEZE;
 SELECT * FROM vistest;
- a 
----
- d
+ a  
+----
+ d2
  e
 (2 rows)
 
 COMMIT;
+SELECT * FROM vistest;
+ a  
+----
+ d2
+ e
+(2 rows)
+
 BEGIN;
 TRUNCATE vistest;
 COPY vistest FROM stdin CSV FREEZE;
@@ -319,12 +333,12 @@ ROLLBACK TO SAVEPOINT s1;
 COPY vistest FROM stdin CSV FREEZE;
 NOTICE:  FREEZE option specified but pre-conditions not met
 SELECT * FROM vistest;
- a 
----
+ a  
+----
  p
  g
  z
- d
+ d3
  e
 (5 rows)
 
@@ -332,10 +346,10 @@ COMMIT;
 CREATE FUNCTION truncate_in_subxact() RETURNS VOID AS
 $$
 BEGIN
-  SELECT * FROM nonexistent;
+       TRUNCATE vistest;
 EXCEPTION
   WHEN OTHERS THEN
-       TRUNCATE vistest;
+       INSERT INTO vistest VALUES ('subxact failure');
 END;
 $$ language plpgsql;
 BEGIN;
@@ -348,17 +362,17 @@ SELECT truncate_in_subxact();
 
 COPY vistest FROM stdin CSV FREEZE;
 SELECT * FROM vistest;
- a 
----
- d
+ a  
+----
+ d4
  e
 (2 rows)
 
 COMMIT;
 SELECT * FROM vistest;
- a 
----
- d
+ a  
+----
+ d4
  e
 (2 rows)
 
index 717c3d081b3c6df5a6734c63149c58d00edd6e30..fbaa433be4e873e3c25c9dcae2bcd7967c75dab9 100644 (file)
@@ -183,34 +183,37 @@ CREATE TABLE vistest (LIKE testeoc);
 BEGIN;
 TRUNCATE vistest;
 COPY vistest FROM stdin CSV;
-a
+a1
 b
 \.
 SELECT * FROM vistest;
 SAVEPOINT s1;
 TRUNCATE vistest;
 COPY vistest FROM stdin CSV;
-d
+d1
 e
 \.
 SELECT * FROM vistest;
 COMMIT;
+SELECT * FROM vistest;
 
 BEGIN;
 TRUNCATE vistest;
 COPY vistest FROM stdin CSV FREEZE;
-a
+a2
 b
 \.
 SELECT * FROM vistest;
 SAVEPOINT s1;
 TRUNCATE vistest;
 COPY vistest FROM stdin CSV FREEZE;
-d
+d2
 e
 \.
 SELECT * FROM vistest;
 COMMIT;
+SELECT * FROM vistest;
+
 BEGIN;
 TRUNCATE vistest;
 COPY vistest FROM stdin CSV FREEZE;
@@ -230,7 +233,7 @@ SAVEPOINT s1;
 TRUNCATE vistest;
 ROLLBACK TO SAVEPOINT s1;
 COPY vistest FROM stdin CSV FREEZE;
-d
+d3
 e
 \.
 SELECT * FROM vistest;
@@ -238,17 +241,17 @@ COMMIT;
 CREATE FUNCTION truncate_in_subxact() RETURNS VOID AS
 $$
 BEGIN
-  SELECT * FROM nonexistent;
+       TRUNCATE vistest;
 EXCEPTION
   WHEN OTHERS THEN
-       TRUNCATE vistest;
+       INSERT INTO vistest VALUES ('subxact failure');
 END;
 $$ language plpgsql;
 BEGIN;
 INSERT INTO vistest VALUES ('z');
 SELECT truncate_in_subxact();
 COPY vistest FROM stdin CSV FREEZE;
-d
+d4
 e
 \.
 SELECT * FROM vistest;