Hi Nikhil,

Here are a couple of questions:
- How do you ALTER the table to repartition it?
- The trigger function for inserts could be improved by using ELSE instead of independent IFs. This would ensure that the row is inserted in at most 1 partition. The last ELSE should raise an exception if there was no match (that would solve point 2 of your TODO list). - Another option is to have a separate trigger per child table and chain them to the master table. For example something like:
CREATE OR REPLACE FUNCTION child_insert_trigger()
RETURNS TRIGGER AS $$
BEGIN
 IF (NEW.date >= DATE(TG_ARGV[1]) AND NEW.date < DATE(TG_ARGV[2]) ) THEN
   INSERT INTO TG_ARGV[0] VALUES (NEW.*);
   RETURN NULL;
 END IF;
 RETURN NEW;
END;
$$
LANGUAGE plpgsql;
DROP TRIGGER IF EXISTS insert_child_trigger ON master;
CREATE TRIGGER insert_child_trigger_y2008m01
   BEFORE INSERT ON master
FOR EACH ROW EXECUTE PROCEDURE child_insert_trigger_date(child_y2008m01, '2008-01-01', '2008-02-01');

CREATE TRIGGER insert_child_trigger_y2008m02
   BEFORE INSERT ON master
FOR EACH ROW EXECUTE PROCEDURE child_insert_trigger_date(child_y2008m02, '2008-02-01', '2008-03-01');

CREATE TRIGGER insert_child_trigger_y2008m03
   BEFORE INSERT ON master
FOR EACH ROW EXECUTE PROCEDURE child_insert_trigger_date(child_y2008m03, '2008-03-01', '2008-04-01');

This might make it easier when you want to alter a specific partition rather than rewriting the whole trigger. Performance-wise, I am not sure how chained triggers will compare to the big if/then/else trigger.

- In the case of an insert, could it be possible to avoid the cost of a new INSERT statement (parser, planner, executor, etc...) by moving directly the tuple in the right table like the COPY code does? If we had an INSERT trigger code in C, given a HeapTuple and a target Relation we should be able to call heap_insert_tuple directly, with no parsing, planning, etc. required.

Thanks for your time,
Emmanuel

Hi,
        > > >
        > > >> Thanks for taking a look. But if I am not mistaken
        Gavin and co. are
        > working
        > > >> on a much exhaustive proposal. In light of that maybe
        this patch might
        > not
        > > >> be needed in the first place?
        > > >>
        > > >> I will wait for discussion and a subsequent collective
        consensus here,
        > > >> before deciding the further course of actions.
        > > >
        > > > I think it is unwise to wait on Gavin for a more complex
        implemention
        > > > ---  we might end up with nothing for 8.4.  As long as
        your syntax is
        > > > compatible with whatever Gavin proposed Gavin can add on
        to your patch
        > > > once it is applied.
        > > >
        > >
        > > seems like you're a prophet... or i miss something?
        > >
        >
        > :)
        >
        > Maybe I will try to summarize the functionality of this
        patch, rebase it
        > against latest CVS head and try to get it on the commitfest
        queue atleast
        > for further feedback to keep the ball rolling on
        auto-partitioning...
        >

        yeah! i was thinking on doing that but still have no time... and
        frankly you're the best man for the job ;)

        one thing i was thinking of is to use triggers instead of
        rules just
        as our current docs recommends
        http://www.postgresql.org/docs/8.3/static/ddl-partitioning.html

        with the benefit that a trigger can check if the child table
        exists
        for the range being inserted and if not it can create it first...
        haven't looked at the code in the detail but seems that your
        patch is
        still missing the "create rule" part so we are in time to change
        that... no?


    Yes triggers should be used instead of rules. Automatic generation
    of rules/triggers would be kind of hard and needs some looking
    into. Also there are issues like checking mutual exclusivity of
    the partition clauses specified too (I have been maintaining that
    the onus of ensuring sane partition ranges/clauses should rest
    with the users atleast initially..).

    I will take a stab at this again whenever I get some free cycles.


I have synced up and modified the patch against latest CVS sources. Am attaching the latest WIP patch here.

Am restating that its a WIP patch, more so because we really need feedback on this before trying to expend any energy trying to come up with a commit-able patch.

As per me, the syntax introduced by this patch should be similar to what was proposed by Gavin quite a while back and this patch essentially tries to bring together a bunch of ddl that would otherwise have been performed step-by-step in a manual fashion earlier. To summarize this patch provides a one-shot mechanism to:

--   * create master table
--   * create several child tables that inherit from this master table
--   * add appropriate constraints to each of the child tables
--   * create a trigger function to redirect insert, updates, deletes to
--     appropriate child tables (plpgsql language)
--   * create the trigger using the trigger function

I have created a new file (src/test/regress/sql/partition.sql) to show a couple of examples of the grammar and the working functionality:

There are TODOs like:
-- logic to ensure unique trigger function and trigger names
-- The trigger function body could raise an exception if the insert/update/delete operation does not fit into any single partition
-- logic to check mutual exclusivity of ranges/lists
-- misc. issues to convert it from wip to commit-ready

If we think this is ok as a first step towards auto-partitioning then we can do something more with this patch.

Regards,
Nikhils
--
http://www.enterprisedb.com
------------------------------------------------------------------------




--
Emmanuel Cecchet
FTO @ Frog Thinker Open Source Development & Consulting
--
Web: http://www.frogthinker.org
email: [EMAIL PROTECTED]
Skype: emmanuel_cecchet


--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to