Jaime Casanova wrote:
> On Thu, Mar 5, 2009 at 10:47 AM, Matteo Beccati <php(at)beccati(dot)com> wrote:
>
>> Guillaume Smet ha scritto:
>>
>>> On Wed, Mar 4, 2009 at 11:50 AM, Peter Eisentraut <peter_e(at)gmx(dot)net> wrote:
>>>
>>>> The question is how you want to implement this in a data type independent
>>>> fashion. You can't assume that increasing the typmod is a noop for all data
>>>> types.
>>>>
>>> Sure. See my previous answer on -hackers (I don't think this
>>> discussion belong to -bugs) and especially the discussion in the
>>> archives about Jonas' patch.
>>>
>> I recently had a similar problem when I added some domains to the
>> application. ALTER TABLE ... TYPE varchar_dom was leading to a full
>> table rewrite even though the underlying type definition were exactly
>> the same (i.e. varchar(64)). I can live with it, but I suppose this fix
>> might be related to the varlen one.
>>
>>
>
> ALTER TABLE ... TYPE does cause a table rewrite even if new_type =
> old_type, and that is actually useful...
> for example when you add a fillfactor to an existing table that
> fillfactor will not affect the existing data until you rewrite the
> table and a convenient way is exactly using ALTER TABLE ... TYPE.
>
Well, while this behaviour is well-known for PostgreSQL, this is
actually an abuse of syntax. If there are legitimate requirements for
rewriting a table, then there should be explicit syntax for such a
feature, like "ALTER TABLE ... REWRITE". Rewriting a table in case of
"ALTER TABLE ... TYPE" is, by the semantics of that statement, just a
side-effect, which may or may not happen, depending on how optimized the
DBMS is. It is bad design to avoid optimization just because an
unnecessary side-effect would be optimized away.
> now, back to the problem... is not easier to define a column as TEXT
> and to put a check to constraint the length? if you wanna change the
> constraint that will be almost free
No. Is it possible to change the column type from VARCHAR(5) to TEXT
without a table-rewrite penalty?
ciao,
Xuân.