static pgpa_join_strategy pgpa_decompose_join(Plan *plan,
Plan **realinner,
Plan **realouter);
+static Index pgpa_scanrelid(Plan *plan);
static void pgpa_debug_out_join_member(StringInfo buf,
pgpa_join_member *member);
/* Allocate result structures. */
ujoin = palloc0_object(pgpa_unrolled_join);
ujoin->outer.plan = join_unroller->outer_subplan;
+ ujoin->outer.rti = pgpa_scanrelid(ujoin->outer.plan);
+ ujoin->ninner = join_unroller->nused;
ujoin->strategy = palloc0_array(pgpa_join_strategy, join_unroller->nused);
ujoin->inner = palloc0_array(pgpa_join_member, join_unroller->nused);
ujoin->inner[i].unrolled_join =
pgpa_build_unrolled_join(pstmt,
join_unroller->inner_unroller[k]);
+ else
+ ujoin->inner[i].rti = pgpa_scanrelid(ujoin->inner[i].plan);
/*
- * XXX. What about rti, clumped join, and elided node ?
+ * XXX. What about clumped join and elided node?
*/
}
return strategy;
}
+static Index
+pgpa_scanrelid(Plan *plan)
+{
+ switch (nodeTag(plan))
+ {
+ case T_SeqScan:
+ case T_SampleScan:
+ case T_BitmapHeapScan:
+ case T_TidScan:
+ case T_TidRangeScan:
+ case T_SubqueryScan:
+ case T_FunctionScan:
+ case T_TableFuncScan:
+ case T_ValuesScan:
+ case T_CteScan:
+ case T_WorkTableScan:
+ case T_ForeignScan:
+ case T_CustomScan:
+ case T_IndexScan:
+ case T_IndexOnlyScan:
+ return ((Scan *) plan)->scanrelid;
+ default:
+ return 0;
+ }
+}
+
void
pgpa_debug_out_clumped_join(StringInfo buf, pgpa_clumped_join *clump)
{
List *extraplans = NIL;
if (join_unroller == NULL &&
- pgpa_get_join_class(plan) == PGPA_CLUMPED_JOIN)
+ pgpa_get_join_class(plan) == PGPA_UNROLLED_JOIN)
{
join_unroller = pgpa_create_join_unroller();
join_unroller_toplevel = true;