fix a few bugs
authorRobert Haas <rhaas@postgresql.org>
Thu, 22 May 2025 19:33:53 +0000 (15:33 -0400)
committerRobert Haas <rhaas@postgresql.org>
Thu, 22 May 2025 19:33:53 +0000 (15:33 -0400)
contrib/pg_plan_advice/pgpa_join.c
contrib/pg_plan_advice/pgpa_walker.c

index ce136853f327d837109165943e4d25764915269e..8bb6a2987d9ccd730fae199aa526d2656e508885 100644 (file)
@@ -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)
 {
index 4d2e3a95bd301c7c324b175229eea8576f229da9..349af23dfbc94508b53e303d9565b864e751cc70 100644 (file)
@@ -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;