Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Fix EXPLAIN of SEARCH BREADTH FIRST queries some more.
authorTom Lane <tgl@sss.pgh.pa.us>
Mon, 11 Oct 2021 15:56:52 +0000 (11:56 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Mon, 11 Oct 2021 15:56:52 +0000 (11:56 -0400)
Commit 3f50b8263 had an oversight: formerly, to deparse expressions
attached to a plan node, it was only necessary to update the
deparse_namespace ancestors list alongside calling set_deparse_plan.
Now it's necessary to update the ancestors list *first*, because
set_deparse_plan consults it, and one call site got that wrong.

This error was masked in most cases because explain.c uses just one
List object for the ancestors list, updating it in-place as the plan
is scanned, so that we accidentally had the right List assigned to
dpns->ancestors before it was needed.  It would fail only if a
WorkTableScan node were the first one that we tried to deparse a
subexpression of.

Per report from Markus Winand.  Like the previous patch,
back-patch to v14.

Discussion: https://postgr.es/m/648B0505-AA57-42C2-A2DA-E551DE46FA15@winand.at

src/backend/utils/adt/ruleutils.c

index 871f3edc92380081f803ffa6fa423e597cb55275..589c8ed87cde2d2eb0c5443138c885a54a28b1d4 100644 (file)
@@ -3681,8 +3681,8 @@ set_deparse_context_plan(List *dpcontext, Plan *plan, List *ancestors)
    dpns = (deparse_namespace *) linitial(dpcontext);
 
    /* Set our attention on the specific plan node passed in */
-   set_deparse_plan(dpns, plan);
    dpns->ancestors = ancestors;
+   set_deparse_plan(dpns, plan);
 
    return dpcontext;
 }
@@ -4836,7 +4836,7 @@ get_rtable_name(int rtindex, deparse_context *context)
  * of a given Plan node
  *
  * This sets the plan, outer_plan, inner_plan, outer_tlist, inner_tlist,
- * and index_tlist fields.  Caller is responsible for adjusting the ancestors
+ * and index_tlist fields.  Caller must already have adjusted the ancestors
  * list if necessary.  Note that the rtable, subplans, and ctes fields do
  * not need to change when shifting attention to different plan nodes in a
  * single plan tree.