aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2001-09-26 21:09:27 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2001-09-26 21:09:27 +0000
commitd435592f33a6f323d94c9f33fe3bc964c033b6d6 (patch)
tree7044534a1d08330fa2ce4149ebafccc0a9fe2aa0 /src
parent1481b3b28b4ff250bbe31da9628dafa2b7e6687a (diff)
downloadpostgresql-d435592f33a6f323d94c9f33fe3bc964c033b6d6.tar.gz
postgresql-d435592f33a6f323d94c9f33fe3bc964c033b6d6.zip
Repair oversight in recent changes to index-creation: tuple time qual
check *can* return HEAPTUPLE_INSERT_IN_PROGRESS or HEAPTUPLE_DELETE_IN_PROGRESS, even though we have ShareLock on the relation. To wit, this can happen if the tuple was inserted/deleted by our own transaction. Per report from Justin Clift 9/23.
Diffstat (limited to 'src')
-rw-r--r--src/backend/catalog/index.c26
1 files changed, 17 insertions, 9 deletions
diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c
index 9debf84cab4..c850c55a0f5 100644
--- a/src/backend/catalog/index.c
+++ b/src/backend/catalog/index.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/catalog/index.c,v 1.163 2001/08/26 16:55:59 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/catalog/index.c,v 1.164 2001/09/26 21:09:27 tgl Exp $
*
*
* INTERFACE ROUTINES
@@ -1789,19 +1789,27 @@ IndexBuildHeapScan(Relation heapRelation,
break;
case HEAPTUPLE_INSERT_IN_PROGRESS:
/*
- * This should not happen, if caller holds ShareLock on
- * the parent relation.
+ * Since caller should hold ShareLock or better, we should
+ * not see any tuples inserted by open transactions ---
+ * unless it's our own transaction. (Consider INSERT
+ * followed by CREATE INDEX within a transaction.)
*/
- elog(ERROR, "IndexBuildHeapScan: concurrent insert in progress");
- indexIt = tupleIsAlive = false; /* keep compiler quiet */
+ if (! TransactionIdIsCurrentTransactionId(heapTuple->t_data->t_xmin))
+ elog(ERROR, "IndexBuildHeapScan: concurrent insert in progress");
+ indexIt = true;
+ tupleIsAlive = true;
break;
case HEAPTUPLE_DELETE_IN_PROGRESS:
/*
- * This should not happen, if caller holds ShareLock on
- * the parent relation.
+ * Since caller should hold ShareLock or better, we should
+ * not see any tuples deleted by open transactions ---
+ * unless it's our own transaction. (Consider DELETE
+ * followed by CREATE INDEX within a transaction.)
*/
- elog(ERROR, "IndexBuildHeapScan: concurrent delete in progress");
- indexIt = tupleIsAlive = false; /* keep compiler quiet */
+ if (! TransactionIdIsCurrentTransactionId(heapTuple->t_data->t_xmax))
+ elog(ERROR, "IndexBuildHeapScan: concurrent delete in progress");
+ indexIt = true;
+ tupleIsAlive = false;
break;
default:
elog(ERROR, "Unexpected HeapTupleSatisfiesVacuum result");