bug: UNION - Mailing list pgsql-bugs

From Nabil Sayegh
Subject bug: UNION
Date
Msg-id 3A2D2FDE.A85FA52C@sayegh.de
Whole thread Raw
Responses Re: bug: UNION  (Tom Lane <tgl@sss.pgh.pa.us>)
List pgsql-bugs
Hi,

There seems to be a bug in postgresql concerning UNION.
I use 7.0.3 (BLCKSIZE=32)

I have the following tables:

                               Table "best_ez"
 Attribute  |     Type     |
Modifier
------------+--------------+--------------------------------------------------
 id         | integer      | not null default
nextval('best_ez_id_seq'::text)
 ins_id     | char(16)     |
 hotel_id   | varchar(200) | not null default ''
 datum      | date         | not null
 corporate  | float8       | default '0.0000'
 preis      | float8       | not null default '0.0000'
 menge      | integer      | not null default '0'
 reserviert | integer      | default '0'
 gebucht    | integer      | default '0'
Indices: best_ez_hotel_id_key,
         best_ez_pkey

tcon=> SELECT * from best_ez where hotel_id='ADMIN' order by datum;
  id  |      ins_id      | hotel_id |   datum    |preis | menge |
reserviert | gebucht
------+------------------+----------+------------+------+-------+------------+---------
...
  476 | 2000010120000201 | ADMIN    | 2000-01-30 |    4 |     5
|          0 |       0
  477 | 2000010120000201 | ADMIN    | 2000-01-31 |    4 |     5
|          0 |       0
  478 | 2000010120000201 | ADMIN    | 2000-02-01 |    4 |     5
|          0 |       0
 2955 | 2001050120010510 | ADMIN    | 2001-05-01 |   20 |    10
|          0 |       0
 2956 | 2001050120010510 | ADMIN    | 2001-05-02 |   20 |    10
|          0 |       0
...
                            Table "ints"
 Attribute |  Type   |                   Modifier
-----------+---------+----------------------------------------------
 n         | integer | not null default nextval('ints_n_seq'::text)
Index: ints_pkey

It contains the numbers from 1 to 31

The Query:
=> SELECT n, menge, preis from ints, BEST_DZ where n <= 28 and
hotel_id='ADMIN' AND DATUM between '2001-02-01'::date AND
'2001-02-01'::date + 28 - 1 and n=date_part('day', datum) union all
select n, 0, 0 from ints where n<28 AND n not in (select
date_part('day', datum) from BEST_DZ where hotel_id='ADMIN' AND DATUM
between '2001-02-01'::date AND '2001-02-01'::date + 28 - 1) order by n;
 n  | menge | preis
----+-------+-------
  1 |     0 |     0
  2 |     0 |     0
  3 |     0 |     0
  4 |     0 |     0
  5 |     0 |     0
  6 |     0 |     0
  7 |     0 |     0
  8 |     0 |     0
  9 |    11 |   3.7
 10 |     0 |     0
 11 |     0 |     0
...

The Query (same as above, but now with ins_id and '0'):

=> SELECT n, ins_id, menge, preis from ints, BEST_DZ where n <= 28 and
hotel_id='ADMIN' AND DATUM between '2001-02-01'::date AND
'2001-02-01'::date + 28 - 1 and n=date_part('day', datum) union all
select n, '0', 0, 0 from ints where n<28 AND n not in (select
date_part('day', datum) from BEST_DZ where hotel_id='ADMIN' AND DATUM
between '2001-02-01'::date AND '2001-02-01'::date + 28 - 1) order by n;
 n  |      ins_id      |   menge   |        preis
----+------------------+-----------+----------------------
  1 | 0                |         0 |                    0
  2 | 0                |         0 |                    0
  3 | 0                |         0 |                    0
  4 | 0                |         0 |                    0
  5 | 0                |         0 |                    0
  6 | 0                |         0 |                    0
  7 | 0                |         0 |                    0
  8 | 0                |         0 |                    0
  9 | 2001020920010209 | 959459888 | 3.11924535422124e-33
 10 | 0                |         0 |                    0
 11 | 0                |         0 |                    0

The same query as above but without order by:

=> SELECT n, ins_id, menge, preis from ints, BEST_DZ where n <= 28 and
hotel_id='ADMIN' AND DATUM between '2001-02-01'::date AND
'2001-02-01'::date + 28 - 1 and n=date_part('day', datum) union all
select n, '0', 0, 0 from ints where n<28 AND n not in (select
date_part('day', datum) from BEST_DZ where hotel_id='ADMIN' AND DATUM
between '2001-02-01'::date AND '2001-02-01'::date + 28 - 1);
 n  |      ins_id      | menge |         preis
----+------------------+-------+-----------------------
  9 | 2001020920010209 |    11 |                   3.7
  1 | 0                |    16 |  2.0467033885567e-269
  2 | 0                |    16 | 2.04646077043258e-269
  3 | 0                |    16 |  2.0467033885567e-269
  4 | 0                |    16 | 2.04646077043258e-269
  5 | 0                |    16 |  2.0467033885567e-269
  6 | 0                |    16 | 2.04646077043258e-269
  7 | 0                |    16 |  2.0467033885567e-269
  8 | 0                |    16 | 2.04646077043258e-269
 10 | 0                |    16 |  2.0467033885567e-269
 11 | 0                |    16 | 2.04646077043258e-269
(even the integer row "menge" is wrong)
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
The last query (e.g.) works exactly 3 times after a fresh connection
ANY further executions of this query lead to wrong results.
Other queries (of similar structure (UNION)) never work right
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

How can this be ? It's the same query on the same data.
Apparantly the "preis" column is a rounding-error, but "menge"
is of type integer.
Why does it work if I skip "ins_id" ?
Is it related to the BLCKSIZE ?

TIA

P.S.: Is there hope for OUTER JOIN in 7.1 ?

--
 Nabil Sayegh

pgsql-bugs by date:

Previous
From: pgsql-bugs@postgresql.org
Date:
Subject: createlang requires entering password 4 times
Next
From: Tom Lane
Date:
Subject: Re: Rules with Conditions: Still Doesn't Work (Bug Rpt)