From: Robert Haas Date: Thu, 29 Jan 2026 13:04:23 +0000 (-0500) Subject: Fix mistakes in commit 4020b370f214315b8c10430301898ac21658143f X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=71c1136989b363004357efb54c87b4192749a6a0;p=thirdparty%2Fpostgresql.git Fix mistakes in commit 4020b370f214315b8c10430301898ac21658143f cost_tidrangescan() was setting the disabled_nodes value correctly, and then immediately resetting it to zero, due to poor code editing on my part. materialized_finished_plan correctly set matpath.parent to zero, but forgot to also set matpath.parallel_workers = 0, causing an access to uninitialized memory in cost_material. (This shouldn't result in any real problem, but it makes valgrind unhappy.) reparameterize_path was dereferencing a variable before verifying that it was not NULL. Reported-by: Tom Lane (issue #1) Reported-by: Michael Paquier (issue #1) Diagnosed-by: Lukas Fittl (issue #1) Reported-by: Zsolt Parragi (issue #2) Reported-by: Richard Guo (issue #3) Discussion: http://postgr.es/m/CAN4CZFPvwjNJEZ_JT9Y67yR7C=KMNa=LNefOB8ZY7TKDcmAXOA@mail.gmail.com Discussion: http://postgr.es/m/aXrnPgrq6Gggb5TG@paquier.xyz --- diff --git a/src/backend/optimizer/path/costsize.c b/src/backend/optimizer/path/costsize.c index 4da0b17f137..c30d6e84672 100644 --- a/src/backend/optimizer/path/costsize.c +++ b/src/backend/optimizer/path/costsize.c @@ -1461,7 +1461,6 @@ cost_tidrangescan(Path *path, PlannerInfo *root, enable_mask |= PGS_CONSIDER_NONPARTIAL; path->disabled_nodes = (baserel->pgs_mask & enable_mask) != enable_mask ? 1 : 0; - path->disabled_nodes = 0; path->startup_cost = startup_cost; path->total_cost = startup_cost + cpu_run_cost + disk_run_cost; } diff --git a/src/backend/optimizer/plan/createplan.c b/src/backend/optimizer/plan/createplan.c index c26e841f537..e5200f4b3ce 100644 --- a/src/backend/optimizer/plan/createplan.c +++ b/src/backend/optimizer/plan/createplan.c @@ -6526,8 +6526,11 @@ materialize_finished_plan(Plan *subplan) subplan->startup_cost -= initplan_cost; subplan->total_cost -= initplan_cost; - /* Set cost data */ + /* Clear fields that cost_material() will consult */ + matpath.parallel_workers = 0; matpath.parent = NULL; + + /* Set cost data */ cost_material(&matpath, enable_material, subplan->disabled_nodes, diff --git a/src/backend/optimizer/util/pathnode.c b/src/backend/optimizer/util/pathnode.c index 7295438ad20..7b6c5d51e5d 100644 --- a/src/backend/optimizer/util/pathnode.c +++ b/src/backend/optimizer/util/pathnode.c @@ -3971,10 +3971,10 @@ reparameterize_path(PlannerInfo *root, Path *path, spath = reparameterize_path(root, spath, required_outer, loop_count); - enabled = - (mpath->path.disabled_nodes <= spath->disabled_nodes); if (spath == NULL) return NULL; + enabled = + (mpath->path.disabled_nodes <= spath->disabled_nodes); return (Path *) create_material_path(rel, spath, enabled); } case T_Memoize: