X-Original-To: pgsql-interfaces-postgresql.org@localhost.postgresql.org Received: from localhost (av.hub.org [200.46.204.144]) by svr1.postgresql.org (Postfix) with ESMTP id 9B8DDD8A61 for ; Mon, 12 Sep 2005 12:36:56 -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 65521-06 for ; Mon, 12 Sep 2005 15:36:54 +0000 (GMT) Received: from tigger.fuhr.org (tigger.fuhr.org [63.214.45.158]) by svr1.postgresql.org (Postfix) with ESMTP id 5B70DD89DE for ; Mon, 12 Sep 2005 12:36:53 -0300 (ADT) Received: from winnie.fuhr.org (winnie.fuhr.org [10.1.0.1]) by tigger.fuhr.org (8.13.3/8.13.3) with ESMTP id j8CFaldP043224 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Mon, 12 Sep 2005 09:36:50 -0600 (MDT) (envelope-from mfuhr@winnie.fuhr.org) Received: from winnie.fuhr.org (localhost [127.0.0.1]) by winnie.fuhr.org (8.13.3/8.13.3) with ESMTP id j8CFalRh055092; Mon, 12 Sep 2005 09:36:47 -0600 (MDT) (envelope-from mfuhr@winnie.fuhr.org) Received: (from mfuhr@localhost) by winnie.fuhr.org (8.13.3/8.13.3/Submit) id j8CFalRn055091; Mon, 12 Sep 2005 09:36:47 -0600 (MDT) (envelope-from mfuhr) Date: Mon, 12 Sep 2005 09:36:46 -0600 From: Michael Fuhr To: fabrizio picca Cc: pgsql-interfaces@postgresql.org Subject: Re: help needed on SPI_modifytuple. Message-ID: <20050912153646.GA55025@winnie.fuhr.org> References: <1532344d050912071740e7c5d9@mail.gmail.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1532344d050912071740e7c5d9@mail.gmail.com> X-Virus-Scanned: by amavisd-new at hub.org X-Spam-Status: No, hits=0.005 required=5 tests=[AWL=0.005] X-Spam-Level: X-Archive-Number: 200509/14 X-Sequence-Number: 5737 On Mon, Sep 12, 2005 at 04:17:33PM +0200, fabrizio picca wrote: > I'm trying to sipmply modify a tuple before it will be inserted in the db. > The problem is that when it try to insert the modified tuple with > SPI_modifytuple all i get is a SPI_ERROR_ARGUMENT negative (-6) . > Could someone help me? i'm reallygoing crazy. > > What i did is just a fire-before C trigger that acts like this: Is the trigger fired on INSERT, UPDATE, or both? > oldtuple = trigdata->tg_trigtuple; > newtuple = trigdata->tg_newtuple; [...] > rettuple=SPI_modifytuple(rel,newtuple,1,&attnum,&new_value,&isnull); I didn't look closely at the rest of the code, but if the trigger is fired on INSERT then you should pass oldtuple; newtuple will be NULL, causing SPI_modifytuple() to fail with SPI_ERROR_ARGUMENT. Here's an extract from "Writing Trigger Functions in C" in the "Triggers" chapter of the documentation: tg_trigtuple A pointer to the row for which the trigger was fired. This is the row being inserted, updated, or deleted. If this trigger was fired for an INSERT or DELETE then this is what you should return from the function if you don't want to replace the row with a different one (in the case of INSERT) or skip the operation. tg_newtuple A pointer to the new version of the row, if the trigger was fired for an UPDATE, and NULL if it is for an INSERT or a DELETE. This is what you have to return from the function if the event is an UPDATE and you don't want to replace this row by a different one or skip the operation. -- Michael Fuhr