On Jun 21, 2011, at 9:58 PM, Noah Misch wrote:
>
> A pg_regress test needs stable output, so we would do it roughly like this:
>
> CREATE TEMP TABLE relstorage AS SELECT 0::regclass AS oldnode;
> ...
> UPDATE relstorage SET oldnode =
> (SELECT relfilenode FROM pg_class WHERE oid = 'test'::regclass);
> ALTER TABLE test ALTER name TYPE varchar(65535);
> SELECT oldnode <> relfilenode AS rewritten
> FROM pg_class, relstorage WHERE oid = 'test'::regclass;
>
> I originally rejected that as too ugly to read. Perhaps not.
Yes, your example is more appropriate. I think you can make it more
straightforward by getting rid of the temp table:
CREATE TABLE test(oldnode oid, name varchar(5));
INSERT INTO test(oldnode) SELECT relfilenode FROM pg_class WHERE
oid='test'::regclass;
ALTER TABLE test ALTER name TYPE varchar(10);
SELECT oldnode <> relfilenode AS rewritten FROM pg_class, test WHERE
oid='test'::regclass;
>
>> The only nitpick code-wise is these lines in varchar_transform:
>>
>> + int32 old_max = exprTypmod(source) - VARHDRSZ;
>> + int32 new_max = new_typmod - VARHDRSZ;
>>
>> I have a hard time understanding why VARHDRSZ is subtracted here, so I'd assume that's a bug.
>
> We track the varchar typmod internally as (max length) + VARHDRSZ.
Oh, right, haven't thought that this is a varchar specific thing.
Thank you,
Alexey.
--
Command Prompt, Inc. http://www.CommandPrompt.com
PostgreSQL Replication, Consulting, Custom Development, 24x7 support