Re: insert rule not firing on insert with exists subselect

From: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
To: Chris Kratz <chris(dot)kratz(at)vistashare(dot)com>
Cc: pgsql-general(at)postgresql(dot)org
Subject: Re: insert rule not firing on insert with exists subselect
Date: 2004-04-13 21:13:26
Message-ID: 26599.1081890806@sss.pgh.pa.us
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

Chris Kratz <chris(dot)kratz(at)vistashare(dot)com> writes:
> What am I missing?

You're thinking that the rule is a trigger. It's not. It's a query
transformation mechanism that adds a new query to be executed after your
INSERT. What actually gets executed is effectively

Original query:

insert into table2 (col1) select col1 from table1 where not exists
(select 1 from table2 where table2.col1 = table1.col1);

Query added by rule:

insert into table3 (col1)
select col1 from table1 where not exists
(select 1 from table2 where table2.col1 = table1.col1);

By the time the second query begins, there *is* a table2 row matching
every row in table1, because you just got done inserting ones to match
any that didn't have a match. So in the second query, the EXISTS test
succeeds at every row of table1 and no rows are produced to insert into
table3.

This could be made to work if the order of the queries were reversed,
but that isn't going to happen because it would break other uses of
ON INSERT rules that need to be able to see the inserted row(s).
So AFAICS you're gonna have to use a trigger.

regards, tom lane

In response to

Responses

Browse pgsql-general by date

  From Date Subject
Next Message Chris Kratz 2004-04-13 21:20:03 Re: insert rule not firing on insert with exists subselect
Previous Message Tom Lane 2004-04-13 21:03:43 Re: Join works in 7.3.6, fails in 7.4.2