BUG #3494: may be Query Error: subplan does not executed - Mailing list pgsql-bugs

From Sergey Burladyan
Subject BUG #3494: may be Query Error: subplan does not executed
Date
Msg-id 200707271038.l6RAcduY034807@wwwmaster.postgresql.org
Whole thread Raw
Responses Re: BUG #3494: may be Query Error: subplan does not executed  (Heikki Linnakangas <heikki@enterprisedb.com>)
Re: BUG #3494: may be Query Error: subplan does not executed  (Tom Lane <tgl@sss.pgh.pa.us>)
List pgsql-bugs
The following bug has been logged online:

Bug reference:      3494
Logged by:          Sergey Burladyan
Email address:      eshkinkot@gmail.com
PostgreSQL version: 8.1.9
Operating system:   CentOS release 5 (Final)
Description:        may be Query Error: subplan does not executed
Details:

i have query with join of two table and 'where' filter it result by subplan
which have references to join result, but this subplan not executed and
result is incorrect. This subplan also not exist in explain analyze output.

test schema:
create table test_1 ( name char(10), ku numeric(4) , ku_1   numeric(4) );
insert into test_1 (name,ku,ku_1)  values ('Petrov',  1,  0);
insert into test_1 (name,ku,ku_1)  values ('Ivanov',  2,  0);
insert into test_1 (name,ku,ku_1)  values ('Sidorov', 3,  0);

create table test_2 (kh numeric(13),  ku numeric(4) , d_s timestamp );
insert into test_2 (kh,ku,d_s)  values (1, 1, '2007-01-01');
insert into test_2 (kh,ku,d_s)  values (1, 2, '2007-01-01');
insert into test_2 (kh,ku,d_s)  values (1, 3, '2007-01-01');

problem query:
select    *
from    test_1 mt1,
    test_2 mt2
where    mt2.kh =  1            and
    mt2.ku between  1 and 100    and
    mt1.ku = mt2.ku        and
    mt1.ku =     (select min(t1.ku)
            from   test_1 t1,test_2 t2
            where    t1.ku_1 = mt1.ku_1    and
                t2.kh   = mt2.kh    and
                t2.d_s  = mt2.d_s    and
                t1.ku   = t2.ku )

                                                   QUERY PLAN
----------------------------------------------------------------------------
-------------------------------------
 Merge Join  (cost=2.13..2.19 rows=3 width=60) (actual time=0.062..0.078
rows=3 loops=1)
   Merge Cond: ("outer".ku = "inner".ku)
   ->  Sort  (cost=1.05..1.06 rows=3 width=32) (actual time=0.026..0.029
rows=3 loops=1)
         Sort Key: mt1.ku
         ->  Seq Scan on test_1 mt1  (cost=0.00..1.03 rows=3 width=32)
(actual time=0.007..0.011 rows=3 loops=1)
   ->  Sort  (cost=1.08..1.08 rows=3 width=28) (actual time=0.028..0.030
rows=3 loops=1)
         Sort Key: mt2.ku
         ->  Seq Scan on test_2 mt2  (cost=0.00..1.05 rows=3 width=28)
(actual time=0.011..0.018 rows=3 loops=1)
               Filter: ((kh = 1::numeric) AND (ku >= 1::numeric) AND (ku <=
100::numeric))


But, when i comment out some 'where' condition in subplan because it always
true (i think) - subplan show up and query work ok:
select    *
from    test_1 mt1,
        test_2 mt2
where   mt2.kh =  1                     and
        mt2.ku between  1 and 100       and
        mt1.ku = mt2.ku         and
        mt1.ku =        (select min(t1.ku)
                        from   test_1 t1,test_2 t2
                        where   /* t1.ku_1 = mt1.ku_1   and */
                                t2.kh   = mt2.kh        and
                                t2.d_s  = mt2.d_s       and
                                t1.ku   = t2.ku )
                                                             QUERY PLAN

----------------------------------------------------------------------------
-------------------------------------------------
-------
 Nested Loop  (cost=0.00..8.74 rows=1 width=60) (actual time=0.125..0.248
rows=1 loops=1)
   Join Filter: ("inner".ku = "outer".ku)
   ->  Seq Scan on test_2 mt2  (cost=0.00..7.67 rows=1 width=28) (actual
time=0.114..0.228 rows=1 loops=1)
         Filter: ((kh = 1::numeric) AND (ku >= 1::numeric) AND (ku <=
100::numeric) AND ((subplan) = ku))
         SubPlan
           ->  Aggregate  (cost=2.19..2.20 rows=1 width=10) (actual
time=0.063..0.064 rows=1 loops=3)
                 ->  Merge Join  (cost=2.12..2.18 rows=3 width=10) (actual
time=0.039..0.054 rows=3 loops=3)
                       Merge Cond: ("outer".ku = "inner".ku)
                       ->  Sort  (cost=1.05..1.06 rows=3 width=10) (actual
time=0.009..0.011 rows=3 loops=3)
                             Sort Key: t1.ku
                             ->  Seq Scan on test_1 t1  (cost=0.00..1.03
rows=3 width=10) (actual time=0.004..0.009 rows=3 loops=1)
                       ->  Sort  (cost=1.07..1.08 rows=3 width=10) (actual
time=0.024..0.026 rows=3 loops=3)
                             Sort Key: t2.ku
                             ->  Seq Scan on test_2 t2  (cost=0.00..1.04
rows=3 width=10) (actual time=0.006..0.013 rows=3 loops=3)
                                   Filter: ((kh = $0) AND (d_s = $1))
   ->  Seq Scan on test_1 mt1  (cost=0.00..1.03 rows=3 width=32) (actual
time=0.003..0.006 rows=3 loops=1)

i am not sure, is this my incompetence or may be problem in planer ?

pgsql-bugs by date:

Previous
From: Alvaro Herrera
Date:
Subject: Re: BUG #3493: Cannot find data with = operator
Next
From: Michał Niklas
Date:
Subject: Re: BUG #3493: Cannot find data with = operator