Commit 0076f264 authored by Heikki Linnakangas's avatar Heikki Linnakangas

Implement IF NOT EXISTS for CREATE SEQUENCE.

Fabrízio de Royes Mello
parent 57ca1d4f
...@@ -21,7 +21,7 @@ PostgreSQL documentation ...@@ -21,7 +21,7 @@ PostgreSQL documentation
<refsynopsisdiv> <refsynopsisdiv>
<synopsis> <synopsis>
CREATE [ TEMPORARY | TEMP ] SEQUENCE <replaceable class="parameter">name</replaceable> [ INCREMENT [ BY ] <replaceable class="parameter">increment</replaceable> ] CREATE [ TEMPORARY | TEMP ] [ IF NOT EXISTS ] SEQUENCE <replaceable class="parameter">name</replaceable> [ INCREMENT [ BY ] <replaceable class="parameter">increment</replaceable> ]
[ MINVALUE <replaceable class="parameter">minvalue</replaceable> | NO MINVALUE ] [ MAXVALUE <replaceable class="parameter">maxvalue</replaceable> | NO MAXVALUE ] [ MINVALUE <replaceable class="parameter">minvalue</replaceable> | NO MINVALUE ] [ MAXVALUE <replaceable class="parameter">maxvalue</replaceable> | NO MAXVALUE ]
[ START [ WITH ] <replaceable class="parameter">start</replaceable> ] [ CACHE <replaceable class="parameter">cache</replaceable> ] [ [ NO ] CYCLE ] [ START [ WITH ] <replaceable class="parameter">start</replaceable> ] [ CACHE <replaceable class="parameter">cache</replaceable> ] [ [ NO ] CYCLE ]
[ OWNED BY { <replaceable class="parameter">table_name</replaceable>.<replaceable class="parameter">column_name</replaceable> | NONE } ] [ OWNED BY { <replaceable class="parameter">table_name</replaceable>.<replaceable class="parameter">column_name</replaceable> | NONE } ]
...@@ -89,6 +89,18 @@ SELECT * FROM <replaceable>name</replaceable>; ...@@ -89,6 +89,18 @@ SELECT * FROM <replaceable>name</replaceable>;
</listitem> </listitem>
</varlistentry> </varlistentry>
<varlistentry>
<term><literal>IF NOT EXISTS</literal></term>
<listitem>
<para>
Do not throw an error if a relation with the same name already exists.
A notice is issued in this case. Note that there is no guarantee that
the existing relation is anything like the sequence that would have
been created - it might not even be a sequence.
</para>
</listitem>
</varlistentry>
<varlistentry> <varlistentry>
<term><replaceable class="parameter">name</replaceable></term> <term><replaceable class="parameter">name</replaceable></term>
<listitem> <listitem>
......
...@@ -122,6 +122,24 @@ DefineSequence(CreateSeqStmt *seq) ...@@ -122,6 +122,24 @@ DefineSequence(CreateSeqStmt *seq)
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED), (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
errmsg("unlogged sequences are not supported"))); errmsg("unlogged sequences are not supported")));
/*
* If if_not_exists was given and a relation with the same name already
* exists, bail out. (Note: we needn't check this when not if_not_exists,
* because DefineRelation will complain anyway.)
*/
if (seq->if_not_exists)
{
RangeVarGetAndCheckCreationNamespace(seq->sequence, NoLock, &seqoid);
if (OidIsValid(seqoid))
{
ereport(NOTICE,
(errcode(ERRCODE_DUPLICATE_TABLE),
errmsg("relation \"%s\" already exists, skipping",
seq->sequence->relname)));
return InvalidOid;
}
}
/* Check and set all option values */ /* Check and set all option values */
init_params(seq->options, true, &new, &owned_by); init_params(seq->options, true, &new, &owned_by);
...@@ -210,7 +228,7 @@ DefineSequence(CreateSeqStmt *seq) ...@@ -210,7 +228,7 @@ DefineSequence(CreateSeqStmt *seq)
stmt->options = NIL; stmt->options = NIL;
stmt->oncommit = ONCOMMIT_NOOP; stmt->oncommit = ONCOMMIT_NOOP;
stmt->tablespacename = NULL; stmt->tablespacename = NULL;
stmt->if_not_exists = false; stmt->if_not_exists = seq->if_not_exists;
seqoid = DefineRelation(stmt, RELKIND_SEQUENCE, seq->ownerId); seqoid = DefineRelation(stmt, RELKIND_SEQUENCE, seq->ownerId);
Assert(seqoid != InvalidOid); Assert(seqoid != InvalidOid);
......
...@@ -3330,6 +3330,7 @@ _copyCreateSeqStmt(const CreateSeqStmt *from) ...@@ -3330,6 +3330,7 @@ _copyCreateSeqStmt(const CreateSeqStmt *from)
COPY_NODE_FIELD(sequence); COPY_NODE_FIELD(sequence);
COPY_NODE_FIELD(options); COPY_NODE_FIELD(options);
COPY_SCALAR_FIELD(ownerId); COPY_SCALAR_FIELD(ownerId);
COPY_SCALAR_FIELD(if_not_exists);
return newnode; return newnode;
} }
......
...@@ -1566,6 +1566,7 @@ _equalCreateSeqStmt(const CreateSeqStmt *a, const CreateSeqStmt *b) ...@@ -1566,6 +1566,7 @@ _equalCreateSeqStmt(const CreateSeqStmt *a, const CreateSeqStmt *b)
COMPARE_NODE_FIELD(sequence); COMPARE_NODE_FIELD(sequence);
COMPARE_NODE_FIELD(options); COMPARE_NODE_FIELD(options);
COMPARE_SCALAR_FIELD(ownerId); COMPARE_SCALAR_FIELD(ownerId);
COMPARE_SCALAR_FIELD(if_not_exists);
return true; return true;
} }
......
...@@ -3486,6 +3486,17 @@ CreateSeqStmt: ...@@ -3486,6 +3486,17 @@ CreateSeqStmt:
n->sequence = $4; n->sequence = $4;
n->options = $5; n->options = $5;
n->ownerId = InvalidOid; n->ownerId = InvalidOid;
n->if_not_exists = false;
$$ = (Node *)n;
}
| CREATE OptTemp SEQUENCE IF_P NOT EXISTS qualified_name OptSeqOptList
{
CreateSeqStmt *n = makeNode(CreateSeqStmt);
$7->relpersistence = $2;
n->sequence = $7;
n->options = $8;
n->ownerId = InvalidOid;
n->if_not_exists = true;
$$ = (Node *)n; $$ = (Node *)n;
} }
; ;
......
...@@ -1979,6 +1979,7 @@ typedef struct CreateSeqStmt ...@@ -1979,6 +1979,7 @@ typedef struct CreateSeqStmt
RangeVar *sequence; /* the sequence to create */ RangeVar *sequence; /* the sequence to create */
List *options; List *options;
Oid ownerId; /* ID of owner, or InvalidOid for default */ Oid ownerId; /* ID of owner, or InvalidOid for default */
bool if_not_exists; /* just do nothing if it already exists? */
} CreateSeqStmt; } CreateSeqStmt;
typedef struct AlterSeqStmt typedef struct AlterSeqStmt
......
...@@ -91,6 +91,8 @@ SELECT nextval('serialTest2_f6_seq'); ...@@ -91,6 +91,8 @@ SELECT nextval('serialTest2_f6_seq');
-- basic sequence operations using both text and oid references -- basic sequence operations using both text and oid references
CREATE SEQUENCE sequence_test; CREATE SEQUENCE sequence_test;
CREATE SEQUENCE IF NOT EXISTS sequence_test;
NOTICE: relation "sequence_test" already exists, skipping
SELECT nextval('sequence_test'::text); SELECT nextval('sequence_test'::text);
nextval nextval
--------- ---------
......
...@@ -59,6 +59,7 @@ SELECT nextval('serialTest2_f6_seq'); ...@@ -59,6 +59,7 @@ SELECT nextval('serialTest2_f6_seq');
-- basic sequence operations using both text and oid references -- basic sequence operations using both text and oid references
CREATE SEQUENCE sequence_test; CREATE SEQUENCE sequence_test;
CREATE SEQUENCE IF NOT EXISTS sequence_test;
SELECT nextval('sequence_test'::text); SELECT nextval('sequence_test'::text);
SELECT nextval('sequence_test'::regclass); SELECT nextval('sequence_test'::regclass);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment