agora inbox for [email protected]  
help / color / mirror / Atom feed
[PATCH 2/3] one more stress test for repack concurrently
150+ messages / 2 participants
[nested] [flat]

* [PATCH 2/3] one more stress test for repack concurrently
@ 2025-12-13 17:46  Mikhail Nikalayeu <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Mikhail Nikalayeu @ 2025-12-13 17:46 UTC (permalink / raw)

---
 contrib/amcheck/meson.build       |   1 +
 contrib/amcheck/t/008_repack_2.pl | 111 ++++++++++++++++++++++++++++++
 2 files changed, 112 insertions(+)
 create mode 100644 contrib/amcheck/t/008_repack_2.pl

diff --git a/contrib/amcheck/meson.build b/contrib/amcheck/meson.build
index cb4bc32e98a..6799df214f9 100644
--- a/contrib/amcheck/meson.build
+++ b/contrib/amcheck/meson.build
@@ -51,6 +51,7 @@ tests += {
       't/005_pitr.pl',
       't/006_verify_gin.pl',
       't/007_repack_1.pl',
+      't/008_repack_2.pl',
     ],
   },
 }
diff --git a/contrib/amcheck/t/008_repack_2.pl b/contrib/amcheck/t/008_repack_2.pl
new file mode 100644
index 00000000000..a287ee2bb71
--- /dev/null
+++ b/contrib/amcheck/t/008_repack_2.pl
@@ -0,0 +1,111 @@
+# Copyright (c) 2021-2026, PostgreSQL Global Development Group
+
+# Test REPACK CONCURRENTLY with concurrent modifications
+use strict;
+use warnings FATAL => 'all';
+
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+
+use Test::More;
+
+# PG_TEST_EXTRA carries a numerical stress value; 0 disables the test,
+# 1 means the test takes about 6 seconds, and the increase should be
+# roughly linear.
+my $matched = ($ENV{PG_TEST_EXTRA} // '') =~ /\bstress_concurrently(?:=(?<stressval>[0-9]*))?\b/;
+my $stressval = $+{stressval} // 1;
+if (!$matched or $stressval == 0)
+{
+	plan skip_all => 'skipping disabled REPACK CONCURRENTLY stress test';
+}
+
+my $node;
+
+#
+# Test set-up
+#
+$node = PostgreSQL::Test::Cluster->new('CIC_test');
+$node->init;
+$node->append_conf('postgresql.conf',
+	'lock_timeout = ' . (1000 * $PostgreSQL::Test::Utils::timeout_default));
+$node->append_conf(
+	'postgresql.conf', qq(
+wal_level = logical
+));
+
+my $duration = 6 * $stressval;
+my $no_hot = int(rand(2));
+
+$node->start;
+$node->safe_psql('postgres', q(CREATE TABLE tbl(id SERIAL PRIMARY KEY, val int)));
+if ($no_hot)
+{
+	$node->safe_psql('postgres', q(CREATE INDEX test_idx ON tbl(val);));
+}
+else
+{
+	$node->safe_psql('postgres', q(CREATE INDEX test_idx ON tbl(id);));
+}
+
+# Load amcheck
+$node->safe_psql('postgres', q(CREATE EXTENSION amcheck));
+
+my $sum = $node->safe_psql('postgres', q(
+	SELECT SUM(val) AS sum FROM tbl
+));
+
+$node->safe_psql('postgres', q(CREATE UNLOGGED SEQUENCE last_j START 1 INCREMENT 1;));
+
+
+$node->pgbench(
+"--no-vacuum --client=30 --jobs=4 --exit-on-abort -T $duration",
+0,
+[qr{actually processed}],
+[qr{^$}],
+'concurrent operations with REINDEX/CREATE INDEX CONCURRENTLY',
+{
+	'concurrent_ops' => qq(
+		SELECT pg_try_advisory_lock(42)::integer AS gotlock \\gset
+		\\if :gotlock
+			REPACK (CONCURRENTLY) tbl USING INDEX tbl_pkey;
+			SELECT bt_index_parent_check('tbl_pkey', heapallindexed => true);
+			SELECT bt_index_parent_check('test_idx', heapallindexed => true);
+			\\sleep 10 ms
+
+			REPACK (CONCURRENTLY) tbl USING INDEX test_idx;
+			SELECT bt_index_parent_check('tbl_pkey', heapallindexed => true);
+			SELECT bt_index_parent_check('test_idx', heapallindexed => true);
+			\\sleep 10 ms
+
+			REPACK (CONCURRENTLY) tbl;
+			SELECT bt_index_parent_check('tbl_pkey', heapallindexed => true);
+			SELECT bt_index_parent_check('test_idx', heapallindexed => true);
+			\\sleep 10 ms
+
+			SELECT pg_advisory_unlock(42);
+		\\else
+			SELECT pg_advisory_lock(43);
+				BEGIN;
+				INSERT INTO tbl(val) VALUES (nextval('last_j')) RETURNING val \\gset p_
+				COMMIT;
+			SELECT pg_advisory_unlock(43);
+			\\sleep 1 ms
+
+			BEGIN
+			--TRANSACTION ISOLATION LEVEL REPEATABLE READ
+			;
+			SELECT 1;
+			\\sleep 1 ms
+			SELECT COUNT(*) AS count FROM tbl WHERE val <= :p_j \\gset p_
+			\\if :p_count != :p_j
+				COMMIT;
+				SELECT (:p_count) / 0;
+			\\endif
+
+			COMMIT;
+		\\endif
+	)
+});
+
+$node->stop;
+done_testing();
-- 
2.47.3


--tbdehtstrqwksfdh
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment;
	filename="0003-Distinguish-properly-when-database-specific-transact.patch"



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread

* [PATCH 1/2] simplify coding in check_log_min_messages
@ 2026-02-17 15:33  Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 150+ messages in thread

From: Álvaro Herrera @ 2026-02-17 15:33 UTC (permalink / raw)

---
 src/backend/utils/error/elog.c | 47 ++++++++++++++--------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index b9d2c96b97a..80d4eef755a 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -193,6 +193,7 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
 static void backtrace_cleanup(int code, Datum arg);
 static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
 static void FreeErrorDataContents(ErrorData *edata);
+static int	parse_message_level(const char *level);
 static int	log_min_messages_cmp(const ListCell *a, const ListCell *b);
 static void write_console(const char *line, int len);
 static const char *process_log_prefix_padding(const char *p, int *ppadding);
@@ -2403,9 +2404,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		 */
 		if (sep == NULL)
 		{
-			const struct config_enum_entry *entry;
-			bool		found;
-
 			/* Reject duplicates for default log level. */
 			if (defaultlevel != -1)
 			{
@@ -2414,18 +2412,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			}
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, elem) == 0)
-				{
-					defaultlevel = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((defaultlevel = parse_message_level(elem)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level: \"%s\".", elem);
 				goto lmm_fail;
@@ -2437,7 +2424,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			char	   *ptype = elem;
 			bool		found;
 			int			level;
-			const struct config_enum_entry *entry;
 
 			/*
 			 * Temporarily clobber the ':' with a string terminator, so that
@@ -2446,18 +2432,7 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 			*sep = '\0';
 
 			/* Validate the log level */
-			found = false;
-			for (entry = server_message_level_options; entry && entry->name; entry++)
-			{
-				if (pg_strcasecmp(entry->name, loglevel) == 0)
-				{
-					level = entry->val;
-					found = true;
-					break;
-				}
-			}
-
-			if (!found)
+			if ((level = parse_message_level(loglevel)) == 0)
 			{
 				GUC_check_errdetail("Unrecognized log level for process type \"%s\": \"%s\".",
 									ptype, loglevel);
@@ -2566,6 +2541,22 @@ lmm_fail:
 	return true;
 }
 
+/*
+ * Recognize the given string as a message level (for log_min_messages), and
+ * return its value if successful.  Otherwise, return 0.
+ */
+static int
+parse_message_level(const char *level)
+{
+	const struct config_enum_entry *entry;
+
+	for (entry = server_message_level_options; entry && entry->name; entry++)
+		if (pg_strcasecmp(entry->name, level) == 0)
+			return entry->val;
+
+	return 0;
+}
+
 /*
  * list_sort() callback for check_log_min_messages.  The default element
  * goes first; the rest are ordered by strcmp() of the process type.
-- 
2.47.3


--dnohjpfxulhc3bo3
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: attachment; filename=0002-memory-free-simplify.patch



^ permalink  raw  reply  [nested|flat] 150+ messages in thread


end of thread, other threads:[~2026-02-17 15:33 UTC | newest]

Thread overview: 150+ messages (download: mbox mbox.gz follow: Atom feed)
-- links below jump to the message on this page --
2025-12-13 17:46 [PATCH 2/3] one more stress test for repack concurrently Mikhail Nikalayeu <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>
2026-02-17 15:33 [PATCH 1/2] simplify coding in check_log_min_messages Álvaro Herrera <[email protected]>

This inbox is served by agora; see mirroring instructions
for how to clone and mirror all data and code used for this inbox