From 991296f690d79a12670f1dca341ecffccf78f907 Mon Sep 17 00:00:00 2001
From: Heikki Linnakangas <heikki.linnakangas@iki.fi>
Date: Tue, 18 May 2021 16:46:53 +0300
Subject: [PATCH 1/1] Allow specifying pg_waldump --rmgr option multiple times.

Before, if you specified multiple --rmgr options, only the last one took
effect. It seems more sensible to select all the specfied resource
managers.
---
 doc/src/sgml/ref/pg_waldump.sgml |  3 ++-
 src/bin/pg_waldump/pg_waldump.c  | 16 ++++++++++------
 2 files changed, 12 insertions(+), 7 deletions(-)

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
       <term><option>--rmgr=<replaceable>rmgr</replaceable></option></term>
       <listitem>
        <para>
-        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 <literal>list</literal> is passed as name, print a list of valid resource manager
         names, and exit.
        </para>
diff --git a/src/bin/pg_waldump/pg_waldump.c b/src/bin/pg_waldump/pg_waldump.c
index f8b8afe4a7b..5c6aa0df03e 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;
@@ -814,7 +815,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;
@@ -869,16 +871,17 @@ main(int argc, char **argv)
 						exit(EXIT_SUCCESS);
 					}
 
+					config.filter_by_rmgr_enabled = true;
 					for (i = 0; i <= RM_MAX_ID; i++)
 					{
 						if (pg_strcasecmp(optarg, RmgrDescTable[i].rm_name) == 0)
 						{
-							config.filter_by_rmgr = i;
+							config.filter_by_rmgr[i] = true;
 							break;
 						}
 					}
 
-					if (config.filter_by_rmgr == -1)
+					if (i > RM_MAX_ID)
 					{
 						pg_log_error("resource manager \"%s\" does not exist",
 									 optarg);
@@ -1087,8 +1090,9 @@ 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 &&
+			(record->xl_rmid < 0 || record->xl_rmid > RM_MAX_ID ||
+			 !config.filter_by_rmgr[record->xl_rmid]))
 			continue;
 
 		if (config.filter_by_xid_enabled &&
-- 
2.30.2

