v2-0002-pg_stat_statements-Add-coverage-for-entry_dealloc.patch

text/plain

Filename: v2-0002-pg_stat_statements-Add-coverage-for-entry_dealloc.patch
Type: text/plain
Part: 1
Message: Re: pg_stat_statements: more test coverage

Patch

Format: format-patch
Series: patch v2-0002
Subject: pg_stat_statements: Add coverage for entry_dealloc()
File+
contrib/pg_stat_statements/expected/max.out 66 0
contrib/pg_stat_statements/Makefile 1 1
contrib/pg_stat_statements/meson.build 1 0
contrib/pg_stat_statements/pg_stat_statements.conf 2 0
contrib/pg_stat_statements/sql/max.sql 44 0
From 6fa54b21ae6060fd459f5330130491662361f2d5 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <peter@eisentraut.org>
Date: Sat, 23 Dec 2023 14:25:26 +0100
Subject: [PATCH v2 2/3] pg_stat_statements: Add coverage for entry_dealloc()

This involves creating pg_stat_statements.max entries, then creating
even more entries, and checking that the limit is kept and the least
used entries are kicked out.

Discussion: https://www.postgresql.org/message-id/flat/40d1e4f2-835f-448f-a541-8ff5db75bf3d@eisentraut.org
---
 contrib/pg_stat_statements/Makefile           |  2 +-
 contrib/pg_stat_statements/expected/max.out   | 66 +++++++++++++++++++
 contrib/pg_stat_statements/meson.build        |  1 +
 .../pg_stat_statements.conf                   |  2 +
 contrib/pg_stat_statements/sql/max.sql        | 44 +++++++++++++
 5 files changed, 114 insertions(+), 1 deletion(-)
 create mode 100644 contrib/pg_stat_statements/expected/max.out
 create mode 100644 contrib/pg_stat_statements/sql/max.sql

diff --git a/contrib/pg_stat_statements/Makefile b/contrib/pg_stat_statements/Makefile
index aecd1d6a2a..7ee16e8350 100644
--- a/contrib/pg_stat_statements/Makefile
+++ b/contrib/pg_stat_statements/Makefile
@@ -19,7 +19,7 @@ LDFLAGS_SL += $(filter -lm, $(LIBS))
 
 REGRESS_OPTS = --temp-config $(top_srcdir)/contrib/pg_stat_statements/pg_stat_statements.conf
 REGRESS = select dml cursors utility level_tracking planning \
-	user_activity wal entry_timestamp cleanup oldextversions
+	user_activity wal entry_timestamp max cleanup oldextversions
 # Disabled because these tests require "shared_preload_libraries=pg_stat_statements",
 # which typical installcheck users do not have (e.g. buildfarm clients).
 NO_INSTALLCHECK = 1
diff --git a/contrib/pg_stat_statements/expected/max.out b/contrib/pg_stat_statements/expected/max.out
new file mode 100644
index 0000000000..49c3f56efd
--- /dev/null
+++ b/contrib/pg_stat_statements/expected/max.out
@@ -0,0 +1,66 @@
+SHOW pg_stat_statements.max;
+ pg_stat_statements.max 
+------------------------
+ 100
+(1 row)
+
+SET pg_stat_statements.track = 'all';
+DO $$
+BEGIN
+  FOR i IN 1..101 LOOP
+    EXECUTE format('create table t%s (a int)', lpad(i::text, 3, '0'));
+  END LOOP;
+END
+$$;
+SELECT pg_stat_statements_reset() IS NOT NULL AS t;
+ t 
+---
+ t
+(1 row)
+
+DO $$
+BEGIN
+  FOR i IN 1..98 LOOP
+    EXECUTE format('select * from t%s', lpad(i::text, 3, '0'));
+  END LOOP;
+END
+$$;
+SELECT count(*) <= 100 AND count(*) > 0 FROM pg_stat_statements;
+ ?column? 
+----------
+ t
+(1 row)
+
+SELECT query FROM pg_stat_statements WHERE query LIKE '%t001%' OR query LIKE '%t098%' ORDER BY query;
+       query        
+--------------------
+ select * from t001
+ select * from t098
+(2 rows)
+
+DO $$
+BEGIN
+  FOR i IN 2..98 LOOP
+    EXECUTE format('select * from t%s', lpad(i::text, 3, '0'));
+  END LOOP;
+END
+$$;
+DO $$
+BEGIN
+  FOR i IN 99..100 LOOP
+    EXECUTE format('select * from t%s', lpad(i::text, 3, '0'));
+  END LOOP;
+END
+$$;
+SELECT count(*) <= 100 AND count(*) > 0 FROM pg_stat_statements;
+ ?column? 
+----------
+ t
+(1 row)
+
+-- record for t001 has been kicked out
+SELECT query FROM pg_stat_statements WHERE query LIKE '%t001%' ORDER BY query;
+ query 
+-------
+(0 rows)
+
diff --git a/contrib/pg_stat_statements/meson.build b/contrib/pg_stat_statements/meson.build
index 81fe1eb917..a66acaa5b8 100644
--- a/contrib/pg_stat_statements/meson.build
+++ b/contrib/pg_stat_statements/meson.build
@@ -50,6 +50,7 @@ tests += {
       'user_activity',
       'wal',
       'entry_timestamp',
+      'max',
       'cleanup',
       'oldextversions',
     ],
diff --git a/contrib/pg_stat_statements/pg_stat_statements.conf b/contrib/pg_stat_statements/pg_stat_statements.conf
index 0e900d7119..0119f681d7 100644
--- a/contrib/pg_stat_statements/pg_stat_statements.conf
+++ b/contrib/pg_stat_statements/pg_stat_statements.conf
@@ -1,2 +1,4 @@
 shared_preload_libraries = 'pg_stat_statements'
 max_prepared_transactions = 5
+
+pg_stat_statements.max = 100
diff --git a/contrib/pg_stat_statements/sql/max.sql b/contrib/pg_stat_statements/sql/max.sql
new file mode 100644
index 0000000000..741fbc9851
--- /dev/null
+++ b/contrib/pg_stat_statements/sql/max.sql
@@ -0,0 +1,44 @@
+SHOW pg_stat_statements.max;
+
+SET pg_stat_statements.track = 'all';
+
+DO $$
+BEGIN
+  FOR i IN 1..101 LOOP
+    EXECUTE format('create table t%s (a int)', lpad(i::text, 3, '0'));
+  END LOOP;
+END
+$$;
+
+SELECT pg_stat_statements_reset() IS NOT NULL AS t;
+
+DO $$
+BEGIN
+  FOR i IN 1..98 LOOP
+    EXECUTE format('select * from t%s', lpad(i::text, 3, '0'));
+  END LOOP;
+END
+$$;
+
+SELECT count(*) <= 100 AND count(*) > 0 FROM pg_stat_statements;
+SELECT query FROM pg_stat_statements WHERE query LIKE '%t001%' OR query LIKE '%t098%' ORDER BY query;
+
+DO $$
+BEGIN
+  FOR i IN 2..98 LOOP
+    EXECUTE format('select * from t%s', lpad(i::text, 3, '0'));
+  END LOOP;
+END
+$$;
+
+DO $$
+BEGIN
+  FOR i IN 99..100 LOOP
+    EXECUTE format('select * from t%s', lpad(i::text, 3, '0'));
+  END LOOP;
+END
+$$;
+
+SELECT count(*) <= 100 AND count(*) > 0 FROM pg_stat_statements;
+-- record for t001 has been kicked out
+SELECT query FROM pg_stat_statements WHERE query LIKE '%t001%' ORDER BY query;
-- 
2.43.0