v3-0003-Prune-PlanRowMark-of-relations-that-are-pruned-fr.patch
text/plain
Filename: v3-0003-Prune-PlanRowMark-of-relations-that-are-pruned-fr.patch
Type: text/plain
Part: 2
Message:
Re: executor relation handling
Patch
Format: format-patch
Series: patch v3-0003
Subject: Prune PlanRowMark of relations that are pruned from a plan
| File | + | − |
|---|---|---|
| src/backend/optimizer/plan/planner.c | 26 | 5 |
From 8e9f0d3422453bd19b897d4212498f62855f6304 Mon Sep 17 00:00:00 2001
From: amit <amitlangote09@gmail.com>
Date: Tue, 14 Aug 2018 10:35:47 +0900
Subject: [PATCH v3 3/4] Prune PlanRowMark of relations that are pruned from a
plan
---
src/backend/optimizer/plan/planner.c | 31 ++++++++++++++++++++++++++-----
1 file changed, 26 insertions(+), 5 deletions(-)
diff --git a/src/backend/optimizer/plan/planner.c b/src/backend/optimizer/plan/planner.c
index bc4f02fbf6..4cd3b9b902 100644
--- a/src/backend/optimizer/plan/planner.c
+++ b/src/backend/optimizer/plan/planner.c
@@ -237,6 +237,7 @@ static void create_partitionwise_grouping_paths(PlannerInfo *root,
static bool group_by_has_partkey(RelOptInfo *input_rel,
List *targetList,
List *groupClause);
+static List *get_unpruned_rowmarks(PlannerInfo *root);
/*****************************************************************************
@@ -1587,7 +1588,7 @@ inheritance_planner(PlannerInfo *root)
if (parse->rowMarks)
rowMarks = NIL;
else
- rowMarks = root->rowMarks;
+ rowMarks = get_unpruned_rowmarks(root);
/* Create Path representing a ModifyTable to do the UPDATE/DELETE work */
add_path(final_rel, (Path *)
@@ -2116,11 +2117,9 @@ grouping_planner(PlannerInfo *root, bool inheritance_update,
* is what goes into the LockRows node.)
*/
if (parse->rowMarks)
- {
path = (Path *) create_lockrows_path(root, final_rel, path,
- root->rowMarks,
+ get_unpruned_rowmarks(root),
SS_assign_special_param(root));
- }
/*
* If there is a LIMIT/OFFSET clause, add the LIMIT node.
@@ -2165,7 +2164,7 @@ grouping_planner(PlannerInfo *root, bool inheritance_update,
if (parse->rowMarks)
rowMarks = NIL;
else
- rowMarks = root->rowMarks;
+ rowMarks = get_unpruned_rowmarks(root);
path = (Path *)
create_modifytable_path(root, final_rel,
@@ -7159,3 +7158,25 @@ group_by_has_partkey(RelOptInfo *input_rel,
return true;
}
+
+/*
+ * get_unpruned_rowmarks
+ * Return a list of PlanRowMark's that reference unpruned relations
+ */
+static List *
+get_unpruned_rowmarks(PlannerInfo *root)
+{
+ List *rowMarks = NIL;
+ ListCell *lc;
+
+ foreach(lc, root->rowMarks)
+ {
+ PlanRowMark *rc = lfirst(lc);
+
+ if (root->simple_rel_array[rc->rti] != NULL &&
+ !IS_DUMMY_REL(root->simple_rel_array[rc->rti]))
+ rowMarks = lappend(rowMarks, rc);
+ }
+
+ return rowMarks;
+}
--
2.11.0