42 Oid operatorNamespace,
53 Oid operatorNamespace,
58 Oid otherLeftTypeId,
Oid otherRightTypeId,
59 const char *operatorName,
Oid operatorNamespace,
60 Oid leftTypeId,
Oid rightTypeId,
76 size_t len = strlen(name);
84 if (strspn(name,
"~!@#^&|`?+-*/%<>=") != len)
88 if (strstr(name,
"/*") || strstr(name,
"--"))
99 (name[len - 1] ==
'+' ||
100 name[len - 1] ==
'-'))
104 for (ic = len - 2; ic >= 0; ic--)
106 if (strchr(
"~!@#^&|`?%", name[ic]))
114 if (strcmp(name,
"!=") == 0)
131 Oid operatorNamespace,
137 Oid operatorObjectId;
148 operatorObjectId = oprform->oid;
158 return operatorObjectId;
175 Oid operatorObjectId;
179 leftObjectId, rightObjectId,
190 return operatorObjectId;
200 Oid operatorNamespace,
205 Oid operatorObjectId;
209 bool nulls[Natts_pg_operator];
218 (
errcode(ERRCODE_INVALID_NAME),
219 errmsg(
"\"%s\" is not a valid operator name",
226 tupDesc = pg_operator_desc->
rd_att;
231 for (i = 0; i < Natts_pg_operator; ++
i)
242 Anum_pg_operator_oid);
245 values[Anum_pg_operator_oprname - 1] =
NameGetDatum(&oname);
246 values[Anum_pg_operator_oprnamespace - 1] =
ObjectIdGetDatum(operatorNamespace);
248 values[Anum_pg_operator_oprkind - 1] =
CharGetDatum(leftTypeId ? (rightTypeId ?
'b' :
'r') :
'l');
249 values[Anum_pg_operator_oprcanmerge - 1] =
BoolGetDatum(
false);
250 values[Anum_pg_operator_oprcanhash - 1] =
BoolGetDatum(
false);
288 return operatorObjectId;
328 Oid operatorNamespace,
332 List *commutatorName,
342 bool nulls[Natts_pg_operator];
343 bool replaces[Natts_pg_operator];
345 Oid operatorObjectId;
346 bool operatorAlreadyDefined;
350 bool selfCommutator =
false;
360 (
errcode(ERRCODE_INVALID_NAME),
361 errmsg(
"\"%s\" is not a valid operator name",
369 (
errcode(ERRCODE_INVALID_FUNCTION_DEFINITION),
370 errmsg(
"only binary operators can have commutators")));
373 (
errcode(ERRCODE_INVALID_FUNCTION_DEFINITION),
374 errmsg(
"only binary operators can have join selectivity")));
377 (
errcode(ERRCODE_INVALID_FUNCTION_DEFINITION),
378 errmsg(
"only binary operators can merge join")));
381 (
errcode(ERRCODE_INVALID_FUNCTION_DEFINITION),
382 errmsg(
"only binary operators can hash")));
387 if (operResultType != BOOLOID)
392 (
errcode(ERRCODE_INVALID_FUNCTION_DEFINITION),
393 errmsg(
"only boolean operators can have negators")));
396 (
errcode(ERRCODE_INVALID_FUNCTION_DEFINITION),
397 errmsg(
"only boolean operators can have restriction selectivity")));
400 (
errcode(ERRCODE_INVALID_FUNCTION_DEFINITION),
401 errmsg(
"only boolean operators can have join selectivity")));
404 (
errcode(ERRCODE_INVALID_FUNCTION_DEFINITION),
405 errmsg(
"only boolean operators can merge join")));
408 (
errcode(ERRCODE_INVALID_FUNCTION_DEFINITION),
409 errmsg(
"only boolean operators can hash")));
416 &operatorAlreadyDefined);
418 if (operatorAlreadyDefined)
420 (
errcode(ERRCODE_DUPLICATE_FUNCTION),
421 errmsg(
"operator %s already exists",
443 rightTypeId, leftTypeId,
444 operatorName, operatorNamespace,
445 leftTypeId, rightTypeId,
459 selfCommutator =
true;
468 leftTypeId, rightTypeId,
469 operatorName, operatorNamespace,
470 leftTypeId, rightTypeId,
486 for (i = 0; i < Natts_pg_operator; ++
i)
494 values[Anum_pg_operator_oprname - 1] =
NameGetDatum(&oname);
495 values[Anum_pg_operator_oprnamespace - 1] =
ObjectIdGetDatum(operatorNamespace);
497 values[Anum_pg_operator_oprkind - 1] =
CharGetDatum(leftTypeId ? (rightTypeId ?
'b' :
'r') :
'l');
498 values[Anum_pg_operator_oprcanmerge - 1] =
BoolGetDatum(canMerge);
499 values[Anum_pg_operator_oprcanhash - 1] =
BoolGetDatum(canHash);
514 if (operatorObjectId)
521 elog(
ERROR,
"cache lookup failed for operator %u",
524 replaces[Anum_pg_operator_oid - 1] =
false;
539 Anum_pg_operator_oid);
568 commutatorId = operatorObjectId;
571 OperatorUpd(operatorObjectId, commutatorId, negatorId,
false);
586 const char *operatorName,
Oid operatorNamespace,
587 Oid leftTypeId,
Oid rightTypeId,
bool isCommutator)
609 if (strcmp(otherName, operatorName) == 0 &&
610 otherNamespace == operatorNamespace &&
611 otherLeftTypeId == leftTypeId &&
612 otherRightTypeId == rightTypeId)
620 (
errcode(ERRCODE_INVALID_FUNCTION_DEFINITION),
621 errmsg(
"operator cannot be its own negator or sort operator")));
681 bool update_commutator =
false;
688 if (isDelete && t->oprcom == baseId)
691 update_commutator =
true;
696 update_commutator =
true;
700 if (update_commutator)
726 bool update_negator =
false;
733 if (isDelete && t->oprnegate == baseId)
736 update_negator =
true;
738 else if (!isDelete && !
OidIsValid(t->oprnegate))
740 t->oprnegate = baseId;
741 update_negator =
true;
779 myself.
classId = OperatorRelationId;
796 referenced.
classId = NamespaceRelationId;
797 referenced.
objectId = oper->oprnamespace;
805 referenced.
classId = TypeRelationId;
806 referenced.
objectId = oper->oprleft;
814 referenced.
classId = TypeRelationId;
815 referenced.
objectId = oper->oprright;
823 referenced.
classId = TypeRelationId;
824 referenced.
objectId = oper->oprresult;
841 referenced.
classId = ProcedureRelationId;
842 referenced.
objectId = oper->oprcode;
850 referenced.
classId = ProcedureRelationId;
851 referenced.
objectId = oper->oprrest;
859 referenced.
classId = ProcedureRelationId;
860 referenced.
objectId = oper->oprjoin;
Oid GetNewOidWithIndex(Relation relation, Oid indexId, AttrNumber oidcolumn)
void table_close(Relation relation, LOCKMODE lockmode)
#define InvokeObjectPostCreateHook(classId, objectId, subId)
ObjectAddress OperatorCreate(const char *operatorName, Oid operatorNamespace, Oid leftTypeId, Oid rightTypeId, Oid procedureId, List *commutatorName, List *negatorName, Oid restrictionId, Oid joinId, bool canMerge, bool canHash)
#define RelationGetDescr(relation)
ObjectAddress makeOperatorDependencies(HeapTuple tuple, bool isUpdate)
Oid QualifiedNameGetCreationNamespace(List *names, char **objname_p)
#define PointerGetDatum(X)
static Oid OperatorLookup(List *operatorName, Oid leftObjectId, Oid rightObjectId, bool *defined)
long deleteDependencyRecordsFor(Oid classId, Oid objectId, bool skipExtensionDeps)
static Oid OperatorGet(const char *operatorName, Oid operatorNamespace, Oid leftObjectId, Oid rightObjectId, bool *defined)
bool pg_oper_ownercheck(Oid oper_oid, Oid roleid)
int errcode(int sqlerrcode)
void recordDependencyOn(const ObjectAddress *depender, const ObjectAddress *referenced, DependencyType behavior)
Oid LookupOperName(ParseState *pstate, List *opername, Oid oprleft, Oid oprright, bool noError, int location)
HeapTuple heap_form_tuple(TupleDesc tupleDescriptor, Datum *values, bool *isnull)
void recordDependencyOnOwner(Oid classId, Oid objectId, Oid owner)
void heap_freetuple(HeapTuple htup)
static Oid OperatorShellMake(const char *operatorName, Oid operatorNamespace, Oid leftTypeId, Oid rightTypeId)
int namestrcpy(Name name, const char *str)
#define OidIsValid(objectId)
AclResult pg_namespace_aclcheck(Oid nsp_oid, Oid roleid, AclMode mode)
static Oid get_other_operator(List *otherOp, Oid otherLeftTypeId, Oid otherRightTypeId, const char *operatorName, Oid operatorNamespace, Oid leftTypeId, Oid rightTypeId, bool isCommutator)
Oid get_func_rettype(Oid funcid)
void aclcheck_error(AclResult aclerr, ObjectType objtype, const char *objectname)
#define ObjectIdGetDatum(X)
char * get_namespace_name(Oid nspid)
#define RegProcedureIsValid(p)
HeapTuple SearchSysCache4(int cacheId, Datum key1, Datum key2, Datum key3, Datum key4)
#define ereport(elevel, rest)
void deleteSharedDependencyRecordsFor(Oid classId, Oid objectId, int32 objectSubId)
char * NameListToString(List *names)
#define OperatorOidIndexId
void CommandCounterIncrement(void)
void ReleaseSysCache(HeapTuple tuple)
RegProcedure get_opcode(Oid opno)
void OperatorUpd(Oid baseId, Oid commId, Oid negId, bool isDelete)
#define HeapTupleIsValid(tuple)
void recordDependencyOnCurrentExtension(const ObjectAddress *object, bool isReplace)
void CatalogTupleUpdate(Relation heapRel, ItemPointer otid, HeapTuple tup)
FormData_pg_operator * Form_pg_operator
static Datum values[MAXATTR]
#define SearchSysCacheCopy1(cacheId, key1)
int errmsg(const char *fmt,...)
Operator oper(ParseState *pstate, List *opname, Oid ltypeId, Oid rtypeId, bool noError, int location)
Relation table_open(Oid relationId, LOCKMODE lockmode)
HeapTuple heap_modify_tuple(HeapTuple tuple, TupleDesc tupleDesc, Datum *replValues, bool *replIsnull, bool *doReplace)
void CatalogTupleInsert(Relation heapRel, HeapTuple tup)
static bool validOperatorName(const char *name)