On Wed, Mar 10, 2021 at 03:50:48PM -0500, Robert Haas wrote: > On Wed, Mar 10, 2021 at 6:52 AM Dilip Kumar <dilipbal...@gmail.com> wrote: > > The pending comment is providing a way to rewrite a table and > > re-compress the data with the current compression method. > > I spent some time poking at this yesterday and ran couldn't figure out > what was going on here. There are two places where we rewrite tables. > One is the stuff in cluter.c, which handles VACUUM FULL and CLUSTER. > That eventually calls reform_and_rewrite_tuple(), which deforms the > old tuple and creates a new one, but it doesn't seem like there's > anything in there that would expand toasted values, whether external > or inline compressed. But I think that can't be right, because it > seems like then you'd end up with toast pointers into the old TOAST > relation, not the new one, which would cause failures later. So I must > be missing something here.
I did this the empirical way. postgres=# CREATE TABLE t (a text compression lz4); postgres=# INSERT INTO t SELECT repeat('a',99999); postgres=# ALTER TABLE t ALTER a SET COMPRESSION pglz; postgres=# VACUUM FULL t; postgres=# SELECT pg_column_compression(a) FROM t; pg_column_compression | lz4 Actually, a --without-lz4 build can *also* VACUUM FULL the lz4 table. It looks like VACUUM FULL t processes t but not its toast table (which is strange to me, since VACUUM processes both, but then autovacuum also processes them independently). -- Justin