Re: Identifying no-op length coercions

Alexey Klyukin <alexk@commandprompt.com>

From: Alexey Klyukin <alexk@commandprompt.com>
To: Noah Misch <noah@leadboat.com>
Cc: Robert Haas <robertmhaas@gmail.com>, Tom Lane <tgl@sss.pgh.pa.us>, pgsql-hackers@postgresql.org
Date: 2011-06-21T21:50:23Z
Lists: pgsql-hackers
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