summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Riggs <simon@2ndQuadrant.com>2012-12-02 20:52:52 +0000
committerSimon Riggs <simon@2ndQuadrant.com>2012-12-02 20:52:52 +0000
commit5457a130d3a66db807d1e0ee2b8e829321809b83 (patch)
treead4eff3fe8a04395e6ea87accc39b1ea66adbb2f
parent3114cb60a1a3f482724adaed4ca17572c5e6bde7 (diff)
Reduce scope of changes for COPY FREEZE.
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.
-rw-r--r--src/backend/access/heap/heapam.c13
-rw-r--r--src/backend/commands/copy.c9
-rw-r--r--src/include/access/heapam.h3
-rw-r--r--src/test/regress/expected/copy2.out60
-rw-r--r--src/test/regress/sql/copy2.sql19
5 files changed, 57 insertions, 47 deletions
diff --git a/src/backend/access/heap/heapam.c b/src/backend/access/heap/heapam.c
index b66e26bebff..74c41fac3e9 100644
--- a/src/backend/access/heap/heapam.c
+++ b/src/backend/access/heap/heapam.c
@@ -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);
diff --git a/src/backend/commands/copy.c b/src/backend/commands/copy.c
index 479c4cb17d6..09f40667f68 100644
--- a/src/backend/commands/copy.c
+++ b/src/backend/commands/copy.c
@@ -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)
diff --git a/src/include/access/heapam.h b/src/include/access/heapam.h
index 92627bfc25c..7259f997e6b 100644
--- a/src/include/access/heapam.h
+++ b/src/include/access/heapam.h
@@ -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;
diff --git a/src/test/regress/expected/copy2.out b/src/test/regress/expected/copy2.out
index e2fc3f51175..7a9e546aad6 100644
--- a/src/test/regress/expected/copy2.out
+++ b/src/test/regress/expected/copy2.out
@@ -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)
diff --git a/src/test/regress/sql/copy2.sql b/src/test/regress/sql/copy2.sql
index 717c3d081b3..fbaa433be4e 100644
--- a/src/test/regress/sql/copy2.sql
+++ b/src/test/regress/sql/copy2.sql
@@ -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;