aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorStephen Frost <sfrost@snowman.net>2016-03-15 18:04:39 -0400
committerStephen Frost <sfrost@snowman.net>2016-03-15 18:04:39 -0400
commitfd658dbb300456b393536802d1145a9cea7b25d6 (patch)
treed8c800c8fb437203fb8b44f1bc021f063ee2f72e /src
parent5bcc413f80de4e0bc8f0df15d7d0ac2e8272dec5 (diff)
downloadpostgresql-fd658dbb300456b393536802d1145a9cea7b25d6.tar.gz
postgresql-fd658dbb300456b393536802d1145a9cea7b25d6.zip
Avoid incorrectly indicating exclusion constraint wait
INSERT ... ON CONFLICT's precheck may have to wait on the outcome of another insertion, which may or may not itself be a speculative insertion. This wait is not necessarily associated with an exclusion constraint, but was always reported that way in log messages if the wait happened to involve a tuple that had no speculative token. Initially discovered through use of ON CONFLICT DO NOTHING, where spurious references to exclusion constraints in log messages were more likely. Patch by Peter Geoghegan. Reviewed by Julien Rouhaud. Back-patch to 9.5 where INSERT ... ON CONFLICT was added.
Diffstat (limited to 'src')
-rw-r--r--src/backend/executor/execIndexing.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/src/backend/executor/execIndexing.c b/src/backend/executor/execIndexing.c
index 838cee7db07..5d553d51d21 100644
--- a/src/backend/executor/execIndexing.c
+++ b/src/backend/executor/execIndexing.c
@@ -725,6 +725,7 @@ retry:
{
TransactionId xwait;
ItemPointerData ctid_wait;
+ XLTW_Oper reason_wait;
Datum existing_values[INDEX_MAX_KEYS];
bool existing_isnull[INDEX_MAX_KEYS];
char *error_new;
@@ -783,13 +784,14 @@ retry:
TransactionIdPrecedes(GetCurrentTransactionId(), xwait))))
{
ctid_wait = tup->t_data->t_ctid;
+ reason_wait = indexInfo->ii_ExclusionOps ?
+ XLTW_RecheckExclusionConstr : XLTW_InsertIndex;
index_endscan(index_scan);
if (DirtySnapshot.speculativeToken)
SpeculativeInsertionWait(DirtySnapshot.xmin,
DirtySnapshot.speculativeToken);
else
- XactLockTableWait(xwait, heap, &ctid_wait,
- XLTW_RecheckExclusionConstr);
+ XactLockTableWait(xwait, heap, &ctid_wait, reason_wait);
goto retry;
}