diff --git a/src/backend/optimizer/path/costsize.c b/src/backend/optimizer/path/costsize.c index ee23ed7835..52ebdd90fc 100644 --- a/src/backend/optimizer/path/costsize.c +++ b/src/backend/optimizer/path/costsize.c @@ -4635,6 +4635,9 @@ cost_rescan(PlannerInfo *root, Path *path, * preferred since it allows caching of the results.) * The result includes both a one-time (startup) component, * and a per-evaluation component. + * + * Note: in some code paths root can be passed as NULL, resulting in + * slightly worse estimates. */ void cost_qual_eval(QualCost *cost, List *quals, PlannerInfo *root) diff --git a/src/backend/utils/adt/selfuncs.c b/src/backend/utils/adt/selfuncs.c index 5f5d7959d8..f4b3e91baa 100644 --- a/src/backend/utils/adt/selfuncs.c +++ b/src/backend/utils/adt/selfuncs.c @@ -2131,6 +2131,9 @@ scalararraysel(PlannerInfo *root, * * Note: the result is integral, but we use "double" to avoid overflow * concerns. Most callers will use it in double-type expressions anyway. + * + * Note: in some code paths root can be passed as NULL, resulting in + * slightly worse estimates. */ double estimate_array_length(PlannerInfo *root, Node *arrayexpr) @@ -2154,7 +2157,7 @@ estimate_array_length(PlannerInfo *root, Node *arrayexpr) { return list_length(((ArrayExpr *) arrayexpr)->elements); } - else if (arrayexpr) + else if (arrayexpr && root) { /* See if we can find any statistics about it */ VariableStatData vardata;