This is an automated email from the ASF dual-hosted git repository.

reshke pushed a commit to branch REL_2_STABLE
in repository https://gitbox.apache.org/repos/asf/cloudberry.git

commit 0d3b0d87f5914184ff699fa9d5587b2eba2d07f2
Author: Tom Lane <[email protected]>
AuthorDate: Fri Aug 5 15:57:46 2022 -0400

    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.
---
 src/backend/statistics/extended_stats.c |  7 +++----
 src/backend/statistics/mcv.c            | 25 ++++++++++++++++---------
 2 files changed, 19 insertions(+), 13 deletions(-)

diff --git a/src/backend/statistics/extended_stats.c 
b/src/backend/statistics/extended_stats.c
index d91d80357ff..134a047f8df 100644
--- a/src/backend/statistics/extended_stats.c
+++ b/src/backend/statistics/extended_stats.c
@@ -1454,7 +1454,6 @@ statext_is_compatible_clause_internal(PlannerInfo *root, 
Node *clause,
                RangeTblEntry *rte = root->simple_rte_array[relid];
                ScalarArrayOpExpr *expr = (ScalarArrayOpExpr *) clause;
                Node       *clause_expr;
-               Const      *cst;
                bool            expronleft;
 
                /* Only expressions with two arguments are considered 
compatible. */
@@ -1462,11 +1461,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_opclause_args(expr->args, &clause_expr, &cst, 
&expronleft))
+               if (!examine_opclause_args(expr->args, &clause_expr, 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;
 
                /*
diff --git a/src/backend/statistics/mcv.c b/src/backend/statistics/mcv.c
index 50c65c3fdeb..01837758534 100644
--- a/src/backend/statistics/mcv.c
+++ b/src/backend/statistics/mcv.c
@@ -1740,17 +1740,24 @@ mcv_get_match_bitmap(PlannerInfo *root, List *clauses,
                        if (!examine_opclause_args(expr->args, &clause_expr, 
&cst, &expronleft))
                                elog(ERROR, "incompatible clause");
 
-                       /* We expect Var on left and non-null constant on right 
*/
-                       if (!expronleft || cst->constisnull)
+                       /* We expect Var on left */
+                       if (!expronleft)
                                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/expression to a dimension of the 
statistic */
                        idx = mcv_match_expression(clause_expr, keys, exprs, 
&collid);


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to