Thread: ALTER TABLE DISABLE RULE does not work inside of a transaction
Namely it does not disable the rule... Enabling inside of the transaction seems to work though Tried both CVS and 8.3.5... create table trule (a int); insert into trule (a) values (1); create rule trule_rule as on update to trule do instead nothing; update trule set a = 2; UPDATE 0 begin; ALTER TABLE trule DISABLE RULE trule_rule; update trule set a = 2; UPDATE 0 \d trule Table "public.trule" Column | Type | Modifiers --------+---------+----------- a | integer | Disabled rules: trule_rule AS ON UPDATE TO trule DO INSTEAD NOTHING rollback; ALTER TABLE trule DISABLE RULE trule_rule; update trule set a = 2; UPDATE 1
On Mon, Dec 29, 2008 at 15:07, Alex Hunsaker <badalex@gmail.com> wrote: > Namely it does not disable the rule... > Enabling inside of the transaction seems to work though Hrm the above turned out to be false... must have gotten confused when testing with triggers If i turn on RELCACHE_FORCE_RELEASE or CLOBBER_CACHE_ALWAYS then it works as expected. Maybe this will make someone who understands the relcache stuff better go Ahh ha!
"Alex Hunsaker" <badalex@gmail.com> writes: > Namely it does not disable the rule... Enabling inside of the > transaction seems to work though Fixed, thanks ... Index: relcache.c =================================================================== RCS file: /cvsroot/pgsql/src/backend/utils/cache/relcache.c,v retrieving revision 1.266.2.4 diff -c -r1.266.2.4 relcache.c *** relcache.c 10 Aug 2008 19:02:46 -0000 1.266.2.4 --- relcache.c 30 Dec 2008 03:53:15 -0000 *************** *** 770,775 **** --- 770,777 ---- return false; if (rule1->attrno != rule2->attrno) return false; + if (rule1->enabled != rule2->enabled) + return false; if (rule1->isInstead != rule2->isInstead) return false; if (!equal(rule1->qual, rule2->qual)) regards, tom lane