1
0
mirror of https://github.com/postgres/postgres.git synced 2025-07-21 16:02:15 +03:00

Update some comments that should've covered MERGE

Oversight in 7103ebb7aa.  Backpatch to 15.

Author: Richard Guo <guofenglinux@gmail.com>
Discussion: https://postgr.es/m/CAMbWs48gnDjZXq3-b56dVpQCNUJ5hD9kdtWN4QFwKCEapspNsA@mail.gmail.com
This commit is contained in:
Alvaro Herrera
2022-10-24 12:52:43 +02:00
parent 8328a15f8f
commit 3b2db22fe2
14 changed files with 42 additions and 34 deletions

View File

@ -3393,12 +3393,13 @@ check_index_predicates(PlannerInfo *root, RelOptInfo *rel)
* Normally we remove quals that are implied by a partial index's
* predicate from indrestrictinfo, indicating that they need not be
* checked explicitly by an indexscan plan using this index. However, if
* the rel is a target relation of UPDATE/DELETE/SELECT FOR UPDATE, we
* cannot remove such quals from the plan, because they need to be in the
* plan so that they will be properly rechecked by EvalPlanQual testing.
* Some day we might want to remove such quals from the main plan anyway
* and pass them through to EvalPlanQual via a side channel; but for now,
* we just don't remove implied quals at all for target relations.
* the rel is a target relation of UPDATE/DELETE/MERGE/SELECT FOR UPDATE,
* we cannot remove such quals from the plan, because they need to be in
* the plan so that they will be properly rechecked by EvalPlanQual
* testing. Some day we might want to remove such quals from the main
* plan anyway and pass them through to EvalPlanQual via a side channel;
* but for now, we just don't remove implied quals at all for target
* relations.
*/
is_target_rel = (bms_is_member(rel->relid, root->all_result_relids) ||
get_plan_rowmark(root->rowMarks, rel->relid) != NULL);

View File

@ -266,7 +266,7 @@ query_planner(PlannerInfo *root,
add_other_rels_to_query(root);
/*
* Distribute any UPDATE/DELETE row identity variables to the target
* Distribute any UPDATE/DELETE/MERGE row identity variables to the target
* relations. This can't be done till we've finished expansion of
* appendrels.
*/

View File

@ -1749,7 +1749,7 @@ grouping_planner(PlannerInfo *root, double tuple_fraction)
if (bms_membership(root->all_result_relids) == BMS_MULTIPLE)
{
/* Inherited UPDATE/DELETE */
/* Inherited UPDATE/DELETE/MERGE */
RelOptInfo *top_result_rel = find_base_rel(root,
parse->resultRelation);
int resultRelation = -1;
@ -1876,7 +1876,7 @@ grouping_planner(PlannerInfo *root, double tuple_fraction)
}
else
{
/* Single-relation INSERT/UPDATE/DELETE. */
/* Single-relation INSERT/UPDATE/DELETE/MERGE. */
resultRelations = list_make1_int(parse->resultRelation);
if (parse->commandType == CMD_UPDATE)
updateColnosLists = list_make1(root->update_colnos);

View File

@ -730,7 +730,7 @@ find_appinfos_by_relids(PlannerInfo *root, Relids relids, int *nappinfos)
/*
* add_row_identity_var
* Register a row-identity column to be used in UPDATE/DELETE.
* Register a row-identity column to be used in UPDATE/DELETE/MERGE.
*
* The Var must be equal(), aside from varno, to any other row-identity
* column with the same rowid_name. Thus, for example, "wholerow"
@ -909,8 +909,8 @@ add_row_identity_columns(PlannerInfo *root, Index rtindex,
* distribute_row_identity_vars
*
* After we have finished identifying all the row identity columns
* needed by an inherited UPDATE/DELETE query, make sure that these
* columns will be generated by all the target relations.
* needed by an inherited UPDATE/DELETE/MERGE query, make sure that
* these columns will be generated by all the target relations.
*
* This is more or less like what build_base_rel_tlists() does,
* except that it would not understand what to do with ROWID_VAR Vars.

View File

@ -609,7 +609,7 @@ expand_single_inheritance_child(PlannerInfo *root, RangeTblEntry *parentrte,
/*
* If we are creating a child of the query target relation (only possible
* in UPDATE/DELETE), add it to all_result_relids, as well as
* in UPDATE/DELETE/MERGE), add it to all_result_relids, as well as
* leaf_result_relids if appropriate, and make sure that we generate
* required row-identity data.
*/

View File

@ -3630,7 +3630,8 @@ create_lockrows_path(PlannerInfo *root, RelOptInfo *rel,
/*
* create_modifytable_path
* Creates a pathnode that represents performing INSERT/UPDATE/DELETE mods
* Creates a pathnode that represents performing INSERT/UPDATE/DELETE/MERGE
* mods
*
* 'rel' is the parent relation associated with the result
* 'subpath' is a Path producing source data

View File

@ -1013,7 +1013,7 @@ build_joinrel_tlist(PlannerInfo *root, RelOptInfo *joinrel,
if (var->varno == ROWID_VAR)
{
/* UPDATE/DELETE row identity vars are always needed */
/* UPDATE/DELETE/MERGE row identity vars are always needed */
RowIdentityVarInfo *ridinfo = (RowIdentityVarInfo *)
list_nth(root->row_identity_vars, var->varattno - 1);

View File

@ -153,7 +153,7 @@ transformFromClause(ParseState *pstate, List *frmList)
/*
* setTargetTable
* Add the target relation of INSERT/UPDATE/DELETE to the range table,
* Add the target relation of INSERT/UPDATE/DELETE/MERGE to the range table,
* and make the special links to it in the ParseState.
*
* We also open the target relation and acquire a write lock on it.
@ -163,7 +163,9 @@ transformFromClause(ParseState *pstate, List *frmList)
*
* If alsoSource is true, add the target to the query's joinlist and
* namespace. For INSERT, we don't want the target to be joined to;
* it's a destination of tuples, not a source. For UPDATE/DELETE,
* it's a destination of tuples, not a source. MERGE is actually
* both, but we'll add it separately to joinlist and namespace, so
* doing nothing (like INSERT) is correct here. For UPDATE/DELETE,
* we do need to scan or join the target. (NOTE: we do not bother
* to check for namespace conflict; we assume that the namespace was
* initially empty in these cases.)

View File

@ -1679,8 +1679,8 @@ transformSubLink(ParseState *pstate, SubLink *sublink)
/*
* Check to see if the sublink is in an invalid place within the query. We
* allow sublinks everywhere in SELECT/INSERT/UPDATE/DELETE, but generally
* not in utility statements.
* allow sublinks everywhere in SELECT/INSERT/UPDATE/DELETE/MERGE, but
* generally not in utility statements.
*/
err = NULL;
switch (pstate->p_expr_kind)

View File

@ -163,7 +163,11 @@ transformMergeStmt(ParseState *pstate, MergeStmt *stmt)
errmsg("unreachable WHEN clause specified after unconditional WHEN clause")));
}
/* Set up the MERGE target table. */
/*
* Set up the MERGE target table. The target table is added to the
* namespace below and to joinlist in transform_MERGE_to_join, so don't
* do it here.
*/
qry->resultRelation = setTargetTable(pstate, stmt->relation,
stmt->relation->inh,
false, targetPerms);