Reorganize planner code moved in b60c39759908
authorAlvaro Herrera <alvherre@alvh.no-ip.org>
Wed, 16 Jan 2019 19:27:44 +0000 (16:27 -0300)
committerAlvaro Herrera <alvherre@alvh.no-ip.org>
Wed, 16 Jan 2019 19:27:44 +0000 (16:27 -0300)
It seems modules are better defined like this instead of the original
split.

Per complaints from David Rowley as well as Amit Langote's self review.
Discussion: https://postgr.es/m/CAKJS1f988rsyhwvLgfT-y1UCYUfXDOv67ENQk=v24OxhsZOzZw@mail.gmail.com

src/backend/optimizer/path/joinrels.c
src/backend/optimizer/util/appendinfo.c
src/backend/optimizer/util/inherit.c
src/include/optimizer/appendinfo.h

index 38eeb23d81435993749f0eb6f4b4adc6b8aceaff..00611a5e405fbfc613999ab9f46d137686272649 100644 (file)
@@ -44,6 +44,9 @@ static void try_partitionwise_join(PlannerInfo *root, RelOptInfo *rel1,
                                           RelOptInfo *rel2, RelOptInfo *joinrel,
                                           SpecialJoinInfo *parent_sjinfo,
                                           List *parent_restrictlist);
+static SpecialJoinInfo *build_child_join_sjinfo(PlannerInfo *root,
+                                               SpecialJoinInfo *parent_sjinfo,
+                                               Relids left_relids, Relids right_relids);
 static int match_expr_to_partition_keys(Expr *expr, RelOptInfo *rel,
                                                         bool strict_op);
 
@@ -1417,6 +1420,48 @@ try_partitionwise_join(PlannerInfo *root, RelOptInfo *rel1, RelOptInfo *rel2,
        }
 }
 
