Fix PlanRowMark/ExecRowMark structures to handle inheritance correctly.
Tom Lane <tgl@sss.pgh.pa.us>
Fix PlanRowMark/ExecRowMark structures to handle inheritance correctly. In an inherited UPDATE/DELETE, each target table has its own subplan, because it might have a column set different from other targets. This means that the resjunk columns we add to support EvalPlanQual might be at different physical column numbers in each subplan. The EvalPlanQual rewrite I did for 9.0 failed to account for this, resulting in possible misbehavior or even crashes during concurrent updates to the same row, as seen in a recent report from Gordon Shannon. Revise the data structure so that we track resjunk column numbers separately for each subplan. I also chose to move responsibility for identifying the physical column numbers back to executor startup, instead of assuming that numbers derived during preprocess_targetlist would stay valid throughout subsequent massaging of the plan. That's a bit slower, so we might want to consider undoing it someday; but it would complicate the patch considerably and didn't seem justifiable in a bug fix that has to be back-patched to 9.0.
Files
| Path | Change | +/− |
|---|---|---|
| src/backend/executor/execJunk.c | modified | +13 −1 |
| src/backend/executor/execMain.c | modified | +82 −25 |
| src/backend/executor/nodeLockRows.c | modified | +26 −25 |
| src/backend/executor/nodeModifyTable.c | modified | +22 −20 |
| src/backend/nodes/copyfuncs.c | modified | +0 −3 |
| src/backend/nodes/outfuncs.c | modified | +0 −3 |
| src/backend/optimizer/plan/planner.c | modified | +0 −8 |
| src/backend/optimizer/prep/preptlist.c | modified | +2 −15 |
| src/backend/optimizer/prep/prepunion.c | modified | +0 −4 |
| src/include/executor/executor.h | modified | +7 −3 |
| src/include/nodes/execnodes.h | modified | +25 −9 |
| src/include/nodes/plannodes.h | modified | +15 −6 |