mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-12-21 08:29:39 +08:00
Fix ALTER TABLE ... ADD COLUMN for inheritance cases.
Alvaro Herrera
This commit is contained in:
parent
b47c3598d4
commit
e49c1a9234
@ -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");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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 */
|
||||||
|
@ -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);
|
||||||
|
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user