Re: Identifying no-op length coercions
От | Alexey Klyukin |
---|---|
Тема | Re: Identifying no-op length coercions |
Дата | |
Msg-id | 779549B8-475B-4F66-B55B-2A57552FF342@commandprompt.com обсуждение исходный текст |
Ответ на | Re: Identifying no-op length coercions (Noah Misch <noah@leadboat.com>) |
Ответы |
Re: Identifying no-op length coercions
|
Список | 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
В списке pgsql-hackers по дате отправления: