diff options
author | Tom Lane | 2022-08-04 18:10:06 +0000 |
---|---|---|
committer | Tom Lane | 2022-08-04 18:10:06 +0000 |
commit | 6ad86feecb246f6b9d1f097e2bf777775b7c2434 (patch) | |
tree | b33980016980c80258acd7888ec851d9500beaf5 /src/backend/executor/nodeModifyTable.c | |
parent | cc116479917b7768bef46d0d789093bd6b25f7cd (diff) |
Add CHECK_FOR_INTERRUPTS in ExecInsert's speculative insertion loop.
Ordinarily the functions called in this loop ought to have plenty
of CFIs themselves; but we've now seen a case where no such CFI is
reached, making the loop uninterruptible. Even though that's from
a recently-introduced bug, it seems prudent to install a CFI at
the loop level in all branches.
Per discussion of bug #17558 from Andrew Kesper (an actual fix for
that bug will follow).
Discussion: https://postgr.es/m/[email protected]
Diffstat (limited to 'src/backend/executor/nodeModifyTable.c')
-rw-r--r-- | src/backend/executor/nodeModifyTable.c | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/src/backend/executor/nodeModifyTable.c b/src/backend/executor/nodeModifyTable.c index a49c3da5b6c..deda3215028 100644 --- a/src/backend/executor/nodeModifyTable.c +++ b/src/backend/executor/nodeModifyTable.c @@ -956,9 +956,11 @@ ExecInsert(ModifyTableContext *context, * * We loop back here if we find a conflict below, either during * the pre-check, or when we re-check after inserting the tuple - * speculatively. + * speculatively. Better allow interrupts in case some bug makes + * this an infinite loop. */ vlock: + CHECK_FOR_INTERRUPTS(); specConflict = false; if (!ExecCheckIndexConstraints(resultRelInfo, slot, estate, &conflictTid, arbiterIndexes)) |