OSDN Git Service

Change version to 1.3.0
[pghintplan/pg_hint_plan.git] / make_join_rel.c
index 75ca4ec..d57b6da 100644 (file)
@@ -1,21 +1,26 @@
 /*-------------------------------------------------------------------------
  *
  * make_join_rel.c
- *       Routines copied from PostgreSQL core distribution.
+ *       Routines copied from PostgreSQL core distribution with some
+ *       modifications.
  *
  * src/backend/optimizer/path/joinrels.c
  *     make_join_rel()
  *
- * Portions Copyright (c) 2013-2016, NIPPON TELEGRAPH AND TELEPHONE CORPORATION
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 2013-2017, NIPPON TELEGRAPH AND TELEPHONE CORPORATION
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  *-------------------------------------------------------------------------
  */
 
+static void populate_joinrel_with_paths(PlannerInfo *root, RelOptInfo *rel1,
+                                                                               RelOptInfo *rel2, RelOptInfo *joinrel,
+                                                                               SpecialJoinInfo *sjinfo,
+                                                                               List *restrictlist);
 /*
  * adjust_rows: tweak estimated row numbers according to the hint.
-*/
+ */
 static double
 adjust_rows(double rows, RowsHint *hint)
 {
@@ -127,9 +132,9 @@ make_join_rel(PlannerInfo *root, RelOptInfo *rel1, RelOptInfo *rel2)
                RowsHint   *domultiply = NULL;
 
                /* Search for applicable rows hint for this join node */
-               for (i = 0; i < current_hint->num_hints[HINT_TYPE_ROWS]; i++)
+               for (i = 0; i < current_hint_state->num_hints[HINT_TYPE_ROWS]; i++)
                {
-                       rows_hint = current_hint->rows_hints[i];
+                       rows_hint = current_hint_state->rows_hints[i];
 
                        /*
                         * Skip this rows_hint if it is invalid from the first or it
@@ -207,6 +212,27 @@ make_join_rel(PlannerInfo *root, RelOptInfo *rel1, RelOptInfo *rel2)
                return joinrel;
        }
 
+       /* Add paths to the join relation. */
+       populate_joinrel_with_paths(root, rel1, rel2, joinrel, sjinfo,
+                                                               restrictlist);
+
+       bms_free(joinrelids);
+
+       return joinrel;
+}
+
+/*
+ * populate_joinrel_with_paths
+ *       Add paths to the given joinrel for given pair of joining relations. The
+ *       SpecialJoinInfo provides details about the join and the restrictlist
+ *       contains the join clauses and the other clauses applicable for given pair
+ *       of the joining relations.
+ */
+static void
+populate_joinrel_with_paths(PlannerInfo *root, RelOptInfo *rel1,
+                                                       RelOptInfo *rel2, RelOptInfo *joinrel,
+                                                       SpecialJoinInfo *sjinfo, List *restrictlist)
+{
        /*
         * Consider paths using each rel as both outer and inner.  Depending on
         * the join type, a provably empty outer or inner rel might mean the join
@@ -351,8 +377,4 @@ make_join_rel(PlannerInfo *root, RelOptInfo *rel1, RelOptInfo *rel2)
                        elog(ERROR, "unrecognized join type: %d", (int) sjinfo->jointype);
                        break;
        }
-
-       bms_free(joinrelids);
-
-       return joinrel;
 }