/*-------------------------------------------------------------------------
*
* 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)
{
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
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
elog(ERROR, "unrecognized join type: %d", (int) sjinfo->jointype);
break;
}
-
- bms_free(joinrelids);
-
- return joinrel;
}