diff --git a/src/backend/catalog/pg_collation.c b/src/backend/catalog/pg_collation.c index ce7e5fb5cc..33a5510bf9 100644 --- a/src/backend/catalog/pg_collation.c +++ b/src/backend/catalog/pg_collation.c @@ -70,6 +70,9 @@ CollationCreate(const char *collname, Oid collnamespace, AssertArg(collcollate); AssertArg(collctype); + /* open pg_collation; see below about the lock level */ + rel = heap_open(CollationRelationId, ShareRowExclusiveLock); + /* * Make sure there is no existing collation of same name & encoding. * @@ -83,9 +86,13 @@ CollationCreate(const char *collname, Oid collnamespace, ObjectIdGetDatum(collnamespace))) { if (quiet) + { + heap_close(rel, NoLock); return InvalidOid; + } else if (if_not_exists) { + heap_close(rel, NoLock); ereport(NOTICE, (errcode(ERRCODE_DUPLICATE_OBJECT), collencoding == -1 @@ -105,9 +112,6 @@ CollationCreate(const char *collname, Oid collnamespace, collname, pg_encoding_to_char(collencoding)))); } - /* open pg_collation; see below about the lock level */ - rel = heap_open(CollationRelationId, ShareRowExclusiveLock); - /* * Also forbid a specific-encoding collation shadowing an any-encoding * collation, or an any-encoding collation being shadowed (see