Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Partially undo commit 94da73281.
authorTom Lane <tgl@sss.pgh.pa.us>
Fri, 5 Aug 2022 19:57:46 +0000 (15:57 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Fri, 5 Aug 2022 19:57:46 +0000 (15:57 -0400)
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
src/backend/statistics/mcv.c

index 3c94e3c762634b20596e9902adaed52c6d38f973..18f6e6dd6d9c925a73478e099d6b068a5d7aef9f 100644 (file)
@@ -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;
 
        /*
index 9afd7e551fa93af9b5174ca4ff9ec584460ecd7b..2b3080ffe4c0bf4bff905bae376d79879c301803 100644 (file)
@@ -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);