Received: from localhost (unknown [200.46.204.191]) by postgresql.org (Postfix) with ESMTP id 1D6E02E3D16 for ; Fri, 4 Jan 2008 11:29:03 -0400 (AST) Received: from postgresql.org ([200.46.204.71]) by localhost (mx1.hub.org [200.46.204.191]) (amavisd-maia, port 10024) with ESMTP id 03895-02-6 for ; Fri, 4 Jan 2008 11:28:52 -0400 (AST) Received: from momjian.us (momjian.us [70.90.9.53]) by postgresql.org (Postfix) with ESMTP id 951462E0168 for ; Fri, 4 Jan 2008 11:27:10 -0400 (AST) Received: (from bruce@localhost) by momjian.us (8.11.6/8.11.6) id m04FR7L19863; Fri, 4 Jan 2008 10:27:07 -0500 (EST) From: Bruce Momjian Message-Id: <200801041527.m04FR7L19863@momjian.us> Subject: Partitioning documentation example To: Simon Riggs Date: Fri, 4 Jan 2008 10:27:07 -0500 (EST) CC: PostgreSQL-documentation X-Mailer: ELM [version 2.4ME+ PL124 (25)] MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="US-ASCII" X-Virus-Scanned: Maia Mailguard 1.0.1 X-Archive-Number: 200801/1 X-Sequence-Number: 4730 Simon, I was looking at the new table partitioning documentation that recommends triggers: http://developer.postgresql.org/pgdocs/postgres/ddl-partitioning.html#DDL-PARTITIONING-IMPLEMENTATION and came upon this trigger function example: CREATE OR REPLACE FUNCTION measurement_insert_trigger() RETURNS TRIGGER AS $$ BEGIN IF ( NEW.logdate >= DATE '2006-02-01' AND NEW.logdate < DATE '2006-03-01' ) THEN INSERT INTO measurement_y2006m02 VALUES (NEW.*); ELSIF ( NEW.logdate >= DATE '2006-03-01' AND NEW.logdate < DATE '2006-04-01' ) THEN INSERT INTO measurement_y2006m03 VALUES (NEW.*); ... ELSIF ( NEW.logdate >= DATE '2008-01-01' AND NEW.logdate < DATE '2008-02-01' ) THEN INSERT INTO measurement_y2008m01 VALUES (NEW.*); ELSE RAISE EXCEPTION 'Date out of range. Fix the measurement_insert_trigger() function!'; END IF; RETURN NULL; END; $$ LANGUAGE plpgsql; It seems to me it would be much clearer if we added a second example that used to_char() to create the INSERT statement dynamically based on NEW.logdate: CREATE OR REPLACE FUNCTION measurement_insert_trigger() RETURNS TRIGGER AS $$ BEGIN EXECUTE 'INSERT INTO measurement_y' || to_char(NEW.logdate,'YYYY_mMM') || ' VALUES (NEW.*)'; END; $$ LANGUAGE plpgsql; It will of course fail if the table does not exist, which I think is what we want. This trigger function would not have to be modified when new tables are added. -- Bruce Momjian http://momjian.us EnterpriseDB http://postgres.enterprisedb.com + If your life is a hard drive, Christ can be your backup. +