BUG #7593: Unexpected query result combining or and in operators

From: demurcia(at)ockham-solutions(dot)fr
To: pgsql-bugs(at)postgresql(dot)org
Subject: BUG #7593: Unexpected query result combining or and in operators
Date: 2012-10-10 15:54:26
Message-ID: E1TLyc6-000827-0i@wrigleys.postgresql.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-bugs

The following bug has been logged on the website:

Bug reference: 7593
Logged by: DE MURCIA Julien
Email address: demurcia(at)ockham-solutions(dot)fr
PostgreSQL version: 9.2.1
Operating system: Windows 7
Description:

Hello,

I am trying to run this query:

select n.numero_id, h.service_id, h.groupe_id
from identite i, numero n, habilitation h
where
(h.service_id=100 or h.groupe_id=50)
and n.numero_id in (25393, 25384)
and i.procedure_id=h.procedure_id
and i.numero_id=n.numero_id;

At first I get 4 results (as expected) with this plan:
"Nested Loop (cost=15.99..73.40 rows=1 width=24)"
" Join Filter: (i.procedure_id = h.procedure_id)"
" -> Hash Join (cost=15.99..46.76 rows=1 width=16)"
" Hash Cond: (i.numero_id = n.numero_id)"
" -> Seq Scan on identite i (cost=0.00..25.10 rows=1510 width=16)"
" -> Hash (cost=15.96..15.96 rows=2 width=8)"
" -> Bitmap Heap Scan on numero n (cost=8.55..15.96 rows=2
width=8)"
" Recheck Cond: (numero_id = ANY
('{25393,25384}'::bigint[]))"
" -> Bitmap Index Scan on numero_pkey (cost=0.00..8.55
rows=2 width=0)"
" Index Cond: (numero_id = ANY
('{25393,25384}'::bigint[]))"
" -> Seq Scan on habilitation h (cost=0.00..26.50 rows=11 width=24)"
" Filter: ((service_id = 100) OR (groupe_id = 50))"

After a little while (probably after the analyze), the query plan is changed
and only 2 results are returned !
"Merge Join (cost=33.31..39.69 rows=1 width=24)"
" Merge Cond: (i.numero_id = n.numero_id)"
" -> Sort (cost=33.31..33.35 rows=17 width=24)"
" Sort Key: i.numero_id"
" -> Hash Join (cost=26.64..32.96 rows=17 width=24)"
" Hash Cond: (i.procedure_id = h.procedure_id)"
" -> Seq Scan on identite i (cost=0.00..5.02 rows=302
width=16)"
" -> Hash (cost=26.50..26.50 rows=11 width=24)"
" -> Seq Scan on habilitation h (cost=0.00..26.50
rows=11 width=24)"
" Filter: ((service_id = 100) OR (groupe_id =
50))"
" -> Index Only Scan using numero_pkey on numero n (cost=0.00..12.57
rows=2 width=8)"
" Index Cond: (numero_id = ANY ('{25393,25384}'::bigint[]))"

Below is the script that creates the test data:

CREATE TABLE numero
(
numero_id bigint NOT NULL,
numero character varying(50) NOT NULL,
primary key (numero_id)
);

CREATE TABLE identite
(
identite_id bigint NOT NULL,
numero_id bigint NOT NULL,
procedure_id bigint NOT NULL,
primary key (identite_id)
);

CREATE TABLE habilitation
(
habilitation_id bigint NOT NULL,
procedure_id bigint NOT NULL,
type integer,
groupe_id bigint,
service_id bigint,
utilisateur_id bigint,
primary key (habilitation_id)
);

CREATE OR REPLACE FUNCTION FILL_WITH_FAKE_DATA() RETURNS VARCHAR AS $$
declare
i bigint;
begin
for i in 1..35000 loop
insert into numero(numero_id,numero) values (i, '123');
end loop;
for i in 1..300 loop
insert into identite(identite_id,numero_id,procedure_id ) values
(i,i,1);
end loop;

for i in 1..30 loop
insert into habilitation(habilitation_id, procedure_id, groupe_id,
service_id) values (i,2,50,null);
end loop;

return ' FILL_WITH_FAKE_DATA DONE';
end;
$$ LANGUAGE plpgsql;

select FILL_WITH_FAKE_DATA();
drop FUNCTION FILL_WITH_FAKE_DATA();

insert into identite(identite_id,numero_id,procedure_id ) values
(25393,25393,1);
insert into identite(identite_id,numero_id,procedure_id ) values
(25384,25384,1);
insert into habilitation(habilitation_id, procedure_id, groupe_id,
service_id) values (31,1,50,null);
insert into habilitation(habilitation_id, procedure_id, groupe_id,
service_id) values (32,1,null,100);

Responses

Browse pgsql-bugs by date

  From Date Subject
Next Message max 2012-10-10 16:02:05 BUG #7594: "tuple concurrently updated" error on concurrent GRANT ON DATABASE statements
Previous Message Heikki Linnakangas 2012-10-10 15:44:34 Re: BUG #7534: walreceiver takes long time to detect n/w breakdown