aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2006-03-24 23:02:17 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2006-03-24 23:02:17 +0000
commit4e7d10c7cd2503193dc13a701ffd740a5741d5eb (patch)
treee8d70682bc46b3fc34241410f0d9be100a8f6999
parent0a202070603bf38ce2e2fc11a7f897fc06603b80 (diff)
downloadpostgresql-4e7d10c7cd2503193dc13a701ffd740a5741d5eb.tar.gz
postgresql-4e7d10c7cd2503193dc13a701ffd740a5741d5eb.zip
Comments in IndexBuildHeapScan describe the indexing of recently-dead
tuples as needed "to keep VACUUM from complaining", but actually there is a more compelling reason to do it: failure to do so violates MVCC semantics. This is because a pre-existing serializable transaction might try to use the index after we finish (re)building it, and it might fail to find tuples it should be able to see. We got this mostly right, but not in the case of partial indexes: the code mistakenly discarded recently-dead tuples for partial indexes. Fix that, and adjust the comments.
-rw-r--r--src/backend/catalog/index.c11
1 files changed, 5 insertions, 6 deletions
diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c
index ca057c7f2fa..1a5c3b3c3bd 100644
--- a/src/backend/catalog/index.c
+++ b/src/backend/catalog/index.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/catalog/index.c,v 1.263 2006/03/05 15:58:22 momjian Exp $
+ * $PostgreSQL: pgsql/src/backend/catalog/index.c,v 1.264 2006/03/24 23:02:17 tgl Exp $
*
*
* INTERFACE ROUTINES
@@ -1473,7 +1473,9 @@ IndexBuildHeapScan(Relation heapRelation,
/*
* If tuple is recently deleted then we must index it
- * anyway to keep VACUUM from complaining.
+ * anyway to preserve MVCC semantics. (Pre-existing
+ * transactions could try to use the index after we
+ * finish building it, and may need to see such tuples.)
*/
indexIt = true;
tupleIsAlive = false;
@@ -1541,13 +1543,10 @@ IndexBuildHeapScan(Relation heapRelation,
/*
* In a partial index, discard tuples that don't satisfy the
- * predicate. We can also discard recently-dead tuples, since VACUUM
- * doesn't complain about tuple count mismatch for partial indexes.
+ * predicate.
*/
if (predicate != NIL)
{
- if (!tupleIsAlive)
- continue;
if (!ExecQual(predicate, econtext, false))
continue;
}