| From: | Michael Fuhr <mike(at)fuhr(dot)org> | 
|---|---|
| To: | Kenneth Downs <ken(at)secdat(dot)com> | 
| Cc: | pgsql-general(at)postgresql(dot)org | 
| Subject: | Re: plperl %_SHARED and rollbacks | 
| Date: | 2006-03-08 21:14:28 | 
| Message-ID: | 20060308211428.GA56906@winnie.fuhr.org | 
| Views: | Whole Thread | Raw Message | Download mbox | Resend email | 
| Thread: | |
| Lists: | pgsql-general | 
On Wed, Mar 08, 2006 at 09:06:36AM -0500, Kenneth Downs wrote:
> If there are triggers writing to %_SHARED within a transaction, and the 
> transaction is rolled back, do the changes to %_SHARED roll back also?  
What happened when you tried it?
CREATE TABLE foo (id integer, t text, last_t text);
CREATE FUNCTION trigfunc() RETURNS trigger AS $$
  $_TD->{new}{last_t} = $_SHARED{last_t};
  $_SHARED{last_t} = $_TD->{new}{t};
  return "MODIFY";
$$ LANGUAGE plperl;
CREATE TRIGGER footrig BEFORE INSERT OR UPDATE ON foo
  FOR EACH ROW EXECUTE PROCEDURE trigfunc();
INSERT INTO foo (id, t) VALUES (1, 'one');
INSERT INTO foo (id, t) VALUES (2, 'two');
BEGIN; INSERT INTO foo (id, t) VALUES (3, 'three'); ROLLBACK;
INSERT INTO foo (id, t) VALUES (4, 'four');
SELECT * FROM foo;
 id |  t   | last_t 
----+------+--------
  1 | one  | 
  2 | two  | one
  4 | four | three
(3 rows)
Notice that the value assigned in the rolled back transaction was
used in the subsequent insert.
> If not then I assume I should manually clear it at the start of 
> transactions, no?
Apparently so.
-- 
Michael Fuhr
| From | Date | Subject | |
|---|---|---|---|
| Next Message | Tom Lane | 2006-03-08 21:19:42 | Re: pg_dump error - filesystem full | 
| Previous Message | Moises Alberto Lindo Gutarra | 2006-03-08 21:10:16 | Re: Out of memory error on pg_restore |