diff options
Diffstat (limited to 'src/backend/catalog/pg_enum.c')
-rw-r--r-- | src/backend/catalog/pg_enum.c | 18 |
1 files changed, 17 insertions, 1 deletions
diff --git a/src/backend/catalog/pg_enum.c b/src/backend/catalog/pg_enum.c index 8ddb376bc16..f3161efb20b 100644 --- a/src/backend/catalog/pg_enum.c +++ b/src/backend/catalog/pg_enum.c @@ -179,7 +179,8 @@ void AddEnumLabel(Oid enumTypeOid, const char *newVal, const char *neighbor, - bool newValIsAfter) + bool newValIsAfter, + bool skipIfExists) { Relation pg_enum; Oid newOid; @@ -211,6 +212,21 @@ AddEnumLabel(Oid enumTypeOid, */ LockDatabaseObject(TypeRelationId, enumTypeOid, 0, ExclusiveLock); + /* Do the "IF NOT EXISTS" test if specified */ + if (skipIfExists) + { + HeapTuple tup; + + tup = SearchSysCache2(ENUMTYPOIDNAME, + ObjectIdGetDatum(enumTypeOid), + CStringGetDatum(newVal)); + if (HeapTupleIsValid(tup)) + { + ReleaseSysCache(tup); + return; + } + } + pg_enum = heap_open(EnumRelationId, RowExclusiveLock); /* If we have to renumber the existing members, we restart from here */ |