diff options
Diffstat (limited to 'src/backend/commands/proclang.c')
-rw-r--r-- | src/backend/commands/proclang.c | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/src/backend/commands/proclang.c b/src/backend/commands/proclang.c index c900ad9431a..08f5e55dc22 100644 --- a/src/backend/commands/proclang.c +++ b/src/backend/commands/proclang.c @@ -16,6 +16,7 @@ #include "access/genam.h" #include "access/heapam.h" #include "access/htup_details.h" +#include "catalog/catalog.h" #include "catalog/dependency.h" #include "catalog/indexing.h" #include "catalog/objectaccess.h" @@ -329,6 +330,7 @@ create_proc_lang(const char *languageName, bool replace, NameData langname; HeapTuple oldtup; HeapTuple tup; + Oid langoid; bool is_update; ObjectAddress myself, referenced; @@ -356,19 +358,22 @@ create_proc_lang(const char *languageName, bool replace, if (HeapTupleIsValid(oldtup)) { + Form_pg_language oldform = (Form_pg_language) GETSTRUCT(oldtup); + /* There is one; okay to replace it? */ if (!replace) ereport(ERROR, (errcode(ERRCODE_DUPLICATE_OBJECT), errmsg("language \"%s\" already exists", languageName))); - if (!pg_language_ownercheck(HeapTupleGetOid(oldtup), languageOwner)) + if (!pg_language_ownercheck(oldform->oid, languageOwner)) aclcheck_error(ACLCHECK_NOT_OWNER, OBJECT_LANGUAGE, languageName); /* - * Do not change existing ownership or permissions. Note + * Do not change existing oid, ownership or permissions. Note * dependency-update code below has to agree with this decision. */ + replaces[Anum_pg_language_oid - 1] = false; replaces[Anum_pg_language_lanowner - 1] = false; replaces[Anum_pg_language_lanacl - 1] = false; @@ -376,12 +381,16 @@ create_proc_lang(const char *languageName, bool replace, tup = heap_modify_tuple(oldtup, tupDesc, values, nulls, replaces); CatalogTupleUpdate(rel, &tup->t_self, tup); + langoid = oldform->oid; ReleaseSysCache(oldtup); is_update = true; } else { /* Creating a new language */ + langoid = GetNewOidWithIndex(rel, LanguageOidIndexId, + Anum_pg_language_oid); + values[Anum_pg_language_oid - 1] = ObjectIdGetDatum(langoid); tup = heap_form_tuple(tupDesc, values, nulls); CatalogTupleInsert(rel, tup); is_update = false; @@ -394,7 +403,7 @@ create_proc_lang(const char *languageName, bool replace, * shared dependencies do *not* need to change, and we leave them alone.) */ myself.classId = LanguageRelationId; - myself.objectId = HeapTupleGetOid(tup); + myself.objectId = langoid; myself.objectSubId = 0; if (is_update) @@ -550,7 +559,8 @@ get_language_oid(const char *langname, bool missing_ok) { Oid oid; - oid = GetSysCacheOid1(LANGNAME, CStringGetDatum(langname)); + oid = GetSysCacheOid1(LANGNAME, Anum_pg_language_oid, + CStringGetDatum(langname)); if (!OidIsValid(oid) && !missing_ok) ereport(ERROR, (errcode(ERRCODE_UNDEFINED_OBJECT), |