From 2a77c3120a5edc32cdb7d716eed051bf2ff86c0e Mon Sep 17 00:00:00 2001
From: Aleksander Alekseev <aleksander@timescale.com>
Date: Mon, 21 Mar 2022 11:01:57 +0300
Subject: [PATCH v4] Remove workarounds to format [u]int64's

Now that we always use our own sprintf(), we can rely on %lld and %llu to be
portable, so we can use those. This reduces the code verbosity.

Author: Aleksander Alekseev <aleksander@timescale.com>
Author:	Japin Li <japinli@hotmail.com>
Reviewed-by: Pavel Borisov <pashkin.elfe@gmail.com>
Reviewed-by: Tom Lane <tgl@sss.pgh.pa.us>
Discussion: https://postgr.es/m/CAJ7c6TMSKi3Xs8h5MP38XOnQQpBLazJvVxVfPn%2B%2BroitDJcR7g%40mail.gmail.com
---
 src/backend/access/brin/brin.c      |  8 +--
 src/backend/commands/copyfrom.c     | 28 ++++-----
 src/backend/commands/sequence.c     | 95 +++++++----------------------
 src/backend/utils/adt/xid8funcs.c   |  5 +-
 src/bin/pg_checksums/pg_checksums.c | 27 +++-----
 5 files changed, 47 insertions(+), 116 deletions(-)

diff --git a/src/backend/access/brin/brin.c b/src/backend/access/brin/brin.c
index ba78ecff66..07c7c5a25d 100644
--- a/src/backend/access/brin/brin.c
+++ b/src/backend/access/brin/brin.c
@@ -1018,11 +1018,9 @@ brin_summarize_range(PG_FUNCTION_ARGS)
 
 	if (heapBlk64 > BRIN_ALL_BLOCKRANGES || heapBlk64 < 0)
 	{
-		char	   *blk = psprintf(INT64_FORMAT, heapBlk64);
-
 		ereport(ERROR,
 				(errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
-				 errmsg("block number out of range: %s", blk)));
+				 errmsg("block number out of range: %lld", (long long)heapBlk64)));
 	}
 	heapBlk = (BlockNumber) heapBlk64;
 
@@ -1095,11 +1093,9 @@ brin_desummarize_range(PG_FUNCTION_ARGS)
 
 	if (heapBlk64 > MaxBlockNumber || heapBlk64 < 0)
 	{
-		char	   *blk = psprintf(INT64_FORMAT, heapBlk64);
-
 		ereport(ERROR,
 				(errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
-				 errmsg("block number out of range: %s", blk)));
+				 errmsg("block number out of range: %lld", (long long)heapBlk64)));
 	}
 	heapBlk = (BlockNumber) heapBlk64;
 
