@@ -3391,8 +3391,8 @@ ATRewriteTable(AlteredTableInfo *tab, Oid OIDNewHeap, LOCKMODE lockmode)
3391
3391
*/
3392
3392
if (newrel )
3393
3393
find_composite_type_dependencies (oldrel -> rd_rel -> reltype ,
3394
- RelationGetRelationName ( oldrel ) ,
3395
- NULL );
3394
+ oldrel -> rd_rel -> relkind ,
3395
+ RelationGetRelationName ( oldrel ) );
3396
3396
3397
3397
/*
3398
3398
* Generate the constraint and default execution states
@@ -3860,9 +3860,8 @@ ATTypedTableRecursion(List **wqueue, Relation rel, AlterTableCmd *cmd,
3860
3860
* to reject the ALTER. (How safe is this really?)
3861
3861
*/
3862
3862
void
3863
- find_composite_type_dependencies (Oid typeOid ,
3864
- const char * origTblName ,
3865
- const char * origTypeName )
3863
+ find_composite_type_dependencies (Oid typeOid , char origRelkind ,
3864
+ const char * origRelname )
3866
3865
{
3867
3866
Relation depRel ;
3868
3867
ScanKeyData key [2 ];
@@ -3905,20 +3904,19 @@ find_composite_type_dependencies(Oid typeOid,
3905
3904
3906
3905
if (rel -> rd_rel -> relkind == RELKIND_RELATION )
3907
3906
{
3908
- if (origTblName )
3909
- ereport (ERROR ,
3910
- (errcode (ERRCODE_FEATURE_NOT_SUPPORTED ),
3911
- errmsg ("cannot alter table \"%s\" because column \"%s\".\"%s\" uses its rowtype" ,
3912
- origTblName ,
3913
- RelationGetRelationName (rel ),
3914
- NameStr (att -> attname ))));
3907
+ const char * msg ;
3908
+ if (origRelkind == RELKIND_COMPOSITE_TYPE )
3909
+ msg = gettext_noop ("cannot alter type \"%s\" because column \"%s\".\"%s\" uses it" );
3910
+ else if (origRelkind == RELKIND_FOREIGN_TABLE )
3911
+ msg = gettext_noop ("cannot alter foreign table \"%s\" because column \"%s\".\"%s\" uses its rowtype" );
3915
3912
else
3916
- ereport (ERROR ,
3917
- (errcode (ERRCODE_FEATURE_NOT_SUPPORTED ),
3918
- errmsg ("cannot alter type \"%s\" because column \"%s\".\"%s\" uses it" ,
3919
- origTypeName ,
3920
- RelationGetRelationName (rel ),
3921
- NameStr (att -> attname ))));
3913
+ msg = gettext_noop ("cannot alter table \"%s\" because column \"%s\".\"%s\" uses its rowtype" );
3914
+ ereport (ERROR ,
3915
+ (errcode (ERRCODE_FEATURE_NOT_SUPPORTED ),
3916
+ errmsg (msg ,
3917
+ origRelname ,
3918
+ RelationGetRelationName (rel ),
3919
+ NameStr (att -> attname ))));
3922
3920
}
3923
3921
else if (OidIsValid (rel -> rd_rel -> reltype ))
3924
3922
{
@@ -3927,7 +3925,7 @@ find_composite_type_dependencies(Oid typeOid,
3927
3925
* recursively check for indirect dependencies via its rowtype.
3928
3926
*/
3929
3927
find_composite_type_dependencies (rel -> rd_rel -> reltype ,
3930
- origTblName , origTypeName );
3928
+ origRelkind , origRelname );
3931
3929
}
3932
3930
3933
3931
relation_close (rel , AccessShareLock );
@@ -3943,7 +3941,7 @@ find_composite_type_dependencies(Oid typeOid,
3943
3941
*/
3944
3942
arrayOid = get_array_type (typeOid );
3945
3943
if (OidIsValid (arrayOid ))
3946
- find_composite_type_dependencies (arrayOid , origTblName , origTypeName );
3944
+ find_composite_type_dependencies (arrayOid , origRelkind , origRelname );
3947
3945
}
3948
3946
3949
3947
@@ -6444,14 +6442,15 @@ ATPrepAlterColumnType(List **wqueue,
6444
6442
errmsg ("ALTER TYPE USING is not supported on foreign tables" )));
6445
6443
}
6446
6444
6447
- if (tab -> relkind == RELKIND_COMPOSITE_TYPE )
6445
+ if (tab -> relkind == RELKIND_COMPOSITE_TYPE
6446
+ || tab -> relkind == RELKIND_FOREIGN_TABLE )
6448
6447
{
6449
6448
/*
6450
6449
* For composite types, do this check now. Tables will check
6451
6450
* it later when the table is being rewritten.
6452
6451
*/
6453
6452
find_composite_type_dependencies (rel -> rd_rel -> reltype ,
6454
- NULL ,
6453
+ rel -> rd_rel -> relkind ,
6455
6454
RelationGetRelationName (rel ));
6456
6455
}
6457
6456
0 commit comments