PostgreSQL Source Code: src/backend/commands/proclang.c Source File (original) (raw)

1

2

3

4

5

6

7

8

9

10

11

12

13

15

32

33

34

35

36

39{

40 const char *languageName = stmt->plname;

42 Oid handlerOid,

43 inlineOid,

44 valOid;

45 Oid funcrettype;

46 Oid funcargtypes[1];

50 bool nulls[Natts_pg_language];

51 bool replaces[Natts_pg_language];

55 Oid langoid;

56 bool is_update;

58 referenced;

60

61

62

63

66 (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),

67 errmsg("must be superuser to create custom procedural language")));

68

69

70

71

72

76 if (funcrettype != LANGUAGE_HANDLEROID)

78 (errcode(ERRCODE_WRONG_OBJECT_TYPE),

79 errmsg("function %s must return type %s",

81

82

83 if (stmt->plinline)

84 {

85 funcargtypes[0] = INTERNALOID;

87

88 }

89 else

91

92

93 if (stmt->plvalidator)

94 {

95 funcargtypes[0] = OIDOID;

97

98 }

99 else

101

102

105

106

108 memset(nulls, false, sizeof(nulls));

109 memset(replaces, true, sizeof(replaces));

110

119 nulls[Anum_pg_language_lanacl - 1] = true;

120

121

123

125 {

127

128

129 if (stmt->replace)

132 errmsg("language \"%s\" already exists", languageName)));

133

134

135#ifdef NOT_USED

136 if (object\_ownercheck(LanguageRelationId, oldform->oid, languageOwner))

138 languageName);

139#endif

140

141

142

143

144

145 replaces[Anum_pg_language_oid - 1] = false;

146 replaces[Anum_pg_language_lanowner - 1] = false;

147 replaces[Anum_pg_language_lanacl - 1] = false;

148

149

152

153 langoid = oldform->oid;

155 is_update = true;

156 }

157 else

158 {

159

161 Anum_pg_language_oid);

165 is_update = false;

166 }

167

168

169

170

171

172

173

174 myself.classId = LanguageRelationId;

177

178 if (is_update)

180

181

182 if (!is_update)

184 languageOwner);

185

186

188

190

191

192 ObjectAddressSet(referenced, ProcedureRelationId, handlerOid);

194

195

197 {

198 ObjectAddressSet(referenced, ProcedureRelationId, inlineOid);

200 }

201

202

204 {

207 }

208

211

212

214

216

217 return myself;

218}

219

220

221

222

223

224

225

228{

230

235 (errcode(ERRCODE_UNDEFINED_OBJECT),

236 errmsg("language \"%s\" does not exist", langname)));

237 return oid;

238}

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)

void add_exact_object_address(const ObjectAddress *object, ObjectAddresses *addrs)

ObjectAddresses * new_object_addresses(void)

void free_object_addresses(ObjectAddresses *addrs)

int errcode(int sqlerrcode)

int errmsg(const char *fmt,...)

#define ereport(elevel,...)

Assert(PointerIsAligned(start, uint64))

HeapTuple heap_modify_tuple(HeapTuple tuple, TupleDesc tupleDesc, const Datum *replValues, const bool *replIsnull, const bool *doReplace)

HeapTuple heap_form_tuple(TupleDesc tupleDescriptor, const Datum *values, const bool *isnull)

#define HeapTupleIsValid(tuple)

static void * GETSTRUCT(const HeapTupleData *tuple)

void CatalogTupleUpdate(Relation heapRel, const ItemPointerData *otid, HeapTuple tup)

void CatalogTupleInsert(Relation heapRel, HeapTuple tup)

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)