1
0
mirror of https://github.com/postgres/postgres.git synced 2025-07-07 00:36:50 +03:00

Improve estimation of ANDs under ORs using extended statistics.

Formerly, extended statistics only handled clauses that were
RestrictInfos. However, the restrictinfo machinery doesn't create
sub-AND RestrictInfos for AND clauses underneath OR clauses.
Therefore teach extended statistics to handle bare AND clauses,
looking for compatible RestrictInfo clauses underneath them.

Dean Rasheed, reviewed by Tomas Vondra.

Discussion: https://postgr.es/m/CAEZATCW=J65GUFm50RcPv-iASnS2mTXQbr=CfBvWRVhFLJ_fWA@mail.gmail.com
This commit is contained in:
Dean Rasheed
2020-12-08 20:10:11 +00:00
parent 88b0898fe3
commit 4f5760d4af
3 changed files with 48 additions and 2 deletions

View File

@ -538,7 +538,28 @@ find_single_rel_for_clauses(PlannerInfo *root, List *clauses)
* However, currently the extended-stats machinery won't do anything
* with non-RestrictInfo clauses anyway, so there's no point in
* spending extra cycles; just fail if that's what we have.
*
* An exception to that rule is if we have a bare BoolExpr AND clause.
* We treat this as a special case because the restrictinfo machinery
* doesn't build RestrictInfos on top of AND clauses.
*/
if (is_andclause(rinfo))
{
RelOptInfo *rel;
rel = find_single_rel_for_clauses(root,
((BoolExpr *) rinfo)->args);
if (rel == NULL)
return NULL;
if (lastrelid == 0)
lastrelid = rel->relid;
else if (rel->relid != lastrelid)
return NULL;
continue;
}
if (!IsA(rinfo, RestrictInfo))
return NULL;