aboutsummaryrefslogtreecommitdiff
path: root/src/backend/commands/sequence.c
diff options
context:
space:
mode:
authorHeikki Linnakangas <heikki.linnakangas@iki.fi>2014-08-26 16:05:18 +0300
committerHeikki Linnakangas <heikki.linnakangas@iki.fi>2014-08-26 16:18:17 +0300
commit0076f264b6f24854219d49b159602e2042c38ee7 (patch)
tree7ea7316c5c6bf9ebbffb9b980d0123a2d68c6b0a /src/backend/commands/sequence.c
parent57ca1d4f0175f60e9cfb0f997c864173d9c72607 (diff)
downloadpostgresql-0076f264b6f24854219d49b159602e2042c38ee7.tar.gz
postgresql-0076f264b6f24854219d49b159602e2042c38ee7.zip
Implement IF NOT EXISTS for CREATE SEQUENCE.
Fabrízio de Royes Mello
Diffstat (limited to 'src/backend/commands/sequence.c')
-rw-r--r--src/backend/commands/sequence.c20
1 files changed, 19 insertions, 1 deletions
diff --git a/src/backend/commands/sequence.c b/src/backend/commands/sequence.c
index e6084203a88..3b89dd009bc 100644
--- a/src/backend/commands/sequence.c
+++ b/src/backend/commands/sequence.c
@@ -122,6 +122,24 @@ DefineSequence(CreateSeqStmt *seq)
(errcode(ERRCODE_FEATURE_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 */
init_params(seq->options, true, &new, &owned_by);
@@ -210,7 +228,7 @@ DefineSequence(CreateSeqStmt *seq)
stmt->options = NIL;
stmt->oncommit = ONCOMMIT_NOOP;
stmt->tablespacename = NULL;
- stmt->if_not_exists = false;
+ stmt->if_not_exists = seq->if_not_exists;
seqoid = DefineRelation(stmt, RELKIND_SEQUENCE, seq->ownerId);
Assert(seqoid != InvalidOid);