diff --git a/src/backend/commands/copyfrom.c b/src/backend/commands/copyfrom.c
index 7b3f5a84b8..bab40c4201 100644
--- a/src/backend/commands/copyfrom.c
+++ b/src/backend/commands/copyfrom.c
@@ -115,21 +115,17 @@ void
 CopyFromErrorCallback(void *arg)
 {
 	CopyFromState cstate = (CopyFromState) arg;
-	char		curlineno_str[32];
-
-	snprintf(curlineno_str, sizeof(curlineno_str), UINT64_FORMAT,
-			 cstate->cur_lineno);
 
 	if (cstate->opts.binary)
 	{
 		/* can't usefully display the data */
 		if (cstate->cur_attname)
-			errcontext("COPY %s, line %s, column %s",
-					   cstate->cur_relname, curlineno_str,
+			errcontext("COPY %s, line %llu, column %s",
+					   cstate->cur_relname, (unsigned long long)cstate->cur_lineno,
 					   cstate->cur_attname);
 		else
-			errcontext("COPY %s, line %s",
-					   cstate->cur_relname, curlineno_str);
+			errcontext("COPY %s, line %llu",
+					   cstate->cur_relname, (unsigned long long)cstate->cur_lineno);
 	}
 	else
 	{
@@ -139,16 +135,16 @@ CopyFromErrorCallback(void *arg)
 			char	   *attval;
 
 			attval = limit_printout_length(cstate->cur_attval);
-			errcontext("COPY %s, line %s, column %s: \"%s\"",
-					   cstate->cur_relname, curlineno_str,
+			errcontext("COPY %s, line %llu, column %s: \"%s\"",
+					   cstate->cur_relname, (unsigned long long)cstate->cur_lineno,
 					   cstate->cur_attname, attval);
 			pfree(attval);
 		}
 		else if (cstate->cur_attname)
 		{
 			/* error is relevant to a particular column, value is NULL */
-			errcontext("COPY %s, line %s, column %s: null input",
-					   cstate->cur_relname, curlineno_str,
+			errcontext("COPY %s, line %llu, column %s: null input",
+					   cstate->cur_relname, (unsigned long long)cstate->cur_lineno,
 					   cstate->cur_attname);
 		}
 		else
@@ -163,14 +159,14 @@ CopyFromErrorCallback(void *arg)
 				char	   *lineval;
 
 				lineval = limit_printout_length(cstate->line_buf.data);
-				errcontext("COPY %s, line %s: \"%s\"",
-						   cstate->cur_relname, curlineno_str, lineval);
+				errcontext("COPY %s, line %llu: \"%s\"",
+						   cstate->cur_relname, (unsigned long long)cstate->cur_lineno, lineval);
 				pfree(lineval);
 			}
 			else
 			{
-				errcontext("COPY %s, line %s",
-						   cstate->cur_relname, curlineno_str);
+				errcontext("COPY %s, line %llu",
+						   cstate->cur_relname, (unsigned long long)cstate->cur_lineno);
 			}
 		}
 	}
diff --git a/src/backend/commands/sequence.c b/src/backend/commands/sequence.c
index ab592ce2f1..992de3a9d3 100644
--- a/src/backend/commands/sequence.c
+++ b/src/backend/commands/sequence.c
@@ -707,13 +707,10 @@ nextval_internal(Oid relid, bool check_permissions)
 					break;		/* stop fetching */
 				if (!cycle)
 				{
-					char		buf[100];
-
-					snprintf(buf, sizeof(buf), INT64_FORMAT, maxv);
 					ereport(ERROR,
 							(errcode(ERRCODE_SEQUENCE_GENERATOR_LIMIT_EXCEEDED),
-							 errmsg("nextval: reached maximum value of sequence \"%s\" (%s)",
-									RelationGetRelationName(seqrel), buf)));
+							 errmsg("nextval: reached maximum value of sequence \"%s\" (%lld)",
+									RelationGetRelationName(seqrel), (long long)maxv)));
 				}
 				next = minv;
 			}
@@ -730,13 +727,10 @@ nextval_internal(Oid relid, bool check_permissions)
 					break;		/* stop fetching */
 				if (!cycle)
 				{
-					char		buf[100];
-
-					snprintf(buf, sizeof(buf), INT64_FORMAT, minv);
 					ereport(ERROR,
 							(errcode(ERRCODE_SEQUENCE_GENERATOR_LIMIT_EXCEEDED),
-							 errmsg("nextval: reached minimum value of sequence \"%s\" (%s)",
-									RelationGetRelationName(seqrel), buf)));
+							 errmsg("nextval: reached minimum value of sequence \"%s\" (%lld)",
+									RelationGetRelationName(seqrel), (long long)minv)));
 				}
 				next = maxv;
 			}
@@ -976,18 +970,11 @@ do_setval(Oid relid, int64 next, bool iscalled)
 
 	if ((next < minv) || (next > maxv))
 	{
-		char		bufv[100],
-					bufm[100],
-					bufx[100];
-
-		snprintf(bufv, sizeof(bufv), INT64_FORMAT, next);
-		snprintf(bufm, sizeof(bufm), INT64_FORMAT, minv);
-		snprintf(bufx, sizeof(bufx), INT64_FORMAT, maxv);
 		ereport(ERROR,
 				(errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
-				 errmsg("setval: value %s is out of bounds for sequence \"%s\" (%s..%s)",
-						bufv, RelationGetRelationName(seqrel),
-						bufm, bufx)));
+				 errmsg("setval: value %lld is out of bounds for sequence \"%s\" (%lld..%lld)",
+						(long long)next, RelationGetRelationName(seqrel),
+						(long long)minv, (long long)maxv)));
 	}
 
 	/* Set the currval() state only if iscalled = true */
@@ -1469,14 +1456,10 @@ init_params(ParseState *pstate, List *options, bool for_identity,
 	if ((seqform->seqtypid == INT2OID && (seqform->seqmax < PG_INT16_MIN || seqform->seqmax > PG_INT16_MAX))
 		|| (seqform->seqtypid == INT4OID && (seqform->seqmax < PG_INT32_MIN || seqform->seqmax > PG_INT32_MAX)))
 	{
-		char		bufx[100];
-
-		snprintf(bufx, sizeof(bufx), INT64_FORMAT, seqform->seqmax);
-
 		ereport(ERROR,
 				(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
-				 errmsg("MAXVALUE (%s) is out of range for sequence data type %s",
-						bufx, format_type_be(seqform->seqtypid))));
+				 errmsg("MAXVALUE (%lld) is out of range for sequence data type %s",
+						(long long)seqform->seqmax, format_type_be(seqform->seqtypid))));
 	}
 
 	/* MINVALUE (null arg means NO MINVALUE) */
