41 const char *languageName =
stmt->plname;
51 bool nulls[Natts_pg_language];
52 bool replaces[Natts_pg_language];
67 (
errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
68 errmsg(
"must be superuser to create custom procedural language")));
77 if (funcrettype != LANGUAGE_HANDLEROID)
79 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
80 errmsg(
"function %s must return type %s",
86 funcargtypes[0] = INTERNALOID;
94 if (
stmt->plvalidator)
96 funcargtypes[0] = OIDOID;
109 memset(nulls,
false,
sizeof(nulls));
110 memset(replaces,
true,
sizeof(replaces));
120 nulls[Anum_pg_language_lanacl - 1] =
true;
133 errmsg(
"language \"%s\" already exists", languageName)));
146 replaces[Anum_pg_language_oid - 1] =
false;
147 replaces[Anum_pg_language_lanowner - 1] =
false;
148 replaces[Anum_pg_language_lanacl - 1] =
false;
154 langoid = oldform->oid;
162 Anum_pg_language_oid);
175 myself.
classId = LanguageRelationId;
236 (
errcode(ERRCODE_UNDEFINED_OBJECT),
237 errmsg(
"language \"%s\" does not exist", langname)));
void aclcheck_error(AclResult aclerr, ObjectType objtype, const char *objectname)
bool object_ownercheck(Oid classid, Oid objectid, Oid roleid)
static Datum values[MAXATTR]
#define OidIsValid(objectId)
Oid GetNewOidWithIndex(Relation relation, Oid indexId, AttrNumber oidcolumn)
void record_object_address_dependencies(const ObjectAddress *depender, ObjectAddresses *referenced, DependencyType behavior)
ObjectAddresses * new_object_addresses(void)
void add_exact_object_address(const ObjectAddress *object, ObjectAddresses *addrs)
void free_object_addresses(ObjectAddresses *addrs)
int errcode(int sqlerrcode)
int errmsg(const char *fmt,...)
#define ereport(elevel,...)
HeapTuple heap_form_tuple(TupleDesc tupleDescriptor, Datum *values, bool *isnull)
HeapTuple heap_modify_tuple(HeapTuple tuple, TupleDesc tupleDesc, Datum *replValues, bool *replIsnull, bool *doReplace)
#define HeapTupleIsValid(tuple)
void CatalogTupleUpdate(Relation heapRel, ItemPointer otid, HeapTuple tup)
void CatalogTupleInsert(Relation heapRel, HeapTuple tup)
Assert(fmt[strlen(fmt) - 1] !='\n')
Oid get_func_rettype(Oid funcid)
void namestrcpy(Name name, const char *str)
char * NameListToString(const List *names)
#define InvokeObjectPostCreateHook(classId, objectId, subId)
#define ObjectAddressSet(addr, class_id, object_id)
Oid LookupFuncName(List *funcname, int nargs, const Oid *argtypes, bool missing_ok)
long deleteDependencyRecordsFor(Oid classId, Oid objectId, bool skipExtensionDeps)
void recordDependencyOnCurrentExtension(const ObjectAddress *object, bool isReplace)
FormData_pg_language * Form_pg_language
void recordDependencyOnOwner(Oid classId, Oid objectId, Oid owner)
static Datum PointerGetDatum(const void *X)
static Datum BoolGetDatum(bool X)
static Datum ObjectIdGetDatum(Oid X)
static Datum NameGetDatum(const NameData *X)
static Datum CStringGetDatum(const char *X)
Oid get_language_oid(const char *langname, bool missing_ok)
ObjectAddress CreateProceduralLanguage(CreatePLangStmt *stmt)
#define RelationGetDescr(relation)
#define ERRCODE_DUPLICATE_OBJECT
void ReleaseSysCache(HeapTuple tuple)
HeapTuple SearchSysCache1(int cacheId, Datum key1)
#define GetSysCacheOid1(cacheId, oidcol, key1)
void table_close(Relation relation, LOCKMODE lockmode)
Relation table_open(Oid relationId, LOCKMODE lockmode)