summaryrefslogtreecommitdiff
path: root/src/backend/commands/operatorcmds.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/commands/operatorcmds.c')
-rw-r--r--src/backend/commands/operatorcmds.c253
1 files changed, 0 insertions, 253 deletions
diff --git a/src/backend/commands/operatorcmds.c b/src/backend/commands/operatorcmds.c
deleted file mode 100644
index de8ec06acbf..00000000000
--- a/src/backend/commands/operatorcmds.c
+++ /dev/null
@@ -1,253 +0,0 @@
-/*-------------------------------------------------------------------------
- *
- * operatorcmds.c
- *
- * Routines for operator manipulation commands
- *
- * Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
- * Portions Copyright (c) 1994, Regents of the University of California
- *
- *
- * IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/commands/operatorcmds.c,v 1.3 2002/04/27 03:45:01 tgl Exp $
- *
- * DESCRIPTION
- * The "DefineFoo" routines take the parse tree and pick out the
- * appropriate arguments/flags, passing the results to the
- * corresponding "FooDefine" routines (in src/catalog) that do
- * the actual catalog-munging. These routines also verify permission
- * of the user to execute the command.
- *
- * NOTES
- * These things must be defined and committed in the following order:
- * "create function":
- * input/output, recv/send procedures
- * "create type":
- * type
- * "create operator":
- * operators
- *
- * Most of the parse-tree manipulation routines are defined in
- * commands/manip.c.
- *
- *-------------------------------------------------------------------------
- */
-#include "postgres.h"
-
-#include "access/heapam.h"
-#include "catalog/catname.h"
-#include "catalog/namespace.h"
-#include "catalog/pg_operator.h"
-#include "commands/comment.h"
-#include "commands/defrem.h"
-#include "miscadmin.h"
-#include "parser/parse_oper.h"
-#include "parser/parse_type.h"
-#include "utils/acl.h"
-#include "utils/lsyscache.h"
-#include "utils/syscache.h"
-
-
-/*
- * DefineOperator
- * this function extracts all the information from the
- * parameter list generated by the parser and then has
- * OperatorCreate() do all the actual work.
- *
- * 'parameters' is a list of DefElem
- */
-void
-DefineOperator(List *names, List *parameters)
-{
- char *oprName;
- Oid oprNamespace;
- AclResult aclresult;
- uint16 precedence = 0; /* operator precedence */
- bool canHash = false; /* operator hashes */
- bool canMerge = false; /* operator merges */
- bool isLeftAssociative = true; /* operator is left
- * associative */
- List *functionName = NIL; /* function for operator */
- TypeName *typeName1 = NULL; /* first type name */
- TypeName *typeName2 = NULL; /* second type name */
- Oid typeId1 = InvalidOid; /* types converted to OID */
- Oid typeId2 = InvalidOid;
- List *commutatorName = NIL; /* optional commutator operator
- * name */
- List *negatorName = NIL; /* optional negator operator name */
- List *restrictionName = NIL; /* optional restrict. sel.
- * procedure */
- List *joinName = NIL; /* optional join sel. procedure */
- List *leftSortName = NIL; /* optional left sort operator */
- List *rightSortName = NIL; /* optional right sort operator */
- List *ltCompareName = NIL; /* optional < compare operator */
- List *gtCompareName = NIL; /* optional > compare operator */
- List *pl;
-
- /* Convert list of names to a name and namespace */
- oprNamespace = QualifiedNameGetCreationNamespace(names, &oprName);
-
- /* Check we have creation rights in target namespace */
- aclresult = pg_namespace_aclcheck(oprNamespace, GetUserId(), ACL_CREATE);
- if (aclresult != ACLCHECK_OK)
- aclcheck_error(aclresult, get_namespace_name(oprNamespace));
-
- /*
- * loop over the definition list and extract the information we need.
- */
- foreach(pl, parameters)
- {
- DefElem *defel = (DefElem *) lfirst(pl);
-
- if (strcasecmp(defel->defname, "leftarg") == 0)
- {
- typeName1 = defGetTypeName(defel);
- if (typeName1->setof)
- elog(ERROR, "setof type not implemented for leftarg");
- }
- else if (strcasecmp(defel->defname, "rightarg") == 0)
- {
- typeName2 = defGetTypeName(defel);
- if (typeName2->setof)
- elog(ERROR, "setof type not implemented for rightarg");
- }
- else if (strcasecmp(defel->defname, "procedure") == 0)
- functionName = defGetQualifiedName(defel);
- else if (strcasecmp(defel->defname, "precedence") == 0)
- {
- /* NOT IMPLEMENTED (never worked in v4.2) */
- elog(NOTICE, "CREATE OPERATOR: precedence not implemented");
- }
- else if (strcasecmp(defel->defname, "associativity") == 0)
- {
- /* NOT IMPLEMENTED (never worked in v4.2) */
- elog(NOTICE, "CREATE OPERATOR: associativity not implemented");
- }
- else if (strcasecmp(defel->defname, "commutator") == 0)
- commutatorName = defGetQualifiedName(defel);
- else if (strcasecmp(defel->defname, "negator") == 0)
- negatorName = defGetQualifiedName(defel);
- else if (strcasecmp(defel->defname, "restrict") == 0)
- restrictionName = defGetQualifiedName(defel);
- else if (strcasecmp(defel->defname, "join") == 0)
- joinName = defGetQualifiedName(defel);
- else if (strcasecmp(defel->defname, "hashes") == 0)
- canHash = TRUE;
- else if (strcasecmp(defel->defname, "merges") == 0)
- canMerge = TRUE;
- else if (strcasecmp(defel->defname, "sort1") == 0)
- leftSortName = defGetQualifiedName(defel);
- else if (strcasecmp(defel->defname, "sort2") == 0)
- rightSortName = defGetQualifiedName(defel);
- else if (strcasecmp(defel->defname, "ltcmp") == 0)
- ltCompareName = defGetQualifiedName(defel);
- else if (strcasecmp(defel->defname, "gtcmp") == 0)
- gtCompareName = defGetQualifiedName(defel);
- else
- {
- elog(WARNING, "DefineOperator: attribute \"%s\" not recognized",
- defel->defname);
- }
- }
-
- /*
- * make sure we have our required definitions
- */
- if (functionName == NIL)
- elog(ERROR, "Define: \"procedure\" unspecified");
-
- /* Transform type names to type OIDs */
- if (typeName1)
- typeId1 = typenameTypeId(typeName1);
- if (typeName2)
- typeId2 = typenameTypeId(typeName2);
-
- /*
- * If any of the mergejoin support operators were given, then canMerge
- * is implicit. If canMerge is specified or implicit, fill in default
- * operator names for any missing mergejoin support operators.
- */
- if (leftSortName || rightSortName || ltCompareName || gtCompareName)
- canMerge = true;
-
- if (canMerge)
- {
- if (!leftSortName)
- leftSortName = makeList1(makeString("<"));
- if (!rightSortName)
- rightSortName = makeList1(makeString("<"));
- if (!ltCompareName)
- ltCompareName = makeList1(makeString("<"));
- if (!gtCompareName)
- gtCompareName = makeList1(makeString(">"));
- }
-
- /*
- * now have OperatorCreate do all the work..
- */
- OperatorCreate(oprName, /* operator name */
- oprNamespace, /* namespace */
- typeId1, /* left type id */
- typeId2, /* right type id */
- functionName, /* function for operator */
- precedence, /* operator precedence */
- isLeftAssociative, /* operator is left associative */
- commutatorName, /* optional commutator operator
- * name */
- negatorName, /* optional negator operator name */
- restrictionName, /* optional restrict. sel.
- * procedure */
- joinName, /* optional join sel. procedure name */
- canHash, /* operator hashes */
- leftSortName, /* optional left sort operator */
- rightSortName, /* optional right sort operator */
- ltCompareName, /* optional < comparison op */
- gtCompareName); /* optional < comparison op */
-}
-
-
-/*
- * RemoveOperator
- * Deletes an operator.
- *
- * Exceptions:
- * BadArg if name is invalid.
- * BadArg if type1 is invalid.
- * "ERROR" if operator nonexistent.
- * ...
- */
-void
-RemoveOperator(List *operatorName, /* operator name */
- TypeName *typeName1, /* left argument type name */
- TypeName *typeName2) /* right argument type name */
-{
- Oid operOid;
- Relation relation;
- HeapTuple tup;
-
- operOid = LookupOperNameTypeNames(operatorName, typeName1, typeName2,
- "RemoveOperator");
-
- relation = heap_openr(OperatorRelationName, RowExclusiveLock);
-
- tup = SearchSysCacheCopy(OPEROID,
- ObjectIdGetDatum(operOid),
- 0, 0, 0);
- if (!HeapTupleIsValid(tup)) /* should not happen */
- elog(ERROR, "RemoveOperator: failed to find tuple for operator '%s'",
- NameListToString(operatorName));
-
- /* Permission check: must own operator or its namespace */
- if (!pg_oper_ownercheck(operOid, GetUserId()) &&
- !pg_namespace_ownercheck(((Form_pg_operator) GETSTRUCT(tup))->oprnamespace,
- GetUserId()))
- aclcheck_error(ACLCHECK_NOT_OWNER, NameListToString(operatorName));
-
- /* Delete any comments associated with this operator */
- DeleteComments(operOid, RelationGetRelid(relation));
-
- simple_heap_delete(relation, &tup->t_self);
-
- heap_freetuple(tup);
- heap_close(relation, RowExclusiveLock);
-}