@@ -1506,28 +1489,19 @@ init_params(ParseState *pstate, List *options, bool for_identity,
 	if ((seqform->seqtypid == INT2OID && (seqform->seqmin < PG_INT16_MIN || seqform->seqmin > PG_INT16_MAX))
 		|| (seqform->seqtypid == INT4OID && (seqform->seqmin < PG_INT32_MIN || seqform->seqmin > PG_INT32_MAX)))
 	{
-		char		bufm[100];
-
-		snprintf(bufm, sizeof(bufm), INT64_FORMAT, seqform->seqmin);
-
 		ereport(ERROR,
 				(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
-				 errmsg("MINVALUE (%s) is out of range for sequence data type %s",
-						bufm, format_type_be(seqform->seqtypid))));
+				 errmsg("MINVALUE (%lld) is out of range for sequence data type %s",
+						(long long)seqform->seqmin, format_type_be(seqform->seqtypid))));
 	}
 
 	/* crosscheck min/max */
 	if (seqform->seqmin >= seqform->seqmax)
 	{
-		char		bufm[100],
-					bufx[100];
-
-		snprintf(bufm, sizeof(bufm), INT64_FORMAT, seqform->seqmin);
-		snprintf(bufx, sizeof(bufx), INT64_FORMAT, seqform->seqmax);
 		ereport(ERROR,
 				(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
-				 errmsg("MINVALUE (%s) must be less than MAXVALUE (%s)",
-						bufm, bufx)));
+				 errmsg("MINVALUE (%lld) must be less than MAXVALUE (%lld)",
+						(long long)seqform->seqmin, (long long)seqform->seqmax)));
 	}
 
 	/* START WITH */
@@ -1546,27 +1520,17 @@ init_params(ParseState *pstate, List *options, bool for_identity,
 	/* crosscheck START */
 	if (seqform->seqstart < seqform->seqmin)
 	{
-		char		bufs[100],
-					bufm[100];
-
-		snprintf(bufs, sizeof(bufs), INT64_FORMAT, seqform->seqstart);
-		snprintf(bufm, sizeof(bufm), INT64_FORMAT, seqform->seqmin);
 		ereport(ERROR,
 				(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
-				 errmsg("START value (%s) cannot be less than MINVALUE (%s)",
-						bufs, bufm)));
+				 errmsg("START value (%lld) cannot be less than MINVALUE (%lld)",
+						(long long)seqform->seqstart, (long long)seqform->seqmin)));
 	}
 	if (seqform->seqstart > seqform->seqmax)
 	{
-		char		bufs[100],
-					bufm[100];
-
-		snprintf(bufs, sizeof(bufs), INT64_FORMAT, seqform->seqstart);
-		snprintf(bufm, sizeof(bufm), INT64_FORMAT, seqform->seqmax);
 		ereport(ERROR,
 				(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
-				 errmsg("START value (%s) cannot be greater than MAXVALUE (%s)",
-						bufs, bufm)));
+				 errmsg("START value (%lld) cannot be greater than MAXVALUE (%lld)",
+						(long long)seqform->seqstart, (long long)seqform->seqmax)));
 	}
 
 	/* RESTART [WITH] */
@@ -1588,27 +1552,17 @@ init_params(ParseState *pstate, List *options, bool for_identity,
 	/* crosscheck RESTART (or current value, if changing MIN/MAX) */
 	if (seqdataform->last_value < seqform->seqmin)
 	{
-		char		bufs[100],
-					bufm[100];
-
-		snprintf(bufs, sizeof(bufs), INT64_FORMAT, seqdataform->last_value);
-		snprintf(bufm, sizeof(bufm), INT64_FORMAT, seqform->seqmin);
 		ereport(ERROR,
 				(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
-				 errmsg("RESTART value (%s) cannot be less than MINVALUE (%s)",
-						bufs, bufm)));
+				 errmsg("RESTART value (%lld) cannot be less than MINVALUE (%lld)",
+						(long long)seqdataform->last_value, (long long)seqform->seqmin)));
 	}
 	if (seqdataform->last_value > seqform->seqmax)
 	{
-		char		bufs[100],
-					bufm[100];
-
-		snprintf(bufs, sizeof(bufs), INT64_FORMAT, seqdataform->last_value);
-		snprintf(bufm, sizeof(bufm), INT64_FORMAT, seqform->seqmax);
 		ereport(ERROR,
 				(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
-				 errmsg("RESTART value (%s) cannot be greater than MAXVALUE (%s)",
-						bufs, bufm)));
+				 errmsg("RESTART value (%lld) cannot be greater than MAXVALUE (%lld)",
+						(long long)seqdataform->last_value, (long long)seqform->seqmax)));
 	}
 
 	/* CACHE */
