Implement IF NOT EXISTS for CREATE SEQUENCE.
Fabrízio de Royes Mello
This commit is contained in:
parent
57ca1d4f01
commit
0076f264b6
@ -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>;
|
|||||||
</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)
|
|||||||
(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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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:
|
|||||||
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
|
|||||||
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');
|
|||||||
|
|
||||||
-- 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');
|
|||||||
|
|
||||||
-- 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);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user