From: Robert Haas Date: Thu, 22 May 2025 19:33:53 +0000 (-0400) Subject: fix a few bugs X-Git-Url: http://git.postgresql.org/gitweb/static/gitweb.js?a=commitdiff_plain;h=4c523f8695493e86253c4764742516471af4313c;p=users%2Frhaas%2Fpostgres.git fix a few bugs --- diff --git a/contrib/pg_plan_advice/pgpa_join.c b/contrib/pg_plan_advice/pgpa_join.c index ce136853f3..8bb6a2987d 100644 --- a/contrib/pg_plan_advice/pgpa_join.c +++ b/contrib/pg_plan_advice/pgpa_join.c @@ -18,6 +18,7 @@ struct pgpa_join_unroller 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); @@ -181,6 +182,8 @@ pgpa_build_unrolled_join(PlannedStmt *pstmt, /* 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); @@ -206,9 +209,11 @@ pgpa_build_unrolled_join(PlannedStmt *pstmt, 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? */ } @@ -287,6 +292,32 @@ pgpa_decompose_join(Plan *plan, Plan **realinner, Plan **realouter) 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) { diff --git a/contrib/pg_plan_advice/pgpa_walker.c b/contrib/pg_plan_advice/pgpa_walker.c index 4d2e3a95bd..349af23dfb 100644 --- a/contrib/pg_plan_advice/pgpa_walker.c +++ b/contrib/pg_plan_advice/pgpa_walker.c @@ -16,7 +16,7 @@ pgpa_plan_walker(pgpa_plan_walker_context *context, Plan *plan, 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;