From 5457a130d3a66db807d1e0ee2b8e829321809b83 Mon Sep 17 00:00:00 2001 From: Simon Riggs <simon@2ndQuadrant.com> Date: Sun, 2 Dec 2012 20:52:52 +0000 Subject: [PATCH] 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. --- src/backend/access/heap/heapam.c | 13 +++---- src/backend/commands/copy.c | 9 ++--- src/include/access/heapam.h | 3 +- src/test/regress/expected/copy2.out | 60 ++++++++++++++++++----------- src/test/regress/sql/copy2.sql | 19 +++++---- 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; -- GitLab