Use appendStringInfoString and appendPQExpBufferStr where possible

Started by Hou, Zhijieover 5 years ago7 messages
#1Hou, Zhijie
houzj.fnst@cn.fujitsu.com
2 attachment(s)

Hi hackers

In(/src/bin/scripts/reindexdb.c; /src/backend/access/rmgrdesc/dbasedesc.c; /src/pl/plpython/plpy_elog.c)

I found some more places that should use appendPQExrBufferStr instead of appendPQExpBuffer.

Here is the patch.

Previous Discussion:
/messages/by-id/CAKJS1f9P=M-3ULmPvr8iCno8yvfDViHibJjpriHU8+SXUgeZ=w@mail.gmail.com

Best regards,
Houzj/huangj

Attachments:

0001-appendPQExpBufferStr-instead-of-appendPQExpBuffer.patchapplication/octet-stream; name=0001-appendPQExpBufferStr-instead-of-appendPQExpBuffer.patchDownload
From a40bb83b09772ae67c7a7d279e96f7ddf4eff082 Mon Sep 17 00:00:00 2001
From: root <root@localhost.localdomain>
Date: Tue, 22 Sep 2020 07:59:17 -0400
Subject: [PATCH] appendPQExpBufferStr

---
 src/bin/scripts/reindexdb.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/src/bin/scripts/reindexdb.c b/src/bin/scripts/reindexdb.c
index 40dcbc9..f63bf88 100644
--- a/src/bin/scripts/reindexdb.c
+++ b/src/bin/scripts/reindexdb.c
@@ -614,7 +614,7 @@ get_parallel_object_list(PGconn *conn, ReindexType type,
 	{
 		case REINDEX_DATABASE:
 			Assert(user_list == NULL);
-			appendPQExpBuffer(&catalog_query,
+			appendPQExpBufferStr(&catalog_query,
 							  "SELECT c.relname, ns.nspname\n"
 							  " FROM pg_catalog.pg_class c\n"
 							  " JOIN pg_catalog.pg_namespace ns"
@@ -637,7 +637,7 @@ get_parallel_object_list(PGconn *conn, ReindexType type,
 				 * All the tables from all the listed schemas are grabbed at
 				 * once.
 				 */
-				appendPQExpBuffer(&catalog_query,
+				appendPQExpBufferStr(&catalog_query,
 								  "SELECT c.relname, ns.nspname\n"
 								  " FROM pg_catalog.pg_class c\n"
 								  " JOIN pg_catalog.pg_namespace ns"
@@ -652,14 +652,14 @@ get_parallel_object_list(PGconn *conn, ReindexType type,
 					const char *nspname = cell->val;
 
 					if (nsp_listed)
-						appendPQExpBuffer(&catalog_query, ", ");
+						appendPQExpBufferStr(&catalog_query, ", ");
 					else
 						nsp_listed = true;
 
 					appendStringLiteralConn(&catalog_query, nspname, conn);
 				}
 
-				appendPQExpBuffer(&catalog_query, ")\n"
+				appendPQExpBufferStr(&catalog_query, ")\n"
 								  " ORDER BY c.relpages DESC;");
 			}
 			break;
-- 
1.8.3.1

0001-Use-appendStringInfoString-instead-of-appendStringIn.patchapplication/octet-stream; name=0001-Use-appendStringInfoString-instead-of-appendStringIn.patchDownload
From 506670d599664f1191816cf76c16e344ecd497cb Mon Sep 17 00:00:00 2001
From: "huangj.fnst" <huangj.fnst@cn.fujitsu.com>
Date: Fri, 18 Sep 2020 11:28:13 +0800
Subject: [PATCH] Use appendStringInfoString instead of appendStringInfo where
 possible.

---
 src/backend/access/rmgrdesc/dbasedesc.c | 2 +-
 src/pl/plpython/plpy_elog.c             | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/backend/access/rmgrdesc/dbasedesc.c b/src/backend/access/rmgrdesc/dbasedesc.c
index d82484b9db..47580feaea 100644
--- a/src/backend/access/rmgrdesc/dbasedesc.c
+++ b/src/backend/access/rmgrdesc/dbasedesc.c
@@ -37,7 +37,7 @@ dbase_desc(StringInfo buf, XLogReaderState *record)
 		xl_dbase_drop_rec *xlrec = (xl_dbase_drop_rec *) rec;
 		int			i;
 
-		appendStringInfo(buf, "dir");
+		appendStringInfoString(buf, "dir");
 		for (i = 0; i < xlrec->ntablespaces; i++)
 			appendStringInfo(buf, " %u/%u",
 							 xlrec->tablespace_ids[i], xlrec->db_id);
diff --git a/src/pl/plpython/plpy_elog.c b/src/pl/plpython/plpy_elog.c
index ae0b97c85d..224b8836fb 100644
--- a/src/pl/plpython/plpy_elog.c
+++ b/src/pl/plpython/plpy_elog.c
@@ -216,7 +216,7 @@ PLy_traceback(PyObject *e, PyObject *v, PyObject *tb,
 	else if (strcmp(e_module_s, "builtins") == 0
 			 || strcmp(e_module_s, "__main__") == 0
 			 || strcmp(e_module_s, "exceptions") == 0)
-		appendStringInfo(&xstr, "%s", e_type_s);
+		appendStringInfoString(&xstr, e_type_s);
 	else
 		appendStringInfo(&xstr, "%s.%s", e_module_s, e_type_s);
 	appendStringInfo(&xstr, ": %s", vstr);
-- 
2.23.0.windows.1

#2David Rowley
dgrowleyml@gmail.com
In reply to: Hou, Zhijie (#1)
Re: Use appendStringInfoString and appendPQExpBufferStr where possible

On Tue, 22 Sep 2020 at 17:00, Hou, Zhijie <houzj.fnst@cn.fujitsu.com> wrote:

I found some more places that should use appendPQExrBufferStr instead of appendPQExpBuffer.

Here is the patch.

Seems like a good idea. Please add it to the next commitfest.

David

#3Hou, Zhijie
houzj.fnst@cn.fujitsu.com
In reply to: David Rowley (#2)
RE: Use appendStringInfoString and appendPQExpBufferStr where possible

On Tue, 22 Sep 2020 at 17:00, Hou, Zhijie <houzj.fnst@cn.fujitsu.com> wrote:

I found some more places that should use appendPQExrBufferStr instead

of appendPQExpBuffer.

Here is the patch.

Seems like a good idea. Please add it to the next commitfest.

Thanks, added it to the next commitfest.
https://commitfest.postgresql.org/30/2735/

Best regards,
houzj

#4Hou, Zhijie
houzj.fnst@cn.fujitsu.com
In reply to: Hou, Zhijie (#1)
2 attachment(s)
RE: Use appendStringInfoString and appendPQExpBufferStr where possible

Hi

I made a slight update to the patch

I found some more places that should use appendPQExrBufferStr instead

of appendPQExpBuffer.

Here is the patch.

Seems like a good idea. Please add it to the next commitfest.

Thanks, added it to the next commitfest.
https://commitfest.postgresql.org/30/2735/

Best regards,
houzj

Attachments:

0001-Latest-appendStringInfoString-instead-of-appendStringInfo.patchapplication/octet-stream; name=0001-Latest-appendStringInfoString-instead-of-appendStringInfo.patchDownload
From 63ecca6569e789cdaee9077e0e3756bb23d75987 Mon Sep 17 00:00:00 2001
From: "huangj.fnst" <huangj.fnst@cn.fujitsu.com>
Date: Fri, 18 Sep 2020 11:28:13 +0800
Subject: [PATCH] Use appendStringInfoString instead of appendStringInfo where
 possible.

---
 contrib/postgres_fdw/postgres_fdw.c     | 3 +--
 src/backend/access/rmgrdesc/dbasedesc.c | 2 +-
 src/pl/plpython/plpy_elog.c             | 2 +-
 3 files changed, 3 insertions(+), 4 deletions(-)

diff --git a/contrib/postgres_fdw/postgres_fdw.c b/contrib/postgres_fdw/postgres_fdw.c
index 9fc53cad68..0b9b01d05d 100644
--- a/contrib/postgres_fdw/postgres_fdw.c
+++ b/contrib/postgres_fdw/postgres_fdw.c
@@ -2590,8 +2590,7 @@ postgresExplainForeignScan(ForeignScanState *node, ExplainState *es)
 									 quote_identifier(relname));
 				}
 				else
-					appendStringInfo(relations, "%s",
-									 quote_identifier(relname));
+					appendStringInfoString(relations, quote_identifier(relname));
 				refname = (char *) list_nth(es->rtable_names, rti - 1);
 				if (refname == NULL)
 					refname = rte->eref->aliasname;
diff --git a/src/backend/access/rmgrdesc/dbasedesc.c b/src/backend/access/rmgrdesc/dbasedesc.c
index d82484b9db..47580feaea 100644
--- a/src/backend/access/rmgrdesc/dbasedesc.c
+++ b/src/backend/access/rmgrdesc/dbasedesc.c
@@ -37,7 +37,7 @@ dbase_desc(StringInfo buf, XLogReaderState *record)
 		xl_dbase_drop_rec *xlrec = (xl_dbase_drop_rec *) rec;
 		int			i;
 
-		appendStringInfo(buf, "dir");
+		appendStringInfoString(buf, "dir");
 		for (i = 0; i < xlrec->ntablespaces; i++)
 			appendStringInfo(buf, " %u/%u",
 							 xlrec->tablespace_ids[i], xlrec->db_id);
diff --git a/src/pl/plpython/plpy_elog.c b/src/pl/plpython/plpy_elog.c
index ae0b97c85d..224b8836fb 100644
--- a/src/pl/plpython/plpy_elog.c
+++ b/src/pl/plpython/plpy_elog.c
@@ -216,7 +216,7 @@ PLy_traceback(PyObject *e, PyObject *v, PyObject *tb,
 	else if (strcmp(e_module_s, "builtins") == 0
 			 || strcmp(e_module_s, "__main__") == 0
 			 || strcmp(e_module_s, "exceptions") == 0)
-		appendStringInfo(&xstr, "%s", e_type_s);
+		appendStringInfoString(&xstr, e_type_s);
 	else
 		appendStringInfo(&xstr, "%s.%s", e_module_s, e_type_s);
 	appendStringInfo(&xstr, ": %s", vstr);
-- 
2.23.0.windows.1

0001-Latest-appendPQExpBufferStr-instead-of-appendPQExpBuffer.patchapplication/octet-stream; name=0001-Latest-appendPQExpBufferStr-instead-of-appendPQExpBuffer.patchDownload
From a40bb83b09772ae67c7a7d279e96f7ddf4eff082 Mon Sep 17 00:00:00 2001
From: root <root@localhost.localdomain>
Date: Tue, 22 Sep 2020 07:59:17 -0400
Subject: [PATCH] appendPQExpBufferStr

---
 src/bin/scripts/reindexdb.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/src/bin/scripts/reindexdb.c b/src/bin/scripts/reindexdb.c
index 40dcbc9..f63bf88 100644
--- a/src/bin/scripts/reindexdb.c
+++ b/src/bin/scripts/reindexdb.c
@@ -614,7 +614,7 @@ get_parallel_object_list(PGconn *conn, ReindexType type,
 	{
 		case REINDEX_DATABASE:
 			Assert(user_list == NULL);
-			appendPQExpBuffer(&catalog_query,
+			appendPQExpBufferStr(&catalog_query,
 							  "SELECT c.relname, ns.nspname\n"
 							  " FROM pg_catalog.pg_class c\n"
 							  " JOIN pg_catalog.pg_namespace ns"
@@ -637,7 +637,7 @@ get_parallel_object_list(PGconn *conn, ReindexType type,
 				 * All the tables from all the listed schemas are grabbed at
 				 * once.
 				 */
-				appendPQExpBuffer(&catalog_query,
+				appendPQExpBufferStr(&catalog_query,
 								  "SELECT c.relname, ns.nspname\n"
 								  " FROM pg_catalog.pg_class c\n"
 								  " JOIN pg_catalog.pg_namespace ns"
@@ -652,14 +652,14 @@ get_parallel_object_list(PGconn *conn, ReindexType type,
 					const char *nspname = cell->val;
 
 					if (nsp_listed)
-						appendPQExpBuffer(&catalog_query, ", ");
+						appendPQExpBufferStr(&catalog_query, ", ");
 					else
 						nsp_listed = true;
 
 					appendStringLiteralConn(&catalog_query, nspname, conn);
 				}
 
-				appendPQExpBuffer(&catalog_query, ")\n"
+				appendPQExpBufferStr(&catalog_query, ")\n"
 								  " ORDER BY c.relpages DESC;");
 			}
 			break;
-- 
1.8.3.1

#5Hou, Zhijie
houzj.fnst@cn.fujitsu.com
In reply to: Hou, Zhijie (#4)
3 attachment(s)
RE: Use appendStringInfoString and appendPQExpBufferStr where possible

Good point. There's another one:

$ git grep -E 'appendStringInfoString.*".{,1}");'
src/backend/utils/adt/ruleutils.c: appendStringInfoString(buf, "(");

I noticed you added a similar thread here.
https://commitfest.postgresql.org/30/

I think this one could be combined as a single patchset with the existing CF entry for the other thread.

Thanks for your response, combined them as a single patchset now.

Best regards,

Attachments:

0001-Latest-appendStringInfoString-instead-of-appendStringInfo.patchapplication/octet-stream; name=0001-Latest-appendStringInfoString-instead-of-appendStringInfo.patchDownload
From 63ecca6569e789cdaee9077e0e3756bb23d75987 Mon Sep 17 00:00:00 2001
From: "huangj.fnst" <huangj.fnst@cn.fujitsu.com>
Date: Fri, 18 Sep 2020 11:28:13 +0800
Subject: [PATCH] Use appendStringInfoString instead of appendStringInfo where
 possible.

---
 contrib/postgres_fdw/postgres_fdw.c     | 3 +--
 src/backend/access/rmgrdesc/dbasedesc.c | 2 +-
 src/pl/plpython/plpy_elog.c             | 2 +-
 3 files changed, 3 insertions(+), 4 deletions(-)

diff --git a/contrib/postgres_fdw/postgres_fdw.c b/contrib/postgres_fdw/postgres_fdw.c
index 9fc53cad68..0b9b01d05d 100644
--- a/contrib/postgres_fdw/postgres_fdw.c
+++ b/contrib/postgres_fdw/postgres_fdw.c
@@ -2590,8 +2590,7 @@ postgresExplainForeignScan(ForeignScanState *node, ExplainState *es)
 									 quote_identifier(relname));
 				}
 				else
-					appendStringInfo(relations, "%s",
-									 quote_identifier(relname));
+					appendStringInfoString(relations, quote_identifier(relname));
 				refname = (char *) list_nth(es->rtable_names, rti - 1);
 				if (refname == NULL)
 					refname = rte->eref->aliasname;
diff --git a/src/backend/access/rmgrdesc/dbasedesc.c b/src/backend/access/rmgrdesc/dbasedesc.c
index d82484b9db..47580feaea 100644
--- a/src/backend/access/rmgrdesc/dbasedesc.c
+++ b/src/backend/access/rmgrdesc/dbasedesc.c
@@ -37,7 +37,7 @@ dbase_desc(StringInfo buf, XLogReaderState *record)
 		xl_dbase_drop_rec *xlrec = (xl_dbase_drop_rec *) rec;
 		int			i;
 
-		appendStringInfo(buf, "dir");
+		appendStringInfoString(buf, "dir");
 		for (i = 0; i < xlrec->ntablespaces; i++)
 			appendStringInfo(buf, " %u/%u",
 							 xlrec->tablespace_ids[i], xlrec->db_id);
diff --git a/src/pl/plpython/plpy_elog.c b/src/pl/plpython/plpy_elog.c
index ae0b97c85d..224b8836fb 100644
--- a/src/pl/plpython/plpy_elog.c
+++ b/src/pl/plpython/plpy_elog.c
@@ -216,7 +216,7 @@ PLy_traceback(PyObject *e, PyObject *v, PyObject *tb,
 	else if (strcmp(e_module_s, "builtins") == 0
 			 || strcmp(e_module_s, "__main__") == 0
 			 || strcmp(e_module_s, "exceptions") == 0)
-		appendStringInfo(&xstr, "%s", e_type_s);
+		appendStringInfoString(&xstr, e_type_s);
 	else
 		appendStringInfo(&xstr, "%s.%s", e_module_s, e_type_s);
 	appendStringInfo(&xstr, ": %s", vstr);
-- 
2.23.0.windows.1

0001-appendStringInfoChar-instead-of-appendStringInfoString.patchapplication/octet-stream; name=0001-appendStringInfoChar-instead-of-appendStringInfoString.patchDownload
From 28743e8ae570c271947278417406bc1f139da874 Mon Sep 17 00:00:00 2001
From: root <root@localhost.localdomain>
Date: Mon, 28 Sep 2020 04:43:03 -0400
Subject: [PATCH] appendStringInfoChar-instead-of-appendStringInfoString

---
 src/backend/replication/backup_manifest.c | 6 +++---
 src/backend/utils/adt/ruleutils.c         | 2 +-
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/src/backend/replication/backup_manifest.c b/src/backend/replication/backup_manifest.c
index a43c793..556e6b5 100644
--- a/src/backend/replication/backup_manifest.c
+++ b/src/backend/replication/backup_manifest.c
@@ -112,7 +112,7 @@ AddFileToBackupManifest(backup_manifest_info *manifest, const char *spcoid,
 	initStringInfo(&buf);
 	if (manifest->first_file)
 	{
-		appendStringInfoString(&buf, "\n");
+		appendStringInfoChar(&buf, '\n');
 		manifest->first_file = false;
 	}
 	else
@@ -152,7 +152,7 @@ AddFileToBackupManifest(backup_manifest_info *manifest, const char *spcoid,
 	enlargeStringInfo(&buf, 128);
 	buf.len += pg_strftime(&buf.data[buf.len], 128, "%Y-%m-%d %H:%M:%S %Z",
 						   pg_gmtime(&mtime));
-	appendStringInfoString(&buf, "\"");
+	appendStringInfoChar(&buf, '"');
 
 	/* Add checksum information. */
 	if (checksum_ctx->type != CHECKSUM_TYPE_NONE)
@@ -168,7 +168,7 @@ AddFileToBackupManifest(backup_manifest_info *manifest, const char *spcoid,
 		enlargeStringInfo(&buf, 2 * checksumlen);
 		buf.len += hex_encode((char *) checksumbuf, checksumlen,
 							  &buf.data[buf.len]);
-		appendStringInfoString(&buf, "\"");
+		appendStringInfoChar(&buf, '"');
 	}
 
 	/* Close out the object. */
diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c
index 15877e3..0e1798c 100644
--- a/src/backend/utils/adt/ruleutils.c
+++ b/src/backend/utils/adt/ruleutils.c
@@ -11359,7 +11359,7 @@ get_range_partbound_string(List *bound_datums)
 	memset(&context, 0, sizeof(deparse_context));
 	context.buf = buf;
 
-	appendStringInfoString(buf, "(");
+	appendStringInfoChar(buf, '(');
 	sep = "";
 	foreach(cell, bound_datums)
 	{
-- 
1.8.3.1

0001-Latest-appendPQExpBufferStr-instead-of-appendPQExpBuffer.patchapplication/octet-stream; name=0001-Latest-appendPQExpBufferStr-instead-of-appendPQExpBuffer.patchDownload
From a40bb83b09772ae67c7a7d279e96f7ddf4eff082 Mon Sep 17 00:00:00 2001
From: root <root@localhost.localdomain>
Date: Tue, 22 Sep 2020 07:59:17 -0400
Subject: [PATCH] appendPQExpBufferStr

---
 src/bin/scripts/reindexdb.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/src/bin/scripts/reindexdb.c b/src/bin/scripts/reindexdb.c
index 40dcbc9..f63bf88 100644
--- a/src/bin/scripts/reindexdb.c
+++ b/src/bin/scripts/reindexdb.c
@@ -614,7 +614,7 @@ get_parallel_object_list(PGconn *conn, ReindexType type,
 	{
 		case REINDEX_DATABASE:
 			Assert(user_list == NULL);
-			appendPQExpBuffer(&catalog_query,
+			appendPQExpBufferStr(&catalog_query,
 							  "SELECT c.relname, ns.nspname\n"
 							  " FROM pg_catalog.pg_class c\n"
 							  " JOIN pg_catalog.pg_namespace ns"
@@ -637,7 +637,7 @@ get_parallel_object_list(PGconn *conn, ReindexType type,
 				 * All the tables from all the listed schemas are grabbed at
 				 * once.
 				 */
-				appendPQExpBuffer(&catalog_query,
+				appendPQExpBufferStr(&catalog_query,
 								  "SELECT c.relname, ns.nspname\n"
 								  " FROM pg_catalog.pg_class c\n"
 								  " JOIN pg_catalog.pg_namespace ns"
@@ -652,14 +652,14 @@ get_parallel_object_list(PGconn *conn, ReindexType type,
 					const char *nspname = cell->val;
 
 					if (nsp_listed)
-						appendPQExpBuffer(&catalog_query, ", ");
+						appendPQExpBufferStr(&catalog_query, ", ");
 					else
 						nsp_listed = true;
 
 					appendStringLiteralConn(&catalog_query, nspname, conn);
 				}
 
-				appendPQExpBuffer(&catalog_query, ")\n"
+				appendPQExpBufferStr(&catalog_query, ")\n"
 								  " ORDER BY c.relpages DESC;");
 			}
 			break;
-- 
1.8.3.1

#6David Rowley
dgrowleyml@gmail.com
In reply to: Hou, Zhijie (#5)
1 attachment(s)
Re: Use appendStringInfoString and appendPQExpBufferStr where possible

On Mon, 28 Sep 2020 at 13:47, Hou, Zhijie <houzj.fnst@cn.fujitsu.com> wrote:

Thanks for your response, combined them as a single patchset now.

I had a look over the three patches. All the changes look fine.
Thanks for working on it.

After a bit of grep work, I found about 6 times more calls that could
be improved. These involved searching for appendStringInfo calls that
could become appendStringInfoString calls and also appendPQExpBuffer
that could be converted to appendPQExpBufferStr.

I didn't really go hunting for any other calls that append a 1 char
string that don't use the Char variant of the function. So perhaps
there's more of those to be found.

I've attached the patch I ended up with. I plan on pushing this in the
next few days.

David

Attachments:

fixup_some_appendStringInfo_calls.patchtext/plain; charset=US-ASCII; name=fixup_some_appendStringInfo_calls.patchDownload
diff --git a/contrib/postgres_fdw/postgres_fdw.c b/contrib/postgres_fdw/postgres_fdw.c
index a31abce7c9..a7caa246ef 100644
--- a/contrib/postgres_fdw/postgres_fdw.c
+++ b/contrib/postgres_fdw/postgres_fdw.c
@@ -2589,8 +2589,8 @@ postgresExplainForeignScan(ForeignScanState *node, ExplainState *es)
 									 quote_identifier(relname));
 				}
 				else
-					appendStringInfo(relations, "%s",
-									 quote_identifier(relname));
+					appendStringInfoString(relations,
+										   quote_identifier(relname));
 				refname = (char *) list_nth(es->rtable_names, rti - 1);
 				if (refname == NULL)
 					refname = rte->eref->aliasname;
diff --git a/contrib/test_decoding/test_decoding.c b/contrib/test_decoding/test_decoding.c
index e60ab34a5a..8e33614f14 100644
--- a/contrib/test_decoding/test_decoding.c
+++ b/contrib/test_decoding/test_decoding.c
@@ -606,7 +606,7 @@ pg_output_stream_start(LogicalDecodingContext *ctx, TestDecodingData *data, Reor
 	if (data->include_xids)
 		appendStringInfo(ctx->out, "opening a streamed block for transaction TXN %u", txn->xid);
 	else
-		appendStringInfo(ctx->out, "opening a streamed block for transaction");
+		appendStringInfoString(ctx->out, "opening a streamed block for transaction");
 	OutputPluginWrite(ctx, last_write);
 }
 
@@ -623,7 +623,7 @@ pg_decode_stream_stop(LogicalDecodingContext *ctx,
 	if (data->include_xids)
 		appendStringInfo(ctx->out, "closing a streamed block for transaction TXN %u", txn->xid);
 	else
-		appendStringInfo(ctx->out, "closing a streamed block for transaction");
+		appendStringInfoString(ctx->out, "closing a streamed block for transaction");
 	OutputPluginWrite(ctx, true);
 }
 
@@ -641,7 +641,7 @@ pg_decode_stream_abort(LogicalDecodingContext *ctx,
 	if (data->include_xids)
 		appendStringInfo(ctx->out, "aborting streamed (sub)transaction TXN %u", txn->xid);
 	else
-		appendStringInfo(ctx->out, "aborting streamed (sub)transaction");
+		appendStringInfoString(ctx->out, "aborting streamed (sub)transaction");
 	OutputPluginWrite(ctx, true);
 }
 
@@ -660,7 +660,7 @@ pg_decode_stream_commit(LogicalDecodingContext *ctx,
 	if (data->include_xids)
 		appendStringInfo(ctx->out, "committing streamed transaction TXN %u", txn->xid);
 	else
-		appendStringInfo(ctx->out, "committing streamed transaction");
+		appendStringInfoString(ctx->out, "committing streamed transaction");
 
 	if (data->include_timestamp)
 		appendStringInfo(ctx->out, " (at %s)",
@@ -693,7 +693,7 @@ pg_decode_stream_change(LogicalDecodingContext *ctx,
 	if (data->include_xids)
 		appendStringInfo(ctx->out, "streaming change for TXN %u", txn->xid);
 	else
-		appendStringInfo(ctx->out, "streaming change for transaction");
+		appendStringInfoString(ctx->out, "streaming change for transaction");
 	OutputPluginWrite(ctx, true);
 }
 
@@ -745,6 +745,6 @@ pg_decode_stream_truncate(LogicalDecodingContext *ctx, ReorderBufferTXN *txn,
 	if (data->include_xids)
 		appendStringInfo(ctx->out, "streaming truncate for TXN %u", txn->xid);
 	else
-		appendStringInfo(ctx->out, "streaming truncate for transaction");
+		appendStringInfoString(ctx->out, "streaming truncate for transaction");
 	OutputPluginWrite(ctx, true);
 }
diff --git a/src/backend/access/rmgrdesc/dbasedesc.c b/src/backend/access/rmgrdesc/dbasedesc.c
index d82484b9db..47580feaea 100644
--- a/src/backend/access/rmgrdesc/dbasedesc.c
+++ b/src/backend/access/rmgrdesc/dbasedesc.c
@@ -37,7 +37,7 @@ dbase_desc(StringInfo buf, XLogReaderState *record)
 		xl_dbase_drop_rec *xlrec = (xl_dbase_drop_rec *) rec;
 		int			i;
 
-		appendStringInfo(buf, "dir");
+		appendStringInfoString(buf, "dir");
 		for (i = 0; i < xlrec->ntablespaces; i++)
 			appendStringInfo(buf, " %u/%u",
 							 xlrec->tablespace_ids[i], xlrec->db_id);
diff --git a/src/backend/commands/explain.c b/src/backend/commands/explain.c
index c8e292adfa..41317f1837 100644
--- a/src/backend/commands/explain.c
+++ b/src/backend/commands/explain.c
@@ -2768,14 +2768,14 @@ show_incremental_sort_group_info(IncrementalSortGroupInfo *groupInfo,
 						 groupInfo->groupCount);
 		/* plural/singular based on methodNames size */
 		if (list_length(methodNames) > 1)
-			appendStringInfo(es->str, "s: ");
+			appendStringInfoString(es->str, "s: ");
 		else
-			appendStringInfo(es->str, ": ");
+			appendStringInfoString(es->str, ": ");
 		foreach(methodCell, methodNames)
 		{
-			appendStringInfo(es->str, "%s", (char *) methodCell->ptr_value);
+			appendStringInfoString(es->str, (char *) methodCell->ptr_value);
 			if (foreach_current_index(methodCell) < list_length(methodNames) - 1)
-				appendStringInfo(es->str, ", ");
+				appendStringInfoString(es->str, ", ");
 		}
 
 		if (groupInfo->maxMemorySpaceUsed > 0)
@@ -2882,11 +2882,11 @@ show_incremental_sort_info(IncrementalSortState *incrsortstate,
 		if (prefixsortGroupInfo->groupCount > 0)
 		{
 			if (es->format == EXPLAIN_FORMAT_TEXT)
-				appendStringInfo(es->str, "\n");
+				appendStringInfoChar(es->str, '\n');
 			show_incremental_sort_group_info(prefixsortGroupInfo, "Pre-sorted", true, es);
 		}
 		if (es->format == EXPLAIN_FORMAT_TEXT)
-			appendStringInfo(es->str, "\n");
+			appendStringInfoChar(es->str, '\n');
 	}
 
 	if (incrsortstate->shared_info != NULL)
@@ -2925,11 +2925,11 @@ show_incremental_sort_info(IncrementalSortState *incrsortstate,
 			if (prefixsortGroupInfo->groupCount > 0)
 			{
 				if (es->format == EXPLAIN_FORMAT_TEXT)
-					appendStringInfo(es->str, "\n");
+					appendStringInfoChar(es->str, '\n');
 				show_incremental_sort_group_info(prefixsortGroupInfo, "Pre-sorted", true, es);
 			}
 			if (es->format == EXPLAIN_FORMAT_TEXT)
-				appendStringInfo(es->str, "\n");
+				appendStringInfoChar(es->str, '\n');
 
 			if (es->workers_state)
 				ExplainCloseWorker(n, es);
diff --git a/src/backend/replication/backup_manifest.c b/src/backend/replication/backup_manifest.c
index a43c793e28..556e6b5040 100644
--- a/src/backend/replication/backup_manifest.c
+++ b/src/backend/replication/backup_manifest.c
@@ -112,7 +112,7 @@ AddFileToBackupManifest(backup_manifest_info *manifest, const char *spcoid,
 	initStringInfo(&buf);
 	if (manifest->first_file)
 	{
-		appendStringInfoString(&buf, "\n");
+		appendStringInfoChar(&buf, '\n');
 		manifest->first_file = false;
 	}
 	else
@@ -152,7 +152,7 @@ AddFileToBackupManifest(backup_manifest_info *manifest, const char *spcoid,
 	enlargeStringInfo(&buf, 128);
 	buf.len += pg_strftime(&buf.data[buf.len], 128, "%Y-%m-%d %H:%M:%S %Z",
 						   pg_gmtime(&mtime));
-	appendStringInfoString(&buf, "\"");
+	appendStringInfoChar(&buf, '"');
 
 	/* Add checksum information. */
 	if (checksum_ctx->type != CHECKSUM_TYPE_NONE)
@@ -168,7 +168,7 @@ AddFileToBackupManifest(backup_manifest_info *manifest, const char *spcoid,
 		enlargeStringInfo(&buf, 2 * checksumlen);
 		buf.len += hex_encode((char *) checksumbuf, checksumlen,
 							  &buf.data[buf.len]);
-		appendStringInfoString(&buf, "\"");
+		appendStringInfoChar(&buf, '"');
 	}
 
 	/* Close out the object. */
diff --git a/src/backend/replication/libpqwalreceiver/libpqwalreceiver.c b/src/backend/replication/libpqwalreceiver/libpqwalreceiver.c
index ad574099ff..24f8b3e42e 100644
--- a/src/backend/replication/libpqwalreceiver/libpqwalreceiver.c
+++ b/src/backend/replication/libpqwalreceiver/libpqwalreceiver.c
@@ -427,7 +427,7 @@ libpqrcv_startstreaming(WalReceiverConn *conn,
 
 		if (options->proto.logical.streaming &&
 			PQserverVersion(conn->streamConn) >= 140000)
-			appendStringInfo(&cmd, ", streaming 'on'");
+			appendStringInfoString(&cmd, ", streaming 'on'");
 
 		pubnames = options->proto.logical.publication_names;
 		pubnames_str = stringlist_to_identifierstr(conn->streamConn, pubnames);
diff --git a/src/backend/replication/logical/tablesync.c b/src/backend/replication/logical/tablesync.c
index c27d970589..843c9285d5 100644
--- a/src/backend/replication/logical/tablesync.c
+++ b/src/backend/replication/logical/tablesync.c
@@ -774,7 +774,7 @@ copy_table(Relation rel)
 		 * For non-tables, we need to do COPY (SELECT ...), but we can't just
 		 * do SELECT * because we need to not copy generated columns.
 		 */
-		appendStringInfo(&cmd, "COPY (SELECT ");
+		appendStringInfoString(&cmd, "COPY (SELECT ");
 		for (int i = 0; i < lrel.natts; i++)
 		{
 			appendStringInfoString(&cmd, quote_identifier(lrel.attnames[i]));
diff --git a/src/backend/utils/adt/jsonpath.c b/src/backend/utils/adt/jsonpath.c
index 3c0dc38a7f..31d9d92d14 100644
--- a/src/backend/utils/adt/jsonpath.c
+++ b/src/backend/utils/adt/jsonpath.c
@@ -660,7 +660,7 @@ printJsonPathItem(StringInfo buf, JsonPathItem *v, bool inKey,
 			else if (v->content.anybounds.first == v->content.anybounds.last)
 			{
 				if (v->content.anybounds.first == PG_UINT32_MAX)
-					appendStringInfo(buf, "**{last}");
+					appendStringInfoString(buf, "**{last}");
 				else
 					appendStringInfo(buf, "**{%u}",
 									 v->content.anybounds.first);
diff --git a/src/backend/utils/adt/ri_triggers.c b/src/backend/utils/adt/ri_triggers.c
index 06cf16d9d7..7e2b2e3dd6 100644
--- a/src/backend/utils/adt/ri_triggers.c
+++ b/src/backend/utils/adt/ri_triggers.c
@@ -1663,7 +1663,7 @@ RI_PartitionRemove_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
 		appendStringInfo(&querybuf, ") WHERE %s AND (",
 						 constraintDef);
 	else
-		appendStringInfo(&querybuf, ") WHERE (");
+		appendStringInfoString(&querybuf, ") WHERE (");
 
 	sep = "";
 	for (i = 0; i < riinfo->nkeys; i++)
diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c
index 62023c20b2..6c656586e8 100644
--- a/src/backend/utils/adt/ruleutils.c
+++ b/src/backend/utils/adt/ruleutils.c
@@ -5250,7 +5250,7 @@ get_select_query_def(Query *query, deparse_context *context,
 			appendContextKeyword(context, " FETCH FIRST ",
 								 -PRETTYINDENT_STD, PRETTYINDENT_STD, 0);
 			get_rule_expr(query->limitCount, context, false);
-			appendStringInfo(buf, " ROWS WITH TIES");
+			appendStringInfoString(buf, " ROWS WITH TIES");
 		}
 		else
 		{
@@ -11362,7 +11362,7 @@ get_range_partbound_string(List *bound_datums)
 	memset(&context, 0, sizeof(deparse_context));
 	context.buf = buf;
 
-	appendStringInfoString(buf, "(");
+	appendStringInfoChar(buf, '(');
 	sep = "";
 	foreach(cell, bound_datums)
 	{
diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c
index 88bbbd9a9e..ff45e3fb8c 100644
--- a/src/bin/pg_dump/pg_dump.c
+++ b/src/bin/pg_dump/pg_dump.c
@@ -1375,8 +1375,8 @@ expand_foreign_server_name_patterns(Archive *fout,
 
 	for (cell = patterns->head; cell; cell = cell->next)
 	{
-		appendPQExpBuffer(query,
-						  "SELECT oid FROM pg_catalog.pg_foreign_server s\n");
+		appendPQExpBufferStr(query,
+							 "SELECT oid FROM pg_catalog.pg_foreign_server s\n");
 		processSQLNamePattern(GetConnection(fout), query, cell->val, false,
 							  false, NULL, "s.srvname", NULL, NULL);
 
@@ -4250,23 +4250,19 @@ getSubscriptions(Archive *fout)
 					  username_subquery);
 
 	if (fout->remoteVersion >= 140000)
-		appendPQExpBuffer(query,
-						  " s.subbinary,\n");
+		appendPQExpBufferStr(query, " s.subbinary,\n");
 	else
-		appendPQExpBuffer(query,
-						  " false AS subbinary,\n");
+		appendPQExpBufferStr(query, " false AS subbinary,\n");
 
 	if (fout->remoteVersion >= 140000)
-		appendPQExpBuffer(query,
-						  " s.substream\n");
+		appendPQExpBufferStr(query, " s.substream\n");
 	else
-		appendPQExpBuffer(query,
-						  " false AS substream\n");
+		appendPQExpBufferStr(query, " false AS substream\n");
 
-	appendPQExpBuffer(query,
-					  "FROM pg_subscription s\n"
-					  "WHERE s.subdbid = (SELECT oid FROM pg_database\n"
-					  "                   WHERE datname = current_database())");
+	appendPQExpBufferStr(query,
+						 "FROM pg_subscription s\n"
+						 "WHERE s.subdbid = (SELECT oid FROM pg_database\n"
+						 "                   WHERE datname = current_database())");
 
 	res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
 
@@ -4376,10 +4372,10 @@ dumpSubscription(Archive *fout, SubscriptionInfo *subinfo)
 		appendPQExpBufferStr(query, "NONE");
 
 	if (strcmp(subinfo->subbinary, "t") == 0)
-		appendPQExpBuffer(query, ", binary = true");
+		appendPQExpBufferStr(query, ", binary = true");
 
 	if (strcmp(subinfo->substream, "f") != 0)
-		appendPQExpBuffer(query, ", streaming = on");
+		appendPQExpBufferStr(query, ", streaming = on");
 
 	if (strcmp(subinfo->subsynccommit, "off") != 0)
 		appendPQExpBuffer(query, ", synchronous_commit = %s", fmtId(subinfo->subsynccommit));
@@ -11845,26 +11841,26 @@ dumpFunc(Archive *fout, FuncInfo *finfo)
 	asPart = createPQExpBuffer();
 
 	/* Fetch function-specific details */
-	appendPQExpBuffer(query,
-					  "SELECT\n"
-					  "proretset,\n"
-					  "prosrc,\n"
-					  "probin,\n"
-					  "provolatile,\n"
-					  "proisstrict,\n"
-					  "prosecdef,\n"
-					  "(SELECT lanname FROM pg_catalog.pg_language WHERE oid = prolang) AS lanname,\n");
+	appendPQExpBufferStr(query,
+						 "SELECT\n"
+						 "proretset,\n"
+						 "prosrc,\n"
+						 "probin,\n"
+						 "provolatile,\n"
+						 "proisstrict,\n"
+						 "prosecdef,\n"
+						 "(SELECT lanname FROM pg_catalog.pg_language WHERE oid = prolang) AS lanname,\n");
 
 	if (fout->remoteVersion >= 80300)
-		appendPQExpBuffer(query,
-						  "proconfig,\n"
-						  "procost,\n"
-						  "prorows,\n");
+		appendPQExpBufferStr(query,
+							 "proconfig,\n"
+							 "procost,\n"
+							 "prorows,\n");
 	else
-		appendPQExpBuffer(query,
-						  "null AS proconfig,\n"
-						  "0 AS procost,\n"
-						  "0 AS prorows,\n");
+		appendPQExpBufferStr(query,
+							 "null AS proconfig,\n"
+							 "0 AS procost,\n"
+							 "0 AS prorows,\n");
 
 	if (fout->remoteVersion >= 80400)
 	{
@@ -11872,56 +11868,56 @@ dumpFunc(Archive *fout, FuncInfo *finfo)
 		 * In 8.4 and up we rely on pg_get_function_arguments and
 		 * pg_get_function_result instead of examining proallargtypes etc.
 		 */
-		appendPQExpBuffer(query,
-						  "pg_catalog.pg_get_function_arguments(oid) AS funcargs,\n"
-						  "pg_catalog.pg_get_function_identity_arguments(oid) AS funciargs,\n"
-						  "pg_catalog.pg_get_function_result(oid) AS funcresult,\n");
+		appendPQExpBufferStr(query,
+							 "pg_catalog.pg_get_function_arguments(oid) AS funcargs,\n"
+							 "pg_catalog.pg_get_function_identity_arguments(oid) AS funciargs,\n"
+							 "pg_catalog.pg_get_function_result(oid) AS funcresult,\n");
 	}
 	else if (fout->remoteVersion >= 80100)
-		appendPQExpBuffer(query,
-						  "proallargtypes,\n"
-						  "proargmodes,\n"
-						  "proargnames,\n");
+		appendPQExpBufferStr(query,
+							 "proallargtypes,\n"
+							 "proargmodes,\n"
+							 "proargnames,\n");
 	else
-		appendPQExpBuffer(query,
-						  "null AS proallargtypes,\n"
-						  "null AS proargmodes,\n"
-						  "proargnames,\n");
+		appendPQExpBufferStr(query,
+							 "null AS proallargtypes,\n"
+							 "null AS proargmodes,\n"
+							 "proargnames,\n");
 
 	if (fout->remoteVersion >= 90200)
-		appendPQExpBuffer(query,
-						  "proleakproof,\n");
+		appendPQExpBufferStr(query,
+							 "proleakproof,\n");
 	else
-		appendPQExpBuffer(query,
-						  "false AS proleakproof,\n");
+		appendPQExpBufferStr(query,
+							 "false AS proleakproof,\n");
 
 	if (fout->remoteVersion >= 90500)
-		appendPQExpBuffer(query,
-						  "array_to_string(protrftypes, ' ') AS protrftypes,\n");
+		appendPQExpBufferStr(query,
+							 "array_to_string(protrftypes, ' ') AS protrftypes,\n");
 
 	if (fout->remoteVersion >= 90600)
-		appendPQExpBuffer(query,
-						  "proparallel,\n");
+		appendPQExpBufferStr(query,
+							 "proparallel,\n");
 	else
-		appendPQExpBuffer(query,
-						  "'u' AS proparallel,\n");
+		appendPQExpBufferStr(query,
+							 "'u' AS proparallel,\n");
 
 	if (fout->remoteVersion >= 110000)
-		appendPQExpBuffer(query,
-						  "prokind,\n");
+		appendPQExpBufferStr(query,
+							 "prokind,\n");
 	else if (fout->remoteVersion >= 80400)
-		appendPQExpBuffer(query,
-						  "CASE WHEN proiswindow THEN 'w' ELSE 'f' END AS prokind,\n");
+		appendPQExpBufferStr(query,
+							 "CASE WHEN proiswindow THEN 'w' ELSE 'f' END AS prokind,\n");
 	else
-		appendPQExpBuffer(query,
-						  "'f' AS prokind,\n");
+		appendPQExpBufferStr(query,
+							 "'f' AS prokind,\n");
 
 	if (fout->remoteVersion >= 120000)
-		appendPQExpBuffer(query,
-						  "prosupport\n");
+		appendPQExpBufferStr(query,
+							 "prosupport\n");
 	else
-		appendPQExpBuffer(query,
-						  "'-' AS prosupport\n");
+		appendPQExpBufferStr(query,
+							 "'-' AS prosupport\n");
 
 	appendPQExpBuffer(query,
 					  "FROM pg_catalog.pg_proc "
@@ -13891,71 +13887,71 @@ dumpAgg(Archive *fout, AggInfo *agginfo)
 	details = createPQExpBuffer();
 
 	/* Get aggregate-specific details */
-	appendPQExpBuffer(query,
-					  "SELECT\n"
-					  "aggtransfn,\n"
-					  "aggfinalfn,\n"
-					  "aggtranstype::pg_catalog.regtype,\n"
-					  "agginitval,\n");
+	appendPQExpBufferStr(query,
+						 "SELECT\n"
+						 "aggtransfn,\n"
+						 "aggfinalfn,\n"
+						 "aggtranstype::pg_catalog.regtype,\n"
+						 "agginitval,\n");
 
 	if (fout->remoteVersion >= 80100)
-		appendPQExpBuffer(query,
-						  "aggsortop,\n");
+		appendPQExpBufferStr(query,
+							 "aggsortop,\n");
 	else
-		appendPQExpBuffer(query,
-						  "0 AS aggsortop,\n");
+		appendPQExpBufferStr(query,
+							 "0 AS aggsortop,\n");
 
 	if (fout->remoteVersion >= 80400)
-		appendPQExpBuffer(query,
-						  "pg_catalog.pg_get_function_arguments(p.oid) AS funcargs,\n"
-						  "pg_catalog.pg_get_function_identity_arguments(p.oid) AS funciargs,\n");
+		appendPQExpBufferStr(query,
+							 "pg_catalog.pg_get_function_arguments(p.oid) AS funcargs,\n"
+							 "pg_catalog.pg_get_function_identity_arguments(p.oid) AS funciargs,\n");
 
 	if (fout->remoteVersion >= 90400)
-		appendPQExpBuffer(query,
-						  "aggkind,\n"
-						  "aggmtransfn,\n"
-						  "aggminvtransfn,\n"
-						  "aggmfinalfn,\n"
-						  "aggmtranstype::pg_catalog.regtype,\n"
-						  "aggfinalextra,\n"
-						  "aggmfinalextra,\n"
-						  "aggtransspace,\n"
-						  "aggmtransspace,\n"
-						  "aggminitval,\n");
+		appendPQExpBufferStr(query,
+							 "aggkind,\n"
+							 "aggmtransfn,\n"
+							 "aggminvtransfn,\n"
+							 "aggmfinalfn,\n"
+							 "aggmtranstype::pg_catalog.regtype,\n"
+							 "aggfinalextra,\n"
+							 "aggmfinalextra,\n"
+							 "aggtransspace,\n"
+							 "aggmtransspace,\n"
+							 "aggminitval,\n");
 	else
-		appendPQExpBuffer(query,
-						  "'n' AS aggkind,\n"
-						  "'-' AS aggmtransfn,\n"
-						  "'-' AS aggminvtransfn,\n"
-						  "'-' AS aggmfinalfn,\n"
-						  "0 AS aggmtranstype,\n"
-						  "false AS aggfinalextra,\n"
-						  "false AS aggmfinalextra,\n"
-						  "0 AS aggtransspace,\n"
-						  "0 AS aggmtransspace,\n"
-						  "NULL AS aggminitval,\n");
+		appendPQExpBufferStr(query,
+							 "'n' AS aggkind,\n"
+							 "'-' AS aggmtransfn,\n"
+							 "'-' AS aggminvtransfn,\n"
+							 "'-' AS aggmfinalfn,\n"
+							 "0 AS aggmtranstype,\n"
+							 "false AS aggfinalextra,\n"
+							 "false AS aggmfinalextra,\n"
+							 "0 AS aggtransspace,\n"
+							 "0 AS aggmtransspace,\n"
+							 "NULL AS aggminitval,\n");
 
 	if (fout->remoteVersion >= 90600)
-		appendPQExpBuffer(query,
-						  "aggcombinefn,\n"
-						  "aggserialfn,\n"
-						  "aggdeserialfn,\n"
-						  "proparallel,\n");
+		appendPQExpBufferStr(query,
+							 "aggcombinefn,\n"
+							 "aggserialfn,\n"
+							 "aggdeserialfn,\n"
+							 "proparallel,\n");
 	else
-		appendPQExpBuffer(query,
-						  "'-' AS aggcombinefn,\n"
-						  "'-' AS aggserialfn,\n"
-						  "'-' AS aggdeserialfn,\n"
-						  "'u' AS proparallel,\n");
+		appendPQExpBufferStr(query,
+							 "'-' AS aggcombinefn,\n"
+							 "'-' AS aggserialfn,\n"
+							 "'-' AS aggdeserialfn,\n"
+							 "'u' AS proparallel,\n");
 
 	if (fout->remoteVersion >= 110000)
-		appendPQExpBuffer(query,
-						  "aggfinalmodify,\n"
-						  "aggmfinalmodify\n");
+		appendPQExpBufferStr(query,
+							 "aggfinalmodify,\n"
+							 "aggmfinalmodify\n");
 	else
-		appendPQExpBuffer(query,
-						  "'0' AS aggfinalmodify,\n"
-						  "'0' AS aggmfinalmodify\n");
+		appendPQExpBufferStr(query,
+							 "'0' AS aggfinalmodify,\n"
+							 "'0' AS aggmfinalmodify\n");
 
 	appendPQExpBuffer(query,
 					  "FROM pg_catalog.pg_aggregate a, pg_catalog.pg_proc p "
diff --git a/src/bin/pg_upgrade/version.c b/src/bin/pg_upgrade/version.c
index 4e5d27f76e..db1934124e 100644
--- a/src/bin/pg_upgrade/version.c
+++ b/src/bin/pg_upgrade/version.c
@@ -158,33 +158,33 @@ check_for_data_type_usage(ClusterInfo *cluster, const char *typename,
 
 		/* Ranges were introduced in 9.2 */
 		if (GET_MAJOR_VERSION(cluster->major_version) >= 902)
-			appendPQExpBuffer(&querybuf,
-							  "			UNION ALL "
+			appendPQExpBufferStr(&querybuf,
+								 "			UNION ALL "
 			/* ranges containing any type selected so far */
-							  "			SELECT t.oid FROM pg_catalog.pg_type t, pg_catalog.pg_range r, x "
-							  "			WHERE t.typtype = 'r' AND r.rngtypid = t.oid AND r.rngsubtype = x.oid");
+								 "			SELECT t.oid FROM pg_catalog.pg_type t, pg_catalog.pg_range r, x "
+								 "			WHERE t.typtype = 'r' AND r.rngtypid = t.oid AND r.rngsubtype = x.oid");
 
-		appendPQExpBuffer(&querybuf,
-						  "	) foo "
-						  ") "
+		appendPQExpBufferStr(&querybuf,
+							 "	) foo "
+							 ") "
 		/* now look for stored columns of any such type */
-						  "SELECT n.nspname, c.relname, a.attname "
-						  "FROM	pg_catalog.pg_class c, "
-						  "		pg_catalog.pg_namespace n, "
-						  "		pg_catalog.pg_attribute a "
-						  "WHERE	c.oid = a.attrelid AND "
-						  "		NOT a.attisdropped AND "
-						  "		a.atttypid IN (SELECT oid FROM oids) AND "
-						  "		c.relkind IN ("
-						  CppAsString2(RELKIND_RELATION) ", "
-						  CppAsString2(RELKIND_MATVIEW) ", "
-						  CppAsString2(RELKIND_INDEX) ") AND "
-						  "		c.relnamespace = n.oid AND "
+							 "SELECT n.nspname, c.relname, a.attname "
+							 "FROM	pg_catalog.pg_class c, "
+							 "		pg_catalog.pg_namespace n, "
+							 "		pg_catalog.pg_attribute a "
+							 "WHERE	c.oid = a.attrelid AND "
+							 "		NOT a.attisdropped AND "
+							 "		a.atttypid IN (SELECT oid FROM oids) AND "
+							 "		c.relkind IN ("
+							 CppAsString2(RELKIND_RELATION) ", "
+							 CppAsString2(RELKIND_MATVIEW) ", "
+							 CppAsString2(RELKIND_INDEX) ") AND "
+							 "		c.relnamespace = n.oid AND "
 		/* exclude possible orphaned temp tables */
-						  "		n.nspname !~ '^pg_temp_' AND "
-						  "		n.nspname !~ '^pg_toast_temp_' AND "
+							 "		n.nspname !~ '^pg_temp_' AND "
+							 "		n.nspname !~ '^pg_toast_temp_' AND "
 		/* exclude system catalogs, too */
-						  "		n.nspname NOT IN ('pg_catalog', 'information_schema')");
+							 "		n.nspname NOT IN ('pg_catalog', 'information_schema')");
 
 		res = executeQueryOrDie(conn, "%s", querybuf.data);
 
diff --git a/src/bin/psql/describe.c b/src/bin/psql/describe.c
index 58de433fd3..6bb0316bd9 100644
--- a/src/bin/psql/describe.c
+++ b/src/bin/psql/describe.c
@@ -6137,17 +6137,16 @@ listOperatorClasses(const char *access_method_pattern,
 						  " pg_catalog.pg_get_userbyid(c.opcowner) AS \"%s\"\n",
 						  gettext_noop("Operator family"),
 						  gettext_noop("Owner"));
-	appendPQExpBuffer(&buf,
-					  "\nFROM pg_catalog.pg_opclass c\n"
-					  "  LEFT JOIN pg_catalog.pg_am am on am.oid = c.opcmethod\n"
-					  "  LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.opcnamespace\n"
-					  "  LEFT JOIN pg_catalog.pg_type t ON t.oid = c.opcintype\n"
-					  "  LEFT JOIN pg_catalog.pg_namespace tn ON tn.oid = t.typnamespace\n"
-		);
+	appendPQExpBufferStr(&buf,
+						 "\nFROM pg_catalog.pg_opclass c\n"
+						 "  LEFT JOIN pg_catalog.pg_am am on am.oid = c.opcmethod\n"
+						 "  LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.opcnamespace\n"
+						 "  LEFT JOIN pg_catalog.pg_type t ON t.oid = c.opcintype\n"
+						 "  LEFT JOIN pg_catalog.pg_namespace tn ON tn.oid = t.typnamespace\n");
 	if (verbose)
-		appendPQExpBuffer(&buf,
-						  "  LEFT JOIN pg_catalog.pg_opfamily of ON of.oid = c.opcfamily\n"
-						  "  LEFT JOIN pg_catalog.pg_namespace ofn ON ofn.oid = of.opfnamespace\n");
+		appendPQExpBufferStr(&buf,
+							 "  LEFT JOIN pg_catalog.pg_opfamily of ON of.oid = c.opcfamily\n"
+							 "  LEFT JOIN pg_catalog.pg_namespace ofn ON ofn.oid = of.opfnamespace\n");
 
 	if (access_method_pattern)
 		have_where = processSQLNamePattern(pset.db, &buf, access_method_pattern,
@@ -6216,11 +6215,10 @@ listOperatorFamilies(const char *access_method_pattern,
 		appendPQExpBuffer(&buf,
 						  ",\n  pg_catalog.pg_get_userbyid(f.opfowner) AS \"%s\"\n",
 						  gettext_noop("Owner"));
-	appendPQExpBuffer(&buf,
-					  "\nFROM pg_catalog.pg_opfamily f\n"
-					  "  LEFT JOIN pg_catalog.pg_am am on am.oid = f.opfmethod\n"
-					  "  LEFT JOIN pg_catalog.pg_namespace n ON n.oid = f.opfnamespace\n"
-		);
+	appendPQExpBufferStr(&buf,
+						 "\nFROM pg_catalog.pg_opfamily f\n"
+						 "  LEFT JOIN pg_catalog.pg_am am on am.oid = f.opfmethod\n"
+						 "  LEFT JOIN pg_catalog.pg_namespace n ON n.oid = f.opfnamespace\n");
 
 	if (access_method_pattern)
 		have_where = processSQLNamePattern(pset.db, &buf, access_method_pattern,
@@ -6240,7 +6238,7 @@ listOperatorFamilies(const char *access_method_pattern,
 							  "tn.nspname", "t.typname",
 							  "pg_catalog.format_type(t.oid, NULL)",
 							  "pg_catalog.pg_type_is_visible(t.oid)");
-		appendPQExpBuffer(&buf, "  )\n");
+		appendPQExpBufferStr(&buf, "  )\n");
 	}
 
 	appendPQExpBufferStr(&buf, "ORDER BY 1, 2;");
@@ -6307,14 +6305,14 @@ listOpFamilyOperators(const char *access_method_pattern,
 		appendPQExpBuffer(&buf,
 						  ", ofs.opfname AS \"%s\"\n",
 						  gettext_noop("Sort opfamily"));
-	appendPQExpBuffer(&buf,
-					  "FROM pg_catalog.pg_amop o\n"
-					  "  LEFT JOIN pg_catalog.pg_opfamily of ON of.oid = o.amopfamily\n"
-					  "  LEFT JOIN pg_catalog.pg_am am ON am.oid = of.opfmethod AND am.oid = o.amopmethod\n"
-					  "  LEFT JOIN pg_catalog.pg_namespace nsf ON of.opfnamespace = nsf.oid\n");
+	appendPQExpBufferStr(&buf,
+						 "FROM pg_catalog.pg_amop o\n"
+						 "  LEFT JOIN pg_catalog.pg_opfamily of ON of.oid = o.amopfamily\n"
+						 "  LEFT JOIN pg_catalog.pg_am am ON am.oid = of.opfmethod AND am.oid = o.amopmethod\n"
+						 "  LEFT JOIN pg_catalog.pg_namespace nsf ON of.opfnamespace = nsf.oid\n");
 	if (verbose)
-		appendPQExpBuffer(&buf,
-						  "  LEFT JOIN pg_catalog.pg_opfamily ofs ON ofs.oid = o.amopsortfamily\n");
+		appendPQExpBufferStr(&buf,
+							 "  LEFT JOIN pg_catalog.pg_opfamily ofs ON ofs.oid = o.amopsortfamily\n");
 
 	if (access_method_pattern)
 		have_where = processSQLNamePattern(pset.db, &buf, access_method_pattern,
@@ -6393,12 +6391,12 @@ listOpFamilyFunctions(const char *access_method_pattern,
 						  ", ap.amproc::pg_catalog.regprocedure AS \"%s\"\n",
 						  gettext_noop("Function"));
 
-	appendPQExpBuffer(&buf,
-					  "FROM pg_catalog.pg_amproc ap\n"
-					  "  LEFT JOIN pg_catalog.pg_opfamily of ON of.oid = ap.amprocfamily\n"
-					  "  LEFT JOIN pg_catalog.pg_am am ON am.oid = of.opfmethod\n"
-					  "  LEFT JOIN pg_catalog.pg_namespace ns ON of.opfnamespace = ns.oid\n"
-					  "  LEFT JOIN pg_catalog.pg_proc p ON ap.amproc = p.oid\n");
+	appendPQExpBufferStr(&buf,
+						 "FROM pg_catalog.pg_amproc ap\n"
+						 "  LEFT JOIN pg_catalog.pg_opfamily of ON of.oid = ap.amprocfamily\n"
+						 "  LEFT JOIN pg_catalog.pg_am am ON am.oid = of.opfmethod\n"
+						 "  LEFT JOIN pg_catalog.pg_namespace ns ON of.opfnamespace = ns.oid\n"
+						 "  LEFT JOIN pg_catalog.pg_proc p ON ap.amproc = p.oid\n");
 
 	if (access_method_pattern)
 		have_where = processSQLNamePattern(pset.db, &buf, access_method_pattern,
diff --git a/src/bin/scripts/reindexdb.c b/src/bin/scripts/reindexdb.c
index 40dcbc9283..1efb53110e 100644
--- a/src/bin/scripts/reindexdb.c
+++ b/src/bin/scripts/reindexdb.c
@@ -614,16 +614,16 @@ get_parallel_object_list(PGconn *conn, ReindexType type,
 	{
 		case REINDEX_DATABASE:
 			Assert(user_list == NULL);
-			appendPQExpBuffer(&catalog_query,
-							  "SELECT c.relname, ns.nspname\n"
-							  " FROM pg_catalog.pg_class c\n"
-							  " JOIN pg_catalog.pg_namespace ns"
-							  " ON c.relnamespace = ns.oid\n"
-							  " WHERE ns.nspname != 'pg_catalog'\n"
-							  "   AND c.relkind IN ("
-							  CppAsString2(RELKIND_RELATION) ", "
-							  CppAsString2(RELKIND_MATVIEW) ")\n"
-							  " ORDER BY c.relpages DESC;");
+			appendPQExpBufferStr(&catalog_query,
+								 "SELECT c.relname, ns.nspname\n"
+								 " FROM pg_catalog.pg_class c\n"
+								 " JOIN pg_catalog.pg_namespace ns"
+								 " ON c.relnamespace = ns.oid\n"
+								 " WHERE ns.nspname != 'pg_catalog'\n"
+								 "   AND c.relkind IN ("
+								 CppAsString2(RELKIND_RELATION) ", "
+								 CppAsString2(RELKIND_MATVIEW) ")\n"
+								 " ORDER BY c.relpages DESC;");
 			break;
 
 		case REINDEX_SCHEMA:
@@ -637,30 +637,30 @@ get_parallel_object_list(PGconn *conn, ReindexType type,
 				 * All the tables from all the listed schemas are grabbed at
 				 * once.
 				 */
-				appendPQExpBuffer(&catalog_query,
-								  "SELECT c.relname, ns.nspname\n"
-								  " FROM pg_catalog.pg_class c\n"
-								  " JOIN pg_catalog.pg_namespace ns"
-								  " ON c.relnamespace = ns.oid\n"
-								  " WHERE c.relkind IN ("
-								  CppAsString2(RELKIND_RELATION) ", "
-								  CppAsString2(RELKIND_MATVIEW) ")\n"
-								  " AND ns.nspname IN (");
+				appendPQExpBufferStr(&catalog_query,
+									 "SELECT c.relname, ns.nspname\n"
+									 " FROM pg_catalog.pg_class c\n"
+									 " JOIN pg_catalog.pg_namespace ns"
+									 " ON c.relnamespace = ns.oid\n"
+									 " WHERE c.relkind IN ("
+									 CppAsString2(RELKIND_RELATION) ", "
+									 CppAsString2(RELKIND_MATVIEW) ")\n"
+									 " AND ns.nspname IN (");
 
 				for (cell = user_list->head; cell; cell = cell->next)
 				{
 					const char *nspname = cell->val;
 
 					if (nsp_listed)
-						appendPQExpBuffer(&catalog_query, ", ");
+						appendPQExpBufferStr(&catalog_query, ", ");
 					else
 						nsp_listed = true;
 
 					appendStringLiteralConn(&catalog_query, nspname, conn);
 				}
 
-				appendPQExpBuffer(&catalog_query, ")\n"
-								  " ORDER BY c.relpages DESC;");
+				appendPQExpBufferStr(&catalog_query, ")\n"
+									 " ORDER BY c.relpages DESC;");
 			}
 			break;
 
diff --git a/src/pl/plpython/plpy_elog.c b/src/pl/plpython/plpy_elog.c
index ae0b97c85d..224b8836fb 100644
--- a/src/pl/plpython/plpy_elog.c
+++ b/src/pl/plpython/plpy_elog.c
@@ -216,7 +216,7 @@ PLy_traceback(PyObject *e, PyObject *v, PyObject *tb,
 	else if (strcmp(e_module_s, "builtins") == 0
 			 || strcmp(e_module_s, "__main__") == 0
 			 || strcmp(e_module_s, "exceptions") == 0)
-		appendStringInfo(&xstr, "%s", e_type_s);
+		appendStringInfoString(&xstr, e_type_s);
 	else
 		appendStringInfo(&xstr, "%s.%s", e_module_s, e_type_s);
 	appendStringInfo(&xstr, ": %s", vstr);
#7David Rowley
dgrowleyml@gmail.com
In reply to: David Rowley (#6)
Re: Use appendStringInfoString and appendPQExpBufferStr where possible

On Wed, 14 Oct 2020 at 21:05, David Rowley <dgrowleyml@gmail.com> wrote:

I've attached the patch I ended up with. I plan on pushing this in the
next few days.

Pushed.

David