X-Original-To: pgsql-sql-postgresql.org@localhost.postgresql.org Received: from localhost (av.hub.org [200.46.204.144]) by svr1.postgresql.org (Postfix) with ESMTP id AA426DA5D6 for ; Fri, 21 Oct 2005 13:06:35 -0300 (ADT) Received: from svr1.postgresql.org ([200.46.204.71]) by localhost (av.hub.org [200.46.204.144]) (amavisd-new, port 10024) with ESMTP id 89916-09 for ; Fri, 21 Oct 2005 16:06:33 +0000 (GMT) Received: from sss.pgh.pa.us (sss.pgh.pa.us [66.207.139.130]) by svr1.postgresql.org (Postfix) with ESMTP id EDF46DA3EA for ; Fri, 21 Oct 2005 13:06:32 -0300 (ADT) Received: from sss2.sss.pgh.pa.us (tgl@localhost [127.0.0.1]) by sss.pgh.pa.us (8.13.1/8.13.1) with ESMTP id j9LG6VcB023326; Fri, 21 Oct 2005 12:06:31 -0400 (EDT) To: Wiebe Cazemier Cc: pgsql-sql@postgresql.org Subject: Re: Delete rule chain stops unexpectedly In-reply-to: <435902DC.3000807@gmail.com> References: <4358F79B.1000409@gmail.com> <21436.1129905772@sss.pgh.pa.us> <435902DC.3000807@gmail.com> Comments: In-reply-to Wiebe Cazemier message dated "Fri, 21 Oct 2005 17:01:48 +0200" Date: Fri, 21 Oct 2005 12:06:31 -0400 Message-ID: <23325.1129910791@sss.pgh.pa.us> From: Tom Lane X-Virus-Scanned: by amavisd-new at hub.org X-Spam-Status: No, hits=0.006 required=5 tests=[AWL=0.006] X-Spam-Level: X-Archive-Number: 200510/247 X-Sequence-Number: 23100 Wiebe Cazemier writes: > Tom Lane wrote: >>> The rule that actually deletes the rows from the underlying has to fire >>> last, since the rows are gone from the view (and hence from OLD) the >>> moment you delete them. > A quote from the postgresql manual: > "But for ON UPDATE and ON DELETE rules, the original query is done after the > actions added by rules. This ensures that the actions can see the to-be-updated > or to-be-deleted rows" Yes, I know that quote. I wrote it. It's not relevant here because the original query (the delete against the view) is never done at all, since you have a DO INSTEAD rule. What is relevant is the timing of the delete issued against the underlying table, and you have that scheduled to occur too early because the rule that does it is first in alphabetical order. > So, the actual delete should be done after all the rules. And even if > it does delete before anything else, that does not explain why "step2" > is not inserted into the debuglog table. Because the rule converts those inserts into, effectively, INSERT INTO debuglog SELECT ... WHERE EXISTS(some matching OLD row); and there are no longer any matching OLD rows in the view. (If it didn't act that way then the INSERTs would execute even for a "DELETE WHERE false". If you find any of this surprising or not what you want, you should probably be using triggers not rules.) > Or, that all the rules _are_ > executed when I call the query with "explain analayze". Hmm ... this appears to be a bug in EXPLAIN ANALYZE: it really should bump the CommandCounter between plan trees, but fails to ... regards, tom lane