Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1vjBDF-009fz7-1h for pgsql-hackers@arkaria.postgresql.org; Fri, 23 Jan 2026 07:04:10 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1vjBDE-00GYkI-1y for pgsql-hackers@arkaria.postgresql.org; Fri, 23 Jan 2026 07:04:08 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1vjBDD-00GYk5-2B for pgsql-hackers@lists.postgresql.org; Fri, 23 Jan 2026 07:04:08 +0000 Received: from fout-a1-smtp.messagingengine.com ([103.168.172.144]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1vjBDB-001tNR-0j for pgsql-hackers@lists.postgresql.org; Fri, 23 Jan 2026 07:04:07 +0000 Received: from phl-compute-08.internal (phl-compute-08.internal [10.202.2.48]) by mailfout.phl.internal (Postfix) with ESMTP id B83A1EC0087 for ; Fri, 23 Jan 2026 02:04:04 -0500 (EST) Received: from phl-frontend-04 ([10.202.2.163]) by phl-compute-08.internal (MEProxy); Fri, 23 Jan 2026 02:04:04 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=paquier.xyz; h= cc:content-type:content-type:date:date:from:from:in-reply-to :message-id:mime-version:reply-to:subject:subject:to:to; s=fm2; t=1769151844; x=1769238244; bh=hY5N77UeiaJU/R2UMD8EFZ4jUQtji0AF P8mZJnwTaQM=; b=VBD5D/jQVR7msYkxQzqJCjxpA46L90PsUQ3NUPNlGGcM9Eh8 3CvTo7+YK5gwyOhLwE62Fj92fy22Pbqcxlz6k4+vrGO7oZKTswwToRAsyF8XToyN ACoJXMZeso32gUBBUNkQERn67AnSHbmV+1GBxgmeHUFNTVZNM+brH7CnRrb5Dpu5 vGQZvglbIbHxU0o5D20D1btd0lw1ixUIuwHFCh06oPJW+NwrJx9kwb0caV+PvEWY lgxPevy7YRaszA+gC5CUBDGOXPA/7I2bR0vaCGpp0i2ebje1un8/3SST/Qnc8WGr M/hkfSH/l1vuHwLq3XbDe2xaq2iUIsYep1/d1Q== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:content-type:content-type:date:date :feedback-id:feedback-id:from:from:in-reply-to:message-id :mime-version:reply-to:subject:subject:to:to:x-me-proxy :x-me-sender:x-me-sender:x-sasl-enc; s=fm2; t=1769151844; x= 1769238244; bh=hY5N77UeiaJU/R2UMD8EFZ4jUQtji0AFP8mZJnwTaQM=; b=c 8GizbpWXeItzqud2juxwhYNh+K484xnKxF3DdIUgcq77ETTE4WQDomeFACGjew02 WHWd7THgE+z9uzuGKzqmaoJW+z42jx78RHPjN2oobfoCQOPdSJh0CTYqGbAkz1Z2 eRBtUstFjK0oWpzvY71ZVFhsVugNx48baqWQUIJnxM7KlW6s7o8crH9J1leYe7D8 2fyOOh7SimGjHPfWVXQ/BBPCw84mSKvx14c57xc1s9JlfZ3Amr4MkVCu3QalYgd8 qEoxZqnURLddApu8pf7mMbV52DL8RzhyHvcs9BkwGIWA6IbzuY3wHGD9HxE5lxzH du9pqMuI5nD1Tc6DQe0gA== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeefgedrtddtgddugeekfeelucetufdoteggodetrf dotffvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfurfetoffkrfgpnffqhgenuceu rghilhhouhhtmecufedttdenucesvcftvggtihhpihgvnhhtshculddquddttddmnegfrh hlucfvnfffucdljedtmdenucfjughrpeffhffvuffkgggtugesghdtreertddtvdenucfh rhhomhepofhitghhrggvlhcurfgrqhhuihgvrhcuoehmihgthhgrvghlsehprghquhhivg hrrdighiiiqeenucggtffrrghtthgvrhhnpedvtdffteegtdfhuefgvedvtdejgfeugfeg gfejgfdvhefgfeevieektdelkefhgfenucevlhhushhtvghrufhiiigvpedtnecurfgrrh grmhepmhgrihhlfhhrohhmpehmihgthhgrvghlsehprghquhhivghrrdighiiipdhnsggp rhgtphhtthhopedupdhmohguvgepshhmthhpohhuthdprhgtphhtthhopehpghhsqhhlqd hhrggtkhgvrhhssehlihhsthhsrdhpohhsthhgrhgvshhqlhdrohhrgh X-ME-Proxy: Feedback-ID: i0fe9450f:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA for ; Fri, 23 Jan 2026 02:04:03 -0500 (EST) Date: Fri, 23 Jan 2026 16:03:59 +0900 From: Michael Paquier To: Postgres hackers Subject: Some tests for TOAST, STORAGE MAIN/EXTENDED Message-ID: MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha512; protocol="application/pgp-signature"; boundary="bzaggNvFc9OJKhkO" Content-Disposition: inline List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --bzaggNvFc9OJKhkO Content-Type: multipart/mixed; boundary="Bu4cwnhgs91FmvgC" Content-Disposition: inline --Bu4cwnhgs91FmvgC Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Hi all, While playing with the TOAST code this week, I have managed to break the handling of inline compressible entries, and noticed that the main regression test suite did not complain following that. Breaking that stuff is my issue, but I would like to add some regression tests to cover all that, giving the attached. This also includes tests with EXTENDED in the same area, while on it, with checks for the TOAST table itself. Thoughts or comments? -- Michael --Bu4cwnhgs91FmvgC Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="0001-More-tests-for-TOAST-and-STORAGE.patch" Content-Transfer-Encoding: quoted-printable =46rom b00fa7379eece6e3da2d46c0fd19aa80531cd7a9 Mon Sep 17 00:00:00 2001 =46rom: Michael Paquier Date: Fri, 23 Jan 2026 15:32:50 +0900 Subject: [PATCH] More tests for TOAST and STORAGE --- src/test/regress/expected/strings.out | 52 +++++++++++++++++++++++++++ src/test/regress/sql/strings.sql | 22 ++++++++++++ 2 files changed, 74 insertions(+) diff --git a/src/test/regress/expected/strings.out b/src/test/regress/expec= ted/strings.out index 5f2b5c391739..db03fd00d071 100644 --- a/src/test/regress/expected/strings.out +++ b/src/test/regress/expected/strings.out @@ -2159,6 +2159,58 @@ SELECT pg_column_compression(f1) AS f1_comp, pg_colu= mn_compression(f2) AS f2_com |=20 (1 row) =20 +TRUNCATE toasttest; +-- test with inline compressible varlenas. +ALTER TABLE toasttest ALTER COLUMN f1 SET STORAGE MAIN; +ALTER TABLE toasttest ALTER COLUMN f2 SET STORAGE MAIN; +INSERT INTO toasttest values(repeat('1234', 1024), repeat('5678', 1024)); +-- There should be no values in the toast relation. +SELECT substr(f1, 5, 10) AS f1_data, substr(f2, 5, 10) AS f2_data + FROM toasttest; + f1_data | f2_data =20 +------------+------------ + 1234123412 | 5678567856 +(1 row) + +SELECT pg_column_compression(f1) AS f1_comp, pg_column_compression(f2) AS = f2_comp + FROM toasttest; + f1_comp | f2_comp=20 +---------+--------- + pglz | pglz +(1 row) + +SELECT count(*) FROM :reltoastname; + count=20 +------- + 0 +(1 row) + +TRUNCATE toasttest; +-- test with external compressed data (default) +ALTER TABLE toasttest ALTER COLUMN f1 SET STORAGE EXTENDED; +ALTER TABLE toasttest ALTER COLUMN f2 SET STORAGE EXTENDED; +INSERT INTO toasttest values(repeat('1234', 10240), NULL); +-- There should be one value in the toast relation. +SELECT substr(f1, 5, 10) AS f1_data, substr(f2, 5, 10) AS f2_data + FROM toasttest; + f1_data | f2_data=20 +------------+--------- + 1234123412 |=20 +(1 row) + +SELECT pg_column_compression(f1) AS f1_comp, pg_column_compression(f2) AS = f2_comp + FROM toasttest; + f1_comp | f2_comp=20 +---------+--------- + pglz |=20 +(1 row) + +SELECT count(*) FROM :reltoastname; + count=20 +------- + 1 +(1 row) + DROP TABLE toasttest; -- -- test length diff --git a/src/test/regress/sql/strings.sql b/src/test/regress/sql/string= s.sql index 37c0893ae838..592599722b8b 100644 --- a/src/test/regress/sql/strings.sql +++ b/src/test/regress/sql/strings.sql @@ -678,6 +678,28 @@ SELECT substr(f1, 5, 10) AS f1_data, substr(f2, 5, 10)= AS f2_data FROM toasttest; SELECT pg_column_compression(f1) AS f1_comp, pg_column_compression(f2) AS = f2_comp FROM toasttest; +TRUNCATE toasttest; +-- test with inline compressible varlenas. +ALTER TABLE toasttest ALTER COLUMN f1 SET STORAGE MAIN; +ALTER TABLE toasttest ALTER COLUMN f2 SET STORAGE MAIN; +INSERT INTO toasttest values(repeat('1234', 1024), repeat('5678', 1024)); +-- There should be no values in the toast relation. +SELECT substr(f1, 5, 10) AS f1_data, substr(f2, 5, 10) AS f2_data + FROM toasttest; +SELECT pg_column_compression(f1) AS f1_comp, pg_column_compression(f2) AS = f2_comp + FROM toasttest; +SELECT count(*) FROM :reltoastname; +TRUNCATE toasttest; +-- test with external compressed data (default) +ALTER TABLE toasttest ALTER COLUMN f1 SET STORAGE EXTENDED; +ALTER TABLE toasttest ALTER COLUMN f2 SET STORAGE EXTENDED; +INSERT INTO toasttest values(repeat('1234', 10240), NULL); +-- There should be one value in the toast relation. +SELECT substr(f1, 5, 10) AS f1_data, substr(f2, 5, 10) AS f2_data + FROM toasttest; +SELECT pg_column_compression(f1) AS f1_comp, pg_column_compression(f2) AS = f2_comp + FROM toasttest; +SELECT count(*) FROM :reltoastname; DROP TABLE toasttest; =20 -- --=20 2.51.0 --Bu4cwnhgs91FmvgC-- --bzaggNvFc9OJKhkO Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQIzBAABCgAdFiEEG72nH6vTowiyblFKnvQgOdbyQH0FAmlzHV8ACgkQnvQgOdby QH0TAw/5ATPHFIq50RHuyS4rOufJx2bv/11+V9q/daeAPsE3CAw83ED63E7IRkDg Zo57GRG/hYVbR5oI8ayATAqXv0WjGBnuVOXcOQ09ZBh2aPmA8cyYd7efhC+METfq n41s5JmUOUuICzVF6VQXezVjRZxApC+3ObF/+y2RZvrTw/xMQhXhEEC5kR0wTQFQ NmQNQiTI88HhOmgNNVTmspalR3UmJ1VV2dP7E4+YmgCH38vf5zYNzUqz0uJaNoDV BXU6PkeVCk4YFSxlSU+g1hjW8nvdid0nzqUIQt44iazDzu+eYGcn+tMfa/a8iR93 /UWbJw7Ci3lGoFWx9cRUojFFiqeV9T/0LA18g0dJA/IPN5GUu1LoeRVodH+hH9w7 ebcUuhgARv36zNdMp5KaTXr+K+BvPzVlBYu41SwWsxifAsUwZb9+TIn5SrAACL3y gWgUnbbzckt5ek19HG7jlnzHsRFhhJ9Ry8S2GPqbMZVd9R+pK+FClppKsJZcX4IF FdXL7ZHu2qGLcojt3KUURDM949agsjref+BETeKZIdasC/22Kyk6y5PWcgJo+cZQ 6RPL7i1/SdVNYKE+owxpWvL8gNv8s88B9KrsV1QPF5GNNplYESNzjVkbPd2xWClC 3pxXxkrYwIrQSaBZgR0utpYfV7MRzEvzRSUS9oL/SFaqFl8YFX4= =tnJ6 -----END PGP SIGNATURE----- --bzaggNvFc9OJKhkO--