create function bar() returns record as $$ declare r foo := row(123, 2^30); begin alter type foo alter attribute b type text; return r; end; $$ language plpgsql;
postgres=# select bar(); server closed the connection unexpectedly This probably means the server terminated abnormally before or while processing the request.
LOG: server process (PID 394076) was terminated by signal 11: Segmentation fault
(Here 2^30 is interpreted as a string length.)
ISTM after the alter operation, the attribute description of 'b' has been altered to cope with type text, but the data layout inside the heap tuple stays unchanged. So when we fetch attribute 'b', what we get is an integer pointer into the tuple's data area storing value 2^30, due to type text is not attbyval.
Then later we interpret that integer pointer as a varlena pointer, which is not correct.
But I'm not sure how to fix it. Is there an easy way to also alter the data layout inside the tuple?