@ -447,7 +447,6 @@ static bool check_for_column_name_collision(Relation rel, const char *colname,
bool if_not_exists ) ;
bool if_not_exists ) ;
static void add_column_datatype_dependency ( Oid relid , int32 attnum , Oid typid ) ;
static void add_column_datatype_dependency ( Oid relid , int32 attnum , Oid typid ) ;
static void add_column_collation_dependency ( Oid relid , int32 attnum , Oid collid ) ;
static void add_column_collation_dependency ( Oid relid , int32 attnum , Oid collid ) ;
static void ATPrepDropNotNull ( Relation rel , bool recurse , bool recursing ) ;
static ObjectAddress ATExecDropNotNull ( Relation rel , const char * colName , LOCKMODE lockmode ) ;
static ObjectAddress ATExecDropNotNull ( Relation rel , const char * colName , LOCKMODE lockmode ) ;
static void ATPrepSetNotNull ( List * * wqueue , Relation rel ,
static void ATPrepSetNotNull ( List * * wqueue , Relation rel ,
AlterTableCmd * cmd , bool recurse , bool recursing ,
AlterTableCmd * cmd , bool recurse , bool recursing ,
@ -4858,7 +4857,6 @@ ATPrepCmd(List **wqueue, Relation rel, AlterTableCmd *cmd,
case AT_DropNotNull : /* ALTER COLUMN DROP NOT NULL */
case AT_DropNotNull : /* ALTER COLUMN DROP NOT NULL */
ATSimplePermissions ( cmd - > subtype , rel ,
ATSimplePermissions ( cmd - > subtype , rel ,
ATT_TABLE | ATT_PARTITIONED_TABLE | ATT_FOREIGN_TABLE ) ;
ATT_TABLE | ATT_PARTITIONED_TABLE | ATT_FOREIGN_TABLE ) ;
ATPrepDropNotNull ( rel , recurse , recursing ) ;
ATSimpleRecursion ( wqueue , rel , cmd , recurse , lockmode , context ) ;
ATSimpleRecursion ( wqueue , rel , cmd , recurse , lockmode , context ) ;
pass = AT_PASS_DROP ;
pass = AT_PASS_DROP ;
break ;
break ;
@ -7498,29 +7496,7 @@ add_column_collation_dependency(Oid relid, int32 attnum, Oid collid)
/*
/*
* ALTER TABLE ALTER COLUMN DROP NOT NULL
* ALTER TABLE ALTER COLUMN DROP NOT NULL
*/
*
static void
ATPrepDropNotNull ( Relation rel , bool recurse , bool recursing )
{
/*
* If the parent is a partitioned table , like check constraints , we do not
* support removing the NOT NULL while partitions exist .
*/
if ( rel - > rd_rel - > relkind = = RELKIND_PARTITIONED_TABLE )
{
PartitionDesc partdesc = RelationGetPartitionDesc ( rel , true ) ;
Assert ( partdesc ! = NULL ) ;
if ( partdesc - > nparts > 0 & & ! recurse & & ! recursing )
ereport ( ERROR ,
( errcode ( ERRCODE_INVALID_TABLE_DEFINITION ) ,
errmsg ( " cannot remove constraint from only the partitioned table when partitions exist " ) ,
errhint ( " Do not specify the ONLY keyword. " ) ) ) ;
}
}
/*
* Return the address of the modified column . If the column was already
* Return the address of the modified column . If the column was already
* nullable , InvalidObjectAddress is returned .
* nullable , InvalidObjectAddress is returned .
*/
*/
@ -12713,18 +12689,6 @@ ATExecDropConstraint(Relation rel, const char *constrName,
else
else
children = NIL ;
children = NIL ;
/*
* For a partitioned table , if partitions exist and we are told not to
* recurse , it ' s a user error . It doesn ' t make sense to have a constraint
* be defined only on the parent , especially if it ' s a partitioned table .
*/
if ( rel - > rd_rel - > relkind = = RELKIND_PARTITIONED_TABLE & &
children ! = NIL & & ! recurse )
ereport ( ERROR ,
( errcode ( ERRCODE_INVALID_TABLE_DEFINITION ) ,
errmsg ( " cannot remove constraint from only the partitioned table when partitions exist " ) ,
errhint ( " Do not specify the ONLY keyword. " ) ) ) ;
foreach_oid ( childrelid , children )
foreach_oid ( childrelid , children )
{
{
Relation childrel ;
Relation childrel ;