Re: create if not exists (CINE)

From: Dawid Kuroczko <qnex42(at)gmail(dot)com>
To: Asko Oja <ascoja(at)gmail(dot)com>
Cc: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>, Robert Haas <robertmhaas(at)gmail(dot)com>, Andrew Dunstan <andrew(at)dunslane(dot)net>, Chris Browne <cbbrowne(at)acm(dot)org>, pgsql-hackers(at)postgresql(dot)org
Subject: Re: create if not exists (CINE)
Date: 2009-05-06 13:04:50
Message-ID: 758d5e7f0905060604v3a5d9cd8y37d56204d2354236@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

On Wed, May 6, 2009 at 7:22 AM, Asko Oja <ascoja(at)gmail(dot)com> wrote:
> It was just yesterday when i wondering why we don't have this feature (i was
> trying to use it and it wasn't there :).
> The group of people who think it's unsafe should not use the feature.
> Clearly this feature would be useful when managing large amounts of servers
> and would simplify our release process.
>
> On Wed, May 6, 2009 at 5:13 AM, Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us> wrote:
[...]
>> Yes, I did.  I'm not any more convinced than I was before.  In
>> particular, the example you give is handled reasonably well without
>> *any* new features, if one merely ignores "object already exists"
>> errors.
>
> It sounds pretty amazing. Ignoring errors as a suggested way to use
> PostgreSQL.
> We run our release scripts inside transactions (with exception of concurrent
> index creation). So if something unexpected happens we are left still in
> working state.
> PostgreSQL ability to do DDL changes inside transaction was one of biggest
> surprises/improvements when switching from Oracle. Now you try to bring us
> down back to the level of Oracle :)

Hm, You can do it easily today with help of PL/PgSQL, say like this:

CREATE OR REPLACE FUNCTION foo_upgrade() RETURNS VOID AS $$
BEGIN
BEGIN
CREATE TABLE foo(i int, t text);
EXCEPTION
WHEN duplicate_table THEN RAISE NOTICE 'Table foo already exists';
END;
BEGIN
ALTER TABLE foo ADD COLUMN t text;
EXCEPTION
WHEN duplicate_column THEN RAISE NOTICE 'Column foo.t already exists';
END;
END;

...the only drawback is that you need to have PL/PgSQL installed. :-)

Personally I don't like 'CREATE IF NOT EXISTS'. I find it 'messy'. :-)

What I wish PostgreSQL would have is ability to do "conditional
rollback to savepoint".
This way one could write a PostgreSQL SQL script that would contain conditional
behaviour similar to exceptions handling above. For instance backend could
handle sort of EXCEPTION clause:

SAVEPOINT create_foo;
CREATE TABLE foo(i int, t text);

START EXCEPTION WHEN duplicate_table;
-- if there was duplicate_table exception, all
-- commands within this block are executed.
-- if there was no error, all commands are
-- ignored, until we reach 'END EXCEPTION;'
-- command.
ROLLBACK TO create_foo;
ALTER TABLE foo ADD COLUMN t text;
END EXCEPTION;

...or some \conditional commands at psql client side.

Just my 0.02 :)

Best regards,
Dawid
--
.................. ``The essence of real creativity is a certain
: *Dawid Kuroczko* : playfulness, a flitting from idea to idea
: qnex42(at)gmail(dot)com : without getting bogged down by fixated demands.''
`..................' Sherkaner Underhill, A Deepness in the Sky, V. Vinge

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Mikael Krantz 2009-05-06 13:22:02 BUG #4796: Recovery followed by backup creates unrecoverable WAL-file
Previous Message Andrew Dunstan 2009-05-06 12:02:13 Re: bytea vs. pg_dump