Fix ALTER TABLE ... ADD COLUMN for inheritance cases.

Alvaro Herrera
This commit is contained in:
Bruce Momjian 2002-10-21 20:31:52 +00:00
parent b47c3598d4
commit e49c1a9234
4 changed files with 42 additions and 17 deletions

View File

@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/commands/tablecmds.c,v 1.48 2002/10/19 03:01:09 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/commands/tablecmds.c,v 1.49 2002/10/21 20:31:51 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@ -1584,7 +1584,6 @@ update_ri_trigger_args(Oid relid,
void void
AlterTableAddColumn(Oid myrelid, AlterTableAddColumn(Oid myrelid,
bool recurse, bool recurse,
bool recursing,
ColumnDef *colDef) ColumnDef *colDef)
{ {
Relation rel, Relation rel,
@ -1643,22 +1642,50 @@ AlterTableAddColumn(Oid myrelid,
colDefChild->inhcount = 1; colDefChild->inhcount = 1;
colDefChild->is_local = false; colDefChild->is_local = false;
/* this routine is actually in the planner */ /* We only want direct inheritors */
children = find_all_inheritors(myrelid); children = find_inheritance_children(myrelid);
/*
* find_all_inheritors does the recursive search of the
* inheritance hierarchy, so all we have to do is process all of
* the relids in the list that it returns.
*/
foreach(child, children) foreach(child, children)
{ {
Oid childrelid = lfirsti(child); Oid childrelid = lfirsti(child);
HeapTuple tuple;
Form_pg_attribute childatt;
Relation childrel;
if (childrelid == myrelid) if (childrelid == myrelid)
continue; continue;
AlterTableAddColumn(childrelid, false, true, colDefChild); attrdesc = heap_openr(AttributeRelationName, RowExclusiveLock);
tuple = SearchSysCacheCopyAttName(childrelid, colDef->colname);
if (!HeapTupleIsValid(tuple))
{
heap_close(attrdesc, RowExclusiveLock);
AlterTableAddColumn(childrelid, true, colDefChild);
continue;
}
childatt = (Form_pg_attribute) GETSTRUCT(tuple);
typeTuple = typenameType(colDef->typename);
if (HeapTupleGetOid(typeTuple) != childatt->atttypid ||
colDef->typename->typmod != childatt->atttypmod)
elog(ERROR, "ALTER TABLE: child table %u has different "
"type for column \"%s\"",
childrelid, colDef->colname);
childatt->attinhcount++;
simple_heap_update(attrdesc, &tuple->t_self, tuple);
CatalogUpdateIndexes(attrdesc, tuple);
childrel = RelationIdGetRelation(childrelid);
elog(NOTICE, "ALTER TABLE: merging definition of column "
"\"%s\" for child %s", colDef->colname,
RelationGetRelationName(childrel));
RelationClose(childrel);
heap_close(attrdesc, RowExclusiveLock);
heap_freetuple(tuple);
ReleaseSysCache(typeTuple);
} }
} }
else else
@ -1667,8 +1694,7 @@ AlterTableAddColumn(Oid myrelid,
* If we are told not to recurse, there had better not be any * If we are told not to recurse, there had better not be any
* child tables; else the addition would put them out of step. * child tables; else the addition would put them out of step.
*/ */
if (!recursing && if (find_inheritance_children(myrelid) != NIL)
find_inheritance_children(myrelid) != NIL)
elog(ERROR, "Attribute must be added to child tables too"); elog(ERROR, "Attribute must be added to child tables too");
} }

View File

@ -10,7 +10,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/tcop/utility.c,v 1.179 2002/10/08 17:17:19 tgl Exp $ * $Header: /cvsroot/pgsql/src/backend/tcop/utility.c,v 1.180 2002/10/21 20:31:52 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@ -475,7 +475,6 @@ ProcessUtility(Node *parsetree,
*/ */
AlterTableAddColumn(relid, AlterTableAddColumn(relid,
interpretInhOption(stmt->relation->inhOpt), interpretInhOption(stmt->relation->inhOpt),
false,
(ColumnDef *) stmt->def); (ColumnDef *) stmt->def);
break; break;
case 'T': /* ALTER COLUMN DEFAULT */ case 'T': /* ALTER COLUMN DEFAULT */

View File

@ -7,7 +7,7 @@
* Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group * Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* $Id: tablecmds.h,v 1.7 2002/09/04 20:31:42 momjian Exp $ * $Id: tablecmds.h,v 1.8 2002/10/21 20:31:52 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@ -16,8 +16,7 @@
#include "nodes/parsenodes.h" #include "nodes/parsenodes.h"
extern void AlterTableAddColumn(Oid myrelid, bool recurse, bool recursing, extern void AlterTableAddColumn(Oid myrelid, bool recurse, ColumnDef *colDef);
ColumnDef *colDef);
extern void AlterTableAlterColumnDropNotNull(Oid myrelid, bool recurse, extern void AlterTableAlterColumnDropNotNull(Oid myrelid, bool recurse,
const char *colName); const char *colName);

View File

@ -373,6 +373,7 @@ SELECT * FROM e_star*;
(23 rows) (23 rows)
ALTER TABLE a_star* ADD COLUMN a text; ALTER TABLE a_star* ADD COLUMN a text;
NOTICE: ALTER TABLE: merging definition of column "a" for child d_star
--UPDATE b_star* --UPDATE b_star*
-- SET a = text 'gazpacho' -- SET a = text 'gazpacho'
-- WHERE aa > 4; -- WHERE aa > 4;