Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 8bf66de

Browse files
committed
Fix confusion about havingQual vs hasHavingQual in planner.
Preprocessing of the HAVING clause will reduce havingQual to NIL if the clause is constant-TRUE. This is one case where that convention is rather unfortunate, because "HAVING TRUE" is not at all the same as not having any HAVING clause at all. (Per the SQL spec, it still forces the query to be grouped.) The planner deals with this by having a boolean hasHavingQual that records whether havingQual was originally nonempty; places that just want to check whether HAVING was specified are supposed to consult that. I found three places that got that wrong. Fortunately, these could only affect cost estimates not correctness. It'd be hard even to demonstrate the errors; for example, the one in allpaths.c would only matter in a query that has HAVING TRUE but no GROUP BY and no aggregates, which would require a completely variable-free SELECT list, making the case probably of only academic interest. Hence, while these are worth fixing before someone copies the incorrect coding somewhere more critical, they don't seem worth back-patching. I didn't bother trying to devise regression tests, either. Discussion: https://postgr.es/m/2503888.1666042643@sss.pgh.pa.us
1 parent 997cd15 commit 8bf66de

File tree

2 files changed

+3
-3
lines changed

2 files changed

+3
-3
lines changed

contrib/postgres_fdw/postgres_fdw.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -3357,7 +3357,7 @@ estimate_path_cost_size(PlannerInfo *root,
33573357
* Get the retrieved_rows and rows estimates. If there are HAVING
33583358
* quals, account for their selectivity.
33593359
*/
3360-
if (root->parse->havingQual)
3360+
if (root->hasHavingQual)
33613361
{
33623362
/* Factor in the selectivity of the remotely-checked quals */
33633363
retrieved_rows =
@@ -3405,7 +3405,7 @@ estimate_path_cost_size(PlannerInfo *root,
34053405
run_cost += cpu_tuple_cost * numGroups;
34063406

34073407
/* Account for the eval cost of HAVING quals, if any */
3408-
if (root->parse->havingQual)
3408+
if (root->hasHavingQual)
34093409
{
34103410
QualCost remote_cost;
34113411

src/backend/optimizer/path/allpaths.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -2575,7 +2575,7 @@ set_subquery_pathlist(PlannerInfo *root, RelOptInfo *rel,
25752575
if (parse->hasAggs ||
25762576
parse->groupClause ||
25772577
parse->groupingSets ||
2578-
parse->havingQual ||
2578+
root->hasHavingQual ||
25792579
parse->distinctClause ||
25802580
parse->sortClause ||
25812581
has_multiple_baserels(root))

0 commit comments

Comments
 (0)