@@ -554,4 +554,246 @@ SELECT pg_stat_get_live_tuples(:drop_stats_test_subxact_oid);
554554
555555DROP TABLE trunc_stats_test, trunc_stats_test1, trunc_stats_test2, trunc_stats_test3, trunc_stats_test4;
556556DROP TABLE prevstats;
557+ -----
558+ -- Test that various stats views are being properly populated
559+ -----
560+ -- Test that sessions is incremented when a new session is started in pg_stat_database
561+ SELECT sessions AS db_stat_sessions FROM pg_stat_database WHERE datname = (SELECT current_database()) \gset
562+ \c
563+ SELECT sessions > :db_stat_sessions FROM pg_stat_database WHERE datname = (SELECT current_database());
564+ ?column?
565+ ----------
566+ t
567+ (1 row)
568+
569+ -- Test pg_stat_bgwriter checkpointer-related stats, together with pg_stat_wal
570+ SELECT checkpoints_req AS rqst_ckpts_before FROM pg_stat_bgwriter \gset
571+ -- Test pg_stat_wal
572+ SELECT wal_bytes AS wal_bytes_before FROM pg_stat_wal \gset
573+ CREATE TABLE test_stats_temp AS SELECT 17;
574+ DROP TABLE test_stats_temp;
575+ -- Checkpoint twice: The checkpointer reports stats after reporting completion
576+ -- of the checkpoint. But after a second checkpoint we'll see at least the
577+ -- results of the first.
578+ CHECKPOINT;
579+ CHECKPOINT;
580+ SELECT checkpoints_req > :rqst_ckpts_before FROM pg_stat_bgwriter;
581+ ?column?
582+ ----------
583+ t
584+ (1 row)
585+
586+ SELECT wal_bytes > :wal_bytes_before FROM pg_stat_wal;
587+ ?column?
588+ ----------
589+ t
590+ (1 row)
591+
592+ -----
593+ -- Test that resetting stats works for reset timestamp
594+ -----
595+ -- Test that reset_slru with a specified SLRU works.
596+ SELECT stats_reset AS slru_commit_ts_reset_ts FROM pg_stat_slru WHERE name = 'CommitTs' \gset
597+ SELECT stats_reset AS slru_notify_reset_ts FROM pg_stat_slru WHERE name = 'Notify' \gset
598+ SELECT pg_stat_reset_slru('CommitTs');
599+ pg_stat_reset_slru
600+ --------------------
601+
602+ (1 row)
603+
604+ SELECT stats_reset > :'slru_commit_ts_reset_ts'::timestamptz FROM pg_stat_slru WHERE name = 'CommitTs';
605+ ?column?
606+ ----------
607+ t
608+ (1 row)
609+
610+ SELECT stats_reset AS slru_commit_ts_reset_ts FROM pg_stat_slru WHERE name = 'CommitTs' \gset
611+ -- Test that multiple SLRUs are reset when no specific SLRU provided to reset function
612+ SELECT pg_stat_reset_slru(NULL);
613+ pg_stat_reset_slru
614+ --------------------
615+
616+ (1 row)
617+
618+ SELECT stats_reset > :'slru_commit_ts_reset_ts'::timestamptz FROM pg_stat_slru WHERE name = 'CommitTs';
619+ ?column?
620+ ----------
621+ t
622+ (1 row)
623+
624+ SELECT stats_reset > :'slru_notify_reset_ts'::timestamptz FROM pg_stat_slru WHERE name = 'Notify';
625+ ?column?
626+ ----------
627+ t
628+ (1 row)
629+
630+ -- Test that reset_shared with archiver specified as the stats type works
631+ SELECT stats_reset AS archiver_reset_ts FROM pg_stat_archiver \gset
632+ SELECT pg_stat_reset_shared('archiver');
633+ pg_stat_reset_shared
634+ ----------------------
635+
636+ (1 row)
637+
638+ SELECT stats_reset > :'archiver_reset_ts'::timestamptz FROM pg_stat_archiver;
639+ ?column?
640+ ----------
641+ t
642+ (1 row)
643+
644+ SELECT stats_reset AS archiver_reset_ts FROM pg_stat_archiver \gset
645+ -- Test that reset_shared with bgwriter specified as the stats type works
646+ SELECT stats_reset AS bgwriter_reset_ts FROM pg_stat_bgwriter \gset
647+ SELECT pg_stat_reset_shared('bgwriter');
648+ pg_stat_reset_shared
649+ ----------------------
650+
651+ (1 row)
652+
653+ SELECT stats_reset > :'bgwriter_reset_ts'::timestamptz FROM pg_stat_bgwriter;
654+ ?column?
655+ ----------
656+ t
657+ (1 row)
658+
659+ SELECT stats_reset AS bgwriter_reset_ts FROM pg_stat_bgwriter \gset
660+ -- Test that reset_shared with wal specified as the stats type works
661+ SELECT stats_reset AS wal_reset_ts FROM pg_stat_wal \gset
662+ SELECT pg_stat_reset_shared('wal');
663+ pg_stat_reset_shared
664+ ----------------------
665+
666+ (1 row)
667+
668+ SELECT stats_reset > :'wal_reset_ts'::timestamptz FROM pg_stat_wal;
669+ ?column?
670+ ----------
671+ t
672+ (1 row)
673+
674+ SELECT stats_reset AS wal_reset_ts FROM pg_stat_wal \gset
675+ -- Test that reset_shared with no specified stats type doesn't reset anything
676+ SELECT pg_stat_reset_shared(NULL);
677+ pg_stat_reset_shared
678+ ----------------------
679+
680+ (1 row)
681+
682+ SELECT stats_reset = :'archiver_reset_ts'::timestamptz FROM pg_stat_archiver;
683+ ?column?
684+ ----------
685+ t
686+ (1 row)
687+
688+ SELECT stats_reset = :'bgwriter_reset_ts'::timestamptz FROM pg_stat_bgwriter;
689+ ?column?
690+ ----------
691+ t
692+ (1 row)
693+
694+ SELECT stats_reset = :'wal_reset_ts'::timestamptz FROM pg_stat_wal;
695+ ?column?
696+ ----------
697+ t
698+ (1 row)
699+
700+ -- Test that reset works for pg_stat_database
701+ -- Since pg_stat_database stats_reset starts out as NULL, reset it once first so we have something to compare it to
702+ SELECT pg_stat_reset();
703+ pg_stat_reset
704+ ---------------
705+
706+ (1 row)
707+
708+ SELECT stats_reset AS db_reset_ts FROM pg_stat_database WHERE datname = (SELECT current_database()) \gset
709+ SELECT pg_stat_reset();
710+ pg_stat_reset
711+ ---------------
712+
713+ (1 row)
714+
715+ SELECT stats_reset > :'db_reset_ts'::timestamptz FROM pg_stat_database WHERE datname = (SELECT current_database());
716+ ?column?
717+ ----------
718+ t
719+ (1 row)
720+
721+ ----
722+ -- pg_stat_get_snapshot_timestamp behavior
723+ ----
724+ BEGIN;
725+ SET LOCAL stats_fetch_consistency = snapshot;
726+ -- no snapshot yet, return NULL
727+ SELECT pg_stat_get_snapshot_timestamp();
728+ pg_stat_get_snapshot_timestamp
729+ --------------------------------
730+
731+ (1 row)
732+
733+ -- any attempt at accessing stats will build snapshot
734+ SELECT pg_stat_get_function_calls(0);
735+ pg_stat_get_function_calls
736+ ----------------------------
737+
738+ (1 row)
739+
740+ SELECT pg_stat_get_snapshot_timestamp() >= NOW();
741+ ?column?
742+ ----------
743+ t
744+ (1 row)
745+
746+ -- shows NULL again after clearing
747+ SELECT pg_stat_clear_snapshot();
748+ pg_stat_clear_snapshot
749+ ------------------------
750+
751+ (1 row)
752+
753+ SELECT pg_stat_get_snapshot_timestamp();
754+ pg_stat_get_snapshot_timestamp
755+ --------------------------------
756+
757+ (1 row)
758+
759+ COMMIT;
760+ ----
761+ -- pg_stat_have_stats behavior
762+ ----
763+ -- fixed-numbered stats exist
764+ SELECT pg_stat_have_stats('bgwriter', 0, 0);
765+ pg_stat_have_stats
766+ --------------------
767+ t
768+ (1 row)
769+
770+ -- unknown stats kinds error out
771+ SELECT pg_stat_have_stats('zaphod', 0, 0);
772+ ERROR: invalid statistics kind: "zaphod"
773+ -- db stats have objoid 0
774+ SELECT pg_stat_have_stats('database', (SELECT oid FROM pg_database WHERE datname = current_database()), 1);
775+ pg_stat_have_stats
776+ --------------------
777+ f
778+ (1 row)
779+
780+ SELECT pg_stat_have_stats('database', (SELECT oid FROM pg_database WHERE datname = current_database()), 0);
781+ pg_stat_have_stats
782+ --------------------
783+ t
784+ (1 row)
785+
786+ -- ensure that stats accessors handle NULL input correctly
787+ SELECT pg_stat_get_replication_slot(NULL);
788+ pg_stat_get_replication_slot
789+ ------------------------------
790+
791+ (1 row)
792+
793+ SELECT pg_stat_get_subscription_stats(NULL);
794+ pg_stat_get_subscription_stats
795+ --------------------------------
796+
797+ (1 row)
798+
557799-- End of Stats Test
0 commit comments