-- Density is controllable and bounded across N (v2.0.2 field report: a -- few-trigram corpus blew up ~50x past 10k rows because the per-tuple -- positional payload -- positions + bloom -- was stored uncompressed at -- ~22 B/TID). That payload path was removed in 3.0.0, so builds are -- always payload-free. This test builds the same small-alphabet corpus -- at 10k and 30k with coalescing ON, and asserts 30k bytes/row stays -- within 4x of 10k bytes/row (it was 50x). SET client_min_messages = warning; SET CREATE EXTENSION IF NOT EXISTS pg_tre; CREATE EXTENSION DROP TABLE IF EXISTS dscale_10k; DROP TABLE DROP TABLE IF EXISTS dscale_30k; DROP TABLE CREATE TABLE dscale_10k (id serial PRIMARY KEY, body text); CREATE TABLE INSERT INTO dscale_10k(body) SELECT (CASE WHEN g % 2 = 0 THEN 'alpha ' ELSE '' END) || (CASE WHEN g % 3 = 0 THEN 'bravo ' ELSE '' END) || (CASE WHEN g % 2 = 1 THEN 'charlie ' ELSE '' END) || (CASE WHEN g % 5 = 0 THEN 'delta ' ELSE '' END) || 'echo foxtrot' FROM generate_series(1, 10000) g; INSERT 0 10000 CREATE TABLE dscale_30k (id serial PRIMARY KEY, body text); CREATE TABLE INSERT INTO dscale_30k(body) SELECT (CASE WHEN g % 2 = 0 THEN 'alpha ' ELSE '' END) || (CASE WHEN g % 3 = 0 THEN 'bravo ' ELSE '' END) || (CASE WHEN g % 2 = 1 THEN 'charlie ' ELSE '' END) || (CASE WHEN g % 5 = 0 THEN 'delta ' ELSE '' END) || 'echo foxtrot' FROM generate_series(1, 30000) g; INSERT 0 30000 SET pg_tre.coalesce_enable = on; SET CREATE INDEX dscale_10k_idx ON dscale_10k USING tre (body); CREATE INDEX CREATE INDEX dscale_30k_idx ON dscale_30k USING tre (body); CREATE INDEX SET pg_tre.coalesce_enable = off; SET SELECT CASE WHEN (pg_relation_size('dscale_30k_idx') / 30000) <= (pg_relation_size('dscale_10k_idx') / 10000) * 4 THEN 'density_bounded' ELSE 'density_blowup' END AS scaling; scaling ----------------- density_bounded (1 row) DROP TABLE dscale_10k; DROP TABLE DROP TABLE dscale_30k; DROP TABLE