BUG #7593: Unexpected query result combining or and in operators - Mailing list pgsql-bugs
From | demurcia@ockham-solutions.fr |
---|---|
Subject | BUG #7593: Unexpected query result combining or and in operators |
Date | |
Msg-id | E1TLyc6-000827-0i@wrigleys.postgresql.org Whole thread Raw |
Responses |
Re: BUG #7593: Unexpected query result combining or and in operators
|
List | pgsql-bugs |
The following bug has been logged on the website: Bug reference: 7593 Logged by: DE MURCIA Julien Email address: demurcia@ockham-solutions.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=3D100 or h.groupe_id=3D50) = and n.numero_id in (25393, 25384) and i.procedure_id=3Dh.procedure_id = and i.numero_id=3Dn.numero_id; At first I get 4 results (as expected) with this plan: "Nested Loop (cost=3D15.99..73.40 rows=3D1 width=3D24)" " Join Filter: (i.procedure_id =3D h.procedure_id)" " -> Hash Join (cost=3D15.99..46.76 rows=3D1 width=3D16)" " Hash Cond: (i.numero_id =3D n.numero_id)" " -> Seq Scan on identite i (cost=3D0.00..25.10 rows=3D1510 width= =3D16)" " -> Hash (cost=3D15.96..15.96 rows=3D2 width=3D8)" " -> Bitmap Heap Scan on numero n (cost=3D8.55..15.96 rows= =3D2 width=3D8)" " Recheck Cond: (numero_id =3D ANY ('{25393,25384}'::bigint[]))" " -> Bitmap Index Scan on numero_pkey (cost=3D0.00..8.= 55 rows=3D2 width=3D0)" " Index Cond: (numero_id =3D ANY ('{25393,25384}'::bigint[]))" " -> Seq Scan on habilitation h (cost=3D0.00..26.50 rows=3D11 width=3D24= )" " Filter: ((service_id =3D 100) OR (groupe_id =3D 50))" After a little while (probably after the analyze), the query plan is changed and only 2 results are returned ! "Merge Join (cost=3D33.31..39.69 rows=3D1 width=3D24)" " Merge Cond: (i.numero_id =3D n.numero_id)" " -> Sort (cost=3D33.31..33.35 rows=3D17 width=3D24)" " Sort Key: i.numero_id" " -> Hash Join (cost=3D26.64..32.96 rows=3D17 width=3D24)" " Hash Cond: (i.procedure_id =3D h.procedure_id)" " -> Seq Scan on identite i (cost=3D0.00..5.02 rows=3D302 width=3D16)" " -> Hash (cost=3D26.50..26.50 rows=3D11 width=3D24)" " -> Seq Scan on habilitation h (cost=3D0.00..26.50 rows=3D11 width=3D24)" " Filter: ((service_id =3D 100) OR (groupe_id =3D 50))" " -> Index Only Scan using numero_pkey on numero n (cost=3D0.00..12.57 rows=3D2 width=3D8)" " Index Cond: (numero_id =3D 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); =
pgsql-bugs by date: