From f4d38e9a819fa8650bea201784511654ec1d858e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Dagfinn=20Ilmari=20Manns=C3=A5ker?= <ilmari@ilmari.org>
Date: Mon, 31 Jan 2022 00:09:14 +0000
Subject: [PATCH 2/2] psql tab-complete: remove unnecessary null checks

free(NULL) is specified to be a no-op, so no need to check before
calling it.  Also make escape_string(NULL) a no-op to match.
---
 src/bin/psql/tab-complete.c | 37 ++++++++++++-------------------------
 1 file changed, 12 insertions(+), 25 deletions(-)

diff --git a/src/bin/psql/tab-complete.c b/src/bin/psql/tab-complete.c
index 0c7a99be0a..5115f02934 100644
--- a/src/bin/psql/tab-complete.c
+++ b/src/bin/psql/tab-complete.c
@@ -4555,11 +4555,9 @@ psql_completion(const char *text, int start, int end)
 	free(previous_words);
 	free(words_buffer);
 	free(text_copy);
-	if (completion_ref_object)
-		free(completion_ref_object);
+	free(completion_ref_object);
 	completion_ref_object = NULL;
-	if (completion_ref_schema)
-		free(completion_ref_schema);
+	free(completion_ref_schema);
 	completion_ref_schema = NULL;
 
 	/* Return our Grand List O' Matches */
@@ -4790,21 +4788,9 @@ _complete_from_query(const char *simple_query,
 		 * up suitably-escaped copies of all the strings we need.
 		 */
 		e_object_like = make_like_pattern(objectname);
-
-		if (schemaname)
-			e_schemaname = escape_string(schemaname);
-		else
-			e_schemaname = NULL;
-
-		if (completion_ref_object)
-			e_ref_object = escape_string(completion_ref_object);
-		else
-			e_ref_object = NULL;
-
-		if (completion_ref_schema)
-			e_ref_schema = escape_string(completion_ref_schema);
-		else
-			e_ref_schema = NULL;
+		e_schemaname = escape_string(schemaname);
+		e_ref_object = escape_string(completion_ref_object);
+		e_ref_schema = escape_string(completion_ref_schema);
 
 		initPQExpBuffer(&query_buffer);
 
@@ -4959,12 +4945,9 @@ _complete_from_query(const char *simple_query,
 		/* Clean up */
 		termPQExpBuffer(&query_buffer);
 		free(e_object_like);
-		if (e_schemaname)
-			free(e_schemaname);
-		if (e_ref_object)
-			free(e_ref_object);
-		if (e_ref_schema)
-			free(e_ref_schema);
+		free(e_schemaname);
+		free(e_ref_object);
+		free(e_ref_schema);
 	}
 
 	/* Return the next result, if any, but not if the query failed */
@@ -5401,6 +5384,7 @@ pg_strdup_keyword_case(const char *s, const char *ref)
  * escape_string - Escape argument for use as string literal.
  *
  * The returned value has to be freed.
+ * Returns NULL if called with NULL.
  */
 static char *
 escape_string(const char *text)
@@ -5408,6 +5392,9 @@ escape_string(const char *text)
 	size_t		text_length;
 	char	   *result;
 
+	if (!text)
+		return text;
+
 	text_length = strlen(text);
 
 	result = pg_malloc(text_length * 2 + 1);
-- 
2.30.2

