Recognize some OR clauses as compatible with functional dependencies
authorTomas Vondra <[email protected]>
Wed, 18 Mar 2020 15:41:45 +0000 (16:41 +0100)
committerTomas Vondra <[email protected]>
Wed, 18 Mar 2020 15:41:49 +0000 (16:41 +0100)
commitccaa3569f58796868303629bc2d63ddddb599b38
tree39244c020cedc8983b4201bca064ee9e00cc5f4c
parentdbe0d9892c338a475c0e791a5e77cff798216d29
Recognize some OR clauses as compatible with functional dependencies

Since commit 8f321bd16c functional dependencies can handle IN clauses,
which however introduced a possible (and surprising) inconsistency,
because IN clauses may be expressed as an OR clause, which are still
considered incompatible. For example

  a IN (1, 2, 3)

may be rewritten as

  (a = 1 OR a = 2 OR a = 3)

The IN clause will work fine with functional dependencies, but the OR
clause will force the estimation to fall back to plain per-column
estimates, possibly introducing significant estimation errors.

This commit recognizes OR clauses equivalent to an IN clause (when all
arugments are compatible and reference the same attribute) as a special
case, compatible with functional dependencies. This allows applying
functional dependencies, just like for IN clauses.

This does not eliminate the difference in estimating the clause itself,
i.e. IN clause and OR clause still use different formulas. It would be
possible to change that (for these special OR clauses), but that's not
really about extended statistics - it was always like this. Moreover the
errors are usually much smaller compared to ignoring dependencies.

Author: Tomas Vondra
Reviewed-by: Dean Rasheed
Discussion: https://www.postgresql.org/message-id/flat/13902317.Eha0YfKkKy%40pierred-pdoc
src/backend/statistics/dependencies.c
src/test/regress/expected/stats_ext.out
src/test/regress/sql/stats_ext.sql