summaryrefslogtreecommitdiff
path: root/src/backend/commands/aggregatecmds.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/commands/aggregatecmds.c')
-rw-r--r--src/backend/commands/aggregatecmds.c208
1 files changed, 0 insertions, 208 deletions
diff --git a/src/backend/commands/aggregatecmds.c b/src/backend/commands/aggregatecmds.c
deleted file mode 100644
index c3c1ed16dfc..00000000000
--- a/src/backend/commands/aggregatecmds.c
+++ /dev/null
@@ -1,208 +0,0 @@
-/*-------------------------------------------------------------------------
- *
- * aggregatecmds.c
- *
- * Routines for aggregate-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/aggregatecmds.c,v 1.2 2002/04/27 03:45:00 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.
- *
- *-------------------------------------------------------------------------
- */
-#include "postgres.h"
-
-#include "access/heapam.h"
-#include "catalog/catname.h"
-#include "catalog/namespace.h"
-#include "catalog/pg_aggregate.h"
-#include "catalog/pg_proc.h"
-#include "commands/comment.h"
-#include "commands/defrem.h"
-#include "miscadmin.h"
-#include "parser/parse_func.h"
-#include "parser/parse_type.h"
-#include "utils/acl.h"
-#include "utils/builtins.h"
-#include "utils/lsyscache.h"
-#include "utils/syscache.h"
-
-
-/*
- * DefineAggregate
- */
-void
-DefineAggregate(List *names, List *parameters)
-{
- char *aggName;
- Oid aggNamespace;
- AclResult aclresult;
- List *transfuncName = NIL;
- List *finalfuncName = NIL;
- TypeName *baseType = NULL;
- TypeName *transType = NULL;
- char *initval = NULL;
- Oid baseTypeId;
- Oid transTypeId;
- List *pl;
-
- /* Convert list of names to a name and namespace */
- aggNamespace = QualifiedNameGetCreationNamespace(names, &aggName);
-
- /* Check we have creation rights in target namespace */
- aclresult = pg_namespace_aclcheck(aggNamespace, GetUserId(), ACL_CREATE);
- if (aclresult != ACLCHECK_OK)
- aclcheck_error(aclresult, get_namespace_name(aggNamespace));
-
- foreach(pl, parameters)
- {
- DefElem *defel = (DefElem *) lfirst(pl);
-
- /*
- * sfunc1, stype1, and initcond1 are accepted as obsolete
- * spellings for sfunc, stype, initcond.
- */
- if (strcasecmp(defel->defname, "sfunc") == 0)
- transfuncName = defGetQualifiedName(defel);
- else if (strcasecmp(defel->defname, "sfunc1") == 0)
- transfuncName = defGetQualifiedName(defel);
- else if (strcasecmp(defel->defname, "finalfunc") == 0)
- finalfuncName = defGetQualifiedName(defel);
- else if (strcasecmp(defel->defname, "basetype") == 0)
- baseType = defGetTypeName(defel);
- else if (strcasecmp(defel->defname, "stype") == 0)
- transType = defGetTypeName(defel);
- else if (strcasecmp(defel->defname, "stype1") == 0)
- transType = defGetTypeName(defel);
- else if (strcasecmp(defel->defname, "initcond") == 0)
- initval = defGetString(defel);
- else if (strcasecmp(defel->defname, "initcond1") == 0)
- initval = defGetString(defel);
- else
- elog(WARNING, "DefineAggregate: attribute \"%s\" not recognized",
- defel->defname);
- }
-
- /*
- * make sure we have our required definitions
- */
- if (baseType == NULL)
- elog(ERROR, "Define: \"basetype\" unspecified");
- if (transType == NULL)
- elog(ERROR, "Define: \"stype\" unspecified");
- if (transfuncName == NIL)
- elog(ERROR, "Define: \"sfunc\" unspecified");
-
- /*
- * Handle the aggregate's base type (input data type). This can be
- * specified as 'ANY' for a data-independent transition function, such
- * as COUNT(*).
- */
- baseTypeId = LookupTypeName(baseType);
- if (OidIsValid(baseTypeId))
- {
- /* no need to allow aggregates on as-yet-undefined types */
- if (!get_typisdefined(baseTypeId))
- elog(ERROR, "Type \"%s\" is only a shell",
- TypeNameToString(baseType));
- }
- else
- {
- char *typnam = TypeNameToString(baseType);
-
- if (strcasecmp(typnam, "ANY") != 0)
- elog(ERROR, "Type \"%s\" does not exist", typnam);
- baseTypeId = InvalidOid;
- }
-
- /* handle transtype --- no special cases here */
- transTypeId = typenameTypeId(transType);
-
- /*
- * Most of the argument-checking is done inside of AggregateCreate
- */
- AggregateCreate(aggName, /* aggregate name */
- aggNamespace, /* namespace */
- transfuncName, /* step function name */
- finalfuncName, /* final function name */
- baseTypeId, /* type of data being aggregated */
- transTypeId, /* transition data type */
- initval); /* initial condition */
-}
-
-
-void
-RemoveAggregate(List *aggName, TypeName *aggType)
-{
- Relation relation;
- HeapTuple tup;
- Oid basetypeID;
- Oid procOid;
-
- /*
- * if a basetype is passed in, then attempt to find an aggregate for
- * that specific type.
- *
- * else if the basetype is blank, then attempt to find an aggregate with
- * a basetype of zero. This is valid. It means that the aggregate is
- * to apply to all basetypes (eg, COUNT).
- */
- if (aggType)
- basetypeID = typenameTypeId(aggType);
- else
- basetypeID = InvalidOid;
-
- procOid = find_aggregate_func("RemoveAggregate", aggName, basetypeID);
-
- relation = heap_openr(ProcedureRelationName, RowExclusiveLock);
-
- tup = SearchSysCache(PROCOID,
- ObjectIdGetDatum(procOid),
- 0, 0, 0);
- if (!HeapTupleIsValid(tup)) /* should not happen */
- elog(ERROR, "RemoveAggregate: couldn't find pg_proc tuple for %s",
- NameListToString(aggName));
-
- /* Permission check: must own agg or its namespace */
- if (!pg_proc_ownercheck(procOid, GetUserId()) &&
- !pg_namespace_ownercheck(((Form_pg_proc) GETSTRUCT(tup))->pronamespace,
- GetUserId()))
- aclcheck_error(ACLCHECK_NOT_OWNER, NameListToString(aggName));
-
- /* Delete any comments associated with this function */
- DeleteComments(procOid, RelationGetRelid(relation));
-
- /* Remove the pg_proc tuple */
- simple_heap_delete(relation, &tup->t_self);
-
- ReleaseSysCache(tup);
-
- heap_close(relation, RowExclusiveLock);
-
- /* Remove the pg_aggregate tuple */
-
- relation = heap_openr(AggregateRelationName, RowExclusiveLock);
-
- tup = SearchSysCache(AGGFNOID,
- ObjectIdGetDatum(procOid),
- 0, 0, 0);
- if (!HeapTupleIsValid(tup)) /* should not happen */
- elog(ERROR, "RemoveAggregate: couldn't find pg_aggregate tuple for %s",
- NameListToString(aggName));
-
- simple_heap_delete(relation, &tup->t_self);
-
- ReleaseSysCache(tup);
-
- heap_close(relation, RowExclusiveLock);
-}