diff options
Diffstat (limited to 'src/test/regress')
| -rw-r--r-- | src/test/regress/expected/fsm.out | 75 | ||||
| -rw-r--r-- | src/test/regress/parallel_schedule | 6 | ||||
| -rw-r--r-- | src/test/regress/serial_schedule | 1 | ||||
| -rw-r--r-- | src/test/regress/sql/fsm.sql | 55 |
4 files changed, 137 insertions, 0 deletions
diff --git a/src/test/regress/expected/fsm.out b/src/test/regress/expected/fsm.out new file mode 100644 index 00000000000..df6b15b9d2a --- /dev/null +++ b/src/test/regress/expected/fsm.out @@ -0,0 +1,75 @@ +-- +-- Free Space Map test +-- +CREATE TABLE fsm_check_size (num int, str text); +-- Fill 3 blocks with as many large records as will fit +-- No FSM +INSERT INTO fsm_check_size SELECT i, rpad('', 1024, 'a') +FROM generate_series(1,7*3) i; +VACUUM fsm_check_size; +SELECT pg_relation_size('fsm_check_size', 'main') AS heap_size, +pg_relation_size('fsm_check_size', 'fsm') AS fsm_size; + heap_size | fsm_size +-----------+---------- + 24576 | 0 +(1 row) + +-- Clear some space on block 0 +DELETE FROM fsm_check_size WHERE num <= 5; +VACUUM fsm_check_size; +-- Insert small record in block 2 to set the cached smgr targetBlock +INSERT INTO fsm_check_size VALUES(99, 'b'); +-- Insert large record and make sure it goes in block 0 rather than +-- causing the relation to extend +INSERT INTO fsm_check_size VALUES (101, rpad('', 1024, 'a')); +SELECT pg_relation_size('fsm_check_size', 'main') AS heap_size, +pg_relation_size('fsm_check_size', 'fsm') AS fsm_size; + heap_size | fsm_size +-----------+---------- + 24576 | 0 +(1 row) + +-- Extend table with enough blocks to exceed the FSM threshold +-- FSM is created and extended to 3 blocks +INSERT INTO fsm_check_size SELECT i, 'c' FROM generate_series(200,1200) i; +VACUUM fsm_check_size; +SELECT pg_relation_size('fsm_check_size', 'fsm') AS fsm_size; + fsm_size +---------- + 24576 +(1 row) + +-- Truncate heap to 1 block +-- No change in FSM +DELETE FROM fsm_check_size WHERE num > 7; +VACUUM fsm_check_size; +SELECT pg_relation_size('fsm_check_size', 'fsm') AS fsm_size; + fsm_size +---------- + 24576 +(1 row) + +-- Truncate heap to 0 blocks +-- FSM now truncated to 2 blocks +DELETE FROM fsm_check_size; +VACUUM fsm_check_size; +SELECT pg_relation_size('fsm_check_size', 'fsm') AS fsm_size; + fsm_size +---------- + 16384 +(1 row) + +-- Add long random string to extend TOAST table to 1 block +INSERT INTO fsm_check_size +VALUES(0, (SELECT string_agg(md5(chr(i)), '') + FROM generate_series(1,100) i)); +VACUUM fsm_check_size; +SELECT pg_relation_size(reltoastrelid, 'main') AS toast_size, +pg_relation_size(reltoastrelid, 'fsm') AS toast_fsm_size +FROM pg_class WHERE relname = 'fsm_check_size'; + toast_size | toast_fsm_size +------------+---------------- + 8192 | 0 +(1 row) + +DROP TABLE fsm_check_size; diff --git a/src/test/regress/parallel_schedule b/src/test/regress/parallel_schedule index cc0bbf5db9f..4051a4ad4e1 100644 --- a/src/test/regress/parallel_schedule +++ b/src/test/regress/parallel_schedule @@ -69,6 +69,12 @@ test: create_aggregate create_function_3 create_cast constraints triggers inheri test: sanity_check # ---------- +# fsm does a delete followed by vacuum, and running it in parallel can prevent +# removal of rows. +# ---------- +test: fsm + +# ---------- # Believe it or not, select creates a table, subsequent # tests need. # ---------- diff --git a/src/test/regress/serial_schedule b/src/test/regress/serial_schedule index 0c10c7100c6..ac1ea622d65 100644 --- a/src/test/regress/serial_schedule +++ b/src/test/regress/serial_schedule @@ -80,6 +80,7 @@ test: roleattributes test: create_am test: hash_func test: sanity_check +test: fsm test: errors test: select test: select_into diff --git a/src/test/regress/sql/fsm.sql b/src/test/regress/sql/fsm.sql new file mode 100644 index 00000000000..07f505591a8 --- /dev/null +++ b/src/test/regress/sql/fsm.sql @@ -0,0 +1,55 @@ +-- +-- Free Space Map test +-- + +CREATE TABLE fsm_check_size (num int, str text); + +-- Fill 3 blocks with as many large records as will fit +-- No FSM +INSERT INTO fsm_check_size SELECT i, rpad('', 1024, 'a') +FROM generate_series(1,7*3) i; +VACUUM fsm_check_size; +SELECT pg_relation_size('fsm_check_size', 'main') AS heap_size, +pg_relation_size('fsm_check_size', 'fsm') AS fsm_size; + +-- Clear some space on block 0 +DELETE FROM fsm_check_size WHERE num <= 5; +VACUUM fsm_check_size; + +-- Insert small record in block 2 to set the cached smgr targetBlock +INSERT INTO fsm_check_size VALUES(99, 'b'); + +-- Insert large record and make sure it goes in block 0 rather than +-- causing the relation to extend +INSERT INTO fsm_check_size VALUES (101, rpad('', 1024, 'a')); +SELECT pg_relation_size('fsm_check_size', 'main') AS heap_size, +pg_relation_size('fsm_check_size', 'fsm') AS fsm_size; + +-- Extend table with enough blocks to exceed the FSM threshold +-- FSM is created and extended to 3 blocks +INSERT INTO fsm_check_size SELECT i, 'c' FROM generate_series(200,1200) i; +VACUUM fsm_check_size; +SELECT pg_relation_size('fsm_check_size', 'fsm') AS fsm_size; + +-- Truncate heap to 1 block +-- No change in FSM +DELETE FROM fsm_check_size WHERE num > 7; +VACUUM fsm_check_size; +SELECT pg_relation_size('fsm_check_size', 'fsm') AS fsm_size; + +-- Truncate heap to 0 blocks +-- FSM now truncated to 2 blocks +DELETE FROM fsm_check_size; +VACUUM fsm_check_size; +SELECT pg_relation_size('fsm_check_size', 'fsm') AS fsm_size; + +-- Add long random string to extend TOAST table to 1 block +INSERT INTO fsm_check_size +VALUES(0, (SELECT string_agg(md5(chr(i)), '') + FROM generate_series(1,100) i)); +VACUUM fsm_check_size; +SELECT pg_relation_size(reltoastrelid, 'main') AS toast_size, +pg_relation_size(reltoastrelid, 'fsm') AS toast_fsm_size +FROM pg_class WHERE relname = 'fsm_check_size'; + +DROP TABLE fsm_check_size; |
