Skip to content

Commit dae887a

Browse files
committed
Remove now-dead code for processing CONSTR_UNIQUE nodes in
AlterTableAddConstraint. Earlier reorganization of the parser's processing of ALTER TABLE means that these node types no longer get here.
1 parent fb17004 commit dae887a

File tree

1 file changed

+7
-173
lines changed

1 file changed

+7
-173
lines changed

src/backend/commands/command.c

Lines changed: 7 additions & 173 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
*
99
*
1010
* IDENTIFICATION
11-
* $Header: /cvsroot/pgsql/src/backend/commands/Attic/command.c,v 1.150 2001/11/05 17:46:24 momjian Exp $
11+
* $Header: /cvsroot/pgsql/src/backend/commands/Attic/command.c,v 1.151 2001/12/04 17:19:48 tgl Exp $
1212
*
1313
* NOTES
1414
* The PerformAddAttribute() code, like most of the relation
@@ -1246,6 +1246,12 @@ AlterTableAddConstraint(char *relationName,
12461246
{
12471247
Constraint *constr = (Constraint *) newConstraint;
12481248

1249+
/*
1250+
* Currently, we only expect to see CONSTR_CHECK nodes
1251+
* arriving here (see the preprocessing done in
1252+
* parser/analyze.c). Use a switch anyway to make it
1253+
* easier to add more code later.
1254+
*/
12491255
switch (constr->contype)
12501256
{
12511257
case CONSTR_CHECK:
@@ -1351,178 +1357,6 @@ AlterTableAddConstraint(char *relationName,
13511357
AddRelationRawConstraints(rel, NIL,
13521358
makeList1(constr));
13531359

1354-
break;
1355-
}
1356-
case CONSTR_UNIQUE:
1357-
{
1358-
char *iname = constr->name;
1359-
bool istemp = is_temp_rel_name(relationName);
1360-
List *indexoidlist;
1361-
List *indexoidscan;
1362-
int num_keys;
1363-
bool index_found = false;
1364-
bool index_found_unique = false;
1365-
bool index_found_primary = false;
1366-
1367-
/*
1368-
* If the constraint name is not
1369-
* specified, generate a name
1370-
*/
1371-
if (iname == NULL)
1372-
{
1373-
Oid indoid;
1374-
int pass = 0;
1375-
char *typename = palloc(NAMEDATALEN);
1376-
Ident *key;
1377-
1378-
/*
1379-
* Assume that the length of the attr
1380-
* list is already > 0
1381-
*/
1382-
1383-
/*
1384-
* Get the first attribute so we can
1385-
* use its name
1386-
*/
1387-
key = (Ident *) lfirst(constr->keys);
1388-
1389-
/* Initialise typename to 'key' */
1390-
snprintf(typename, NAMEDATALEN, "key");
1391-
1392-
for (;;)
1393-
{
1394-
iname = makeObjectName(relationName, key->name, typename);
1395-
1396-
/* Check for a conflict */
1397-
indoid = RelnameFindRelid(iname);
1398-
1399-
/*
1400-
* If the oid was not found, then
1401-
* we have a safe name
1402-
*/
1403-
if ((!istemp && !OidIsValid(indoid)) ||
1404-
(istemp && !is_temp_rel_name(iname)))
1405-
break;
1406-
1407-
/*
1408-
* Found a conflict, so try a new
1409-
* name component
1410-
*/
1411-
pfree(iname);
1412-
snprintf(typename, NAMEDATALEN, "key%d", ++pass);
1413-
}
1414-
}
1415-
1416-
/*
1417-
* Need to check for unique key already on
1418-
* field(s)
1419-
*/
1420-
1421-
/*
1422-
* First we check for limited correctness
1423-
* of the constraint
1424-
*/
1425-
1426-
/* Loop over all indices on the relation */
1427-
indexoidlist = RelationGetIndexList(rel);
1428-
1429-
foreach(indexoidscan, indexoidlist)
1430-
{
1431-
Oid indexoid = lfirsti(indexoidscan);
1432-
HeapTuple indexTuple;
1433-
Form_pg_index indexStruct;
1434-
List *keyl;
1435-
int i;
1436-
1437-
indexTuple = SearchSysCache(INDEXRELID,
1438-
ObjectIdGetDatum(indexoid),
1439-
0, 0, 0);
1440-
1441-
if (!HeapTupleIsValid(indexTuple))
1442-
elog(ERROR, "ALTER TABLE / ADD CONSTRAINT: Index \"%u\" not found",
1443-
indexoid);
1444-
indexStruct = (Form_pg_index) GETSTRUCT(indexTuple);
1445-
1446-
/*
1447-
* Make sure this index has the same
1448-
* number of keys as the constraint --
1449-
* It obviously won't match otherwise.
1450-
*/
1451-
for (i = 0; i < INDEX_MAX_KEYS && indexStruct->indkey[i] != 0; i++)
1452-
;
1453-
num_keys = length(constr->keys);
1454-
1455-
if (i == num_keys)
1456-
{
1457-
/*
1458-
* Loop over each key in the
1459-
* constraint and check that there
1460-
* is a corresponding key in the
1461-
* index.
1462-
*/
1463-
int keys_matched = 0;
1464-
1465-
i = 0;
1466-
foreach(keyl, constr->keys)
1467-
{
1468-
Ident *key = lfirst(keyl);
1469-
int keyno = indexStruct->indkey[i];
1470-
1471-
/*
1472-
* Look at key[i] in the index
1473-
* and check that it is over
1474-
* the same column as key[i]
1475-
* in the constraint. This is
1476-
* to differentiate between
1477-
* (a,b) and (b,a)
1478-
*/
1479-
if (namestrcmp(attnumAttName(rel, keyno),
1480-
key->name) == 0)
1481-
keys_matched++;
1482-
else
1483-
break;
1484-
i++;
1485-
}
1486-
if (keys_matched == num_keys)
1487-
{
1488-
index_found = true;
1489-
index_found_unique = indexStruct->indisunique;
1490-
index_found_primary = indexStruct->indisprimary;
1491-
}
1492-
}
1493-
ReleaseSysCache(indexTuple);
1494-
if (index_found_unique || index_found_primary)
1495-
break;
1496-
}
1497-
1498-
freeList(indexoidlist);
1499-
1500-
if (index_found_primary)
1501-
elog(ERROR, "Unique primary key already defined on relation \"%s\"", relationName);
1502-
else if (index_found_unique)
1503-
elog(ERROR, "Unique constraint already defined on the specified attributes in relation \"%s\"", relationName);
1504-
1505-
/*
1506-
* If everything is ok, create the new
1507-
* index (constraint)
1508-
*/
1509-
DefineIndex(
1510-
relationName,
1511-
iname,
1512-
"btree",
1513-
constr->keys,
1514-
true,
1515-
false,
1516-
NULL,
1517-
NIL);
1518-
1519-
/* Issue notice */
1520-
elog(NOTICE, "ALTER TABLE / ADD UNIQUE will create implicit index '%s' for table '%s'",
1521-
iname, relationName);
1522-
if (index_found)
1523-
elog(NOTICE, "Unique constraint supercedes existing index on relation \"%s\". Drop the existing index to remove redundancy.", relationName);
1524-
pfree(iname);
1525-
15261360
break;
15271361
}
15281362
default:

0 commit comments

Comments
 (0)