88 *
99 *
1010 * IDENTIFICATION
11- * $Header: /cvsroot/pgsql/src/backend/commands/typecmds.c,v 1.20 2002/12/06 05:00:11 momjian Exp $
11+ * $Header: /cvsroot/pgsql/src/backend/commands/typecmds.c,v 1.21 2002/12/09 20:31:05 tgl Exp $
1212 *
1313 * DESCRIPTION
1414 * The "DefineFoo" routines take the parse tree and pick out the
6363static Oid findTypeIOFunction (List * procname , Oid typeOid , bool isOutput );
6464static List * get_rels_with_domain (Oid domainOid );
6565static void domainPermissionCheck (HeapTuple tup , TypeName * typename );
66- static void domainCheckForUnsupportedConstraints (Node * newConstraint );
6766static char * domainAddConstraint (Oid domainOid , Oid domainNamespace ,
6867 Oid baseTypeOid ,
6968 int typMod , Constraint * constr ,
@@ -519,24 +518,23 @@ DefineDomain(CreateDomainStmt *stmt)
519518 Constraint * colDef ;
520519 ParseState * pstate ;
521520
522- /*
523- * Check for constraint types which are not supported by
524- * domains. Throws an error if it finds one.
525- */
526- domainCheckForUnsupportedConstraints (newConstraint );
521+ /* Check for unsupported constraint types */
522+ if (IsA (newConstraint , FkConstraint ))
523+ elog (ERROR , "CREATE DOMAIN / FOREIGN KEY constraints not supported" );
524+
525+ /* this case should not happen */
526+ if (!IsA (newConstraint , Constraint ))
527+ elog (ERROR , "DefineDomain: unexpected constraint node type" );
527528
528- /* Assume its a CHECK, DEFAULT, NULL or NOT NULL constraint */
529529 colDef = (Constraint * ) newConstraint ;
530+
530531 switch (colDef -> contype )
531532 {
533+ case CONSTR_DEFAULT :
532534 /*
533535 * The inherited default value may be overridden by the
534536 * user with the DEFAULT <expr> statement.
535- *
536- * We have to search the entire constraint tree returned as
537- * we don't want to cook or fiddle too much.
538537 */
539- case CONSTR_DEFAULT :
540538 if (defaultExpr )
541539 elog (ERROR , "CREATE DOMAIN has multiple DEFAULT expressions" );
542540 /* Create a dummy ParseState for transformExpr */
@@ -563,9 +561,6 @@ DefineDomain(CreateDomainStmt *stmt)
563561 defaultValueBin = nodeToString (defaultExpr );
564562 break ;
565563
566- /*
567- * Find the NULL constraint.
568- */
569564 case CONSTR_NOTNULL :
570565 if (nullDefined )
571566 elog (ERROR , "CREATE DOMAIN has conflicting NULL / NOT NULL constraint" );
@@ -580,19 +575,34 @@ DefineDomain(CreateDomainStmt *stmt)
580575 nullDefined = true;
581576 break ;
582577
583- /*
584- * Check constraints are handled after domain creation, as they require
585- * the Oid of the domain
586- */
587578 case CONSTR_CHECK :
579+ /*
580+ * Check constraints are handled after domain creation, as they
581+ * require the Oid of the domain
582+ */
583+ break ;
584+
585+ /*
586+ * All else are error cases
587+ */
588+ case CONSTR_UNIQUE :
589+ elog (ERROR , "CREATE DOMAIN / UNIQUE not supported" );
590+ break ;
591+
592+ case CONSTR_PRIMARY :
593+ elog (ERROR , "CREATE DOMAIN / PRIMARY KEY not supported" );
594+ break ;
595+
596+ case CONSTR_ATTR_DEFERRABLE :
597+ case CONSTR_ATTR_NOT_DEFERRABLE :
598+ case CONSTR_ATTR_DEFERRED :
599+ case CONSTR_ATTR_IMMEDIATE :
600+ elog (ERROR , "CREATE DOMAIN: DEFERRABLE, NON DEFERRABLE, DEFERRED"
601+ " and IMMEDIATE not supported" );
588602 break ;
589603
590- /*
591- * If we reach this, then domainCheckForUnsupportedConstraints()
592- * doesn't have a complete list of unsupported domain constraints
593- */
594604 default :
595- elog (ERROR , "DefineDomain: unrecognized constraint node type " );
605+ elog (ERROR , "DefineDomain: unrecognized constraint subtype " );
596606 break ;
597607 }
598608 }
@@ -629,6 +639,8 @@ DefineDomain(CreateDomainStmt *stmt)
629639 {
630640 Constraint * constr = lfirst (listptr );
631641
642+ /* it must be a Constraint, per check above */
643+
632644 switch (constr -> contype )
633645 {
634646 case CONSTR_CHECK :
@@ -642,7 +654,8 @@ DefineDomain(CreateDomainStmt *stmt)
642654 }
643655 break ;
644656
645- /* Errors for other constraints are taken care of prior to domain creation */
657+ /* Other constraint types were fully processed above */
658+
646659 default :
647660 break ;
648661 }
@@ -1262,21 +1275,21 @@ AlterDomainAddConstraint(List *names, Node *newConstraint)
12621275 elog (ERROR , "AlterDomain: type \"%s\" does not exist" ,
12631276 TypeNameToString (typename ));
12641277
1278+ typTup = (Form_pg_type ) GETSTRUCT (tup );
12651279
12661280 /* Doesn't return if user isn't allowed to alter the domain */
12671281 domainPermissionCheck (tup , typename );
12681282
1269- typTup = (Form_pg_type ) GETSTRUCT (tup );
1270-
1283+ /* Check for unsupported constraint types */
1284+ if (IsA (newConstraint , FkConstraint ))
1285+ elog (ERROR , "ALTER DOMAIN / FOREIGN KEY constraints not supported" );
12711286
1272- /*
1273- * Check for constraint types which are not supported by
1274- * domains. Throws an error if it finds one.
1275- */
1276- domainCheckForUnsupportedConstraints (newConstraint );
1287+ /* this case should not happen */
1288+ if (!IsA (newConstraint , Constraint ))
1289+ elog (ERROR , "AlterDomainAddConstraint: unexpected constraint node type" );
12771290
1278- /* Assume its a CHECK, DEFAULT, NULL or NOT NULL constraint */
12791291 constr = (Constraint * ) newConstraint ;
1292+
12801293 switch (constr -> contype )
12811294 {
12821295 case CONSTR_DEFAULT :
@@ -1288,32 +1301,42 @@ AlterDomainAddConstraint(List *names, Node *newConstraint)
12881301 elog (ERROR , "Use ALTER DOMAIN .. [ SET | DROP ] NOT NULL instead" );
12891302 break ;
12901303
1291- /*
1292- * Check constraints are handled after domain creation, as they require
1293- * the Oid of the domain
1294- */
12951304 case CONSTR_CHECK :
1296- {
1297- /* Returns the cooked constraint which is not needed during creation */
1298- ccbin = domainAddConstraint (HeapTupleGetOid (tup ), typTup -> typnamespace ,
1299- typTup -> typbasetype , typTup -> typtypmod ,
1300- constr , & counter , NameStr (typTup -> typname ));
1301- }
1305+ /* processed below */
13021306 break ;
13031307
1304- /*
1305- * If we reach this, then domainCheckForUnsupportedConstraints()
1306- * doesn't have a complete list of unsupported domain constraints
1307- */
1308+ case CONSTR_UNIQUE :
1309+ elog (ERROR , "ALTER DOMAIN / UNIQUE indexes not supported" );
1310+ break ;
1311+
1312+ case CONSTR_PRIMARY :
1313+ elog (ERROR , "ALTER DOMAIN / PRIMARY KEY indexes not supported" );
1314+ break ;
1315+
1316+ case CONSTR_ATTR_DEFERRABLE :
1317+ case CONSTR_ATTR_NOT_DEFERRABLE :
1318+ case CONSTR_ATTR_DEFERRED :
1319+ case CONSTR_ATTR_IMMEDIATE :
1320+ elog (ERROR , "ALTER DOMAIN: DEFERRABLE, NON DEFERRABLE, DEFERRED"
1321+ " and IMMEDIATE not supported" );
1322+ break ;
1323+
13081324 default :
1309- elog (ERROR , "DefineDomain : unrecognized constraint node type" );
1325+ elog (ERROR , "AlterDomainAddConstraint : unrecognized constraint node type" );
13101326 break ;
13111327 }
13121328
13131329 /*
13141330 * Since all other constraint types throw errors, this must be
1315- * a check constraint, and ccbin must be set.
1316- *
1331+ * a check constraint.
1332+ */
1333+
1334+ /* Returns the cooked constraint which is not needed during creation */
1335+ ccbin = domainAddConstraint (HeapTupleGetOid (tup ), typTup -> typnamespace ,
1336+ typTup -> typbasetype , typTup -> typtypmod ,
1337+ constr , & counter , NameStr (typTup -> typname ));
1338+
1339+ /*
13171340 * Test all values stored in the attributes based on the domain
13181341 * the constraint is being added to.
13191342 */
@@ -1424,7 +1447,7 @@ get_rels_with_domain(Oid domainOid)
14241447 /* Scan through pg_class for tables */
14251448 while ((classTup = heap_getnext (classScan , ForwardScanDirection )) != NULL )
14261449 {
1427- bool addToList = true ;
1450+ relToCheck * rtc = NULL ;
14281451 int nkeys = 0 ;
14291452 HeapTuple attTup ;
14301453 HeapScanDesc attScan ;
@@ -1447,13 +1470,9 @@ get_rels_with_domain(Oid domainOid)
14471470 /* Scan through pg_attribute for attributes based on the domain */
14481471 while ((attTup = heap_getnext (attScan , ForwardScanDirection )) != NULL )
14491472 {
1450- relToCheck * rtc ;
1451-
1452- /* Make the list entries for the relation */
1453- if (addToList )
1473+ if (rtc == NULL )
14541474 {
1455- addToList = false;
1456-
1475+ /* First one found for this rel */
14571476 rtc = (relToCheck * )palloc (sizeof (relToCheck ));
14581477 rtc -> atts = (int * )palloc (sizeof (int ) * pg_class -> relnatts );
14591478 rtc -> relOid = HeapTupleGetOid (classTup );
@@ -1625,42 +1644,3 @@ domainAddConstraint(Oid domainOid, Oid domainNamespace, Oid baseTypeOid,
16251644 */
16261645 return ccbin ;
16271646}
1628-
1629- /*
1630- * domainCheckForUnsupportedConstraints
1631- *
1632- * Throws an error on constraints that are unsupported by the
1633- * domains.
1634- */
1635- void
1636- domainCheckForUnsupportedConstraints (Node * newConstraint )
1637- {
1638- Constraint * colDef ;
1639-
1640- if (nodeTag (newConstraint ) == T_FkConstraint )
1641- elog (ERROR , "CREATE DOMAIN / FOREIGN KEY constraints not supported" );
1642-
1643- colDef = (Constraint * ) newConstraint ;
1644-
1645- switch (colDef -> contype )
1646- {
1647- case CONSTR_UNIQUE :
1648- elog (ERROR , "CREATE DOMAIN / UNIQUE indexes not supported" );
1649- break ;
1650-
1651- case CONSTR_PRIMARY :
1652- elog (ERROR , "CREATE DOMAIN / PRIMARY KEY indexes not supported" );
1653- break ;
1654-
1655- case CONSTR_ATTR_DEFERRABLE :
1656- case CONSTR_ATTR_NOT_DEFERRABLE :
1657- case CONSTR_ATTR_DEFERRED :
1658- case CONSTR_ATTR_IMMEDIATE :
1659- elog (ERROR , "DefineDomain: DEFERRABLE, NON DEFERRABLE, DEFERRED"
1660- " and IMMEDIATE not supported" );
1661- break ;
1662-
1663- default :
1664- break ;
1665- }
1666- }
0 commit comments