Re: creating a function with another function

From: David Fetter <david(at)fetter(dot)org>
To: Dave Huber <DHuber(at)letourneautechnologies(dot)com>
Cc: 'Merlin Moncure' <mmoncure(at)gmail(dot)com>, "pgsql-general(at)postgresql(dot)org" <pgsql-general(at)postgresql(dot)org>
Subject: Re: creating a function with another function
Date: 2009-10-12 21:13:23
Message-ID: 20091012211323.GI14810@fetter.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

On Mon, Oct 12, 2009 at 03:36:47PM -0500, Dave Huber wrote:
> > Surely, there are valid cases of having a function create a
> > function. Suppose (just off the top of my head), you create a
> > helper function that generates triggers on a table for record
> > archiving.
>
> My application is for archiving. I'm using partitioned tables (each
> 100000 records)

That seems awfully small. Are the rows really wide?

> to keep a rolling archive of the last 10 million. I already need to
> setup a trigger function for inserting into the latest partition.
> What I'd like to do is automate the process of creating a new table
> with a name based off the record ID, a bigserial that is used to
> defining each partition. Whether its automated or not, every 100000
> record inserts will require 3 actions:
>
> 1. create a new partition,

This part is just begging for nasty race conditions. It's better to
pre-create your partitions.

> 2. modify the insert trigger function, and

That, you could do with CREATE OR REPLACE.

> 3. truncate and drop the oldest partition.

If you're going to drop it, you don't need to truncate, and /vice versa/.

> A number of things complicate the process for me. I'm using a COPY
> statement to bulk insert a varying number of records that can occur
> at different intervals of time. Also, the application starts and
> stops at various times, so it must be able to initialize based on
> the state of the database on startup.
>
> Is there a way to dynamically create table names within a function
> based on a numeric value? I want to be able to name the partitions
> log_1, log_2, ..., log_x, where x is the record ID / 100000.

For the reason I stated earlier, on-demand DDL is not a great idea.
You can write a program in whatever language is convenient to generate
the CREATE TABLE statements and feed that in.

> I would also have to be able to truncate the same way, by
> dynamically specifying the name of the table to be deleted.

You could make an SQL function that executes a TRUNCATE.

> Well, I appreciate the help, anyway.

More help is available :)

Cheers,
David.

P.S. Thanks for giving more context to what you're doing. It's
always handy to have some of that :)
--
David Fetter <david(at)fetter(dot)org> http://fetter.org/
Phone: +1 415 235 3778 AIM: dfetter666 Yahoo!: dfetter
Skype: davidfetter XMPP: david(dot)fetter(at)gmail(dot)com

Remember to vote!
Consider donating to Postgres: http://www.postgresql.org/about/donate

In response to

Browse pgsql-general by date

  From Date Subject
Next Message Bill Todd 2009-10-12 23:18:41 Re: Nested transactions
Previous Message Dave Huber 2009-10-12 20:36:47 Re: creating a function with another function