BUG #13464: Optimizer fails to use partial index on boolean when selected via "IS" operator.

Lists: pgsql-bugs
From: corey(dot)huinker(at)gmail(dot)com
To: pgsql-bugs(at)postgresql(dot)org
Subject: BUG #13464: Optimizer fails to use partial index on boolean when selected via "IS" operator.
Date: 2015-06-24 00:08:36
Message-ID: 20150624000836.3876.241@wrigleys.postgresql.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-bugs

The following bug has been logged on the website:

Bug reference: 13464
Logged by: Corey Huinker
Email address: corey(dot)huinker(at)gmail(dot)com
PostgreSQL version: 9.4.2
Operating system: Ubuntu 14.04
Description:

Correct index is used on "WHERE y" and "WHERE y = true" but not "WHERE y IS
TRUE".

[local]:ubuntu(at)test# create table sample_table(x integer not null, y boolean
default false not null);
CREATE TABLE
Time: 6.025 ms
[local]:ubuntu(at)test# insert into sample_table(x) select t.n from
generate_series(1,100000) as t(n);
INSERT 0 100000
Time: 143.815 ms
[local]:ubuntu(at)test# create index sample_table_i1 on sample_table(x);
CREATE INDEX
Time: 46.622 ms
[local]:ubuntu(at)test# create index sample_table_i2 on sample_table(x) where
y;
CREATE INDEX
Time: 16.076 ms
[local]:ubuntu(at)test# update sample_table set y = true where x % 100 = 0;
UPDATE 1000
Time: 47.548 ms
[local]:ubuntu(at)test# explain select * from sample_table where x < 10000 and
y = true;
QUERY PLAN

------------------------------------------------------------------------------------
Index Scan using sample_table_i2 on sample_table (cost=0.28..1.29 rows=1
width=5)
Index Cond: (x < 10000)
(2 rows)

Time: 1.321 ms
[local]:ubuntu(at)test# explain select * from sample_table where x < 10000 and
y is true;
QUERY PLAN

--------------------------------------------------------------------------------------
Index Scan using sample_table_i1 on sample_table (cost=0.29..252.14 rows=1
width=5)
Index Cond: (x < 10000)
Filter: (y IS TRUE)
(3 rows)

Time: 0.369 ms
[local]:ubuntu(at)test# explain select * from sample_table where x < 10000 and
y;
QUERY PLAN

------------------------------------------------------------------------------------
Index Scan using sample_table_i2 on sample_table (cost=0.28..1.29 rows=1
width=5)
Index Cond: (x < 10000)
(2 rows)


From: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
To: corey(dot)huinker(at)gmail(dot)com
Cc: pgsql-bugs(at)postgresql(dot)org
Subject: Re: BUG #13464: Optimizer fails to use partial index on boolean when selected via "IS" operator.
Date: 2015-06-24 00:28:52
Message-ID: 17190.1435105732@sss.pgh.pa.us
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-bugs

corey(dot)huinker(at)gmail(dot)com writes:
> Correct index is used on "WHERE y" and "WHERE y = true" but not "WHERE y IS
> TRUE".

y IS TRUE is not actually equivalent to the other two conditions ...

regards, tom lane


From: Corey Huinker <corey(dot)huinker(at)gmail(dot)com>
To: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
Cc: pgsql-bugs(at)postgresql(dot)org
Subject: Re: BUG #13464: Optimizer fails to use partial index on boolean when selected via "IS" operator.
Date: 2015-06-24 01:27:05
Message-ID: CADkLM=dm8UBb+_5ujDWgq1TtxucMZiH_hDLRMRpbOCr9kGLesQ@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-bugs

Good to know. And yes, according to
http://www.postgresql.org/docs/9.4/static/functions-comparison.html IS TRUE
will never return null even if y is null.

I can't, however think of a case where the the partial index would lead to
an incorrect answer. Can you enlighten me?

On Tue, Jun 23, 2015 at 8:28 PM, Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us> wrote:

> corey(dot)huinker(at)gmail(dot)com writes:
> > Correct index is used on "WHERE y" and "WHERE y = true" but not "WHERE y
> IS
> > TRUE".
>
> y IS TRUE is not actually equivalent to the other two conditions ...
>
> regards, tom lane
>