diff --git a/src/backend/optimizer/plan/setrefs.c b/src/backend/optimizer/plan/setrefs.c index 95338c8..b8bfe94 100644 --- a/src/backend/optimizer/plan/setrefs.c +++ b/src/backend/optimizer/plan/setrefs.c @@ -2582,6 +2582,11 @@ extract_query_dependencies_walker(Node *node, PlannerInfo *context) if (rte->rtekind == RTE_RELATION) context->glob->relationOids = lappend_oid(context->glob->relationOids, rte->relid); + else if (rte->rtekind == RTE_NAMEDTUPLESTORE && + OidIsValid(rte->relid)) + context->glob->relationOids = + lappend_oid(context->glob->relationOids, + rte->relid); } /* And recurse into the query's subexpressions */ diff --git a/src/backend/parser/parse_relation.c b/src/backend/parser/parse_relation.c index fdb149a..47d0d8c 100644 --- a/src/backend/parser/parse_relation.c +++ b/src/backend/parser/parse_relation.c @@ -1991,6 +1991,12 @@ addRangeTableEntryForEnr(ParseState *pstate, rte->rtekind = RTE_NAMEDTUPLESTORE; /* + * Record dependency on a relation. This allows plans to be invalidated + * if they access transition tables linked to a table that is altered. + */ + rte->relid = enrmd->dependrelid; + + /* * Build the list of effective column names using user-supplied aliases * and/or actual column names. Also build the cannibalized fields. */ diff --git a/src/include/utils/queryenvironment.h b/src/include/utils/queryenvironment.h index d5d22c2..c112ddf 100644 --- a/src/include/utils/queryenvironment.h +++ b/src/include/utils/queryenvironment.h @@ -26,6 +26,7 @@ typedef struct EnrmdData { char *name; /* name used to identify the relation */ TupleDesc tupdesc; /* description of result rows */ + Oid dependrelid; /* OID of table this Enr depends on */ EnrType enrtype; /* to identify type of relation */ double enrtuples; /* estimated number of tuples */ } EnrmdData; diff --git a/src/pl/plpgsql/src/pl_exec.c b/src/pl/plpgsql/src/pl_exec.c index d9a4ef9..f8d89fd 100644 --- a/src/pl/plpgsql/src/pl_exec.c +++ b/src/pl/plpgsql/src/pl_exec.c @@ -703,6 +703,7 @@ plpgsql_exec_trigger(PLpgSQL_function *func, enr->md.name = trigdata->tg_trigger->tgnewtable; enr->md.tupdesc = trigdata->tg_relation->rd_att; + enr->md.dependrelid = trigdata->tg_relation->rd_id; enr->md.enrtuples = tuplestore_tuple_count(trigdata->tg_newtable); enr->reldata = trigdata->tg_newtable; register_enr(estate.queryEnv, enr); @@ -716,6 +717,7 @@ plpgsql_exec_trigger(PLpgSQL_function *func, enr->md.name = trigdata->tg_trigger->tgoldtable; enr->md.tupdesc = trigdata->tg_relation->rd_att; + enr->md.dependrelid = trigdata->tg_relation->rd_id; enr->md.enrtuples = tuplestore_tuple_count(trigdata->tg_oldtable); enr->reldata = trigdata->tg_oldtable; register_enr(estate.queryEnv, enr);