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/yzy0ilxnbmaxh...@paquier.xyz -- 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