From: | Jeff Frost <jeff(at)pgexperts(dot)com> |
---|---|
To: | Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us> |
Cc: | pgsql-bugs(at)postgresql(dot)org |
Subject: | Re: BUG #9606: pg_class relhaspkey column not updated on removal of primary key |
Date: | 2014-03-17 19:01:24 |
Message-ID: | 7FBC4B95-6AF6-4CFC-A4E2-DE7D9C30AB4B@pgexperts.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-bugs |
On Mar 17, 2014, at 11:59 AM, Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us> wrote:
> jeff(at)pgexperts(dot)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!
From | Date | Subject | |
---|---|---|---|
Next Message | Tom Lane | 2014-03-17 20:00:07 | Re: relcache reference leak on refresh materialized view concurrently |
Previous Message | Tom Lane | 2014-03-17 18:59:30 | Re: BUG #9606: pg_class relhaspkey column not updated on removal of primary key |