]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
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);