Re: Partitioning documentation example - Mailing list pgsql-docs

From Bruce Momjian
Subject Re: Partitioning documentation example
Date
Msg-id 200801051737.m05HbWC08088@momjian.us
Whole thread Raw
In response to Partitioning documentation example  (Bruce Momjian <bruce@momjian.us>)
Responses Re: Partitioning documentation example
List pgsql-docs
bruce wrote:
> 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;

Because my EXECUTE example didn't work I have created a new example
using date_trunc(), which I think is less error-prone than the
comparisons done in the original example:

    CREATE OR REPLACE FUNCTION measurement_insert_trigger()
    RETURNS TRIGGER AS $$
    BEGIN
        IF date_trunc('month', NEW.logdate) = '2006-02-01' THEN
        INSERT INTO measurement_y2006m02 VALUES (NEW.*);
        ELSIF  date_trunc('month', NEW.logdate) = '2006-03-01' THEN
        INSERT INTO measurement_y2006m03 VALUES (NEW.*);
        ...
        ELSIF  date_trunc('month', NEW.logdate) = '2008-01-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;

--
  Bruce Momjian  <bruce@momjian.us>        http://momjian.us
  EnterpriseDB                             http://postgres.enterprisedb.com

  + If your life is a hard drive, Christ can be your backup. +

pgsql-docs by date:

Previous
From: Bruce Momjian
Date:
Subject: Re: Partitioning documentation example
Next
From: Tom Lane
Date:
Subject: Re: Partitioning documentation example