From fe6bc199671ce6f0a1940acb73f921d9b1a5b6b1 Mon Sep 17 00:00:00 2001 From: Zsolt Parragi Date: Mon, 31 Aug 2026 12:00:35 +0000 Subject: [PATCH 1/2] pgbench: don't disable --unlogged-tables when partitioning With --partitions, --unlogged-tables was silently ignored for all of pgbench's tables; only the pgbench_accounts partitions were created unlogged. The documentation promises unlogged tables regardless. Create the other tables unlogged as requested. pgbench_accounts itself has to stay permanent, because a partitioned table cannot be unlogged, and pgbench_branches is kept permanent too, so that --foreign-keys can still reference it from the permanent pgbench_accounts: constraints on permanent tables may reference only permanent tables. This also stops pgbench_history from being a permanent table that references the unlogged pgbench_accounts partitions, a combination that leaves dangling rows in pgbench_history after crash recovery and that the server is about to reject. --- doc/src/sgml/ref/pgbench.sgml | 7 +++++++ src/bin/pgbench/pgbench.c | 15 ++++++++++++++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/ref/pgbench.sgml b/doc/src/sgml/ref/pgbench.sgml index 9688527c955..356caf1eedf 100644 --- a/doc/src/sgml/ref/pgbench.sgml +++ b/doc/src/sgml/ref/pgbench.sgml @@ -400,6 +400,13 @@ pgbench options d Create all tables as unlogged tables, rather than permanent tables. + When is used, + pgbench_accounts is nevertheless created as a + permanent table, because a partitioned table cannot be unlogged; its + partitions are created unlogged. pgbench_branches + is then also kept permanent, so that + can reference it from the permanent + pgbench_accounts. diff --git a/src/bin/pgbench/pgbench.c b/src/bin/pgbench/pgbench.c index 5862758427f..3cd64676290 100644 --- a/src/bin/pgbench/pgbench.c +++ b/src/bin/pgbench/pgbench.c @@ -4948,9 +4948,22 @@ initCreateTables(PGconn *con) { const struct ddlinfo *ddl = &DDLs[i]; + bool unlogged = unlogged_tables; + + /* + * When the accounts table is partitioned, it cannot be unlogged + * itself; its partitions are created unlogged instead. In that case + * pgbench_branches must stay permanent too, so that the permanent + * pgbench_accounts can reference it when --foreign-keys is used. + */ + if (partition_method != PART_NONE && + (strcmp(ddl->table, "pgbench_accounts") == 0 || + strcmp(ddl->table, "pgbench_branches") == 0)) + unlogged = false; + /* Construct new create table statement. */ printfPQExpBuffer(&query, "create%s table %s(%s)", - (unlogged_tables && partition_method == PART_NONE) ? " unlogged" : "", + unlogged ? " unlogged" : "", ddl->table, (scale >= SCALE_32BIT_THRESHOLD) ? ddl->bigcols : ddl->smcols); -- 2.55.0