Hi all, As mentioned in [1], there is no regression tests for the SQL control functions: pg_control_checkpoint, pg_control_recovery, pg_control_system and pg_control_init.
It would be minimal to check their execution, as of a "SELECT FROM func()", still some validation can be done on its output as long as the test is portable enough (needs transparency for wal_level, commit timestamps, etc.). Attached is a proposal to provide some coverage. Some of the checks could be just removed, like the ones for non-NULL fields, but I have written out everything to show how much could be done. Thoughts? [1]: https://www.postgresql.org/message-id/[email protected] -- Michael
diff --git a/src/test/regress/expected/misc_functions.out b/src/test/regress/expected/misc_functions.out
index 9f106c2a10..a5df523109 100644
--- a/src/test/regress/expected/misc_functions.out
+++ b/src/test/regress/expected/misc_functions.out
@@ -594,3 +594,89 @@ SELECT * FROM tenk1 a JOIN my_gen_series(1,10) g ON a.unique1 = g;
Index Cond: (unique1 = g.g)
(4 rows)
+--
+-- Test functions for control data
+--
+\x
+SELECT checkpoint_lsn > '0/0'::pg_lsn AS checkpoint_lsn,
+ redo_lsn > '0/0'::pg_lsn AS redo_lsn,
+ redo_wal_file IS NOT NULL AS redo_wal_file,
+ timeline_id > 0 AS timeline_id,
+ prev_timeline_id > 0 AS prev_timeline_id,
+ next_xid IS NOT NULL AS next_xid,
+ next_oid > 0 AS next_oid,
+ next_multixact_id != '0'::xid AS next_multixact_id,
+ next_multi_offset IS NOT NULL AS next_multi_offset,
+ oldest_xid != '0'::xid AS oldest_xid,
+ oldest_xid_dbid > 0 AS oldest_xid_dbid,
+ oldest_active_xid IS NOT NULL AS oldest_active_xid,
+ oldest_multi_xid != '0'::xid AS oldest_multi_xid,
+ oldest_multi_dbid > 0 AS oldest_multi_dbid,
+ oldest_commit_ts_xid IS NOT NULL AS oldest_commit_ts_xid,
+ newest_commit_ts_xid IS NOT NULL AS newest_commit_ts_xid
+ FROM pg_control_checkpoint();
+-[ RECORD 1 ]--------+--
+checkpoint_lsn | t
+redo_lsn | t
+redo_wal_file | t
+timeline_id | t
+prev_timeline_id | t
+next_xid | t
+next_oid | t
+next_multixact_id | t
+next_multi_offset | t
+oldest_xid | t
+oldest_xid_dbid | t
+oldest_active_xid | t
+oldest_multi_xid | t
+oldest_multi_dbid | t
+oldest_commit_ts_xid | t
+newest_commit_ts_xid | t
+
+SELECT max_data_alignment > 0 AS max_data_alignment,
+ database_block_size > 0 AS database_block_size,
+ blocks_per_segment > 0 AS blocks_per_segment,
+ wal_block_size > 0 AS wal_block_size,
+ max_identifier_length > 0 AS max_identifier_length,
+ max_index_columns > 0 AS max_index_columns,
+ max_toast_chunk_size > 0 AS max_toast_chunk_size,
+ large_object_chunk_size > 0 AS large_object_chunk_size,
+ float8_pass_by_value IS NOT NULL AS float8_pass_by_value,
+ data_page_checksum_version >= 0 AS data_page_checksum_version
+ FROM pg_control_init();
+-[ RECORD 1 ]--------------+--
+max_data_alignment | t
+database_block_size | t
+blocks_per_segment | t
+wal_block_size | t
+max_identifier_length | t
+max_index_columns | t
+max_toast_chunk_size | t
+large_object_chunk_size | t
+float8_pass_by_value | t
+data_page_checksum_version | t
+
+SELECT min_recovery_end_lsn >= '0/0'::pg_lsn AS min_recovery_end_lsn,
+ min_recovery_end_timeline >= 0 AS min_recovery_end_timeline,
+ backup_start_lsn >= '0/0'::pg_lsn AS backup_start_lsn,
+ backup_end_lsn >= '0/0'::pg_lsn AS backup_end_lsn,
+ end_of_backup_record_required IS NOT NULL AS end_of_backup_record_required
+ FROM pg_control_recovery();
+-[ RECORD 1 ]-----------------+--
+min_recovery_end_lsn | t
+min_recovery_end_timeline | t
+backup_start_lsn | t
+backup_end_lsn | t
+end_of_backup_record_required | t
+
+SELECT pg_control_version > 0 AS pg_control_version,
+ catalog_version_no > 0 AS catalog_version_no,
+ system_identifier >= 0 AS system_identifier,
+ pg_control_last_modified <= now() AS pg_control_last_modified
+ FROM pg_control_system();
+-[ RECORD 1 ]------------+--
+pg_control_version | t
+catalog_version_no | t
+system_identifier | t
+pg_control_last_modified | t
+
diff --git a/src/test/regress/sql/misc_functions.sql b/src/test/regress/sql/misc_functions.sql
index 639e9b352c..e5e75b82f3 100644
--- a/src/test/regress/sql/misc_functions.sql
+++ b/src/test/regress/sql/misc_functions.sql
@@ -223,3 +223,47 @@ SELECT * FROM tenk1 a JOIN my_gen_series(1,1000) g ON a.unique1 = g;
EXPLAIN (COSTS OFF)
SELECT * FROM tenk1 a JOIN my_gen_series(1,10) g ON a.unique1 = g;
+
+--
+-- Test functions for control data
+--
+\x
+SELECT checkpoint_lsn > '0/0'::pg_lsn AS checkpoint_lsn,
+ redo_lsn > '0/0'::pg_lsn AS redo_lsn,
+ redo_wal_file IS NOT NULL AS redo_wal_file,
+ timeline_id > 0 AS timeline_id,
+ prev_timeline_id > 0 AS prev_timeline_id,
+ next_xid IS NOT NULL AS next_xid,
+ next_oid > 0 AS next_oid,
+ next_multixact_id != '0'::xid AS next_multixact_id,
+ next_multi_offset IS NOT NULL AS next_multi_offset,
+ oldest_xid != '0'::xid AS oldest_xid,
+ oldest_xid_dbid > 0 AS oldest_xid_dbid,
+ oldest_active_xid IS NOT NULL AS oldest_active_xid,
+ oldest_multi_xid != '0'::xid AS oldest_multi_xid,
+ oldest_multi_dbid > 0 AS oldest_multi_dbid,
+ oldest_commit_ts_xid IS NOT NULL AS oldest_commit_ts_xid,
+ newest_commit_ts_xid IS NOT NULL AS newest_commit_ts_xid
+ FROM pg_control_checkpoint();
+SELECT max_data_alignment > 0 AS max_data_alignment,
+ database_block_size > 0 AS database_block_size,
+ blocks_per_segment > 0 AS blocks_per_segment,
+ wal_block_size > 0 AS wal_block_size,
+ max_identifier_length > 0 AS max_identifier_length,
+ max_index_columns > 0 AS max_index_columns,
+ max_toast_chunk_size > 0 AS max_toast_chunk_size,
+ large_object_chunk_size > 0 AS large_object_chunk_size,
+ float8_pass_by_value IS NOT NULL AS float8_pass_by_value,
+ data_page_checksum_version >= 0 AS data_page_checksum_version
+ FROM pg_control_init();
+SELECT min_recovery_end_lsn >= '0/0'::pg_lsn AS min_recovery_end_lsn,
+ min_recovery_end_timeline >= 0 AS min_recovery_end_timeline,
+ backup_start_lsn >= '0/0'::pg_lsn AS backup_start_lsn,
+ backup_end_lsn >= '0/0'::pg_lsn AS backup_end_lsn,
+ end_of_backup_record_required IS NOT NULL AS end_of_backup_record_required
+ FROM pg_control_recovery();
+SELECT pg_control_version > 0 AS pg_control_version,
+ catalog_version_no > 0 AS catalog_version_no,
+ system_identifier >= 0 AS system_identifier,
+ pg_control_last_modified <= now() AS pg_control_last_modified
+ FROM pg_control_system();
signature.asc
Description: PGP signature
