mirror of
https://github.com/postgres/postgres.git
synced 2025-06-27 23:21:58 +03:00
Fix things so that updatable views work with partitioned tables.
Previously, ExecInitModifyTable was missing handling for WITH CHECK OPTION, and view_query_is_auto_updatable was missing handling for RELKIND_PARTITIONED_TABLE. Amit Langote, reviewed by me.
This commit is contained in:
@ -1777,6 +1777,46 @@ ExecInitModifyTable(ModifyTable *node, EState *estate, int eflags)
|
||||
i++;
|
||||
}
|
||||
|
||||
/*
|
||||
* Build WITH CHECK OPTION constraints for each leaf partition rel.
|
||||
* Note that we didn't build the withCheckOptionList for each partition
|
||||
* within the planner, but simple translation of the varattnos for each
|
||||
* partition will suffice. This only occurs for the INSERT case;
|
||||
* UPDATE/DELETE cases are handled above.
|
||||
*/
|
||||
if (node->withCheckOptionLists != NIL && mtstate->mt_num_partitions > 0)
|
||||
{
|
||||
List *wcoList;
|
||||
|
||||
Assert(operation == CMD_INSERT);
|
||||
resultRelInfo = mtstate->mt_partitions;
|
||||
wcoList = linitial(node->withCheckOptionLists);
|
||||
for (i = 0; i < mtstate->mt_num_partitions; i++)
|
||||
{
|
||||
Relation partrel = resultRelInfo->ri_RelationDesc;
|
||||
List *mapped_wcoList;
|
||||
List *wcoExprs = NIL;
|
||||
ListCell *ll;
|
||||
|
||||
/* varno = node->nominalRelation */
|
||||
mapped_wcoList = map_partition_varattnos(wcoList,
|
||||
node->nominalRelation,
|
||||
partrel, rel);
|
||||
foreach(ll, mapped_wcoList)
|
||||
{
|
||||
WithCheckOption *wco = (WithCheckOption *) lfirst(ll);
|
||||
ExprState *wcoExpr = ExecInitExpr((Expr *) wco->qual,
|
||||
mtstate->mt_plans[i]);
|
||||
|
||||
wcoExprs = lappend(wcoExprs, wcoExpr);
|
||||
}
|
||||
|
||||
resultRelInfo->ri_WithCheckOptions = mapped_wcoList;
|
||||
resultRelInfo->ri_WithCheckOptionExprs = wcoExprs;
|
||||
resultRelInfo++;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Initialize RETURNING projections if needed.
|
||||
*/
|
||||
|
Reference in New Issue
Block a user