mirror of
https://github.com/postgres/postgres.git
synced 2025-05-03 22:24:49 +03:00
Use functional dependencies to estimate ScalarArrayOpExpr
Until now functional dependencies supported only simple equality clauses and clauses that can be trivially translated to equalities. This commit allows estimation of some ScalarArrayOpExpr (IN/ANY) clauses. For IN clauses we can do this thanks to using operator with equality semantics, which means an IN clause WHERE c IN (1, 2, ..., N) can be translated to WHERE (c = 1 OR c = 2 OR ... OR c = N) IN clauses are now considered compatible with functional dependencies, and rely on the same assumption of consistency of queries with data (which is an assumption we already used for simple equality clauses). This applies also to ALL clauses with an equality operator, which can be considered equivalent to IN clause. ALL clauses are still considered incompatible, although there's some discussion about maybe relaxing this in the future. Author: Pierre Ducroquet Reviewed-by: Tomas Vondra, Dean Rasheed Discussion: https://www.postgresql.org/message-id/flat/13902317.Eha0YfKkKy%40pierred-pdoc
This commit is contained in:
parent
dbf95c843a
commit
8f321bd16c
doc/src/sgml
src
@ -1203,7 +1203,8 @@ SELECT stxname, stxkeys, stxddependencies
|
||||
|
||||
<para>
|
||||
Functional dependencies are currently only applied when considering
|
||||
simple equality conditions that compare columns to constant values.
|
||||
simple equality conditions that compare columns to constant values,
|
||||
and <literal>IN</literal> clauses with constant values.
|
||||
They are not used to improve estimates for equality conditions
|
||||
comparing two columns or comparing a column to an expression, nor for
|
||||
range clauses, <literal>LIKE</literal> or any other type of condition.
|
||||
|
@ -801,6 +801,44 @@ dependency_is_compatible_clause(Node *clause, Index relid, AttrNumber *attnum)
|
||||
|
||||
/* OK to proceed with checking "var" */
|
||||
}
|
||||
else if (IsA(rinfo->clause, ScalarArrayOpExpr))
|
||||
{
|
||||
/* If it's an scalar array operator, check for Var IN Const. */
|
||||
ScalarArrayOpExpr *expr = (ScalarArrayOpExpr *) rinfo->clause;
|
||||
|
||||
/*
|
||||
* Reject ALL() variant, we only care about ANY/IN.
|
||||
*
|
||||
* FIXME Maybe we should check if all the values are the same, and
|
||||
* allow ALL in that case? Doesn't seem very practical, though.
|
||||
*/
|
||||
if (!expr->useOr)
|
||||
return false;
|
||||
|
||||
/* Only expressions with two arguments are candidates. */
|
||||
if (list_length(expr->args) != 2)
|
||||
return false;
|
||||
|
||||
/*
|
||||
* We know it's always (Var IN Const), so we assume the var is the
|
||||
* first argument, and pseudoconstant is the second one.
|
||||
*/
|
||||
if (!is_pseudo_constant_clause(lsecond(expr->args)))
|
||||
return false;
|
||||
|
||||
var = linitial(expr->args);
|
||||
|
||||
/*
|
||||
* If it's not an "=" operator, just ignore the clause, as it's not
|
||||
* compatible with functional dependencies. The operator is identified
|
||||
* simply by looking at which function it uses to estimate selectivity.
|
||||
* That's a bit strange, but it's what other similar places do.
|
||||
*/
|
||||
if (get_oprrest(expr->opno) != F_EQSEL)
|
||||
return false;
|
||||
|
||||
/* OK to proceed with checking "var" */
|
||||
}
|
||||
else if (is_notclause(rinfo->clause))
|
||||
{
|
||||
/*
|
||||
|
@ -421,6 +421,118 @@ SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE
|
||||
1 | 50
|
||||
(1 row)
|
||||
|
||||
-- IN
|
||||
SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a IN (1, 51) AND b = ''1''');
|
||||
estimated | actual
|
||||
-----------+--------
|
||||
2 | 100
|
||||
(1 row)
|
||||
|
||||
SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a IN (1, 51) AND b IN (''1'', ''2'')');
|
||||
estimated | actual
|
||||
-----------+--------
|
||||
4 | 100
|
||||
(1 row)
|
||||
|
||||
SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a IN (1, 2, 51, 52) AND b IN (''1'', ''2'')');
|
||||
estimated | actual
|
||||
-----------+--------
|
||||
8 | 200
|
||||
(1 row)
|
||||
|
||||
SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a IN (1, 26, 51, 76) AND b IN (''1'', ''26'') AND c = 1');
|
||||
estimated | actual
|
||||
-----------+--------
|
||||
1 | 200
|
||||
(1 row)
|
||||
|
||||
SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a IN (1, 26, 51, 76) AND b IN (''1'', ''26'') AND c IN (1)');
|
||||
estimated | actual
|
||||
-----------+--------
|
||||
1 | 200
|
||||
(1 row)
|
||||
|
||||
SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a IN (1, 2, 26, 27, 51, 52, 76, 77) AND b IN (''1'', ''2'', ''26'', ''27'') AND c IN (1, 2)');
|
||||
estimated | actual
|
||||
-----------+--------
|
||||
3 | 400
|
||||
(1 row)
|
||||
|
||||
-- ANY
|
||||
SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a = ANY (ARRAY[1, 51]) AND b = ''1''');
|
||||
estimated | actual
|
||||
-----------+--------
|
||||
2 | 100
|
||||
(1 row)
|
||||
|
||||
SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a = ANY (ARRAY[1, 51]) AND b = ANY (ARRAY[''1'', ''2''])');
|
||||
estimated | actual
|
||||
-----------+--------
|
||||
4 | 100
|
||||
(1 row)
|
||||
|
||||
SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a = ANY (ARRAY[1, 2, 51, 52]) AND b = ANY (ARRAY[''1'', ''2''])');
|
||||
estimated | actual
|
||||
-----------+--------
|
||||
8 | 200
|
||||
(1 row)
|
||||
|
||||
SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a = ANY (ARRAY[1, 26, 51, 76]) AND b = ANY (ARRAY[''1'', ''26'']) AND c = 1');
|
||||
estimated | actual
|
||||
-----------+--------
|
||||
1 | 200
|
||||
(1 row)
|
||||
|
||||
SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a = ANY (ARRAY[1, 26, 51, 76]) AND b = ANY (ARRAY[''1'', ''26'']) AND c = ANY (ARRAY[1])');
|
||||
estimated | actual
|
||||
-----------+--------
|
||||
1 | 200
|
||||
(1 row)
|
||||
|
||||
SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a = ANY (ARRAY[1, 2, 26, 27, 51, 52, 76, 77]) AND b = ANY (ARRAY[''1'', ''2'', ''26'', ''27'']) AND c = ANY (ARRAY[1, 2])');
|
||||
estimated | actual
|
||||
-----------+--------
|
||||
3 | 400
|
||||
(1 row)
|
||||
|
||||
-- ANY with inequalities should not benefit from functional dependencies
|
||||
SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a < ANY (ARRAY[1, 51]) AND b > ''1''');
|
||||
estimated | actual
|
||||
-----------+--------
|
||||
2472 | 2400
|
||||
(1 row)
|
||||
|
||||
SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a >= ANY (ARRAY[1, 51]) AND b <= ANY (ARRAY[''1'', ''2''])');
|
||||
estimated | actual
|
||||
-----------+--------
|
||||
1441 | 1250
|
||||
(1 row)
|
||||
|
||||
SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a <= ANY (ARRAY[1, 2, 51, 52]) AND b >= ANY (ARRAY[''1'', ''2''])');
|
||||
estimated | actual
|
||||
-----------+--------
|
||||
3909 | 2550
|
||||
(1 row)
|
||||
|
||||
-- ALL (should not benefit from functional dependencies)
|
||||
SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a IN (1, 51) AND b = ALL (ARRAY[''1''])');
|
||||
estimated | actual
|
||||
-----------+--------
|
||||
2 | 100
|
||||
(1 row)
|
||||
|
||||
SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a IN (1, 51) AND b = ALL (ARRAY[''1'', ''2''])');
|
||||
estimated | actual
|
||||
-----------+--------
|
||||
1 | 0
|
||||
(1 row)
|
||||
|
||||
SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a IN (1, 2, 51, 52) AND b = ALL (ARRAY[''1'', ''2''])');
|
||||
estimated | actual
|
||||
-----------+--------
|
||||
1 | 0
|
||||
(1 row)
|
||||
|
||||
-- create statistics
|
||||
CREATE STATISTICS func_deps_stat (dependencies) ON a, b, c FROM functional_dependencies;
|
||||
ANALYZE functional_dependencies;
|
||||
@ -436,6 +548,118 @@ SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE
|
||||
50 | 50
|
||||
(1 row)
|
||||
|
||||
-- IN
|
||||
SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a IN (1, 51) AND b = ''1''');
|
||||
estimated | actual
|
||||
-----------+--------
|
||||
100 | 100
|
||||
(1 row)
|
||||
|
||||
SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a IN (1, 51) AND b IN (''1'', ''2'')');
|
||||
estimated | actual
|
||||
-----------+--------
|
||||
100 | 100
|
||||
(1 row)
|
||||
|
||||
SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a IN (1, 2, 51, 52) AND b IN (''1'', ''2'')');
|
||||
estimated | actual
|
||||
-----------+--------
|
||||
200 | 200
|
||||
(1 row)
|
||||
|
||||
SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a IN (1, 26, 51, 76) AND b IN (''1'', ''26'') AND c = 1');
|
||||
estimated | actual
|
||||
-----------+--------
|
||||
200 | 200
|
||||
(1 row)
|
||||
|
||||
SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a IN (1, 26, 51, 76) AND b IN (''1'', ''26'') AND c IN (1)');
|
||||
estimated | actual
|
||||
-----------+--------
|
||||
200 | 200
|
||||
(1 row)
|
||||
|
||||
SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a IN (1, 2, 26, 27, 51, 52, 76, 77) AND b IN (''1'', ''2'', ''26'', ''27'') AND c IN (1, 2)');
|
||||
estimated | actual
|
||||
-----------+--------
|
||||
400 | 400
|
||||
(1 row)
|
||||
|
||||
-- ANY
|
||||
SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a = ANY (ARRAY[1, 51]) AND b = ''1''');
|
||||
estimated | actual
|
||||
-----------+--------
|
||||
100 | 100
|
||||
(1 row)
|
||||
|
||||
SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a = ANY (ARRAY[1, 51]) AND b = ANY (ARRAY[''1'', ''2''])');
|
||||
estimated | actual
|
||||
-----------+--------
|
||||
100 | 100
|
||||
(1 row)
|
||||
|
||||
SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a = ANY (ARRAY[1, 2, 51, 52]) AND b = ANY (ARRAY[''1'', ''2''])');
|
||||
estimated | actual
|
||||
-----------+--------
|
||||
200 | 200
|
||||
(1 row)
|
||||
|
||||
SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a = ANY (ARRAY[1, 26, 51, 76]) AND b = ANY (ARRAY[''1'', ''26'']) AND c = 1');
|
||||
estimated | actual
|
||||
-----------+--------
|
||||
200 | 200
|
||||
(1 row)
|
||||
|
||||
SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a = ANY (ARRAY[1, 26, 51, 76]) AND b = ANY (ARRAY[''1'', ''26'']) AND c = ANY (ARRAY[1])');
|
||||
estimated | actual
|
||||
-----------+--------
|
||||
200 | 200
|
||||
(1 row)
|
||||
|
||||
SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a = ANY (ARRAY[1, 2, 26, 27, 51, 52, 76, 77]) AND b = ANY (ARRAY[''1'', ''2'', ''26'', ''27'']) AND c = ANY (ARRAY[1, 2])');
|
||||
estimated | actual
|
||||
-----------+--------
|
||||
400 | 400
|
||||
(1 row)
|
||||
|
||||
-- ANY with inequalities should not benefit from functional dependencies
|
||||
SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a < ANY (ARRAY[1, 51]) AND b > ''1''');
|
||||
estimated | actual
|
||||
-----------+--------
|
||||
2472 | 2400
|
||||
(1 row)
|
||||
|
||||
SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a >= ANY (ARRAY[1, 51]) AND b <= ANY (ARRAY[''1'', ''2''])');
|
||||
estimated | actual
|
||||
-----------+--------
|
||||
1441 | 1250
|
||||
(1 row)
|
||||
|
||||
SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a <= ANY (ARRAY[1, 2, 51, 52]) AND b >= ANY (ARRAY[''1'', ''2''])');
|
||||
estimated | actual
|
||||
-----------+--------
|
||||
3909 | 2550
|
||||
(1 row)
|
||||
|
||||
-- ALL (should not benefit from functional dependencies)
|
||||
SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a IN (1, 51) AND b = ALL (ARRAY[''1''])');
|
||||
estimated | actual
|
||||
-----------+--------
|
||||
2 | 100
|
||||
(1 row)
|
||||
|
||||
SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a IN (1, 51) AND b = ALL (ARRAY[''1'', ''2''])');
|
||||
estimated | actual
|
||||
-----------+--------
|
||||
1 | 0
|
||||
(1 row)
|
||||
|
||||
SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a IN (1, 2, 51, 52) AND b = ALL (ARRAY[''1'', ''2''])');
|
||||
estimated | actual
|
||||
-----------+--------
|
||||
1 | 0
|
||||
(1 row)
|
||||
|
||||
-- check change of column type doesn't break it
|
||||
ALTER TABLE functional_dependencies ALTER COLUMN c TYPE numeric;
|
||||
SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a = 1 AND b = ''1'' AND c = 1');
|
||||
|
@ -273,6 +273,46 @@ SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE
|
||||
|
||||
SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a = 1 AND b = ''1'' AND c = 1');
|
||||
|
||||
-- IN
|
||||
SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a IN (1, 51) AND b = ''1''');
|
||||
|
||||
SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a IN (1, 51) AND b IN (''1'', ''2'')');
|
||||
|
||||
SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a IN (1, 2, 51, 52) AND b IN (''1'', ''2'')');
|
||||
|
||||
SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a IN (1, 26, 51, 76) AND b IN (''1'', ''26'') AND c = 1');
|
||||
|
||||
SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a IN (1, 26, 51, 76) AND b IN (''1'', ''26'') AND c IN (1)');
|
||||
|
||||
SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a IN (1, 2, 26, 27, 51, 52, 76, 77) AND b IN (''1'', ''2'', ''26'', ''27'') AND c IN (1, 2)');
|
||||
|
||||
-- ANY
|
||||
SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a = ANY (ARRAY[1, 51]) AND b = ''1''');
|
||||
|
||||
SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a = ANY (ARRAY[1, 51]) AND b = ANY (ARRAY[''1'', ''2''])');
|
||||
|
||||
SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a = ANY (ARRAY[1, 2, 51, 52]) AND b = ANY (ARRAY[''1'', ''2''])');
|
||||
|
||||
SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a = ANY (ARRAY[1, 26, 51, 76]) AND b = ANY (ARRAY[''1'', ''26'']) AND c = 1');
|
||||
|
||||
SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a = ANY (ARRAY[1, 26, 51, 76]) AND b = ANY (ARRAY[''1'', ''26'']) AND c = ANY (ARRAY[1])');
|
||||
|
||||
SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a = ANY (ARRAY[1, 2, 26, 27, 51, 52, 76, 77]) AND b = ANY (ARRAY[''1'', ''2'', ''26'', ''27'']) AND c = ANY (ARRAY[1, 2])');
|
||||
|
||||
-- ANY with inequalities should not benefit from functional dependencies
|
||||
SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a < ANY (ARRAY[1, 51]) AND b > ''1''');
|
||||
|
||||
SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a >= ANY (ARRAY[1, 51]) AND b <= ANY (ARRAY[''1'', ''2''])');
|
||||
|
||||
SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a <= ANY (ARRAY[1, 2, 51, 52]) AND b >= ANY (ARRAY[''1'', ''2''])');
|
||||
|
||||
-- ALL (should not benefit from functional dependencies)
|
||||
SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a IN (1, 51) AND b = ALL (ARRAY[''1''])');
|
||||
|
||||
SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a IN (1, 51) AND b = ALL (ARRAY[''1'', ''2''])');
|
||||
|
||||
SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a IN (1, 2, 51, 52) AND b = ALL (ARRAY[''1'', ''2''])');
|
||||
|
||||
-- create statistics
|
||||
CREATE STATISTICS func_deps_stat (dependencies) ON a, b, c FROM functional_dependencies;
|
||||
|
||||
@ -282,6 +322,46 @@ SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE
|
||||
|
||||
SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a = 1 AND b = ''1'' AND c = 1');
|
||||
|
||||
-- IN
|
||||
SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a IN (1, 51) AND b = ''1''');
|
||||
|
||||
SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a IN (1, 51) AND b IN (''1'', ''2'')');
|
||||
|
||||
SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a IN (1, 2, 51, 52) AND b IN (''1'', ''2'')');
|
||||
|
||||
SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a IN (1, 26, 51, 76) AND b IN (''1'', ''26'') AND c = 1');
|
||||
|
||||
SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a IN (1, 26, 51, 76) AND b IN (''1'', ''26'') AND c IN (1)');
|
||||
|
||||
SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a IN (1, 2, 26, 27, 51, 52, 76, 77) AND b IN (''1'', ''2'', ''26'', ''27'') AND c IN (1, 2)');
|
||||
|
||||
-- ANY
|
||||
SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a = ANY (ARRAY[1, 51]) AND b = ''1''');
|
||||
|
||||
SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a = ANY (ARRAY[1, 51]) AND b = ANY (ARRAY[''1'', ''2''])');
|
||||
|
||||
SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a = ANY (ARRAY[1, 2, 51, 52]) AND b = ANY (ARRAY[''1'', ''2''])');
|
||||
|
||||
SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a = ANY (ARRAY[1, 26, 51, 76]) AND b = ANY (ARRAY[''1'', ''26'']) AND c = 1');
|
||||
|
||||
SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a = ANY (ARRAY[1, 26, 51, 76]) AND b = ANY (ARRAY[''1'', ''26'']) AND c = ANY (ARRAY[1])');
|
||||
|
||||
SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a = ANY (ARRAY[1, 2, 26, 27, 51, 52, 76, 77]) AND b = ANY (ARRAY[''1'', ''2'', ''26'', ''27'']) AND c = ANY (ARRAY[1, 2])');
|
||||
|
||||
-- ANY with inequalities should not benefit from functional dependencies
|
||||
SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a < ANY (ARRAY[1, 51]) AND b > ''1''');
|
||||
|
||||
SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a >= ANY (ARRAY[1, 51]) AND b <= ANY (ARRAY[''1'', ''2''])');
|
||||
|
||||
SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a <= ANY (ARRAY[1, 2, 51, 52]) AND b >= ANY (ARRAY[''1'', ''2''])');
|
||||
|
||||
-- ALL (should not benefit from functional dependencies)
|
||||
SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a IN (1, 51) AND b = ALL (ARRAY[''1''])');
|
||||
|
||||
SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a IN (1, 51) AND b = ALL (ARRAY[''1'', ''2''])');
|
||||
|
||||
SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a IN (1, 2, 51, 52) AND b = ALL (ARRAY[''1'', ''2''])');
|
||||
|
||||
-- check change of column type doesn't break it
|
||||
ALTER TABLE functional_dependencies ALTER COLUMN c TYPE numeric;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user