Add check constraint bug

Started by Peter Eisentrautover 23 years ago6 messages
#1Peter Eisentraut
peter_e@gmx.net

The following happens in latest CVS and a fresh database:

create table test (a int);
insert into test values (1);
alter table test add column b text check (b <> '');
alter table test add check (a > 0);
alter table test add check (a <> 1);

After the last command I get

ERROR: CheckConstraintFetch: unexpected record found for rel test

and then the table seems to be wedged because any access to it will get
the same error.

Also, psql seems to forget about check constraints in peculiar ways:

create table test (a int);
insert into test values (1);
alter table test add column b text check (b <> '');
\d test
alter table test add check (a > 0);
\d test

The first shows:

Table "public.test"
Spalte | Typ | Attribute
--------+---------+-----------
a | integer |
b | text |

The second shows:

Table "public.test"
Spalte | Typ | Attribute
--------+---------+-----------
a | integer |
b | text |
Check-Constraints: ᅵtest_bᅵ (b <> ''::text)
ᅵ$1ᅵ (a > 0)

Note the first one doesn't show any constraints.

--
Peter Eisentraut peter_e@gmx.net

#2Stephan Szabo
sszabo@megazone23.bigpanda.com
In reply to: Peter Eisentraut (#1)
Re: Add check constraint bug

On Thu, 5 Sep 2002, Peter Eisentraut wrote:

The following happens in latest CVS and a fresh database:

create table test (a int);
insert into test values (1);
alter table test add column b text check (b <> '');
alter table test add check (a > 0);
alter table test add check (a <> 1);

After the last command I get

ERROR: CheckConstraintFetch: unexpected record found for rel test

and then the table seems to be wedged because any access to it will get
the same error.

I don't have reasonable access to the machine at home for code purposes,
but it looks to me that the add column line is the one that's causing
the bug. It's inserting a check constraint but not upping relchecks
which seems to work because it's zero and therefore doesn't even look, but
the add check is incrementing the count and inserting its constraint which
makes 2 real constraints and relchecks=1 which causes the error.

This is probably also why it forgets about the check constraint below
since relchecks is 0, but I didn't look.

Note that:
create table test(a int check (a>3));
alter table test add column b text check(b<>'');
select * from test;

will error.

#3scott.marlowe
scott.marlowe@ihs.com
In reply to: Stephan Szabo (#2)
Re: Add check constraint bug

On Thu, 5 Sep 2002, Stephan Szabo wrote:

On Thu, 5 Sep 2002, Peter Eisentraut wrote:

The following happens in latest CVS and a fresh database:

create table test (a int);
insert into test values (1);
alter table test add column b text check (b <> '');
alter table test add check (a > 0);
alter table test add check (a <> 1);

After the last command I get

ERROR: CheckConstraintFetch: unexpected record found for rel test

and then the table seems to be wedged because any access to it will get
the same error.

Just fyi, 7.2.1 does this too.

#4Tom Lane
tgl@sss.pgh.pa.us
In reply to: Peter Eisentraut (#1)
Re: Add check constraint bug

Peter Eisentraut <peter_e@gmx.net> writes:

The following happens in latest CVS and a fresh database:
create table test (a int);
insert into test values (1);
alter table test add column b text check (b <> '');

This bug's been there awhile I fear. The failure occurs when
AlterTableAddColumn needs to add a check constraint AND the
new column causes AlterTableCreateToastTable to do its thing.

The reason there is a bug is that AlterTableCreateToastTable
gratuitously does a heap_mark4update, thereby selecting the un-updated
version of the pg_class tuple as its basis for modification (and
ignoring the HeapTupleSelfUpdated return code that warned that there
was a problem).

I've said before that I do not like heap_mark4update in catalog
manipulations, and here's a perfect example of why it's a bad idea.

regards, tom lane

#5Bruce Momjian
pgman@candle.pha.pa.us
In reply to: Tom Lane (#4)
Re: Add check constraint bug

Is there a TODO here?

---------------------------------------------------------------------------

Tom Lane wrote:

Peter Eisentraut <peter_e@gmx.net> writes:

The following happens in latest CVS and a fresh database:
create table test (a int);
insert into test values (1);
alter table test add column b text check (b <> '');

This bug's been there awhile I fear. The failure occurs when
AlterTableAddColumn needs to add a check constraint AND the
new column causes AlterTableCreateToastTable to do its thing.

The reason there is a bug is that AlterTableCreateToastTable
gratuitously does a heap_mark4update, thereby selecting the un-updated
version of the pg_class tuple as its basis for modification (and
ignoring the HeapTupleSelfUpdated return code that warned that there
was a problem).

I've said before that I do not like heap_mark4update in catalog
manipulations, and here's a perfect example of why it's a bad idea.

regards, tom lane

---------------------------(end of broadcast)---------------------------
TIP 2: you can get off all lists at once with the unregister command
(send "unregister YourEmailAddressHere" to majordomo@postgresql.org)

-- 
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 359-1001
  +  If your life is a hard drive,     |  13 Roberts Road
  +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073
#6Tom Lane
tgl@sss.pgh.pa.us
In reply to: Bruce Momjian (#5)
Re: Add check constraint bug

Bruce Momjian <pgman@candle.pha.pa.us> writes:

Is there a TODO here?

I've committed a fix for the immediate problem. I want to take a very
hard look at the other heap_mark4update calls, though.

regards, tom lane