8.4.0 bug - failure to enforce a foreign key constraint

Started by Radoslaw Zielinskiover 16 years ago5 messagesgeneral
Jump to latest
#1Radoslaw Zielinski
radek@pld-linux.org

Hello,

I have reported this yesterday via WWW as bug 4979, but I can't see it
in the -bugs archive. Has it been lost or are the bug reports being
moderated...?

Anyway. Pg 8.4.0 from yum.postgresql.org running on 64bit RHEL 5.3.

radek=# \d kandydaci
Table "public.kandydaci"
Column | Type | Modifiers
-------------------+------------------+-----------
id_rekordu | bigint | not null
id_osoby | integer | not null
id_rodzaju_adresu | smallint |
score | double precision | not null
Indexes:
"kandydaci_pkey" PRIMARY KEY, btree (id_rekordu, id_osoby)
Check constraints:
"c_kandydaci_score" CHECK (score >= 0::double precision AND score <= 1::double precision)
Foreign-key constraints:
"kandydaci_fk_id_rekordu" FOREIGN KEY (id_rekordu) REFERENCES rekordy(id) ON DELETE CASCADE

radek=# select count(*), sum((r.id is null)::int) as orphans from kandydaci k left join rekordy r on r.id=k.id_rekordu;
count | orphans
-------+---------
1472 | 152
(1 row)

The "orphans" count should be 0, obviously.

This table is only inserted into, never updated. These rows should have
been deleted by the CASCADE constraint: table "rekordy" references table
"tasks" (also with ON DELETE CASCADE), and some "tasks" were deleted.

Judging from the IDs, this has happened multiple times (at least twice).

It's a test database with very low load. Some complex SELECT queries,
bulk inserts, 99.9% non-conflicting transactions (users work on their
own parts of the data, as defined by the task_id). No weird stuff has
been done to this cluster.

Loaded modules: plpgsql, plperl, dblink, fuzzystrmatch, hstore-new.

Any ideas? I have not been able to reproduce it, unfortunately.

--
Radosław Zieliński <radek@pld-linux.org>

#2Grzegorz Jaśkiewicz
gryzman@gmail.com
In reply to: Radoslaw Zielinski (#1)
Re: 8.4.0 bug - failure to enforce a foreign key constraint

On Thu, Aug 13, 2009 at 12:36 PM, Radoslaw Zielinski<radek@pld-linux.org> wrote:

Hello,

I have reported this yesterday via WWW as bug 4979, but I can't see it
in the -bugs archive.  Has it been lost or are the bug reports being
moderated...?

Anyway.  Pg 8.4.0 from yum.postgresql.org running on 64bit RHEL 5.3.

 radek=# \d kandydaci
            Table "public.kandydaci"
       Column       |       Type       | Modifiers
 -------------------+------------------+-----------
  id_rekordu        | bigint           | not null
  id_osoby          | integer          | not null
  id_rodzaju_adresu | smallint         |
  score             | double precision | not null
 Indexes:
     "kandydaci_pkey" PRIMARY KEY, btree (id_rekordu, id_osoby)
 Check constraints:
     "c_kandydaci_score" CHECK (score >= 0::double precision AND score <= 1::double precision)
 Foreign-key constraints:
     "kandydaci_fk_id_rekordu" FOREIGN KEY (id_rekordu) REFERENCES rekordy(id) ON DELETE CASCADE

 radek=# select count(*), sum((r.id is null)::int) as orphans from kandydaci k left join rekordy r on r.id=k.id_rekordu;
  count | orphans
 -------+---------
   1472 |     152
 (1 row)

since you do LEFT JOIN, indeed you can get r.id to be null.

--
GJ

#3Radoslaw Zielinski
radek@pld-linux.org
In reply to: Grzegorz Jaśkiewicz (#2)
Re: 8.4.0 bug - failure to enforce a foreign key constraint

Grzegorz Jaśkiewicz <gryzman@gmail.com> [2009-08-13 14:23]:

On Thu, Aug 13, 2009 at 12:36 PM, Radoslaw Zielinski<radek@pld-linux.org> wrote:

[...]

     "kandydaci_fk_id_rekordu" FOREIGN KEY (id_rekordu) REFERENCES rekordy(id) ON DELETE CASCADE

[...]

since you do LEFT JOIN, indeed you can get r.id to be null.

There is a foreign key on this field, and it's the only one used in the
JOIN condition. LEFT was only used to demonstrate the issue in a single
query.

--
Radosław Zieliński <radek@pld-linux.org>

#4Laurenz Albe
laurenz.albe@cybertec.at
In reply to: Radoslaw Zielinski (#1)
Re: 8.4.0 bug - failure to enforce a foreign key constraint

Radoslaw Zielinski wrote:

radek=# \d kandydaci
Table "public.kandydaci"
Column | Type | Modifiers
-------------------+------------------+-----------
id_rekordu | bigint | not null
id_osoby | integer | not null
id_rodzaju_adresu | smallint |
score | double precision | not null

[...]

Foreign-key constraints:
"kandydaci_fk_id_rekordu" FOREIGN KEY (id_rekordu) REFERENCES rekordy(id) ON DELETE CASCADE

radek=# select count(*), sum((r.id is null)::int) as
orphans from kandydaci k left join rekordy r on r.id=k.id_rekordu;
count | orphans
-------+---------
1472 | 152
(1 row)

The "orphans" count should be 0, obviously.

Just to make sure that there is really an inconsistency:

Could you pg_dump both tables and try to load them into
another database? If that works without errors, we must have
missed something obvious.

Yours,
Laurenz Albe

#5Radoslaw Zielinski
radek@pld-linux.org
In reply to: Laurenz Albe (#4)
Re: 8.4.0 bug - failure to enforce a foreign key constraint

Albe Laurenz <laurenz.albe@wien.gv.at> [2009-08-14 07:34]:

Radoslaw Zielinski wrote:

[...]

The "orphans" count should be 0, obviously.

Just to make sure that there is really an inconsistency:

Could you pg_dump both tables and try to load them into
another database? If that works without errors, we must have
missed something obvious.

Yes, I did that. In fact, that's how I have noticed this -- by reading
pg_dump's output.

--
Radosław Zieliński <radek@pld-linux.org>