Hi All, Test case:
drop table if exists t; create table t(c text); insert into t values ('x'), (repeat(md5('abcdefghijklmnop'), 10000)); select pg_column_size(c), pg_column_size(c || '') FROM t; CREATE OR REPLACE FUNCTION copy_toast_out() RETURNS VOID AS $$ declare v text; BEGIN SELECT c INTO v FROM t WHERE c <> 'x'; Select 1/0; Exception When Others Then PERFORM pg_sleep(30); -- go run "TRUNCATE t" in a 2nd session raise notice 'length :%', length(v || ''); -- force detoast END; $$ language plpgsql; postgres=# select copy_toast_out(); ERROR: missing chunk number 0 for toast value 16390 in pg_toast_16384 CONTEXT: PL/pgSQL function copy_toast_out() line 10 at RAISE Analysis: The basic problem here is that if the lock is released on table before extracting toasted value, and in meantime someone truncates the table, this error can occur. Here error coming with PL block contains an Exception block (as incase there is an exception block, it calls RollbackAndReleaseCurrentSubTransaction). Do you think we should detoast the local variable before RollbackAndReleaseCurrentSubTransaction ? Or any other options ? Regards, Rushabh Lathia www.EnterpriseDB.com