summaryrefslogtreecommitdiff
path: root/src/backend/commands
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/commands')
-rw-r--r--src/backend/commands/creatinh.c93
-rw-r--r--src/backend/commands/define.c363
-rw-r--r--src/backend/commands/remove.c59
3 files changed, 8 insertions, 507 deletions
diff --git a/src/backend/commands/creatinh.c b/src/backend/commands/creatinh.c
index 586cee63cce..bb80487dbb4 100644
--- a/src/backend/commands/creatinh.c
+++ b/src/backend/commands/creatinh.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/commands/Attic/creatinh.c,v 1.84 2002/03/06 20:34:46 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/commands/Attic/creatinh.c,v 1.85 2002/03/07 16:35:34 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@@ -39,7 +39,7 @@ static bool change_varattnos_of_a_node(Node *node, const AttrNumber *newattno);
static void StoreCatalogInheritance(Oid relationId, List *supers);
static int findAttrByName(const char *attributeName, List *schema);
static void setRelhassubclassInRelation(Oid relationId, bool relhassubclass);
-static List *MergeDomainAttributes(List *schema);
+
/* ----------------------------------------------------------------
* DefineRelation
@@ -70,13 +70,6 @@ DefineRelation(CreateStmt *stmt, char relkind)
StrNCpy(relname, stmt->relname, NAMEDATALEN);
/*
- * Merge domain attributes into the known columns before inheritance
- * applies it's changes otherwise we risk adding double constraints
- * to a domain thats inherited.
- */
- schema = MergeDomainAttributes(schema);
-
- /*
* Look up inheritance ancestors and generate relation schema,
* including inherited attributes.
*/
@@ -244,88 +237,6 @@ TruncateRelation(char *name)
heap_truncate(name);
}
-
-/*
- * MergeDomainAttributes
- * Returns a new schema with the constraints, types, and other
- * attributes of the domain resolved.
- *
- * Defaults are processed at execution time by taking the default of
- * the type (domain) if it is null. This does not need to be merged
- * here.
- */
-static List *
-MergeDomainAttributes(List *schema)
-{
- List *entry;
-
- /*
- * Loop through the table elements supplied. These should
- * never include inherited domains else they'll be
- * double (or more) processed.
- */
- foreach(entry, schema)
- {
- ColumnDef *coldef = lfirst(entry);
- HeapTuple tuple;
- Form_pg_type typeTup;
-
-
- tuple = SearchSysCache(TYPENAME,
- CStringGetDatum(coldef->typename->name),
- 0,0,0);
-
- if (!HeapTupleIsValid(tuple))
- elog(ERROR, "MergeDomainAttributes: Type %s does not exist",
- coldef->typename->name);
-
- typeTup = (Form_pg_type) GETSTRUCT(tuple);
- if (typeTup->typtype == 'd') {
- /*
- * This is a domain, lets force the properties of the domain on to
- * the new column.
- */
-
- /* Enforce the typmod value */
- coldef->typename->typmod = typeTup->typmod;
-
- /* Enforce type NOT NULL || column definition NOT NULL -> NOT NULL */
- coldef->is_not_null |= typeTup->typnotnull;
-
- /* Enforce the element type in the event the domain is an array
- *
- * BUG: How do we fill out arrayBounds and attrname from typelem and typNDimms?
- */
-
- }
- ReleaseSysCache(tuple);
-
-//typedef struct TypeName
-//{
- //NodeTag type;
- //char *name; /* name of the type */
- //bool timezone; /* timezone specified? */
- //bool setof; /* is a set? */
- //int32 typmod; /* type modifier */
- //List *arrayBounds; /* array bounds */
- //char *attrname; /* field name when using %TYPE */
-//} TypeName;
-
-// ColumnDef
-// NodeTag type;
-// char *colname; /* name of column */
-// TypeName *typename; /* type of column */
-// bool is_not_null; /* NOT NULL constraint specified? */
-// Node *raw_default; /* default value (untransformed parse
-// * tree) */
-// char *cooked_default; /* nodeToString representation */
-// List *constraints; /* other constraints on column */
-
- }
-
- return schema;
-}
-
/*----------
* MergeAttributes
* Returns new schema given initial schema and superclasses.
diff --git a/src/backend/commands/define.c b/src/backend/commands/define.c
index cb71340eb2c..f70b58d5c2e 100644
--- a/src/backend/commands/define.c
+++ b/src/backend/commands/define.c
@@ -10,7 +10,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/commands/define.c,v 1.68 2002/03/06 20:34:47 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/commands/define.c,v 1.69 2002/03/07 16:35:34 momjian Exp $
*
* DESCRIPTION
* The "DefineFoo" routines take the parse tree and pick out the
@@ -40,7 +40,6 @@
#include "access/heapam.h"
#include "catalog/catname.h"
-#include "catalog/heap.h"
#include "catalog/pg_aggregate.h"
#include "catalog/pg_language.h"
#include "catalog/pg_operator.h"
@@ -477,322 +476,6 @@ DefineAggregate(char *aggName, List *parameters)
}
/*
- * DefineDomain
- * Registers a new domain.
- */
-void
-DefineDomain(CreateDomainStmt *stmt)
-{
- int16 internalLength = -1; /* int2 */
- int16 externalLength = -1; /* int2 */
- char *inputName = NULL;
- char *outputName = NULL;
- char *sendName = NULL;
- char *receiveName = NULL;
-
- /*
- * Domains store the external representation in defaultValue
- * and the interal Node representation in defaultValueBin
- */
- char *defaultValue = NULL;
- char *defaultValueBin = NULL;
-
- bool byValue = false;
- char delimiter = DEFAULT_TYPDELIM;
- char alignment = 'i'; /* default alignment */
- char storage = 'p'; /* default TOAST storage method */
- char typtype;
- Datum datum;
- bool typNotNull = false;
- char *elemName = NULL;
- int32 typNDims = 0; /* No array dimensions by default */
-
- bool isnull;
- Relation pg_type_rel;
- TupleDesc pg_type_dsc;
- HeapTuple typeTup;
- char *typeName = stmt->typename->name;
-
- List *listptr;
- List *schema = stmt->constraints;
-
- /*
- * Domainnames, unlike typenames don't need to account for the '_'
- * prefix. So they can be one character longer.
- */
- if (strlen(stmt->domainname) > (NAMEDATALEN - 1))
- elog(ERROR, "CREATE DOMAIN: domain names must be %d characters or less",
- NAMEDATALEN - 1);
-
-
- /* Test for existing Domain (or type) of that name */
- typeTup = SearchSysCache( TYPENAME
- , PointerGetDatum(stmt->domainname)
- , 0, 0, 0
- );
-
- if (HeapTupleIsValid(typeTup))
- {
- elog(ERROR, "CREATE DOMAIN: domain or type %s already exists",
- stmt->domainname);
- }
-
- /*
- * Get the information about old types
- */
- pg_type_rel = heap_openr(TypeRelationName, RowExclusiveLock);
- pg_type_dsc = RelationGetDescr(pg_type_rel);
-
-
- /*
- * When the type is an array for some reason we don't actually receive
- * the name here. We receive the base types name. Lets set Dims while
- * were at it.
- */
- if (stmt->typename->arrayBounds > 0) {
- typeName = makeArrayTypeName(stmt->typename->name);
-
- typNDims = length(stmt->typename->arrayBounds);
- }
-
-
- typeTup = SearchSysCache( TYPENAME
- , PointerGetDatum(typeName)
- , 0, 0, 0
- );
-
- if (!HeapTupleIsValid(typeTup))
- {
- elog(ERROR, "CREATE DOMAIN: type %s does not exist",
- stmt->typename->name);
- }
-
-
- /* Check that this is a basetype */
- typtype = DatumGetChar(heap_getattr(typeTup, Anum_pg_type_typtype, pg_type_dsc, &isnull));
- Assert(!isnull);
-
- /*
- * What we really don't want is domains of domains. This could cause all sorts
- * of neat issues if we allow that.
- *
- * With testing, we may determine complex types should be allowed
- */
- if (typtype != 'b') {
- elog(ERROR, "DefineDomain: %s is not a basetype", stmt->typename->name);
- }
-
- /* passed by value */
- byValue = DatumGetBool(heap_getattr(typeTup, Anum_pg_type_typbyval, pg_type_dsc, &isnull));
- Assert(!isnull);
-
- /* Required Alignment */
- alignment = DatumGetChar(heap_getattr(typeTup, Anum_pg_type_typalign, pg_type_dsc, &isnull));
- Assert(!isnull);
-
- /* Storage Length */
- internalLength = DatumGetInt16(heap_getattr(typeTup, Anum_pg_type_typlen, pg_type_dsc, &isnull));
- Assert(!isnull);
-
- /* External Length (unused) */
- externalLength = DatumGetInt16(heap_getattr(typeTup, Anum_pg_type_typprtlen, pg_type_dsc, &isnull));
- Assert(!isnull);
-
- /* Array element Delimiter */
- delimiter = DatumGetChar(heap_getattr(typeTup, Anum_pg_type_typdelim, pg_type_dsc, &isnull));
- Assert(!isnull);
-
- /* Input Function Name */
- datum = heap_getattr(typeTup, Anum_pg_type_typinput, pg_type_dsc, &isnull);
- Assert(!isnull);
-
- inputName = DatumGetCString(DirectFunctionCall1(regprocout, datum));
-
- /* Output Function Name */
- datum = heap_getattr(typeTup, Anum_pg_type_typoutput, pg_type_dsc, &isnull);
- Assert(!isnull);
-
- outputName = DatumGetCString(DirectFunctionCall1(regprocout, datum));
-
- /* ReceiveName */
- datum = heap_getattr(typeTup, Anum_pg_type_typreceive, pg_type_dsc, &isnull);
- Assert(!isnull);
-
- receiveName = DatumGetCString(DirectFunctionCall1(regprocout, datum));
-
- /* SendName */
- datum = heap_getattr(typeTup, Anum_pg_type_typsend, pg_type_dsc, &isnull);
- Assert(!isnull);
-
- sendName = DatumGetCString(DirectFunctionCall1(regprocout, datum));
-
- /* TOAST Strategy */
- storage = DatumGetChar(heap_getattr(typeTup, Anum_pg_type_typstorage, pg_type_dsc, &isnull));
- Assert(!isnull);
-
- /* Inherited default value */
- datum = heap_getattr(typeTup, Anum_pg_type_typdefault, pg_type_dsc, &isnull);
- if (!isnull) {
- defaultValue = DatumGetCString(DirectFunctionCall1(textout, datum));
- }
-
- /*
- * Pull out the typelem name of the parent OID.
- *
- * This is what enables us to make a domain of an array
- */
- datum = heap_getattr(typeTup, Anum_pg_type_typelem, pg_type_dsc, &isnull);
- Assert(!isnull);
-
- if (DatumGetObjectId(datum) != InvalidOid) {
- HeapTuple tup;
-
- tup = SearchSysCache( TYPEOID
- , datum
- , 0, 0, 0
- );
-
- elemName = NameStr(((Form_pg_type) GETSTRUCT(tup))->typname);
-
- ReleaseSysCache(tup);
- }
-
-
- /*
- * Run through constraints manually avoids the additional
- * processing conducted by DefineRelation() and friends.
- *
- * Besides, we don't want any constraints to be cooked. We'll
- * do that when the table is created via MergeDomainAttributes().
- */
- foreach(listptr, schema)
- {
- bool nullDefined = false;
- Node *expr;
- Constraint *colDef = lfirst(listptr);
-
- /* Used for the statement transformation */
- ParseState *pstate;
-
- /*
- * Create a dummy ParseState and insert the target relation as its
- * sole rangetable entry. We need a ParseState for transformExpr.
- */
- pstate = make_parsestate(NULL);
-
- switch(colDef->contype) {
- /*
- * The inherited default value may be overridden by the user
- * with the DEFAULT <expr> statement.
- *
- * We have to search the entire constraint tree returned as we
- * don't want to cook or fiddle too much.
- */
- case CONSTR_DEFAULT:
-
- /*
- * Cook the colDef->raw_expr into an expression to ensure
- * that it can be done. We store the text version of the
- * raw value.
- *
- * Note: Name is strictly for error message
- */
- expr = cookDefault(pstate, colDef->raw_expr
- , typeTup->t_data->t_oid
- , stmt->typename->typmod
- , stmt->typename->name);
-
- /* Binary default required */
- defaultValue = deparse_expression(expr,
- deparse_context_for(stmt->domainname,
- InvalidOid),
- false);
-
- defaultValueBin = nodeToString(expr);
-
- break;
-
- /*
- * Find the NULL constraint.
- */
- case CONSTR_NOTNULL:
- if (nullDefined) {
- elog(ERROR, "CREATE DOMAIN has conflicting NULL / NOT NULL constraint");
- } else {
- typNotNull = true;
- nullDefined = true;
- }
-
- break;
-
- case CONSTR_NULL:
- if (nullDefined) {
- elog(ERROR, "CREATE DOMAIN has conflicting NULL / NOT NULL constraint");
- } else {
- typNotNull = false;
- nullDefined = true;
- }
-
- break;
-
- case CONSTR_UNIQUE:
- elog(ERROR, "CREATE DOMAIN / UNIQUE indecies not supported");
- break;
-
- case CONSTR_PRIMARY:
- elog(ERROR, "CREATE DOMAIN / PRIMARY KEY indecies not supported");
- break;
-
-
- case CONSTR_CHECK:
-
- elog(ERROR, "defineDomain: CHECK Constraints not supported");
- break;
-
- case CONSTR_ATTR_DEFERRABLE:
- case CONSTR_ATTR_NOT_DEFERRABLE:
- case CONSTR_ATTR_DEFERRED:
- case CONSTR_ATTR_IMMEDIATE:
- elog(ERROR, "defineDomain: DEFERRABLE, NON DEFERRABLE, DEFERRED and IMMEDIATE not supported");
- break;
- }
-
- }
-
- /*
- * Have TypeCreate do all the real work.
- */
- TypeCreate(stmt->domainname, /* type name */
- InvalidOid, /* preassigned type oid (not done here) */
- InvalidOid, /* relation oid (n/a here) */
- internalLength, /* internal size */
- externalLength, /* external size */
- 'd', /* type-type (domain type) */
- delimiter, /* array element delimiter */
- inputName, /* input procedure */
- outputName, /* output procedure */
- receiveName, /* receive procedure */
- sendName, /* send procedure */
- elemName, /* element type name */
- typeName, /* base type name */
- defaultValue, /* default type value */
- defaultValueBin, /* default type value */
- byValue, /* passed by value */
- alignment, /* required alignment */
- storage, /* TOAST strategy */
- stmt->typename->typmod, /* typeMod value */
- typNDims, /* Array dimensions for base type */
- typNotNull); /* Type NOT NULL */
-
- /*
- * Now we can clean up.
- */
- ReleaseSysCache(typeTup);
- heap_close(pg_type_rel, NoLock);
-}
-
-
-/*
* DefineType
* Registers a new type.
*/
@@ -807,8 +490,6 @@ DefineType(char *typeName, List *parameters)
char *sendName = NULL;
char *receiveName = NULL;
char *defaultValue = NULL;
- char *defaultValueBin = NULL;
- Node *defaultRaw = (Node *) NULL;
bool byValue = false;
char delimiter = DEFAULT_TYPDELIM;
char *shadow_type;
@@ -850,7 +531,7 @@ DefineType(char *typeName, List *parameters)
else if (strcasecmp(defel->defname, "element") == 0)
elemName = defGetString(defel);
else if (strcasecmp(defel->defname, "default") == 0)
- defaultRaw = defel->arg;
+ defaultValue = defGetString(defel);
else if (strcasecmp(defel->defname, "passedbyvalue") == 0)
byValue = true;
else if (strcasecmp(defel->defname, "alignment") == 0)
@@ -910,32 +591,6 @@ DefineType(char *typeName, List *parameters)
if (outputName == NULL)
elog(ERROR, "Define: \"output\" unspecified");
-
- if (defaultRaw) {
- Node *expr;
- ParseState *pstate;
-
- /*
- * Create a dummy ParseState and insert the target relation as its
- * sole rangetable entry. We need a ParseState for transformExpr.
- */
- pstate = make_parsestate(NULL);
-
- expr = cookDefault(pstate, defaultRaw,
- InvalidOid,
- -1,
- typeName);
-
- /* Binary default required */
- defaultValue = deparse_expression(expr,
- deparse_context_for(typeName,
- InvalidOid),
- false);
-
- defaultValueBin = nodeToString(expr);
- }
-
-
/*
* now have TypeCreate do all the real work.
*/
@@ -951,15 +606,10 @@ DefineType(char *typeName, List *parameters)
receiveName, /* receive procedure */
sendName, /* send procedure */
elemName, /* element type name */
- NULL, /* base type name (Non-zero for domains) */
defaultValue, /* default type value */
- defaultValueBin, /* default type value (Binary form) */
byValue, /* passed by value */
alignment, /* required alignment */
- storage, /* TOAST strategy */
- -1, /* typMod (Domains only) */
- 0, /* Array Dimensions of typbasetype */
- 'f'); /* Type NOT NULL */
+ storage); /* TOAST strategy */
/*
* When we create a base type (as opposed to a complex type) we need
@@ -982,15 +632,10 @@ DefineType(char *typeName, List *parameters)
"array_in", /* receive procedure */
"array_out", /* send procedure */
typeName, /* element type name */
- NULL, /* base type name */
NULL, /* never a default type value */
- NULL, /* binary default isn't sent either */
false, /* never passed by value */
alignment, /* see above */
- 'x', /* ARRAY is always toastable */
- -1, /* typMod (Domains only) */
- 0, /* Array dimensions of typbasetype */
- 'f'); /* Type NOT NULL */
+ 'x'); /* ARRAY is always toastable */
pfree(shadow_type);
}
diff --git a/src/backend/commands/remove.c b/src/backend/commands/remove.c
index 69e6e1b9000..8c8634c18b4 100644
--- a/src/backend/commands/remove.c
+++ b/src/backend/commands/remove.c
@@ -1,14 +1,14 @@
/*-------------------------------------------------------------------------
*
* remove.c
- * POSTGRES remove (domain | function | type | operator ) utilty code.
+ * POSTGRES remove (function | type | operator ) utilty code.
*
* Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/commands/Attic/remove.c,v 1.67 2002/03/06 20:34:47 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/commands/Attic/remove.c,v 1.68 2002/03/07 16:35:34 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@@ -22,7 +22,6 @@
#include "commands/comment.h"
#include "commands/defrem.h"
#include "miscadmin.h"
-#include "parser/parse.h"
#include "parser/parse_agg.h"
#include "parser/parse_expr.h"
#include "parser/parse_func.h"
@@ -277,60 +276,6 @@ RemoveType(char *typeName) /* type name to be removed */
}
/*
- * RemoveDomain
- * Removes the domain 'typeName' and all attributes and relations that
- * use it.
- */
-void
-RemoveDomain(char *domainName, int behavior) /* domain name to be removed */
-{
- Relation relation;
- HeapTuple tup;
- TupleDesc description;
- char typtype;
- bool isnull;
-
-
- /* Domains are stored as types. Check for permissions on the type */
- if (!pg_ownercheck(GetUserId(), domainName, TYPENAME))
- elog(ERROR, "RemoveDomain: type '%s': permission denied",
- domainName);
-
-
- relation = heap_openr(TypeRelationName, RowExclusiveLock);
- description = RelationGetDescr(relation);
-
- tup = SearchSysCache(TYPENAME,
- PointerGetDatum(domainName),
- 0, 0, 0);
- if (!HeapTupleIsValid(tup))
- elog(ERROR, "RemoveType: type '%s' does not exist", domainName);
-
-
- /* Check that this is actually a domain */
- typtype = DatumGetChar(heap_getattr(tup, Anum_pg_type_typtype, description, &isnull));
- Assert(!isnull);
-
- if (typtype != 'd') {
- elog(ERROR, "%s is not a domain", domainName);
- }
-
- /* CASCADE unsupported */
- if (behavior == CASCADE) {
- elog(ERROR, "DROP DOMAIN does not support the CASCADE keyword");
- }
-
- /* Delete any comments associated with this type */
- DeleteComments(tup->t_data->t_oid, RelationGetRelid(relation));
-
- simple_heap_delete(relation, &tup->t_self);
-
- ReleaseSysCache(tup);
-
- heap_close(relation, RowExclusiveLock);
-}
-
-/*
* RemoveFunction
* Deletes a function.
*