Add some basic regression tests for pg_freespacemap
authorMichael Paquier <michael@paquier.xyz>
Thu, 24 Mar 2022 00:36:30 +0000 (09:36 +0900)
committerMichael Paquier <michael@paquier.xyz>
Thu, 24 Mar 2022 00:36:30 +0000 (09:36 +0900)
The number of relation pages is tricky to get right in a portable way,
particularly across 32b and 64b builds, but checking after the existence
of the FSM and if there is any space available space should be stable
enough with a minimal number of tuples involved.  This commit introduces
checks on a table with some btree, BRIN and hash indexes, as a first
attempt.

Author: Dong Wook Lee, Fabrízio de Royes Mello, Michael Paquier
Discussion: https://postgr.es/m/CAAcByaJ5KW3bd7fJr=jPEyK8M_UzXJFHHBVuOcBe+JHD8txRyQ@mail.gmail.com

contrib/pg_freespacemap/.gitignore [new file with mode: 0644]
contrib/pg_freespacemap/Makefile
contrib/pg_freespacemap/expected/pg_freespacemap.out [new file with mode: 0644]
contrib/pg_freespacemap/sql/pg_freespacemap.sql [new file with mode: 0644]

diff --git a/contrib/pg_freespacemap/.gitignore b/contrib/pg_freespacemap/.gitignore
new file mode 100644 (file)
index 0000000..5dcb3ff
--- /dev/null
@@ -0,0 +1,4 @@
+# Generated subdirectories
+/log/
+/results/
+/tmp_check/
index da40b80c7c97556caa3363da36d966a6b371fb61..2d525a1284ec2eeffbdbef5b1e83e0b9e564f00e 100644 (file)
@@ -10,6 +10,8 @@ DATA = pg_freespacemap--1.1.sql pg_freespacemap--1.1--1.2.sql \
    pg_freespacemap--1.0--1.1.sql
 PGFILEDESC = "pg_freespacemap - monitoring of free space map"
 
+REGRESS = pg_freespacemap
+
 ifdef USE_PGXS
 PG_CONFIG = pg_config
 PGXS := $(shell $(PG_CONFIG) --pgxs)
diff --git a/contrib/pg_freespacemap/expected/pg_freespacemap.out b/contrib/pg_freespacemap/expected/pg_freespacemap.out
new file mode 100644 (file)
index 0000000..eb574c2
--- /dev/null
@@ -0,0 +1,85 @@
+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;
diff --git a/contrib/pg_freespacemap/sql/pg_freespacemap.sql b/contrib/pg_freespacemap/sql/pg_freespacemap.sql
new file mode 100644 (file)
index 0000000..06275d8
--- /dev/null
@@ -0,0 +1,32 @@
+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;