@@ -1617,13 +1571,10 @@ init_params(ParseState *pstate, List *options, bool for_identity,
 		seqform->seqcache = defGetInt64(cache_value);
 		if (seqform->seqcache <= 0)
 		{
-			char		buf[100];
-
-			snprintf(buf, sizeof(buf), INT64_FORMAT, seqform->seqcache);
 			ereport(ERROR,
 					(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
-					 errmsg("CACHE (%s) must be greater than zero",
-							buf)));
+					 errmsg("CACHE (%lld) must be greater than zero",
+							(long long)seqform->seqcache)));
 		}
 		seqdataform->log_cnt = 0;
 	}
diff --git a/src/backend/utils/adt/xid8funcs.c b/src/backend/utils/adt/xid8funcs.c
index 60e57876de..e321a70138 100644
--- a/src/backend/utils/adt/xid8funcs.c
+++ b/src/backend/utils/adt/xid8funcs.c
@@ -113,9 +113,8 @@ TransactionIdInRecentPast(FullTransactionId fxid, TransactionId *extracted_xid)
 	if (!FullTransactionIdPrecedes(fxid, now_fullxid))
 		ereport(ERROR,
 				(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
-				 errmsg("transaction ID %s is in the future",
-						psprintf(UINT64_FORMAT,
-								 U64FromFullTransactionId(fxid)))));
+				 errmsg("transaction ID %llu is in the future",
+						(unsigned long long)U64FromFullTransactionId(fxid))));
 
 	/*
 	 * ShmemVariableCache->oldestClogXid is protected by XactTruncationLock,
diff --git a/src/bin/pg_checksums/pg_checksums.c b/src/bin/pg_checksums/pg_checksums.c
index 7e69475947..8509bd15e8 100644
--- a/src/bin/pg_checksums/pg_checksums.c
+++ b/src/bin/pg_checksums/pg_checksums.c
@@ -132,8 +132,6 @@ static void
 progress_report(bool finished)
 {
 	int			percent;
-	char		total_size_str[32];
-	char		current_size_str[32];
 	pg_time_t	now;
 
 	Assert(showprogress);
@@ -152,18 +150,9 @@ progress_report(bool finished)
 	/* Calculate current percentage of size done */
 	percent = total_size ? (int) ((current_size) * 100 / total_size) : 0;
 
-	/*
-	 * Separate step to keep platform-dependent format code out of
-	 * translatable strings.  And we only test for INT64_FORMAT availability
-	 * in snprintf, not fprintf.
-	 */
-	snprintf(total_size_str, sizeof(total_size_str), INT64_FORMAT,
-			 total_size / (1024 * 1024));
-	snprintf(current_size_str, sizeof(current_size_str), INT64_FORMAT,
-			 current_size / (1024 * 1024));
-
-	fprintf(stderr, _("%*s/%s MB (%d%%) computed"),
-			(int) strlen(current_size_str), current_size_str, total_size_str,
+	fprintf(stderr, _("%lld/%lld MB (%d%%) computed"),
+			(long long)(current_size / (1024 * 1024)),
+			(long long)(total_size / (1024 * 1024)),
 			percent);
 
 	/*
@@ -657,11 +646,11 @@ main(int argc, char *argv[])
 			progress_report(true);
 
 		printf(_("Checksum operation completed\n"));
-		printf(_("Files scanned:   %s\n"), psprintf(INT64_FORMAT, files_scanned));
-		printf(_("Blocks scanned:  %s\n"), psprintf(INT64_FORMAT, blocks_scanned));
+		printf(_("Files scanned:   %lld\n"), (long long)files_scanned);
+		printf(_("Blocks scanned:  %lld\n"), (long long)blocks_scanned);
 		if (mode == PG_MODE_CHECK)
 		{
-			printf(_("Bad checksums:  %s\n"), psprintf(INT64_FORMAT, badblocks));
+			printf(_("Bad checksums:  %lld\n"), (long long)badblocks);
 			printf(_("Data checksum version: %u\n"), ControlFile->data_checksum_version);
 
 			if (badblocks > 0)
@@ -669,8 +658,8 @@ main(int argc, char *argv[])
 		}
 		else if (mode == PG_MODE_ENABLE)
 		{
-			printf(_("Files written:  %s\n"), psprintf(INT64_FORMAT, files_written));
-			printf(_("Blocks written: %s\n"), psprintf(INT64_FORMAT, blocks_written));
+			printf(_("Files written:  %lld\n"), (long long)files_written);
+			printf(_("Blocks written: %lld\n"), (long long)blocks_written);
 		}
 	}
 
-- 
2.35.1

