diff options
Diffstat (limited to 'src/backend/catalog/pg_operator.c')
-rw-r--r-- | src/backend/catalog/pg_operator.c | 36 |
1 files changed, 23 insertions, 13 deletions
diff --git a/src/backend/catalog/pg_operator.c b/src/backend/catalog/pg_operator.c index 6dde75ed25..43533c5836 100644 --- a/src/backend/catalog/pg_operator.c +++ b/src/backend/catalog/pg_operator.c @@ -20,6 +20,7 @@ #include "access/heapam.h" #include "access/htup_details.h" #include "access/xact.h" +#include "catalog/catalog.h" #include "catalog/dependency.h" #include "catalog/indexing.h" #include "catalog/namespace.h" @@ -142,10 +143,10 @@ OperatorGet(const char *operatorName, ObjectIdGetDatum(operatorNamespace)); if (HeapTupleIsValid(tup)) { - RegProcedure oprcode = ((Form_pg_operator) GETSTRUCT(tup))->oprcode; + Form_pg_operator oprform = (Form_pg_operator) GETSTRUCT(tup); - operatorObjectId = HeapTupleGetOid(tup); - *defined = RegProcedureIsValid(oprcode); + operatorObjectId = oprform->oid; + *defined = RegProcedureIsValid(oprform->oprcode); ReleaseSysCache(tup); } else @@ -219,6 +220,12 @@ OperatorShellMake(const char *operatorName, operatorName))); /* + * open pg_operator + */ + pg_operator_desc = heap_open(OperatorRelationId, RowExclusiveLock); + tupDesc = pg_operator_desc->rd_att; + + /* * initialize our *nulls and *values arrays */ for (i = 0; i < Natts_pg_operator; ++i) @@ -231,6 +238,9 @@ OperatorShellMake(const char *operatorName, * initialize values[] with the operator name and input data types. Note * that oprcode is set to InvalidOid, indicating it's a shell. */ + operatorObjectId = GetNewOidWithIndex(pg_operator_desc, OperatorOidIndexId, + Anum_pg_operator_oid); + values[Anum_pg_operator_oid - 1] = ObjectIdGetDatum(operatorObjectId); namestrcpy(&oname, operatorName); values[Anum_pg_operator_oprname - 1] = NameGetDatum(&oname); values[Anum_pg_operator_oprnamespace - 1] = ObjectIdGetDatum(operatorNamespace); @@ -248,12 +258,6 @@ OperatorShellMake(const char *operatorName, values[Anum_pg_operator_oprjoin - 1] = ObjectIdGetDatum(InvalidOid); /* - * open pg_operator - */ - pg_operator_desc = heap_open(OperatorRelationId, RowExclusiveLock); - tupDesc = pg_operator_desc->rd_att; - - /* * create a new operator tuple */ tup = heap_form_tuple(tupDesc, values, nulls); @@ -261,7 +265,7 @@ OperatorShellMake(const char *operatorName, /* * insert our "shell" operator tuple */ - operatorObjectId = CatalogTupleInsert(pg_operator_desc, tup); + CatalogTupleInsert(pg_operator_desc, tup); /* Add dependencies for the entry */ makeOperatorDependencies(tup, false); @@ -517,6 +521,7 @@ OperatorCreate(const char *operatorName, elog(ERROR, "cache lookup failed for operator %u", operatorObjectId); + replaces[Anum_pg_operator_oid - 1] = false; tup = heap_modify_tuple(tup, RelationGetDescr(pg_operator_desc), values, @@ -529,10 +534,15 @@ OperatorCreate(const char *operatorName, { isUpdate = false; + operatorObjectId = GetNewOidWithIndex(pg_operator_desc, + OperatorOidIndexId, + Anum_pg_operator_oid); + values[Anum_pg_operator_oid - 1] = ObjectIdGetDatum(operatorObjectId); + tup = heap_form_tuple(RelationGetDescr(pg_operator_desc), values, nulls); - operatorObjectId = CatalogTupleInsert(pg_operator_desc, tup); + CatalogTupleInsert(pg_operator_desc, tup); } /* Add dependencies for the entry */ @@ -767,7 +777,7 @@ makeOperatorDependencies(HeapTuple tuple, bool isUpdate) referenced; myself.classId = OperatorRelationId; - myself.objectId = HeapTupleGetOid(tuple); + myself.objectId = oper->oid; myself.objectSubId = 0; /* @@ -853,7 +863,7 @@ makeOperatorDependencies(HeapTuple tuple, bool isUpdate) } /* Dependency on owner */ - recordDependencyOnOwner(OperatorRelationId, HeapTupleGetOid(tuple), + recordDependencyOnOwner(OperatorRelationId, oper->oid, oper->oprowner); /* Dependency on extension */ |