Hello,

Here's a couple of trivial cleanups of this code.  0001 simplifies code
and removes a duplicate by creating a small subroutine; 0002 also
simplifies memory freeing a tad, by freeing allocations as soon as
no longer needed instead of waiting and being forced to duplicate the
frees in several places.

This is two commits here just for ease of review, but I'd probably push
as one commit (and without backpatch).

-- 
Álvaro Herrera        Breisgau, Deutschland  —  https://www.EnterpriseDB.com/
"World domination is proceeding according to plan"        (Andrew Morton)
>From 4a781c3cc700f455705994dbc36c34355defcd31 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=C3=81lvaro=20Herrera?= <[email protected]>
Date: Tue, 17 Feb 2026 16:33:18 +0100
Subject: [PATCH 1/2] simplify coding in check_log_min_messages

---
 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

>From 6f31ae2fb2506f05c0a9bb9da3a88c1266d5f457 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=C3=81lvaro=20Herrera?= <[email protected]>
Date: Sun, 5 Jul 2026 14:10:18 +0200
Subject: [PATCH 2/2] memory free simplify

---
 src/backend/utils/error/elog.c | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index 80d4eef755a..7d229279dbe 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -2364,6 +2364,7 @@ bool
 check_log_min_messages(char **newval, void **extra, GucSource source)
 {
 	char	   *rawstring;
+	int			rawstring_len;
 	List	   *elemlist;
 	StringInfoData buf;
 	char	   *result;
@@ -2392,6 +2393,8 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		guc_free(rawstring);
 		return false;
 	}
+	rawstring_len = strlen(rawstring);
+	guc_free(rawstring);
 
 	/* Validate and assign log level and process type. */
 	foreach_ptr(char, elem, elemlist)
@@ -2478,7 +2481,6 @@ check_log_min_messages(char **newval, void **extra, GucSource source)
 		continue;
 
 lmm_fail:
-		guc_free(rawstring);
 		list_free(elemlist);
 		return false;
 	}
@@ -2489,7 +2491,6 @@ lmm_fail:
 	if (defaultlevel == -1)
 	{
 		GUC_check_errdetail("Default log level was not defined.");
-		guc_free(rawstring);
 		list_free(elemlist);
 		return false;
 	}
@@ -2507,7 +2508,7 @@ lmm_fail:
 	 */
 	list_sort(elemlist, log_min_messages_cmp);
 
-	initStringInfoExt(&buf, strlen(rawstring) + 1);
+	initStringInfoExt(&buf, rawstring_len + 1);
 	foreach_ptr(char, elem, elemlist)
 	{
 		if (foreach_current_index(elem) == 0)
@@ -2515,6 +2516,7 @@ lmm_fail:
 		else
 			appendStringInfo(&buf, ", %s", elem);
 	}
+	list_free(elemlist);
 
 	result = guc_strdup(LOG, buf.data);
 	if (!result)
@@ -2526,8 +2528,6 @@ lmm_fail:
 	guc_free(*newval);
 	*newval = result;
 
-	guc_free(rawstring);
-	list_free(elemlist);
 	pfree(buf.data);
 
 	/*
-- 
2.47.3

Reply via email to