Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commite49c1a9

Browse files
committed
Fix ALTER TABLE ... ADD COLUMN for inheritance cases.
Alvaro Herrera
1 parentb47c359 commite49c1a9

File tree

4 files changed

+42
-17
lines changed

4 files changed

+42
-17
lines changed

‎src/backend/commands/tablecmds.c

Lines changed: 38 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
*
99
*
1010
* IDENTIFICATION
11-
* $Header: /cvsroot/pgsql/src/backend/commands/tablecmds.c,v 1.48 2002/10/19 03:01:09 momjian Exp $
11+
* $Header: /cvsroot/pgsql/src/backend/commands/tablecmds.c,v 1.49 2002/10/21 20:31:51 momjian Exp $
1212
*
1313
*-------------------------------------------------------------------------
1414
*/
@@ -1584,7 +1584,6 @@ update_ri_trigger_args(Oid relid,
15841584
void
15851585
AlterTableAddColumn(Oidmyrelid,
15861586
boolrecurse,
1587-
boolrecursing,
15881587
ColumnDef*colDef)
15891588
{
15901589
Relationrel,
@@ -1643,22 +1642,50 @@ AlterTableAddColumn(Oid myrelid,
16431642
colDefChild->inhcount=1;
16441643
colDefChild->is_local= false;
16451644

1646-
/*this routine is actually in the planner */
1647-
children=find_all_inheritors(myrelid);
1645+
/*We only want direct inheritors */
1646+
children=find_inheritance_children(myrelid);
16481647

1649-
/*
1650-
* find_all_inheritors does the recursive search of the
1651-
* inheritance hierarchy, so all we have to do is process all of
1652-
* the relids in the list that it returns.
1653-
*/
16541648
foreach(child,children)
16551649
{
16561650
Oidchildrelid=lfirsti(child);
1651+
HeapTupletuple;
1652+
Form_pg_attributechildatt;
1653+
Relationchildrel;
16571654

16581655
if (childrelid==myrelid)
16591656
continue;
16601657

1661-
AlterTableAddColumn(childrelid, false, true,colDefChild);
1658+
attrdesc=heap_openr(AttributeRelationName,RowExclusiveLock);
1659+
tuple=SearchSysCacheCopyAttName(childrelid,colDef->colname);
1660+
if (!HeapTupleIsValid(tuple))
1661+
{
1662+
heap_close(attrdesc,RowExclusiveLock);
1663+
AlterTableAddColumn(childrelid, true,colDefChild);
1664+
continue;
1665+
}
1666+
childatt= (Form_pg_attribute)GETSTRUCT(tuple);
1667+
1668+
typeTuple=typenameType(colDef->typename);
1669+
1670+
if (HeapTupleGetOid(typeTuple)!=childatt->atttypid||
1671+
colDef->typename->typmod!=childatt->atttypmod)
1672+
elog(ERROR,"ALTER TABLE: child table %u has different "
1673+
"type for column \"%s\"",
1674+
childrelid,colDef->colname);
1675+
1676+
childatt->attinhcount++;
1677+
simple_heap_update(attrdesc,&tuple->t_self,tuple);
1678+
CatalogUpdateIndexes(attrdesc,tuple);
1679+
1680+
childrel=RelationIdGetRelation(childrelid);
1681+
elog(NOTICE,"ALTER TABLE: merging definition of column "
1682+
"\"%s\" for child %s",colDef->colname,
1683+
RelationGetRelationName(childrel));
1684+
RelationClose(childrel);
1685+
1686+
heap_close(attrdesc,RowExclusiveLock);
1687+
heap_freetuple(tuple);
1688+
ReleaseSysCache(typeTuple);
16621689
}
16631690
}
16641691
else
@@ -1667,8 +1694,7 @@ AlterTableAddColumn(Oid myrelid,
16671694
* If we are told not to recurse, there had better not be any
16681695
* child tables; else the addition would put them out of step.
16691696
*/
1670-
if (!recursing&&
1671-
find_inheritance_children(myrelid)!=NIL)
1697+
if (find_inheritance_children(myrelid)!=NIL)
16721698
elog(ERROR,"Attribute must be added to child tables too");
16731699
}
16741700

‎src/backend/tcop/utility.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
*
1111
*
1212
* IDENTIFICATION
13-
* $Header: /cvsroot/pgsql/src/backend/tcop/utility.c,v 1.179 2002/10/08 17:17:19 tgl Exp $
13+
* $Header: /cvsroot/pgsql/src/backend/tcop/utility.c,v 1.180 2002/10/21 20:31:52 momjian Exp $
1414
*
1515
*-------------------------------------------------------------------------
1616
*/
@@ -475,7 +475,6 @@ ProcessUtility(Node *parsetree,
475475
*/
476476
AlterTableAddColumn(relid,
477477
interpretInhOption(stmt->relation->inhOpt),
478-
false,
479478
(ColumnDef*)stmt->def);
480479
break;
481480
case'T':/* ALTER COLUMN DEFAULT */

‎src/include/commands/tablecmds.h

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
* Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
88
* Portions Copyright (c) 1994, Regents of the University of California
99
*
10-
* $Id: tablecmds.h,v 1.7 2002/09/04 20:31:42 momjian Exp $
10+
* $Id: tablecmds.h,v 1.8 2002/10/21 20:31:52 momjian Exp $
1111
*
1212
*-------------------------------------------------------------------------
1313
*/
@@ -16,8 +16,7 @@
1616

1717
#include"nodes/parsenodes.h"
1818

19-
externvoidAlterTableAddColumn(Oidmyrelid,boolrecurse,boolrecursing,
20-
ColumnDef*colDef);
19+
externvoidAlterTableAddColumn(Oidmyrelid,boolrecurse,ColumnDef*colDef);
2120

2221
externvoidAlterTableAlterColumnDropNotNull(Oidmyrelid,boolrecurse,
2322
constchar*colName);

‎src/test/regress/output/misc.source

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -373,6 +373,7 @@ SELECT * FROM e_star*;
373373
(23 rows)
374374

375375
ALTER TABLE a_star* ADD COLUMN a text;
376+
NOTICE: ALTER TABLE: merging definition of column "a" for child d_star
376377
--UPDATE b_star*
377378
-- SET a = text 'gazpacho'
378379
-- WHERE aa > 4;

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp