diff --git a/doc/src/sgml/ref/pg_waldump.sgml b/doc/src/sgml/ref/pg_waldump.sgml
index 5fcdfe210ac..432254d2d5d 100644
--- a/doc/src/sgml/ref/pg_waldump.sgml
+++ b/doc/src/sgml/ref/pg_waldump.sgml
@@ -142,7 +142,8 @@ PostgreSQL documentation
- Only display records generated by the specified resource manager.
+ Only display records generated by the specified resource manager. You can
+ specify the option multiple times to select multiple resource managers.
If list is passed as name, print a list of valid resource manager
names, and exit.
diff --git a/src/bin/pg_waldump/pg_waldump.c b/src/bin/pg_waldump/pg_waldump.c
index d83847b276d..74664bef6a4 100644
--- a/src/bin/pg_waldump/pg_waldump.c
+++ b/src/bin/pg_waldump/pg_waldump.c
@@ -49,7 +49,8 @@ typedef struct XLogDumpConfig
bool stats_per_record;
/* filter options */
- int filter_by_rmgr;
+ bool filter_by_rmgr[RM_MAX_ID + 1];
+ bool filter_by_rmgr_enabled;
TransactionId filter_by_xid;
bool filter_by_xid_enabled;
} XLogDumpConfig;
@@ -825,7 +826,8 @@ main(int argc, char **argv)
config.stop_after_records = -1;
config.already_displayed_records = 0;
config.follow = false;
- config.filter_by_rmgr = -1;
+ /* filter_by_rmgr array was zeroed by memset above */
+ config.filter_by_rmgr_enabled = false;
config.filter_by_xid = InvalidTransactionId;
config.filter_by_xid_enabled = false;
config.stats = false;
@@ -884,12 +886,12 @@ main(int argc, char **argv)
{
if (pg_strcasecmp(optarg, RmgrDescTable[i].rm_name) == 0)
{
- config.filter_by_rmgr = i;
+ config.filter_by_rmgr[i] = true;
+ config.filter_by_rmgr_enabled = true;
break;
}
}
-
- if (config.filter_by_rmgr == -1)
+ if (i > RM_MAX_ID)
{
pg_log_error("resource manager \"%s\" does not exist",
optarg);
@@ -1098,8 +1100,8 @@ main(int argc, char **argv)
}
/* apply all specified filters */
- if (config.filter_by_rmgr != -1 &&
- config.filter_by_rmgr != record->xl_rmid)
+ if (config.filter_by_rmgr_enabled &&
+ !config.filter_by_rmgr[record->xl_rmid])
continue;
if (config.filter_by_xid_enabled &&