aboutsummaryrefslogtreecommitdiff
path: root/src
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 /src
parent3114cb60a1a3f482724adaed4ca17572c5e6bde7 (diff)
downloadpostgresql-5457a130d3a66db807d1e0ee2b8e829321809b83.tar.gz
postgresql-5457a130d3a66db807d1e0ee2b8e829321809b83.zip
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.
Diffstat (limited to 'src')
-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;