Re: SET WITHOUT OIDS and VACUUM badness?
От | Bruce Momjian |
---|---|
Тема | Re: SET WITHOUT OIDS and VACUUM badness? |
Дата | |
Msg-id | 200402112244.i1BMiA726804@candle.pha.pa.us обсуждение исходный текст |
Ответ на | Re: SET WITHOUT OIDS and VACUUM badness? (Gavin Sherry <swm@linuxworld.com.au>) |
Ответы |
Re: SET WITHOUT OIDS and VACUUM badness?
Re: SET WITHOUT OIDS and VACUUM badness? |
Список | pgsql-hackers |
Gavin Sherry wrote: > On Wed, 21 Jan 2004, Gavin Sherry wrote: > > > On Wed, 21 Jan 2004, Christopher Kings-Lynne wrote: > > > > > This is what we did: > > > > > > 0. BEGIN; > > > > > > 1. ALTER TABLE ... SET WITHOUT OIDS > > > > > 12. ROLLBACK; > > > > > > 13. VACUUM FULL forums_posts; > > > > The problem here is that this conditional doesn't take into account the > > change in state which the above transaction causes: > > > > if (onerel->rd_rel->relhasoids && > > !OidIsValid(HeapTupleGetOid(&tuple))) > > > > Tuples inserted after step one have no (valid) OID. However, since we > > rollback, the change to pg_class.relhasoids => 'f' is rolled back. The > > only solution I can think of is removing the test or storing relhasoids as > > a per tuple flag (argh). > > What am I talking about. Can't we test for: > > (&tuple)->t_infomask & HEAP_HASOID > > Instead of: > > onerel->rd_rel->relhasoids I can confirm we still have this bug:test=> CREATE TABLE foo (a INT);CREATE TABLEtest=> BEGIN;BEGINtest=> ALTER TABLE fooSET WITHOUT OIDS; INSERT INTO foo values (5);ROLLBACK;VACUUM FULL foo;ALTER TABLEtest=> INSERT INTO foo values (5);INSERT0 1test=> ROLLBACK;ROLLBACKtest=>test=> VACUUM FULL foo;WARNING: relation "foo" TID 0/1: OID is invalidVACUUM Anyone want to fix it? -- 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, Pennsylvania19073
В списке pgsql-hackers по дате отправления: