From 9ee48915705645a5b3b662a73f88410eafd753f3 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Mon, 9 Dec 2002 20:31:05 +0000 Subject: [PATCH] Some quick fixes for ALTER DOMAIN patch. It still needs a lot of work, but at least it doesn't generate gcc warnings. --- src/backend/commands/typecmds.c | 172 ++++++++++++++------------------ 1 file changed, 76 insertions(+), 96 deletions(-) diff --git a/src/backend/commands/typecmds.c b/src/backend/commands/typecmds.c index 209d415ef5..d5260ad119 100644 --- a/src/backend/commands/typecmds.c +++ b/src/backend/commands/typecmds.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/commands/typecmds.c,v 1.20 2002/12/06 05:00:11 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/commands/typecmds.c,v 1.21 2002/12/09 20:31:05 tgl Exp $ * * DESCRIPTION * The "DefineFoo" routines take the parse tree and pick out the @@ -63,7 +63,6 @@ static Oid findTypeIOFunction(List *procname, Oid typeOid, bool isOutput); static List *get_rels_with_domain(Oid domainOid); static void domainPermissionCheck(HeapTuple tup, TypeName *typename); -static void domainCheckForUnsupportedConstraints(Node *newConstraint); static char *domainAddConstraint(Oid domainOid, Oid domainNamespace, Oid baseTypeOid, int typMod, Constraint *constr, @@ -519,24 +518,23 @@ DefineDomain(CreateDomainStmt *stmt) Constraint *colDef; ParseState *pstate; - /* - * Check for constraint types which are not supported by - * domains. Throws an error if it finds one. - */ - domainCheckForUnsupportedConstraints(newConstraint); + /* Check for unsupported constraint types */ + if (IsA(newConstraint, FkConstraint)) + elog(ERROR, "CREATE DOMAIN / FOREIGN KEY constraints not supported"); + + /* this case should not happen */ + if (!IsA(newConstraint, Constraint)) + elog(ERROR, "DefineDomain: unexpected constraint node type"); - /* Assume its a CHECK, DEFAULT, NULL or NOT NULL constraint */ colDef = (Constraint *) newConstraint; + switch (colDef->contype) { + case CONSTR_DEFAULT: /* * The inherited default value may be overridden by the * user with the DEFAULT statement. - * - * We have to search the entire constraint tree returned as - * we don't want to cook or fiddle too much. */ - case CONSTR_DEFAULT: if (defaultExpr) elog(ERROR, "CREATE DOMAIN has multiple DEFAULT expressions"); /* Create a dummy ParseState for transformExpr */ @@ -563,9 +561,6 @@ DefineDomain(CreateDomainStmt *stmt) defaultValueBin = nodeToString(defaultExpr); break; - /* - * Find the NULL constraint. - */ case CONSTR_NOTNULL: if (nullDefined) elog(ERROR, "CREATE DOMAIN has conflicting NULL / NOT NULL constraint"); @@ -580,19 +575,34 @@ DefineDomain(CreateDomainStmt *stmt) nullDefined = true; break; - /* - * Check constraints are handled after domain creation, as they require - * the Oid of the domain - */ case CONSTR_CHECK: + /* + * Check constraints are handled after domain creation, as they + * require the Oid of the domain + */ + break; + + /* + * All else are error cases + */ + case CONSTR_UNIQUE: + elog(ERROR, "CREATE DOMAIN / UNIQUE not supported"); + break; + + case CONSTR_PRIMARY: + elog(ERROR, "CREATE DOMAIN / PRIMARY KEY not supported"); + break; + + case CONSTR_ATTR_DEFERRABLE: + case CONSTR_ATTR_NOT_DEFERRABLE: + case CONSTR_ATTR_DEFERRED: + case CONSTR_ATTR_IMMEDIATE: + elog(ERROR, "CREATE DOMAIN: DEFERRABLE, NON DEFERRABLE, DEFERRED" + " and IMMEDIATE not supported"); break; - /* - * If we reach this, then domainCheckForUnsupportedConstraints() - * doesn't have a complete list of unsupported domain constraints - */ default: - elog(ERROR, "DefineDomain: unrecognized constraint node type"); + elog(ERROR, "DefineDomain: unrecognized constraint subtype"); break; } } @@ -629,6 +639,8 @@ DefineDomain(CreateDomainStmt *stmt) { Constraint *constr = lfirst(listptr); + /* it must be a Constraint, per check above */ + switch (constr->contype) { case CONSTR_CHECK: @@ -642,7 +654,8 @@ DefineDomain(CreateDomainStmt *stmt) } break; - /* Errors for other constraints are taken care of prior to domain creation */ + /* Other constraint types were fully processed above */ + default: break; } @@ -1262,21 +1275,21 @@ AlterDomainAddConstraint(List *names, Node *newConstraint) elog(ERROR, "AlterDomain: type \"%s\" does not exist", TypeNameToString(typename)); + typTup = (Form_pg_type) GETSTRUCT(tup); /* Doesn't return if user isn't allowed to alter the domain */ domainPermissionCheck(tup, typename); - typTup = (Form_pg_type) GETSTRUCT(tup); + /* Check for unsupported constraint types */ + if (IsA(newConstraint, FkConstraint)) + elog(ERROR, "ALTER DOMAIN / FOREIGN KEY constraints not supported"); + /* this case should not happen */ + if (!IsA(newConstraint, Constraint)) + elog(ERROR, "AlterDomainAddConstraint: unexpected constraint node type"); - /* - * Check for constraint types which are not supported by - * domains. Throws an error if it finds one. - */ - domainCheckForUnsupportedConstraints(newConstraint); - - /* Assume its a CHECK, DEFAULT, NULL or NOT NULL constraint */ constr = (Constraint *) newConstraint; + switch (constr->contype) { case CONSTR_DEFAULT: @@ -1288,32 +1301,42 @@ AlterDomainAddConstraint(List *names, Node *newConstraint) elog(ERROR, "Use ALTER DOMAIN .. [ SET | DROP ] NOT NULL instead"); break; - /* - * Check constraints are handled after domain creation, as they require - * the Oid of the domain - */ case CONSTR_CHECK: - { - /* Returns the cooked constraint which is not needed during creation */ - ccbin = domainAddConstraint(HeapTupleGetOid(tup), typTup->typnamespace, - typTup->typbasetype, typTup->typtypmod, - constr, &counter, NameStr(typTup->typname)); - } + /* processed below */ break; - /* - * If we reach this, then domainCheckForUnsupportedConstraints() - * doesn't have a complete list of unsupported domain constraints - */ + case CONSTR_UNIQUE: + elog(ERROR, "ALTER DOMAIN / UNIQUE indexes not supported"); + break; + + case CONSTR_PRIMARY: + elog(ERROR, "ALTER DOMAIN / PRIMARY KEY indexes not supported"); + break; + + case CONSTR_ATTR_DEFERRABLE: + case CONSTR_ATTR_NOT_DEFERRABLE: + case CONSTR_ATTR_DEFERRED: + case CONSTR_ATTR_IMMEDIATE: + elog(ERROR, "ALTER DOMAIN: DEFERRABLE, NON DEFERRABLE, DEFERRED" + " and IMMEDIATE not supported"); + break; + default: - elog(ERROR, "DefineDomain: unrecognized constraint node type"); + elog(ERROR, "AlterDomainAddConstraint: unrecognized constraint node type"); break; } /* * Since all other constraint types throw errors, this must be - * a check constraint, and ccbin must be set. - * + * a check constraint. + */ + + /* Returns the cooked constraint which is not needed during creation */ + ccbin = domainAddConstraint(HeapTupleGetOid(tup), typTup->typnamespace, + typTup->typbasetype, typTup->typtypmod, + constr, &counter, NameStr(typTup->typname)); + + /* * Test all values stored in the attributes based on the domain * the constraint is being added to. */ @@ -1424,7 +1447,7 @@ get_rels_with_domain(Oid domainOid) /* Scan through pg_class for tables */ while ((classTup = heap_getnext(classScan, ForwardScanDirection)) != NULL) { - bool addToList = true; + relToCheck *rtc = NULL; int nkeys = 0; HeapTuple attTup; HeapScanDesc attScan; @@ -1447,13 +1470,9 @@ get_rels_with_domain(Oid domainOid) /* Scan through pg_attribute for attributes based on the domain */ while ((attTup = heap_getnext(attScan, ForwardScanDirection)) != NULL) { - relToCheck *rtc; - - /* Make the list entries for the relation */ - if (addToList) + if (rtc == NULL) { - addToList = false; - + /* First one found for this rel */ rtc = (relToCheck *)palloc(sizeof(relToCheck)); rtc->atts = (int *)palloc(sizeof(int) * pg_class->relnatts); rtc->relOid = HeapTupleGetOid(classTup); @@ -1625,42 +1644,3 @@ domainAddConstraint(Oid domainOid, Oid domainNamespace, Oid baseTypeOid, */ return ccbin; } - -/* - * domainCheckForUnsupportedConstraints - * - * Throws an error on constraints that are unsupported by the - * domains. - */ -void -domainCheckForUnsupportedConstraints(Node *newConstraint) -{ - Constraint *colDef; - - if (nodeTag(newConstraint) == T_FkConstraint) - elog(ERROR, "CREATE DOMAIN / FOREIGN KEY constraints not supported"); - - colDef = (Constraint *) newConstraint; - - switch (colDef->contype) - { - case CONSTR_UNIQUE: - elog(ERROR, "CREATE DOMAIN / UNIQUE indexes not supported"); - break; - - case CONSTR_PRIMARY: - elog(ERROR, "CREATE DOMAIN / PRIMARY KEY indexes 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; - - default: - break; - } -}