aboutsummaryrefslogtreecommitdiff
path: root/src/backend/utils/adt/array_selfuncs.c
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2014-02-21 17:10:46 -0500
committerTom Lane <tgl@sss.pgh.pa.us>2014-02-21 17:10:46 -0500
commit77585bce03042e8fee62d8df0dde9c008a904699 (patch)
treea379fbf445a39b335d999714f46d794837cf634d /src/backend/utils/adt/array_selfuncs.c
parent0c5783ff301ae3e470000c918bfc2395129de4c5 (diff)
downloadpostgresql-77585bce03042e8fee62d8df0dde9c008a904699.tar.gz
postgresql-77585bce03042e8fee62d8df0dde9c008a904699.zip
Do ScalarArrayOp estimation correctly when array is a stable expression.
Most estimation functions apply estimate_expression_value to see if they can reduce an expression to a constant; the key difference is that it allows evaluation of stable as well as immutable functions in hopes of ending up with a simple Const node. scalararraysel didn't get the memo though, and neither did gincost_opexpr/gincost_scalararrayopexpr. Fix that, and remove a now-unnecessary estimate_expression_value step in the subsidiary function scalararraysel_containment. Per complaint from Alexey Klyukin. Back-patch to 9.3. The problem goes back further, but I'm hesitant to change estimation behavior in long-stable release branches.
Diffstat (limited to 'src/backend/utils/adt/array_selfuncs.c')
-rw-r--r--src/backend/utils/adt/array_selfuncs.c15
1 files changed, 8 insertions, 7 deletions
diff --git a/src/backend/utils/adt/array_selfuncs.c b/src/backend/utils/adt/array_selfuncs.c
index e35edf8ec84..20eb358a620 100644
--- a/src/backend/utils/adt/array_selfuncs.c
+++ b/src/backend/utils/adt/array_selfuncs.c
@@ -68,11 +68,13 @@ static int float_compare_desc(const void *key1, const void *key2);
* scalararraysel_containment
* Estimate selectivity of ScalarArrayOpExpr via array containment.
*
- * scalararraysel() has already verified that the operator of a
- * ScalarArrayOpExpr is the array element type's default equality or
- * inequality operator. If we have const =/<> ANY/ALL (array_var)
- * then we can estimate the selectivity as though this were an array
- * containment operator, array_var op ARRAY[const].
+ * If we have const =/<> ANY/ALL (array_var) then we can estimate the
+ * selectivity as though this were an array containment operator,
+ * array_var op ARRAY[const].
+ *
+ * scalararraysel() has already verified that the ScalarArrayOpExpr's operator
+ * is the array element type's default equality or inequality operator, and
+ * has aggressively simplified both inputs to constants.
*
* Returns selectivity (0..1), or -1 if we fail to estimate selectivity.
*/
@@ -99,9 +101,8 @@ scalararraysel_containment(PlannerInfo *root,
}
/*
- * Aggressively reduce leftop to a constant, if possible.
+ * leftop must be a constant, else punt.
*/
- leftop = estimate_expression_value(root, leftop);
if (!IsA(leftop, Const))
{
ReleaseVariableStats(vardata);