Received: from maia.hub.org (maia-2.hub.org [200.46.204.251]) by mail.postgresql.org (Postfix) with ESMTP id 25E2E3B9519 for ; Wed, 9 Nov 2011 21:45:09 -0400 (AST) Received: from mail.postgresql.org ([200.46.204.86]) by maia.hub.org (mx1.hub.org [200.46.204.251]) (amavisd-maia, port 10024) with ESMTP id 75775-06 for ; Thu, 10 Nov 2011 01:45:01 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.8.0-rc2 Received: from mail-yx0-f174.google.com (mail-yx0-f174.google.com [209.85.213.174]) by mail.postgresql.org (Postfix) with ESMTP id A01C13B9517 for ; Wed, 9 Nov 2011 21:45:00 -0400 (AST) Received: by yenr9 with SMTP id r9so1331811yen.19 for ; Wed, 09 Nov 2011 17:44:59 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc:content-type:content-transfer-encoding; bh=URa3i8aB4ps7SBkYuDg3lI6xsTx+lDAAXOncTtrgeLk=; b=uhFhMQbW2sIdi/ysV+2O4dEwuVtVIyeb66RZ/Ps2c7LD+MwkodyVVJ2Oj3L/E8+CPE nj1Rm76TJXGo3HwOK9EG+hKDoSLrjuyuyvF4jfe/tDOsnL5uiG9ZG2oOGhjSyQdyMoQ4 ZfKFRpG83Hm6hM+6bUlOTOqcybKBQW5864Mak= Received: by 10.68.20.233 with SMTP id q9mr5071255pbe.99.1320889499039; Wed, 09 Nov 2011 17:44:59 -0800 (PST) MIME-Version: 1.0 Received: by 10.68.66.170 with HTTP; Wed, 9 Nov 2011 17:44:38 -0800 (PST) In-Reply-To: References: From: Josh Kupershmidt Date: Wed, 9 Nov 2011 20:44:38 -0500 Message-ID: Subject: Re: Partitionning + Trigger and Execute not working as expected To: Sylvain Mougenot Cc: pgsql-sql@postgresql.org Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable X-Virus-Scanned: Maia Mailguard 1.0.1 X-Spam-Status: No, hits=-1.899 tagged_above=-5 required=5 tests=BAYES_00=-1.9, FREEMAIL_FROM=0.001 X-Spam-Level: X-Archive-Number: 201111/47 X-Sequence-Number: 36020 On Wed, Nov 9, 2011 at 4:39 PM, Sylvain Mougenot wrote= : > As I mentioned before, your code works on special cases (insert with all = the > columns) and those are very few cases. > Try this > CREATE TABLE foo (a int, b int); > CREATE TABLE job_2011_11 (c int, d int); > > CREATE OR REPLACE FUNCTION job_insert_trigger() > RETURNS TRIGGER AS > $BODY$ > DECLARE > =A0 =A0 =A0 =A0currentTableName character varying :=3D 'job_' || '2011_11= '; > BEGIN > =A0 =A0 =A0 =A0EXECUTE 'INSERT INTO '|| currentTableName || ' values ' ||= (NEW.*); > =A0 =A0 =A0 =A0RETURN NULL; > END; > $BODY$ > =A0LANGUAGE plpgsql VOLATILE > =A0COST 100; > > CREATE TRIGGER job_insert_trg BEFORE INSERT ON foo > =A0FOR EACH ROW EXECUTE PROCEDURE job_insert_trigger(); > INSERT INTO foo (a, b) VALUES (1, 2); > INSERT INTO foo (a) VALUES (10); > ERROR: > LINE 1: INSERT INTO job_2011_11 values (10,) > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 =A0^ > QUERY: =A0INSERT INTO job_2011_11 values (10,) > CONTEXT: =A0PL/pgSQL function "job_insert_trigger" line 5 at instruction > EXECUTE Oh, I see what you're on about now. Sounds like you're looking for the USING clause of EXECUTE. Try this: CREATE OR REPLACE FUNCTION job_insert_trigger() RETURNS TRIGGER AS $BODY$ DECLARE currentTableName character varying :=3D 'job_' || '2011_11'; BEGIN EXECUTE 'INSERT INTO '|| currentTableName || ' (c, d) VALUES ($1, $2= )' USING NEW.a, NEW.b; RETURN NULL; END; $BODY$ LANGUAGE plpgsql VOLATILE COST 100; Josh