X-Original-To: pgsql-sql-postgresql.org@localhost.postgresql.org Received: from localhost (unknown [200.46.204.144]) by svr1.postgresql.org (Postfix) with ESMTP id CC5593A4B85 for ; Fri, 19 Nov 2004 16:23:25 +0000 (GMT) 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 67777-02 for ; Fri, 19 Nov 2004 16:23:24 +0000 (GMT) Received: from tigger.fuhr.org (tigger.fuhr.org [63.214.45.158]) by svr1.postgresql.org (Postfix) with ESMTP id C02F53A4B0E for ; Fri, 19 Nov 2004 16:23:22 +0000 (GMT) Received: from winnie.fuhr.org (winnie.fuhr.org [10.1.0.1]) by tigger.fuhr.org (8.13.1/8.13.1) with ESMTP id iAJGNAqb005548 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 19 Nov 2004 09:23:12 -0700 (MST) (envelope-from mfuhr@winnie.fuhr.org) Received: from winnie.fuhr.org (localhost [127.0.0.1]) by winnie.fuhr.org (8.13.1/8.13.1) with ESMTP id iAJGN9Ne097518; Fri, 19 Nov 2004 09:23:10 -0700 (MST) (envelope-from mfuhr@winnie.fuhr.org) Received: (from mfuhr@localhost) by winnie.fuhr.org (8.13.1/8.13.1/Submit) id iAJGN9FB097517; Fri, 19 Nov 2004 09:23:09 -0700 (MST) (envelope-from mfuhr) Date: Fri, 19 Nov 2004 09:23:09 -0700 From: Michael Fuhr To: Richard Huxton Cc: abief_ag_-postgresql@yahoo.com, pgsql-sql@postgresql.org Subject: Re: transactions in functions, possible bug or what I'm doing Message-ID: <20041119162309.GA77593@winnie.fuhr.org> References: <20041119115231.27648.qmail@web13924.mail.yahoo.com> <419DEE1B.6010805@archonet.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <419DEE1B.6010805@archonet.com> X-Virus-Scanned: by amavisd-new at hub.org X-Spam-Status: No, hits=0.3 tagged_above=0.0 required=5.0 tests=UPPERCASE_25_50 X-Spam-Level: X-Archive-Number: 200411/198 X-Sequence-Number: 19517 On Fri, Nov 19, 2004 at 12:59:07PM +0000, Richard Huxton wrote: > You can have what are called "savepoints" in version 8.0 though, which > lets you trap errors and rollback to a named (saved) point in your function. Savepoints in functions don't work as of 8.0.0beta4, unless I'm doing something wrong: CREATE TABLE foo (id SERIAL PRIMARY KEY, name TEXT NOT NULL); CREATE FUNCTION fooins(TEXT) RETURNS BOOLEAN AS $$ BEGIN SAVEPOINT x; INSERT INTO foo (name) VALUES ($1); ROLLBACK TO x; RETURN TRUE; END; $$ LANGUAGE plpgsql; BEGIN; SELECT fooins('John'); ERROR: SPI_execute_plan failed executing query "SAVEPOINT x": SPI_ERROR_TRANSACTION CONTEXT: PL/pgSQL function "fooins" line 2 at SQL statement Error trapping does work, however: CREATE FUNCTION fooins(TEXT) RETURNS BOOLEAN AS $$ BEGIN INSERT INTO foo (name) VALUES ($1 || '-1'); BEGIN INSERT INTO foo (id, name) VALUES (currval('foo_id_seq'), $1 || '-2'); EXCEPTION WHEN unique_violation THEN NULL; END; INSERT INTO foo (name) VALUES ($1 || '-3'); RETURN TRUE; END; $$ LANGUAGE plpgsql; SELECT fooins('John'); fooins -------- t (1 row) SELECT * FROM foo; id | name ----+-------- 1 | John-1 2 | John-3 (2 rows) -- Michael Fuhr http://www.fuhr.org/~mfuhr/