From 1d2c2fd51cf0ad8704782aab2f215dd8e37fcbc2 Mon Sep 17 00:00:00 2001 From: Bharath Rupireddy Date: Fri, 25 Feb 2022 06:49:42 +0000 Subject: [PATCH v5] pg_walinspect tests --- .../pg_walinspect/expected/pg_walinspect.out | 122 ++++++++++++++++++ contrib/pg_walinspect/sql/pg_walinspect.sql | 86 ++++++++++++ 2 files changed, 208 insertions(+) create mode 100644 contrib/pg_walinspect/expected/pg_walinspect.out create mode 100644 contrib/pg_walinspect/sql/pg_walinspect.sql diff --git a/contrib/pg_walinspect/expected/pg_walinspect.out b/contrib/pg_walinspect/expected/pg_walinspect.out new file mode 100644 index 0000000000..ba09c1caab --- /dev/null +++ b/contrib/pg_walinspect/expected/pg_walinspect.out @@ -0,0 +1,122 @@ +CREATE EXTENSION pg_walinspect; +SELECT pg_current_wal_lsn() AS wal_lsn1 \gset +CREATE TABLE sample_tbl(col1 int, col2 int); +INSERT INTO sample_tbl VALUES(1, 2); +SELECT pg_current_wal_lsn() AS wal_lsn2 \gset +INSERT INTO sample_tbl VALUES(2, 3); +-- =================================================================== +-- tests for input validation +-- =================================================================== +SELECT pg_get_raw_wal_record('0/0'); -- ERROR +ERROR: invalid WAL record LSN +SELECT pg_get_first_valid_wal_record_lsn('0/0'); -- ERROR +ERROR: invalid WAL record LSN +SELECT pg_get_wal_record_info('0/0'); -- ERROR +ERROR: invalid WAL record LSN +SELECT pg_get_wal_records_info('0/0', '0/0'); -- ERROR +ERROR: invalid WAL record start LSN +SELECT pg_get_wal_records_info(:'wal_lsn1', '0/0'); -- ERROR +ERROR: invalid WAL record end LSN +SELECT pg_get_wal_records_info(:'wal_lsn2', :'wal_lsn1'); -- start LSN >= end LSN, ERROR +ERROR: WAL record start LSN must be less than end LSN +SELECT pg_get_wal_stats('0/0', '0/0'); -- ERROR +ERROR: invalid WAL record start LSN +SELECT pg_get_wal_stats(:'wal_lsn1', '0/0'); -- ERROR +ERROR: invalid WAL record end LSN +SELECT pg_get_wal_stats(:'wal_lsn2', :'wal_lsn1'); -- start LSN >= end LSN, ERROR +ERROR: WAL record start LSN must be less than end LSN +-- =================================================================== +-- tests for all function executions +-- =================================================================== +SELECT COUNT(*) >= 0 AS ok FROM pg_get_first_valid_wal_record_lsn(:'wal_lsn1'); + ok +---- + t +(1 row) + +SELECT lsn AS valid_wal_lsn1 FROM pg_get_first_valid_wal_record_lsn(:'wal_lsn1') \gset +SELECT lsn AS valid_wal_lsn2 FROM pg_get_first_valid_wal_record_lsn(:'wal_lsn2') \gset +SELECT COUNT(*) >= 0 AS ok FROM pg_get_raw_wal_record(:'valid_wal_lsn1'); + ok +---- + t +(1 row) + +SELECT COUNT(*) >= 0 AS ok FROM pg_get_wal_record_info(:'valid_wal_lsn1'); + ok +---- + t +(1 row) + +SELECT COUNT(*) >= 0 AS ok FROM pg_get_wal_records_info(:'valid_wal_lsn1', :'valid_wal_lsn2'); + ok +---- + t +(1 row) + +SELECT COUNT(*) >= 0 AS ok FROM pg_get_wal_records_info_till_end_of_wal(:'valid_wal_lsn2'); +WARNING: reached end of WAL + ok +---- + t +(1 row) + +SELECT COUNT(*) >= 0 AS ok FROM pg_get_wal_stats(:'valid_wal_lsn1', :'valid_wal_lsn2'); + ok +---- + t +(1 row) + +SELECT COUNT(*) >= 0 AS ok FROM pg_get_wal_stats_till_end_of_wal(:'valid_wal_lsn2'); +WARNING: reached end of WAL + ok +---- + t +(1 row) + +SELECT file_name AS wal_file_name FROM pg_walfile_name_offset(:'valid_wal_lsn1') \gset +SELECT COUNT(*) = 1 AS ok FROM pg_switch_wal(); + ok +---- + t +(1 row) + +INSERT INTO sample_tbl VALUES(3, 4); +SELECT COUNT(*) >= 0 AS ok FROM pg_get_first_and_last_valid_wal_record_lsn(:'wal_file_name'); + ok +---- + t +(1 row) + +-- =================================================================== +-- tests for functions with future WAL +-- =================================================================== +SELECT COUNT(*) >= 0 AS ok FROM pg_get_wal_records_info(:'valid_wal_lsn1', 'FFFFFFFF/FFFFFFFF'); -- WARNING +WARNING: reached end of WAL + ok +---- + t +(1 row) + +SELECT COUNT(*) >= 0 AS ok FROM pg_get_wal_stats(:'valid_wal_lsn1', 'FFFFFFFF/FFFFFFFF'); -- WARNING +WARNING: reached end of WAL + ok +---- + t +(1 row) + +-- =================================================================== +-- tests for filtering out WAL records of a particular table +-- =================================================================== +SELECT oid AS sample_tbl_oid FROM pg_class WHERE relname = 'sample_tbl' \gset +SELECT COUNT(*) >= 0 AS ok FROM pg_get_wal_records_info(:'valid_wal_lsn1', :'valid_wal_lsn2') + WHERE block_ref LIKE concat('%', :'sample_tbl_oid', '%') AND resource_manager = 'Heap'; + ok +---- + t +(1 row) + +-- =================================================================== +-- clean up +-- =================================================================== +DROP TABLE sample_tbl; diff --git a/contrib/pg_walinspect/sql/pg_walinspect.sql b/contrib/pg_walinspect/sql/pg_walinspect.sql new file mode 100644 index 0000000000..5c4253787d --- /dev/null +++ b/contrib/pg_walinspect/sql/pg_walinspect.sql @@ -0,0 +1,86 @@ +CREATE EXTENSION pg_walinspect; + +SELECT pg_current_wal_lsn() AS wal_lsn1 \gset + +CREATE TABLE sample_tbl(col1 int, col2 int); + +INSERT INTO sample_tbl VALUES(1, 2); + +SELECT pg_current_wal_lsn() AS wal_lsn2 \gset + +INSERT INTO sample_tbl VALUES(2, 3); + +-- =================================================================== +-- tests for input validation +-- =================================================================== + +SELECT pg_get_raw_wal_record('0/0'); -- ERROR + +SELECT pg_get_first_valid_wal_record_lsn('0/0'); -- ERROR + +SELECT pg_get_wal_record_info('0/0'); -- ERROR + +SELECT pg_get_wal_records_info('0/0', '0/0'); -- ERROR + +SELECT pg_get_wal_records_info(:'wal_lsn1', '0/0'); -- ERROR + +SELECT pg_get_wal_records_info(:'wal_lsn2', :'wal_lsn1'); -- start LSN >= end LSN, ERROR + +SELECT pg_get_wal_stats('0/0', '0/0'); -- ERROR + +SELECT pg_get_wal_stats(:'wal_lsn1', '0/0'); -- ERROR + +SELECT pg_get_wal_stats(:'wal_lsn2', :'wal_lsn1'); -- start LSN >= end LSN, ERROR + +-- =================================================================== +-- tests for all function executions +-- =================================================================== + +SELECT COUNT(*) >= 0 AS ok FROM pg_get_first_valid_wal_record_lsn(:'wal_lsn1'); + +SELECT lsn AS valid_wal_lsn1 FROM pg_get_first_valid_wal_record_lsn(:'wal_lsn1') \gset + +SELECT lsn AS valid_wal_lsn2 FROM pg_get_first_valid_wal_record_lsn(:'wal_lsn2') \gset + +SELECT COUNT(*) >= 0 AS ok FROM pg_get_raw_wal_record(:'valid_wal_lsn1'); + +SELECT COUNT(*) >= 0 AS ok FROM pg_get_wal_record_info(:'valid_wal_lsn1'); + +SELECT COUNT(*) >= 0 AS ok FROM pg_get_wal_records_info(:'valid_wal_lsn1', :'valid_wal_lsn2'); + +SELECT COUNT(*) >= 0 AS ok FROM pg_get_wal_records_info_till_end_of_wal(:'valid_wal_lsn2'); + +SELECT COUNT(*) >= 0 AS ok FROM pg_get_wal_stats(:'valid_wal_lsn1', :'valid_wal_lsn2'); + +SELECT COUNT(*) >= 0 AS ok FROM pg_get_wal_stats_till_end_of_wal(:'valid_wal_lsn2'); + +SELECT file_name AS wal_file_name FROM pg_walfile_name_offset(:'valid_wal_lsn1') \gset + +SELECT COUNT(*) = 1 AS ok FROM pg_switch_wal(); + +INSERT INTO sample_tbl VALUES(3, 4); + +SELECT COUNT(*) >= 0 AS ok FROM pg_get_first_and_last_valid_wal_record_lsn(:'wal_file_name'); + +-- =================================================================== +-- tests for functions with future WAL +-- =================================================================== + +SELECT COUNT(*) >= 0 AS ok FROM pg_get_wal_records_info(:'valid_wal_lsn1', 'FFFFFFFF/FFFFFFFF'); -- WARNING + +SELECT COUNT(*) >= 0 AS ok FROM pg_get_wal_stats(:'valid_wal_lsn1', 'FFFFFFFF/FFFFFFFF'); -- WARNING + +-- =================================================================== +-- tests for filtering out WAL records of a particular table +-- =================================================================== + +SELECT oid AS sample_tbl_oid FROM pg_class WHERE relname = 'sample_tbl' \gset + +SELECT COUNT(*) >= 0 AS ok FROM pg_get_wal_records_info(:'valid_wal_lsn1', :'valid_wal_lsn2') + WHERE block_ref LIKE concat('%', :'sample_tbl_oid', '%') AND resource_manager = 'Heap'; + +-- =================================================================== +-- clean up +-- =================================================================== + +DROP TABLE sample_tbl; -- 2.25.1