+/*
+ * Construct the SpecialJoinInfo for a child-join by translating
+ * SpecialJoinInfo for the join between parents. left_relids and right_relids
+ * are the relids of left and right side of the join respectively.
+ */
+static SpecialJoinInfo *
+build_child_join_sjinfo(PlannerInfo *root, SpecialJoinInfo *parent_sjinfo,
+                                               Relids left_relids, Relids right_relids)
+{
+       SpecialJoinInfo *sjinfo = makeNode(SpecialJoinInfo);
+       AppendRelInfo **left_appinfos;
+       int                     left_nappinfos;
+       AppendRelInfo **right_appinfos;
+       int                     right_nappinfos;
+
+       memcpy(sjinfo, parent_sjinfo, sizeof(SpecialJoinInfo));
+       left_appinfos = find_appinfos_by_relids(root, left_relids,
+                                                                                       &left_nappinfos);
+       right_appinfos = find_appinfos_by_relids(root, right_relids,
+                                                                                        &right_nappinfos);
+
+       sjinfo->min_lefthand = adjust_child_relids(sjinfo->min_lefthand,
+                                                                                          left_nappinfos, left_appinfos);
+       sjinfo->min_righthand = adjust_child_relids(sjinfo->min_righthand,
+                                                                                               right_nappinfos,
+                                                                                               right_appinfos);
+       sjinfo->syn_lefthand = adjust_child_relids(sjinfo->syn_lefthand,
+                                                                                          left_nappinfos, left_appinfos);
+       sjinfo->syn_righthand = adjust_child_relids(sjinfo->syn_righthand,
+                                                                                               right_nappinfos,
+                                                                                               right_appinfos);
+       sjinfo->semi_rhs_exprs = (List *) adjust_appendrel_attrs(root,
+                                                                                                                        (Node *) sjinfo->semi_rhs_exprs,
+                                                                                                                        right_nappinfos,
+                                                                                                                        right_appinfos);
+
+       pfree(left_appinfos);
+       pfree(right_appinfos);
+
+       return sjinfo;
+}
+
 /*
  * Returns true if there exists an equi-join condition for each pair of
  * partition keys from given relations being joined.
index d48e3a09b3e34f26bb47b9912b2550d5efa9239c..ca6622ece9b86dfbc725e94e04201e207b4c583a 100644 (file)
 #include "postgres.h"
 
 #include "access/htup_details.h"
-#include "access/sysattr.h"
 #include "nodes/makefuncs.h"
 #include "nodes/nodeFuncs.h"
 #include "optimizer/appendinfo.h"
 #include "parser/parsetree.h"
-#include "utils/rel.h"
 #include "utils/lsyscache.h"
+#include "utils/rel.h"
 #include "utils/syscache.h"
 
 
@@ -38,8 +37,6 @@ static void make_inh_translation_list(Relation oldrelation,
                                                  List **translated_vars);
 static Node *adjust_appendrel_attrs_mutator(Node *node,
                                                           adjust_appendrel_attrs_context *context);
-static Relids adjust_child_relids(Relids relids, int nappinfos,
-                                       AppendRelInfo **appinfos);
 static List *adjust_inherited_tlist(List *tlist,
                                           AppendRelInfo *context);
 
@@ -166,58 +163,6 @@ make_inh_translation_list(Relation oldrelation, Relation newrelation,
        *translated_vars = vars;
 }
 
-/*
- * translate_col_privs
- *       Translate a bitmapset representing per-column privileges from the
- *       parent rel's attribute numbering to the child's.
- *
- * The only surprise here is that we don't translate a parent whole-row
- * reference into a child whole-row reference.  That would mean requiring
- * permissions on all child columns, which is overly strict, since the
- * query is really only going to reference the inherited columns.  Instead
- * we set the per-column bits for all inherited columns.
- */
-Bitmapset *
-translate_col_privs(const Bitmapset *parent_privs,
-                                       List *translated_vars)
-{
-       Bitmapset  *child_privs = NULL;
-       bool            whole_row;
-       int                     attno;
-       ListCell   *lc;
-
-       /* System attributes have the same numbers in all tables */
-       for (attno = FirstLowInvalidHeapAttributeNumber + 1; attno < 0; attno++)
-       {
-               if (bms_is_member(attno - FirstLowInvalidHeapAttributeNumber,
-                                                 parent_privs))
-                       child_privs = bms_add_member(child_privs,
-                                                                                attno - FirstLowInvalidHeapAttributeNumber);
-       }
-
-       /* Check if parent has whole-row reference */
-       whole_row = bms_is_member(InvalidAttrNumber - FirstLowInvalidHeapAttributeNumber,
-                                                         parent_privs);
-
-       /* And now translate the regular user attributes, using the vars list */
-       attno = InvalidAttrNumber;
-       foreach(lc, translated_vars)
-       {
-               Var                *var = lfirst_node(Var, lc);
-
-               attno++;
-               if (var == NULL)                /* ignore dropped columns */
-                       continue;
-               if (whole_row ||
-                       bms_is_member(attno - FirstLowInvalidHeapAttributeNumber,
-                                                 parent_privs))
-                       child_privs = bms_add_member(child_privs,
-                                                                                var->varattno - FirstLowInvalidHeapAttributeNumber);
-       }
-
-       return child_privs;
-}
-
 /*
  * adjust_appendrel_attrs
  *       Copy the specified query or expression and translate Vars referring to a
@@ -527,11 +472,53 @@ adjust_appendrel_attrs_mutator(Node *node,
                                                                   (void *) context);
 }
 
+/*
+ * adjust_appendrel_attrs_multilevel
+ *       Apply Var translations from a toplevel appendrel parent down to a child.
+ *
+ * In some cases we need to translate expressions referencing a parent relation
+ * to reference an appendrel child that's multiple levels removed from it.
+ */
+Node *
+adjust_appendrel_attrs_multilevel(PlannerInfo *root, Node *node,
+                                                                 Relids child_relids,
+                                                                 Relids top_parent_relids)
+{
+       AppendRelInfo **appinfos;
+       Bitmapset  *parent_relids = NULL;
+       int                     nappinfos;
+       int                     cnt;
+
+       Assert(bms_num_members(child_relids) == bms_num_members(top_parent_relids));
+
+       appinfos = find_appinfos_by_relids(root, child_relids, &nappinfos);
+
+       /* Construct relids set for the immediate parent of given child. */
+       for (cnt = 0; cnt < nappinfos; cnt++)
+       {
+               AppendRelInfo *appinfo = appinfos[cnt];
+
+               parent_relids = bms_add_member(parent_relids, appinfo->parent_relid);
+       }
+
+       /* Recurse if immediate parent is not the top parent. */
+       if (!bms_equal(parent_relids, top_parent_relids))
+               node = adjust_appendrel_attrs_multilevel(root, node, parent_relids,
+                                                                                                top_parent_relids);
+
+       /* Now translate for this child */
+       node = adjust_appendrel_attrs(root, node, nappinfos, appinfos);
+
+       pfree(appinfos);
+
+       return node;
+}
+
 /*
  * Substitute child relids for parent relids in a Relid set.  The array of
  * appinfos specifies the substitutions to be performed.
  */
