summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane2007-08-25 19:08:37 +0000
committerTom Lane2007-08-25 19:08:37 +0000
commit28b17705200d31fd2e8d2d3be4605c1e6c912dca (patch)
treec036bdf0ca2b62ea4cf1ab054457c1d56233796b
parentfa87632f794111d7b5382b34f26754c891fb1312 (diff)
Fix brain fade in DefineIndex(): it was continuing to access the table's
relcache entry after having heap_close'd it. This could lead to misbehavior if a relcache flush wiped out the cache entry meanwhile. In 8.2 there is a very real risk of CREATE INDEX CONCURRENTLY using the wrong relid for locking and waiting purposes. I think the bug is only cosmetic in 8.0 and 8.1, because their transgression is limited to using RelationGetRelationName(rel) in an ereport message immediately after heap_close, and there's no way (except with special debugging options) for a cache flush to occur in that interval. Not quite sure that it's cosmetic in 7.4, but seems best to patch anyway. Found by trying to run the regression tests with CLOBBER_CACHE_ALWAYS enabled. Maybe we should try to do that on a regular basis --- it's awfully slow, but perhaps some fast buildfarm machine could do it once in awhile.
-rw-r--r--src/backend/commands/indexcmds.c6
1 files changed, 3 insertions, 3 deletions
diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c
index 87a29339a7c..7a146b3848e 100644
--- a/src/backend/commands/indexcmds.c
+++ b/src/backend/commands/indexcmds.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/commands/indexcmds.c,v 1.128.4.1 2006/02/10 19:01:33 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/commands/indexcmds.c,v 1.128.4.2 2007/08/25 19:08:37 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -364,8 +364,6 @@ DefineIndex(RangeVar *heapRelation,
relationId, accessMethodName, accessMethodId,
isconstraint);
- heap_close(rel, NoLock);
-
/*
* Report index creation if appropriate (delay this till after most of
* the error checks)
@@ -377,6 +375,8 @@ DefineIndex(RangeVar *heapRelation,
primary ? "PRIMARY KEY" : "UNIQUE",
indexRelationName, RelationGetRelationName(rel))));
+ heap_close(rel, NoLock);
+
index_create(relationId, indexRelationName,
indexInfo, accessMethodId, tablespaceId, classObjectId,
primary, isconstraint,