--- /dev/null
+CREATE EXTENSION pg_freespacemap;
+CREATE TABLE freespace_tab (c1 int) WITH (autovacuum_enabled = off);
+CREATE INDEX freespace_brin ON freespace_tab USING brin (c1);
+CREATE INDEX freespace_btree ON freespace_tab USING btree (c1);
+CREATE INDEX freespace_hash ON freespace_tab USING hash (c1);
+-- report all the sizes of the FSMs for all the relation blocks.
+WITH rel AS (SELECT oid::regclass AS id FROM pg_class WHERE relname ~ 'freespace')
+ SELECT rel.id, fsm.blkno, (fsm.avail > 0) AS is_avail
+ FROM rel, LATERAL pg_freespace(rel.id) AS fsm
+ ORDER BY 1, 2;
+ id | blkno | is_avail
+-----------------+-------+----------
+ freespace_brin | 0 | f
+ freespace_brin | 1 | f
+ freespace_brin | 2 | t
+ freespace_btree | 0 | f
+ freespace_hash | 0 | f
+ freespace_hash | 1 | f
+ freespace_hash | 2 | f
+ freespace_hash | 3 | f
+ freespace_hash | 4 | f
+ freespace_hash | 5 | f
+ freespace_hash | 6 | f
+ freespace_hash | 7 | f
+ freespace_hash | 8 | f
+ freespace_hash | 9 | f
+(14 rows)
+
+INSERT INTO freespace_tab VALUES (1);
+VACUUM freespace_tab;
+WITH rel AS (SELECT oid::regclass AS id FROM pg_class WHERE relname ~ 'freespace')
+ SELECT rel.id, fsm.blkno, (fsm.avail > 0) AS is_avail
+ FROM rel, LATERAL pg_freespace(rel.id) AS fsm
+ ORDER BY 1, 2;
+ id | blkno | is_avail
+-----------------+-------+----------
+ freespace_tab | 0 | t
+ freespace_brin | 0 | f
+ freespace_brin | 1 | f
+ freespace_brin | 2 | t
+ freespace_btree | 0 | f
+ freespace_btree | 1 | f
+ freespace_hash | 0 | f
+ freespace_hash | 1 | f
+ freespace_hash | 2 | f
+ freespace_hash | 3 | f
+ freespace_hash | 4 | f
+ freespace_hash | 5 | f
+ freespace_hash | 6 | f
+ freespace_hash | 7 | f
+ freespace_hash | 8 | f
+ freespace_hash | 9 | f
+(16 rows)
+
+DELETE FROM freespace_tab;
+VACUUM freespace_tab;
+WITH rel AS (SELECT oid::regclass AS id FROM pg_class WHERE relname ~ 'freespace')
+ SELECT rel.id, fsm.blkno, (fsm.avail > 0) AS is_avail
+ FROM rel, LATERAL pg_freespace(rel.id) AS fsm
+ ORDER BY 1, 2;
+ id | blkno | is_avail
+-----------------+-------+----------
+ freespace_brin | 0 | f
+ freespace_brin | 1 | f
+ freespace_brin | 2 | t
+ freespace_btree | 0 | f
+ freespace_btree | 1 | f
+ freespace_hash | 0 | f
+ freespace_hash | 1 | f
+ freespace_hash | 2 | f
+ freespace_hash | 3 | f
+ freespace_hash | 4 | f
+ freespace_hash | 5 | f
+ freespace_hash | 6 | f
+ freespace_hash | 7 | f
+ freespace_hash | 8 | f
+ freespace_hash | 9 | f
+(15 rows)
+
+-- failures with incorrect block number
+SELECT * FROM pg_freespace('freespace_tab', -1);
+ERROR: invalid block number
+SELECT * FROM pg_freespace('freespace_tab', 4294967295);
+ERROR: invalid block number
+DROP TABLE freespace_tab;
--- /dev/null
+CREATE EXTENSION pg_freespacemap;
+
+CREATE TABLE freespace_tab (c1 int) WITH (autovacuum_enabled = off);
+CREATE INDEX freespace_brin ON freespace_tab USING brin (c1);
+CREATE INDEX freespace_btree ON freespace_tab USING btree (c1);
+CREATE INDEX freespace_hash ON freespace_tab USING hash (c1);
+
+-- report all the sizes of the FSMs for all the relation blocks.
+WITH rel AS (SELECT oid::regclass AS id FROM pg_class WHERE relname ~ 'freespace')
+ SELECT rel.id, fsm.blkno, (fsm.avail > 0) AS is_avail
+ FROM rel, LATERAL pg_freespace(rel.id) AS fsm
+ ORDER BY 1, 2;
+
+INSERT INTO freespace_tab VALUES (1);
+VACUUM freespace_tab;
+WITH rel AS (SELECT oid::regclass AS id FROM pg_class WHERE relname ~ 'freespace')
+ SELECT rel.id, fsm.blkno, (fsm.avail > 0) AS is_avail
+ FROM rel, LATERAL pg_freespace(rel.id) AS fsm
+ ORDER BY 1, 2;
+
+DELETE FROM freespace_tab;
+VACUUM freespace_tab;
+WITH rel AS (SELECT oid::regclass AS id FROM pg_class WHERE relname ~ 'freespace')
+ SELECT rel.id, fsm.blkno, (fsm.avail > 0) AS is_avail
+ FROM rel, LATERAL pg_freespace(rel.id) AS fsm
+ ORDER BY 1, 2;
+
+-- failures with incorrect block number
+SELECT * FROM pg_freespace('freespace_tab', -1);
+SELECT * FROM pg_freespace('freespace_tab', 4294967295);
+
+DROP TABLE freespace_tab;