Re: BUG #9606: pg_class relhaspkey column not updated on removal of primary key - Mailing list pgsql-bugs

From Jeff Frost
Subject Re: BUG #9606: pg_class relhaspkey column not updated on removal of primary key
Date
Msg-id 7FBC4B95-6AF6-4CFC-A4E2-DE7D9C30AB4B@pgexperts.com
Whole thread Raw
In response to Re: BUG #9606: pg_class relhaspkey column not updated on removal of primary key  (Tom Lane <tgl@sss.pgh.pa.us>)
Responses Re: BUG #9606: pg_class relhaspkey column not updated on removal of primary key
List pgsql-bugs
On Mar 17, 2014, at 11:59 AM, Tom Lane <tgl@sss.pgh.pa.us> wrote:

> jeff@pgexperts.com writes:
>> [ $SUBJECT ]
>
> This is not a bug; please read the description of pg_class:
>
> relhaspkey    bool    True if the table has (or once had) a primary key
>
> The note at the bottom of the page explains why:
>
> Several of the Boolean flags in pg_class are maintained lazily: they are
> guaranteed to be true if that's the correct state, but may not be reset to
> false immediately when the condition is no longer true. For example,
> relhasindex is set by CREATE INDEX, but it is never cleared by DROP
> INDEX. Instead, VACUUM clears relhasindex if it finds the table has no
> indexes. This arrangement avoids race conditions and improves concurrency.

Sure enough, you're right!

pkey_test=# select relname, relhaspkey FROM pg_class where relname = 'foo';
 relname | relhaspkey
---------+------------
 foo     | t
(1 row)

pkey_test=# vacuum foo;
VACUUM
pkey_test=# select relname, relhaspkey FROM pg_class where relname = 'foo';
 relname | relhaspkey
---------+------------
 foo     | f
(1 row)

Thanks, Tom, i had completely forgotten about that!

pgsql-bugs by date:

Previous
From: Tom Lane
Date:
Subject: Re: BUG #9606: pg_class relhaspkey column not updated on removal of primary key
Next
From: Tom Lane
Date:
Subject: Re: relcache reference leak on refresh materialized view concurrently