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
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