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 */