On Sat, Feb 05, 2011 at 10:03:59AM -0500, Robert Haas wrote:
> Looking at this still more, it appears that independent of any change
> this patch may wish to make, there's a live bug here related to the
> foreign table patch I committed back in December.  Creating a foreign
> table creates an eponymous rowtype, which can be used as a column in a
> regular table.  You can then change the data type of a column in the
> foreign table, read from the regular table, and crash the server.
> 
> The simple fix for this is to just change the code in
> ATPrepAlterColumnType to handle the foreign table case also:
> 
>     if (tab->relkind == RELKIND_COMPOSITE_TYPE)
>     {
>         /*
>          * For composite types, do this check now.  Tables will check
>          * it later when the table is being rewritten.
>          */
>         find_composite_type_dependencies(rel->rd_rel->reltype,
>                                          NULL,
>                                          RelationGetRelationName(rel));
>     }
> 
> But this is a little unsatisfying, for two reasons.  First, the error
> message will be subtly wrong: we can make it complain about a table or
> a type, but not a foreign table.  At a quick look, it likes the right
> fix might be to replace the second and third arguments to
> find_composite_type_dependencies() with a Relation.

Seems like a clear improvement.

> Second, I wonder
> if we shouldn't refactor things so that all the checks fire in
> ATRewriteTables() rather than doing them in different places.  Seems
> like that might be cleaner.

Offhand, this seems reasonable, too.  I assumed there was some good reason it
couldn't be done there for non-tables, but nothing comes to mind.

-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to