diff options
author | Robert Haas <rhaas@postgresql.org> | 2017-05-16 12:46:32 -0400 |
---|---|---|
committer | Robert Haas <rhaas@postgresql.org> | 2017-05-16 12:46:32 -0400 |
commit | 59f40566cab95181ec132b3f0208f34e4c67f2b0 (patch) | |
tree | 322161ace2c1b3ae6bdde4e22cad90ad2c02eed0 /src/backend/executor/execMain.c | |
parent | 8e709a612f4c10cdc4b19a734cd67ac019d0a2ec (diff) | |
download | postgresql-59f40566cab95181ec132b3f0208f34e4c67f2b0.tar.gz postgresql-59f40566cab95181ec132b3f0208f34e4c67f2b0.zip |
Fix relcache leak when row triggers on partitions are fired by COPY.
Thomas Munro, reviewed by Amit Langote
Discussion: http://postgr.es/m/CAEepm=15Jss-yhFApuKzxcoCuFnb8TR8iQiWMjG=CLYPx48QLw@mail.gmail.com
Diffstat (limited to 'src/backend/executor/execMain.c')
-rw-r--r-- | src/backend/executor/execMain.c | 39 |
1 files changed, 21 insertions, 18 deletions
diff --git a/src/backend/executor/execMain.c b/src/backend/executor/execMain.c index 2535d2ee695..fb2ba3302c0 100644 --- a/src/backend/executor/execMain.c +++ b/src/backend/executor/execMain.c @@ -1447,6 +1447,24 @@ ExecGetTriggerResultRel(EState *estate, Oid relid) } /* + * Close any relations that have been opened by ExecGetTriggerResultRel(). + */ +void +ExecCleanUpTriggerState(EState *estate) +{ + ListCell *l; + + foreach(l, estate->es_trig_target_relations) + { + ResultRelInfo *resultRelInfo = (ResultRelInfo *) lfirst(l); + + /* Close indices and then the relation itself */ + ExecCloseIndices(resultRelInfo); + heap_close(resultRelInfo->ri_RelationDesc, NoLock); + } +} + +/* * ExecContextForcesOids * * This is pretty grotty: when doing INSERT, UPDATE, or CREATE TABLE AS, @@ -1610,16 +1628,8 @@ ExecEndPlan(PlanState *planstate, EState *estate) resultRelInfo++; } - /* - * likewise close any trigger target relations - */ - foreach(l, estate->es_trig_target_relations) - { - resultRelInfo = (ResultRelInfo *) lfirst(l); - /* Close indices and then the relation itself */ - ExecCloseIndices(resultRelInfo); - heap_close(resultRelInfo->ri_RelationDesc, NoLock); - } + /* likewise close any trigger target relations */ + ExecCleanUpTriggerState(estate); /* * close any relations selected FOR [KEY] UPDATE/SHARE, again keeping @@ -3173,14 +3183,7 @@ EvalPlanQualEnd(EPQState *epqstate) ExecResetTupleTable(estate->es_tupleTable, false); /* close any trigger target relations attached to this EState */ - foreach(l, estate->es_trig_target_relations) - { - ResultRelInfo *resultRelInfo = (ResultRelInfo *) lfirst(l); - - /* Close indices and then the relation itself */ - ExecCloseIndices(resultRelInfo); - heap_close(resultRelInfo->ri_RelationDesc, NoLock); - } + ExecCleanUpTriggerState(estate); MemoryContextSwitchTo(oldcontext); |