mirror of
https://github.com/postgres/postgres.git
synced 2026-04-27 00:58:45 -04:00
Partially undo commit 94da73281.
On closer inspection, mcv.c isn't as broken for ScalarArrayOpExpr as I thought. The Var-on-right issue is real enough, but actually it does cope fine with a NULL array constant --- I was misled by an XXX comment suggesting it didn't. Undo that part of the code change, and replace the XXX comment with something less misleading.
This commit is contained in:
parent
c102d11067
commit
476f9d5330
2 changed files with 19 additions and 13 deletions
|
|
@ -1051,7 +1051,6 @@ statext_is_compatible_clause_internal(PlannerInfo *root, Node *clause,
|
|||
RangeTblEntry *rte = root->simple_rte_array[relid];
|
||||
ScalarArrayOpExpr *expr = (ScalarArrayOpExpr *) clause;
|
||||
Var *var;
|
||||
Const *cst;
|
||||
bool expronleft;
|
||||
|
||||
/* Only expressions with two arguments are considered compatible. */
|
||||
|
|
@ -1059,11 +1058,11 @@ statext_is_compatible_clause_internal(PlannerInfo *root, Node *clause,
|
|||
return false;
|
||||
|
||||
/* Check if the expression has the right shape (one Var, one Const) */
|
||||
if (!examine_clause_args(expr->args, &var, &cst, &expronleft))
|
||||
if (!examine_clause_args(expr->args, &var, NULL, &expronleft))
|
||||
return false;
|
||||
|
||||
/* We only support Var on left and non-null array constants */
|
||||
if (!expronleft || cst->constisnull)
|
||||
/* We only support Var on left, Const on right */
|
||||
if (!expronleft)
|
||||
return false;
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -1679,17 +1679,24 @@ mcv_get_match_bitmap(PlannerInfo *root, List *clauses,
|
|||
Datum *elem_values;
|
||||
bool *elem_nulls;
|
||||
|
||||
/* We expect Var on left and non-null constant on right */
|
||||
if (!varonleft || cst->constisnull)
|
||||
/* We expect Var on left */
|
||||
if (!varonleft)
|
||||
elog(ERROR, "incompatible clause");
|
||||
|
||||
arrayval = DatumGetArrayTypeP(cst->constvalue);
|
||||
get_typlenbyvalalign(ARR_ELEMTYPE(arrayval),
|
||||
&elmlen, &elmbyval, &elmalign);
|
||||
deconstruct_array(arrayval,
|
||||
ARR_ELEMTYPE(arrayval),
|
||||
elmlen, elmbyval, elmalign,
|
||||
&elem_values, &elem_nulls, &num_elems);
|
||||
/*
|
||||
* Deconstruct the array constant, unless it's NULL (we'll
|
||||
* cover that case below)
|
||||
*/
|
||||
if (!cst->constisnull)
|
||||
{
|
||||
arrayval = DatumGetArrayTypeP(cst->constvalue);
|
||||
get_typlenbyvalalign(ARR_ELEMTYPE(arrayval),
|
||||
&elmlen, &elmbyval, &elmalign);
|
||||
deconstruct_array(arrayval,
|
||||
ARR_ELEMTYPE(arrayval),
|
||||
elmlen, elmbyval, elmalign,
|
||||
&elem_values, &elem_nulls, &num_elems);
|
||||
}
|
||||
|
||||
/* match the attribute to a dimension of the statistic */
|
||||
idx = bms_member_index(keys, var->varattno);
|
||||
|
|
|
|||
Loading…
Reference in a new issue