From 6fa54b21ae6060fd459f5330130491662361f2d5 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut 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