pgsql: Fix handling of NULLs in MCV items and constants

From: Tomas Vondra <tomas(dot)vondra(at)postgresql(dot)org>
To: pgsql-committers(at)lists(dot)postgresql(dot)org
Subject: pgsql: Fix handling of NULLs in MCV items and constants
Date: 2019-07-18 09:30:28
Message-ID: E1ho2k8-0004Fd-DI@gemulon.postgresql.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-committers

Fix handling of NULLs in MCV items and constants

There were two issues in how the extended statistics handled NULL values
in opclauses. Firstly, the code was oblivious to the possibility that
Const may be NULL (constisnull=true) in which case the constvalue is
undefined. We need to treat this as a mismatch, and not call the proc.

Secondly, the MCV item itself may contain NULL values too - the code
already did check that, and updated the match bitmap accordingly, but
failed to ensure we won't call the operator procedure anyway. It did
work for AND-clauses, because in that case false in the bitmap stops
evaluation of further clauses. But for OR-clauses ir was not easy to
get incorrect estimates or even trigger a crash.

This fixes both issues by extending the existing check so that it looks
at constisnull too, and making sure it skips calling the procedure.

Discussion: https://postgr.es/m/8736jdhbhc.fsf%40ansel.ydns.eu

Branch
------
REL_12_STABLE

Details
-------
https://git.postgresql.org/pg/commitdiff/1c2acc32dc6cb15c6ea038a954af9a4db8d01f08

Modified Files
--------------
src/backend/statistics/mcv.c | 16 +++++++++++-----
src/test/regress/expected/stats_ext.out | 26 ++++++++++++++++++++++++++
src/test/regress/sql/stats_ext.sql | 23 +++++++++++++++++++++++
3 files changed, 60 insertions(+), 5 deletions(-)

Browse pgsql-committers by date

  From Date Subject
Next Message Tom Lane 2019-07-18 14:37:20 pgsql: Further adjust SPITupleTable to provide a public row-count field
Previous Message Tomas Vondra 2019-07-18 09:30:00 pgsql: Fix handling of NULLs in MCV items and constants