47 #include "utils/fmgroids.h" 55 Oid amoid,
Oid opfamilyoid,
56 int maxOpNumber,
int maxProcNumber,
59 Oid amoid,
Oid opfamilyoid,
60 int maxOpNumber,
int maxProcNumber,
67 Oid opfamilyoid,
Oid opclassoid,
68 List *operators,
bool isAdd);
70 Oid opfamilyoid,
Oid opclassoid,
71 List *procedures,
bool isAdd);
124 elog(
ERROR,
"cache lookup failed for access method %u", amID);
126 (
errcode(ERRCODE_UNDEFINED_OBJECT),
127 errmsg(
"operator family \"%s\" does not exist for access method \"%s\"",
203 elog(
ERROR,
"cache lookup failed for access method %u", amID);
205 (
errcode(ERRCODE_UNDEFINED_OBJECT),
206 errmsg(
"operator class \"%s\" does not exist for access method \"%s\"",
248 bool nulls[Natts_pg_opfamily];
265 errmsg(
"operator family \"%s\" for access method \"%s\" already exists",
271 memset(values, 0,
sizeof(values));
272 memset(nulls,
false,
sizeof(nulls));
276 values[Anum_pg_opfamily_opfname - 1] =
NameGetDatum(&opfName);
289 myself.
classId = OperatorFamilyRelationId;
294 referenced.
classId = AccessMethodRelationId;
300 referenced.
classId = NamespaceRelationId;
343 bool nulls[Natts_pg_opclass];
363 (
errcode(ERRCODE_UNDEFINED_OBJECT),
364 errmsg(
"access method \"%s\" does not exist",
373 if (maxOpNumber <= 0)
374 maxOpNumber = SHRT_MAX;
402 (
errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
403 errmsg(
"must be superuser to create an operator class")));
448 namespaceoid, amoid);
462 foreach(l, stmt->
items)
475 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
476 errmsg(
"invalid operator number %d," 477 " must be between 1 and %d",
478 item->
number, maxOpNumber)));
519 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
520 errmsg(
"invalid procedure number %d," 521 " must be between 1 and %d",
522 item->
number, maxProcNumber)));
548 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
549 errmsg(
"storage type specified more than once")));
571 if (storageoid == typeoid)
575 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
576 errmsg(
"storage type cannot be different from data type for access method \"%s\"",
592 errmsg(
"operator class \"%s\" for access method \"%s\" already exists",
606 Anum_pg_opclass_opcmethod,
617 if (opclass->opcintype == typeoid && opclass->opcdefault)
620 errmsg(
"could not make operator class \"%s\" be default for type %s",
623 errdetail(
"Operator class \"%s\" already is the default.",
633 memset(values, 0,
sizeof(values));
634 memset(nulls,
false,
sizeof(nulls));
638 values[Anum_pg_opclass_opcname - 1] =
NameGetDatum(&opcName);
657 opclassoid, operators,
false);
659 opclassoid, procedures,
false);
668 myself.
classId = OperatorClassRelationId;
673 referenced.
classId = NamespaceRelationId;
679 referenced.
classId = OperatorFamilyRelationId;
685 referenced.
classId = TypeRelationId;
693 referenced.
classId = TypeRelationId;
747 (
errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
748 errmsg(
"must be superuser to create an operator family")));
777 (
errcode(ERRCODE_UNDEFINED_OBJECT),
778 errmsg(
"access method \"%s\" does not exist",
787 if (maxOpNumber <= 0)
788 maxOpNumber = SHRT_MAX;
803 (
errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
804 errmsg(
"must be superuser to alter an operator family")));
811 maxOpNumber, maxProcNumber, stmt->
items);
814 maxOpNumber, maxProcNumber, stmt->
items);
824 int maxOpNumber,
int maxProcNumber,
List *items)
849 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
850 errmsg(
"invalid operator number %d," 851 " must be between 1 and %d",
852 item->
number, maxOpNumber)));
858 (
errcode(ERRCODE_SYNTAX_ERROR),
859 errmsg(
"operator argument types must be specified in ALTER OPERATOR FAMILY")));
893 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
894 errmsg(
"invalid procedure number %d," 895 " must be between 1 and %d",
896 item->
number, maxProcNumber)));
921 (
errcode(ERRCODE_SYNTAX_ERROR),
922 errmsg(
"STORAGE cannot be specified in ALTER OPERATOR FAMILY")));
941 operators, procedures);
949 int maxOpNumber,
int maxProcNumber,
List *items)
973 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
974 errmsg(
"invalid operator number %d," 975 " must be between 1 and %d",
976 item->
number, maxOpNumber)));
988 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
989 errmsg(
"invalid procedure number %d," 990 " must be between 1 and %d",
991 item->
number, maxProcNumber)));
1016 operators, procedures);
1039 *righttype = *lefttype;
1043 (
errcode(ERRCODE_SYNTAX_ERROR),
1044 errmsg(
"one or two argument types must be specified")));
1067 if (opform->oprkind !=
'b')
1069 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
1070 errmsg(
"index operators must be binary")));
1088 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
1089 errmsg(
"access method \"%s\" does not support ordering operators",
1097 if (opform->oprresult != BOOLOID)
1099 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
1100 errmsg(
"index search operators must return boolean")));
1107 member->
lefttype = opform->oprleft;
1126 if (proctup == NULL)
1137 if (amoid == BTREE_AM_OID)
1141 if (procform->pronargs != 2)
1143 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
1144 errmsg(
"btree comparison procedures must have two arguments")));
1145 if (procform->prorettype != INT4OID)
1147 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
1148 errmsg(
"btree comparison procedures must return integer")));
1155 member->
lefttype = procform->proargtypes.values[0];
1157 member->
righttype = procform->proargtypes.values[1];
1161 if (procform->pronargs != 1 ||
1162 procform->proargtypes.values[0] != INTERNALOID)
1164 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
1165 errmsg(
"btree sort support procedures must accept type \"internal\"")));
1166 if (procform->prorettype != VOIDOID)
1168 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
1169 errmsg(
"btree sort support procedures must return void")));
1177 if (procform->pronargs != 5)
1179 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
1180 errmsg(
"btree in_range procedures must have five arguments")));
1181 if (procform->prorettype != BOOLOID)
1183 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
1184 errmsg(
"btree in_range procedures must return boolean")));
1191 member->
lefttype = procform->proargtypes.values[0];
1193 member->
righttype = procform->proargtypes.values[2];
1196 else if (amoid == HASH_AM_OID)
1200 if (procform->pronargs != 1)
1202 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
1203 errmsg(
"hash procedure 1 must have one argument")));
1204 if (procform->prorettype != INT4OID)
1206 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
1207 errmsg(
"hash procedure 1 must return integer")));
1211 if (procform->pronargs != 2)
1213 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
1214 errmsg(
"hash procedure 2 must have two arguments")));
1215 if (procform->prorettype != INT8OID)
1217 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
1218 errmsg(
"hash procedure 2 must return bigint")));
1225 member->
lefttype = procform->proargtypes.values[0];
1227 member->
righttype = procform->proargtypes.values[0];
1242 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
1243 errmsg(
"associated data types must be specified for index support procedure")));
1267 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
1268 errmsg(
"procedure number %d for (%s,%s) appears more than once",
1274 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
1275 errmsg(
"operator number %d for (%s,%s) appears more than once",
1281 *list =
lappend(*list, member);
1293 Oid opfamilyoid,
Oid opclassoid,
1294 List *operators,
bool isAdd)
1298 bool nulls[Natts_pg_amop];
1307 foreach(l, operators)
1324 errmsg(
"operator %d(%s,%s) already exists in operator family \"%s\"",
1333 memset(values, 0,
sizeof(values));
1334 memset(nulls,
false,
sizeof(nulls));
1340 values[Anum_pg_amop_amoppurpose - 1] =
CharGetDatum(oppurpose);
1352 myself.
classId = AccessMethodOperatorRelationId;
1356 referenced.
classId = OperatorRelationId;
1366 referenced.
classId = OperatorClassRelationId;
1377 referenced.
classId = OperatorFamilyRelationId;
1386 referenced.
classId = OperatorFamilyRelationId;
1408 Oid opfamilyoid,
Oid opclassoid,
1409 List *procedures,
bool isAdd)
1413 bool nulls[Natts_pg_amproc];
1422 foreach(l, procedures)
1438 errmsg(
"function %d(%s,%s) already exists in operator family \"%s\"",
1445 memset(values, 0,
sizeof(values));
1446 memset(nulls,
false,
sizeof(nulls));
1461 myself.
classId = AccessMethodProcedureRelationId;
1465 referenced.
classId = ProcedureRelationId;
1475 referenced.
classId = OperatorClassRelationId;
1486 referenced.
classId = OperatorFamilyRelationId;
1512 foreach(l, operators)
1525 (
errcode(ERRCODE_UNDEFINED_OBJECT),
1526 errmsg(
"operator %d(%s,%s) does not exist in operator family \"%s\"",
1532 object.classId = AccessMethodOperatorRelationId;
1533 object.objectId = amopid;
1534 object.objectSubId = 0;
1552 foreach(l, procedures)
1565 (
errcode(ERRCODE_UNDEFINED_OBJECT),
1566 errmsg(
"function %d(%s,%s) does not exist in operator family \"%s\"",
1572 object.classId = AccessMethodProcedureRelationId;
1573 object.objectId = amprocid;
1574 object.objectSubId = 0;
1593 elog(
ERROR,
"cache lookup failed for opfamily %u", opfamilyOid);
1612 elog(
ERROR,
"cache lookup failed for opclass %u", opclassOid);
1642 elog(
ERROR,
"could not find tuple for amop entry %u", entryOid);
1671 elog(
ERROR,
"could not find tuple for amproc entry %u", entryOid);
1696 errmsg(
"operator class \"%s\" for access method \"%s\" already exists in schema \"%s\"",
1719 errmsg(
"operator family \"%s\" for access method \"%s\" already exists in schema \"%s\"",
Oid LookupOperWithArgs(ObjectWithArgs *oper, bool noError)
#define GetSysCacheOid4(cacheId, key1, key2, key3, key4)
Oid LookupExplicitNamespace(const char *nspname, bool missing_ok)
void systable_endscan(SysScanDesc sysscan)
static void assignOperTypes(OpFamilyMember *member, Oid amoid, Oid typeoid)
#define InvokeObjectPostCreateHook(classId, objectId, subId)
#define BTSORTSUPPORT_PROC
void RemoveOpClassById(Oid opclassOid)
#define ObjectIdAttributeNumber
Oid QualifiedNameGetCreationNamespace(List *names, char **objname_p)
#define PointerGetDatum(X)
char * TypeNameToString(const TypeName *typeName)
static HeapTuple OpClassCacheLookup(Oid amID, List *opclassname, bool missing_ok)
#define SearchSysCacheExists4(cacheId, key1, key2, key3, key4)
#define AccessMethodOperatorOidIndexId
bool pg_oper_ownercheck(Oid oper_oid, Oid roleid)
int errcode(int sqlerrcode)
static HeapTuple OpFamilyCacheLookup(Oid amID, List *opfamilyname, bool missing_ok)
static void dropProcedures(List *opfamilyname, Oid amoid, Oid opfamilyoid, List *procedures)
#define HASHEXTENDED_PROC
void CatalogTupleDelete(Relation heapRel, ItemPointer tid)
void recordDependencyOn(const ObjectAddress *depender, const ObjectAddress *referenced, DependencyType behavior)
void DeconstructQualifiedName(List *names, char **nspname_p, char **objname_p)
Oid LookupOperName(ParseState *pstate, List *opername, Oid oprleft, Oid oprright, bool noError, int location)
HeapTuple heap_form_tuple(TupleDesc tupleDescriptor, Datum *values, bool *isnull)
Oid get_opclass_oid(Oid amID, List *opclassname, bool missing_ok)
void recordDependencyOnOwner(Oid classId, Oid objectId, Oid owner)
void RemoveAmProcEntryById(Oid entryOid)
void heap_freetuple(HeapTuple htup)
bool pg_type_ownercheck(Oid type_oid, Oid roleid)
ObjectAddress DefineOpClass(CreateOpClassStmt *stmt)
int namestrcpy(Name name, const char *str)
Oid OpclassnameGetOpcid(Oid amid, const char *opcname)
#define OidIsValid(objectId)
AclResult pg_namespace_aclcheck(Oid nsp_oid, Oid roleid, AclMode mode)
void IsThereOpClassInNamespace(const char *opcname, Oid opcmethod, Oid opcnamespace)
SysScanDesc systable_beginscan(Relation heapRelation, Oid indexId, bool indexOK, Snapshot snapshot, int nkeys, ScanKey key)
#define OpclassAmNameNspIndexId
void aclcheck_error_type(AclResult aclerr, Oid typeOid)
#define AccessMethodProcedureOidIndexId
#define OPCLASS_ITEM_OPERATOR
char * get_opname(Oid opno)
static void dropOperators(List *opfamilyname, Oid amoid, Oid opfamilyoid, List *operators)
void aclcheck_error(AclResult aclerr, ObjectType objtype, const char *objectname)
Oid OpfamilynameGetOpfid(Oid amid, const char *opfname)
HeapTuple systable_getnext(SysScanDesc sysscan)
static void AlterOpFamilyDrop(AlterOpFamilyStmt *stmt, Oid amoid, Oid opfamilyoid, int maxOpNumber, int maxProcNumber, List *items)
#define ObjectIdGetDatum(X)
#define SearchSysCacheExists3(cacheId, key1, key2, key3)
Oid CatalogTupleInsert(Relation heapRel, HeapTuple tup)
IndexAmRoutine * GetIndexAmRoutineByAmId(Oid amoid, bool noerror)
char * get_func_name(Oid funcid)
HeapTuple SearchSysCache3(int cacheId, Datum key1, Datum key2, Datum key3)
#define lfirst_node(type, lc)
void RemoveOpFamilyById(Oid opfamilyOid)
char * get_namespace_name(Oid nspid)
Oid get_index_am_oid(const char *amname, bool missing_ok)
char * get_am_name(Oid amOid)
Oid LookupFuncWithArgs(ObjectType objtype, ObjectWithArgs *func, bool noError)
int errdetail(const char *fmt,...)
static void addFamilyMember(List **list, OpFamilyMember *member, bool isProc)
#define CStringGetDatum(X)
void performDeletion(const ObjectAddress *object, DropBehavior behavior, int flags)
#define HASHSTANDARD_PROC
#define ereport(elevel, rest)
static ObjectAddress CreateOpFamily(const char *amname, const char *opfname, Oid namespaceoid, Oid amoid)
void EventTriggerCollectAlterOpFam(AlterOpFamilyStmt *stmt, Oid opfamoid, List *operators, List *procedures)
List * lappend(List *list, void *datum)
HeapTuple SearchSysCache1(int cacheId, Datum key1)
char * NameListToString(List *names)
void RemoveAmOpEntryById(Oid entryOid)
static void processTypesSpec(List *args, Oid *lefttype, Oid *righttype)
void * palloc0(Size size)
void ReleaseSysCache(HeapTuple tuple)
Relation heap_open(Oid relationId, LOCKMODE lockmode)
FormData_pg_proc * Form_pg_proc
RegProcedure get_opcode(Oid opno)
#define OPCLASS_ITEM_FUNCTION
#define HeapTupleIsValid(tuple)
#define Assert(condition)
void recordDependencyOnCurrentExtension(const ObjectAddress *object, bool isReplace)
static void AlterOpFamilyAdd(AlterOpFamilyStmt *stmt, Oid amoid, Oid opfamilyoid, int maxOpNumber, int maxProcNumber, List *items)
#define OPCLASS_ITEM_STORAGETYPE
void EventTriggerCollectCreateOpClass(CreateOpClassStmt *stmt, Oid opcoid, List *operators, List *procedures)
Oid get_opfamily_oid(Oid amID, List *opfamilyname, bool missing_ok)
static int list_length(const List *l)
static void storeProcedures(List *opfamilyname, Oid amoid, Oid opfamilyoid, Oid opclassoid, List *procedures, bool isAdd)
FormData_pg_operator * Form_pg_operator
Oid AlterOpFamily(AlterOpFamilyStmt *stmt)
ObjectAddress DefineOpFamily(CreateOpFamilyStmt *stmt)
static Datum values[MAXATTR]
FormData_pg_am * Form_pg_am
int errmsg(const char *fmt,...)
void ScanKeyInit(ScanKey entry, AttrNumber attributeNumber, StrategyNumber strategy, RegProcedure procedure, Datum argument)
#define HeapTupleGetOid(tuple)
static void assignProcTypes(OpFamilyMember *member, Oid amoid, Oid typeoid)
static void storeOperators(List *opfamilyname, Oid amoid, Oid opfamilyoid, Oid opclassoid, List *operators, bool isAdd)
FormData_pg_opclass * Form_pg_opclass
#define ERRCODE_DUPLICATE_OBJECT
#define BTEqualStrategyNumber
bool pg_proc_ownercheck(Oid proc_oid, Oid roleid)
void IsThereOpFamilyInNamespace(const char *opfname, Oid opfmethod, Oid opfnamespace)
Oid typenameTypeId(ParseState *pstate, const TypeName *typeName)