-static Relids
+Relids
 adjust_child_relids(Relids relids, int nappinfos, AppendRelInfo **appinfos)
 {
        Bitmapset  *result = NULL;
@@ -711,90 +698,6 @@ adjust_inherited_tlist(List *tlist, AppendRelInfo *context)
        return new_tlist;
 }
 
-/*
- * adjust_appendrel_attrs_multilevel
- *       Apply Var translations from a toplevel appendrel parent down to a child.
- *
- * In some cases we need to translate expressions referencing a parent relation
- * to reference an appendrel child that's multiple levels removed from it.
- */
-Node *
-adjust_appendrel_attrs_multilevel(PlannerInfo *root, Node *node,
-                                                                 Relids child_relids,
-                                                                 Relids top_parent_relids)
-{
-       AppendRelInfo **appinfos;
-       Bitmapset  *parent_relids = NULL;
-       int                     nappinfos;
-       int                     cnt;
-
-       Assert(bms_num_members(child_relids) == bms_num_members(top_parent_relids));
-
-       appinfos = find_appinfos_by_relids(root, child_relids, &nappinfos);
-
-       /* Construct relids set for the immediate parent of given child. */
-       for (cnt = 0; cnt < nappinfos; cnt++)
-       {
-               AppendRelInfo *appinfo = appinfos[cnt];
-
-               parent_relids = bms_add_member(parent_relids, appinfo->parent_relid);
-       }
-
-       /* Recurse if immediate parent is not the top parent. */
-       if (!bms_equal(parent_relids, top_parent_relids))
-               node = adjust_appendrel_attrs_multilevel(root, node, parent_relids,
-                                                                                                top_parent_relids);
-
-       /* Now translate for this child */
-       node = adjust_appendrel_attrs(root, node, nappinfos, appinfos);
-
-       pfree(appinfos);
-
-       return node;
-}
-
-/*
- * Construct the SpecialJoinInfo for a child-join by translating
- * SpecialJoinInfo for the join between parents. left_relids and right_relids
- * are the relids of left and right side of the join respectively.
- */
-SpecialJoinInfo *
-build_child_join_sjinfo(PlannerInfo *root, SpecialJoinInfo *parent_sjinfo,
-                                               Relids left_relids, Relids right_relids)
-{
-       SpecialJoinInfo *sjinfo = makeNode(SpecialJoinInfo);
-       AppendRelInfo **left_appinfos;
-       int                     left_nappinfos;
-       AppendRelInfo **right_appinfos;
-       int                     right_nappinfos;
-
-       memcpy(sjinfo, parent_sjinfo, sizeof(SpecialJoinInfo));
-       left_appinfos = find_appinfos_by_relids(root, left_relids,
-                                                                                       &left_nappinfos);
-       right_appinfos = find_appinfos_by_relids(root, right_relids,
-                                                                                        &right_nappinfos);
-
-       sjinfo->min_lefthand = adjust_child_relids(sjinfo->min_lefthand,
-                                                                                          left_nappinfos, left_appinfos);
-       sjinfo->min_righthand = adjust_child_relids(sjinfo->min_righthand,
-                                                                                               right_nappinfos,
-                                                                                               right_appinfos);
-       sjinfo->syn_lefthand = adjust_child_relids(sjinfo->syn_lefthand,
-                                                                                          left_nappinfos, left_appinfos);
-       sjinfo->syn_righthand = adjust_child_relids(sjinfo->syn_righthand,
-                                                                                               right_nappinfos,
-                                                                                               right_appinfos);
-       sjinfo->semi_rhs_exprs = (List *) adjust_appendrel_attrs(root,
-                                                                                                                        (Node *) sjinfo->semi_rhs_exprs,
-                                                                                                                        right_nappinfos,
-                                                                                                                        right_appinfos);
-
-       pfree(left_appinfos);
-       pfree(right_appinfos);
-
-       return sjinfo;
-}
-
 /*
  * find_appinfos_by_relids
  *             Find AppendRelInfo structures for all relations specified by relids.
index 350e6afe2708383b10f5f9d94edbc2bfa217f358..db474acbc55796d2196669db56b52cc389a9001e 100644 (file)
@@ -15,6 +15,7 @@
 #include "postgres.h"
 
 #include "access/heapam.h"
+#include "access/sysattr.h"
 #include "catalog/partition.h"
 #include "catalog/pg_inherits.h"
 #include "miscadmin.h"
@@ -38,6 +39,8 @@ static void expand_single_inheritance_child(PlannerInfo *root,
                                                                PlanRowMark *top_parentrc, Relation childrel,
                                                                List **appinfos, RangeTblEntry **childrte_p,
                                                                Index *childRTindex_p);
+static Bitmapset *translate_col_privs(const Bitmapset *parent_privs,
+                                       List *translated_vars);
 
 
 /*
@@ -437,3 +440,55 @@ expand_single_inheritance_child(PlannerInfo *root, RangeTblEntry *parentrte,
                root->rowMarks = lappend(root->rowMarks, childrc);
        }
 }
+
+/*
+ * translate_col_privs
+ *       Translate a bitmapset representing per-column privileges from the
+ *       parent rel's attribute numbering to the child's.
+ *
+ * The only surprise here is that we don't translate a parent whole-row
+ * reference into a child whole-row reference.  That would mean requiring
+ * permissions on all child columns, which is overly strict, since the
+ * query is really only going to reference the inherited columns.  Instead
+ * we set the per-column bits for all inherited columns.
+ */
+static Bitmapset *
+translate_col_privs(const Bitmapset *parent_privs,
+                                       List *translated_vars)
+{
+       Bitmapset  *child_privs = NULL;
+       bool            whole_row;
+       int                     attno;
+       ListCell   *lc;
+
+       /* System attributes have the same numbers in all tables */
+       for (attno = FirstLowInvalidHeapAttributeNumber + 1; attno < 0; attno++)
+       {
+               if (bms_is_member(attno - FirstLowInvalidHeapAttributeNumber,
+                                                 parent_privs))
+                       child_privs = bms_add_member(child_privs,
+                                                                                attno - FirstLowInvalidHeapAttributeNumber);
+       }
+
+       /* Check if parent has whole-row reference */
+       whole_row = bms_is_member(InvalidAttrNumber - FirstLowInvalidHeapAttributeNumber,
+                                                         parent_privs);
+
+       /* And now translate the regular user attributes, using the vars list */
+       attno = InvalidAttrNumber;
+       foreach(lc, translated_vars)
+       {
+               Var                *var = lfirst_node(Var, lc);
+
+               attno++;
+               if (var == NULL)                /* ignore dropped columns */
+                       continue;
+               if (whole_row ||
+                       bms_is_member(attno - FirstLowInvalidHeapAttributeNumber,
+                                                 parent_privs))
+                       child_privs = bms_add_member(child_privs,
+                                                                                var->varattno - FirstLowInvalidHeapAttributeNumber);
+       }
+
+       return child_privs;
+}
index 16705da78065fd123f2ae2eeb6e43185c75aa16a..604e36d73cbe00bc437301f22ef737ca84ee64d8 100644 (file)
 extern AppendRelInfo *make_append_rel_info(Relation parentrel,
                                         Relation childrel,
                                         Index parentRTindex, Index childRTindex);
-extern Bitmapset *translate_col_privs(const Bitmapset *parent_privs,
-                                       List *translated_vars);
 extern Node *adjust_appendrel_attrs(PlannerInfo *root, Node *node,
                                           int nappinfos, AppendRelInfo **appinfos);
-
 extern Node *adjust_appendrel_attrs_multilevel(PlannerInfo *root, Node *node,
                                                                  Relids child_relids,
                                                                  Relids top_parent_relids);
-
-extern AppendRelInfo **find_appinfos_by_relids(PlannerInfo *root,
-                                               Relids relids, int *nappinfos);
-
-extern SpecialJoinInfo *build_child_join_sjinfo(PlannerInfo *root,
-                                               SpecialJoinInfo *parent_sjinfo,
-                                               Relids left_relids, Relids right_relids);
+extern Relids adjust_child_relids(Relids relids, int nappinfos,
+                                       AppendRelInfo **appinfos);
 extern Relids adjust_child_relids_multilevel(PlannerInfo *root, Relids relids,
                                                           Relids child_relids, Relids top_parent_relids);
+extern AppendRelInfo **find_appinfos_by_relids(PlannerInfo *root,
+                                               Relids relids, int *nappinfos);
 
 #endif                                                 /* APPENDINFO_H */