summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/backend/commands/vacuum.c2
-rw-r--r--src/test/regress/expected/maintain_every.out33
-rw-r--r--src/test/regress/parallel_schedule4
-rw-r--r--src/test/regress/sql/maintain_every.sql26
4 files changed, 65 insertions, 0 deletions
diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c
index db5da3ce826..33a33bf6b1c 100644
--- a/src/backend/commands/vacuum.c
+++ b/src/backend/commands/vacuum.c
@@ -657,6 +657,8 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy,
if (use_own_xacts)
{
PopActiveSnapshot();
+ /* standard_ProcessUtility() does CCI if !use_own_xacts */
+ CommandCounterIncrement();
CommitTransactionCommand();
}
else
diff --git a/src/test/regress/expected/maintain_every.out b/src/test/regress/expected/maintain_every.out
new file mode 100644
index 00000000000..dea1089c249
--- /dev/null
+++ b/src/test/regress/expected/maintain_every.out
@@ -0,0 +1,33 @@
+-- Test maintenance commands that visit every eligible relation. Run as a
+-- non-superuser, to skip other users' tables.
+CREATE ROLE regress_maintain;
+SET ROLE regress_maintain;
+-- Test database-wide ANALYZE ("use_own_xacts" mode) setting relhassubclass=f
+-- for non-partitioning inheritance, w/ ON COMMIT DELETE ROWS building an
+-- empty index.
+CREATE TEMP TABLE past_inh_db_other (); -- need 2 tables for "use_own_xacts"
+CREATE TEMP TABLE past_inh_db_parent () ON COMMIT DELETE ROWS;
+CREATE TEMP TABLE past_inh_db_child () INHERITS (past_inh_db_parent);
+CREATE INDEX ON past_inh_db_parent ((1));
+ANALYZE past_inh_db_parent;
+SELECT reltuples, relhassubclass
+ FROM pg_class WHERE oid = 'past_inh_db_parent'::regclass;
+ reltuples | relhassubclass
+-----------+----------------
+ 0 | t
+(1 row)
+
+DROP TABLE past_inh_db_child;
+SET client_min_messages = error; -- hide WARNINGs for other users' tables
+ANALYZE;
+RESET client_min_messages;
+SELECT reltuples, relhassubclass
+ FROM pg_class WHERE oid = 'past_inh_db_parent'::regclass;
+ reltuples | relhassubclass
+-----------+----------------
+ 0 | f
+(1 row)
+
+DROP TABLE past_inh_db_parent, past_inh_db_other;
+RESET ROLE;
+DROP ROLE regress_maintain;
diff --git a/src/test/regress/parallel_schedule b/src/test/regress/parallel_schedule
index 0f38caa0d24..a424be2a6bf 100644
--- a/src/test/regress/parallel_schedule
+++ b/src/test/regress/parallel_schedule
@@ -91,6 +91,10 @@ test: select_parallel
test: write_parallel
test: vacuum_parallel
+# Run this alone, because concurrent DROP TABLE would make non-superuser
+# "ANALYZE;" fail with "relation with OID $n does not exist".
+test: maintain_every
+
# no relation related tests can be put in this group
test: publication subscription
diff --git a/src/test/regress/sql/maintain_every.sql b/src/test/regress/sql/maintain_every.sql
new file mode 100644
index 00000000000..263e97272d5
--- /dev/null
+++ b/src/test/regress/sql/maintain_every.sql
@@ -0,0 +1,26 @@
+-- Test maintenance commands that visit every eligible relation. Run as a
+-- non-superuser, to skip other users' tables.
+
+CREATE ROLE regress_maintain;
+SET ROLE regress_maintain;
+
+-- Test database-wide ANALYZE ("use_own_xacts" mode) setting relhassubclass=f
+-- for non-partitioning inheritance, w/ ON COMMIT DELETE ROWS building an
+-- empty index.
+CREATE TEMP TABLE past_inh_db_other (); -- need 2 tables for "use_own_xacts"
+CREATE TEMP TABLE past_inh_db_parent () ON COMMIT DELETE ROWS;
+CREATE TEMP TABLE past_inh_db_child () INHERITS (past_inh_db_parent);
+CREATE INDEX ON past_inh_db_parent ((1));
+ANALYZE past_inh_db_parent;
+SELECT reltuples, relhassubclass
+ FROM pg_class WHERE oid = 'past_inh_db_parent'::regclass;
+DROP TABLE past_inh_db_child;
+SET client_min_messages = error; -- hide WARNINGs for other users' tables
+ANALYZE;
+RESET client_min_messages;
+SELECT reltuples, relhassubclass
+ FROM pg_class WHERE oid = 'past_inh_db_parent'::regclass;
+DROP TABLE past_inh_db_parent, past_inh_db_other;
+
+RESET ROLE;
+DROP ROLE regress_maintain;