v1-0001-Improve-various-error-messages.patch

text/plain

Filename: v1-0001-Improve-various-error-messages.patch
Type: text/plain
Part: 0
Message: Re: Make some xlogreader messages more accurate

Patch

Format: format-patch
Series: patch v1-0001
Subject: Improve various error messages
File+
src/backend/access/transam/twophase.c 4 6
src/backend/access/transam/xlogreader.c 1 1
src/backend/access/transam/xlogrecovery.c 4 1
src/backend/postmaster/postmaster.c 6 2
src/backend/replication/logical/worker.c 1 1
src/backend/statistics/mcv.c 7 12
src/backend/utils/adt/network.c 4 2
src/backend/utils/adt/tsquery.c 1 1
src/backend/utils/adt/tsvector.c 1 1
src/backend/utils/adt/varbit.c 4 2
src/pl/plpython/expected/plpython_types.out 1 1
src/pl/plpython/plpy_typeio.c 1 1
src/test/modules/test_rbtree/test_rbtree.c 1 1
From 24876cad15d43fde310ad12a801aec09c35e18a5 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <peter@eisentraut.org>
Date: Thu, 2 Mar 2023 08:54:22 +0100
Subject: [PATCH v1] Improve various error messages

Update error messages "{invalid|incorrect|wrong} {length|size}" to be
more precise by using the appropriate adjective and adding more detail
if available.
---
 src/backend/access/transam/twophase.c       | 10 ++++------
 src/backend/access/transam/xlogreader.c     |  2 +-
 src/backend/access/transam/xlogrecovery.c   |  5 ++++-
 src/backend/postmaster/postmaster.c         |  8 ++++++--
 src/backend/replication/logical/worker.c    |  2 +-
 src/backend/statistics/mcv.c                | 19 +++++++------------
 src/backend/utils/adt/network.c             |  6 ++++--
 src/backend/utils/adt/tsquery.c             |  2 +-
 src/backend/utils/adt/tsvector.c            |  2 +-
 src/backend/utils/adt/varbit.c              |  6 ++++--
 src/pl/plpython/expected/plpython_types.out |  2 +-
 src/pl/plpython/plpy_typeio.c               |  2 +-
 src/test/modules/test_rbtree/test_rbtree.c  |  2 +-
 13 files changed, 36 insertions(+), 32 deletions(-)

diff --git a/src/backend/access/transam/twophase.c b/src/backend/access/transam/twophase.c
index 068e59bec0..e644a0c4d3 100644
--- a/src/backend/access/transam/twophase.c
+++ b/src/backend/access/transam/twophase.c
@@ -1319,10 +1319,8 @@ ReadTwoPhaseFile(TransactionId xid, bool missing_ok)
 		stat.st_size > MaxAllocSize)
 		ereport(ERROR,
 				(errcode(ERRCODE_DATA_CORRUPTED),
-				 errmsg_plural("incorrect size of file \"%s\": %lld byte",
-							   "incorrect size of file \"%s\": %lld bytes",
-							   (long long int) stat.st_size, path,
-							   (long long int) stat.st_size)));
+				 errmsg("size of file \"%s\" (%lld) out of valid range",
+						path, (long long int) stat.st_size)));
 
 	crc_offset = stat.st_size - sizeof(pg_crc32c);
 	if (crc_offset != MAXALIGN(crc_offset))
@@ -1367,8 +1365,8 @@ ReadTwoPhaseFile(TransactionId xid, bool missing_ok)
 	if (hdr->total_len != stat.st_size)
 		ereport(ERROR,
 				(errcode(ERRCODE_DATA_CORRUPTED),
-				 errmsg("invalid size stored in file \"%s\"",
-						path)));
+				 errmsg("incorrect size stored in file \"%s\"", path),
+				 errdetail("Expected %lld, got %u.", (long long int) stat.st_size, hdr->total_len)));
 
 	INIT_CRC32C(calc_crc);
 	COMP_CRC32C(calc_crc, buf, crc_offset);
diff --git a/src/backend/access/transam/xlogreader.c b/src/backend/access/transam/xlogreader.c
index aa6c929477..f431a84fbc 100644
--- a/src/backend/access/transam/xlogreader.c
+++ b/src/backend/access/transam/xlogreader.c
@@ -1942,7 +1942,7 @@ DecodeXLogRecord(XLogReaderState *state,
 
 shortdata_err:
 	report_invalid_record(state,
-						  "record with invalid length at %X/%X",
+						  "record with incorrect length at %X/%X",
 						  LSN_FORMAT_ARGS(state->ReadRecPtr));
 err:
 	*errormsg = state->errormsg_buf;
diff --git a/src/backend/access/transam/xlogrecovery.c b/src/backend/access/transam/xlogrecovery.c
index dbe9394762..7d5b8b9775 100644
--- a/src/backend/access/transam/xlogrecovery.c
+++ b/src/backend/access/transam/xlogrecovery.c
@@ -3984,7 +3984,10 @@ ReadCheckpointRecord(XLogPrefetcher *xlogprefetcher, XLogRecPtr RecPtr,
 	if (record->xl_tot_len != SizeOfXLogRecord + SizeOfXLogRecordDataHeaderShort + sizeof(CheckPoint))
 	{
 		ereport(LOG,
-				(errmsg("invalid length of checkpoint record")));
+				(errmsg("incorrect length of checkpoint record"),
+				 errdetail("Expected %zu, got %u.",
+						   SizeOfXLogRecord + SizeOfXLogRecordDataHeaderShort + sizeof(CheckPoint),
+						   record->xl_tot_len)));
 		return NULL;
 	}
 	return record;
diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c
index 2552327d90..1080a72c8d 100644
--- a/src/backend/postmaster/postmaster.c
+++ b/src/backend/postmaster/postmaster.c
@@ -1993,7 +1993,9 @@ ProcessStartupPacket(Port *port, bool ssl_done, bool gss_done)
 	{
 		ereport(COMMERROR,
 				(errcode(ERRCODE_PROTOCOL_VIOLATION),
-				 errmsg("invalid length of startup packet")));
+				 errmsg("invalid length of startup packet"),
+				 errdetail("Expected %d..%d, got %d.",
+						   (int32) sizeof(ProtocolVersion), MAX_STARTUP_PACKET_LENGTH, len)));
 		return STATUS_ERROR;
 	}
 
@@ -2026,7 +2028,9 @@ ProcessStartupPacket(Port *port, bool ssl_done, bool gss_done)
 		{
 			ereport(COMMERROR,
 					(errcode(ERRCODE_PROTOCOL_VIOLATION),
-					 errmsg("invalid length of startup packet")));
+					 errmsg("incorrect length of cancel request packet"),
+					 errdetail("Expected %zu, got %d.",
+							   sizeof(CancelRequestPacket), len)));
 			return STATUS_ERROR;
 		}
 		processCancelRequest(port, buf);
diff --git a/src/backend/replication/logical/worker.c b/src/backend/replication/logical/worker.c
index cfb2ab6248..62b3fb56f6 100644
--- a/src/backend/replication/logical/worker.c
+++ b/src/backend/replication/logical/worker.c
@@ -2090,7 +2090,7 @@ apply_spooled_messages(FileSet *stream_fileset, TransactionId xid,
 
 		/* do we have a correct length? */
 		if (len <= 0)
-			elog(ERROR, "incorrect length %d in streaming transaction's changes file \"%s\"",
+			elog(ERROR, "invalid length %d in streaming transaction's changes file \"%s\"",
 				 len, path);
 
 		/* make sure we have sufficiently large buffer */
diff --git a/src/backend/statistics/mcv.c b/src/backend/statistics/mcv.c
index 03b9f04bb5..5590f78c6d 100644
--- a/src/backend/statistics/mcv.c
+++ b/src/backend/statistics/mcv.c
@@ -1064,18 +1064,13 @@ statext_mcv_deserialize(bytea *data)
 		elog(ERROR, "invalid MCV type %u (expected %u)",
 			 mcvlist->type, STATS_MCV_TYPE_BASIC);
 
-	if (mcvlist->ndimensions == 0)
-		elog(ERROR, "invalid zero-length dimension array in MCVList");
-	else if ((mcvlist->ndimensions > STATS_MAX_DIMENSIONS) ||
-			 (mcvlist->ndimensions < 0))
-		elog(ERROR, "invalid length (%d) dimension array in MCVList",
-			 mcvlist->ndimensions);
-
-	if (mcvlist->nitems == 0)
-		elog(ERROR, "invalid zero-length item array in MCVList");
-	else if (mcvlist->nitems > STATS_MCVLIST_MAX_ITEMS)
-		elog(ERROR, "invalid length (%u) item array in MCVList",
-			 mcvlist->nitems);
+	if (mcvlist->ndimensions < 1 ||	mcvlist->ndimensions > STATS_MAX_DIMENSIONS)
+		elog(ERROR, "length of dimension array in MCVList (%d) out of valid range (%d..%d)",
+			 mcvlist->ndimensions, 1, STATS_MAX_DIMENSIONS);
+
+	if (mcvlist->nitems < 1 || mcvlist->nitems > STATS_MCVLIST_MAX_ITEMS)
+		elog(ERROR, "length of item array in MCVList (%u) out of valid range (%d..%d)",
+			 mcvlist->nitems, 1, STATS_MCVLIST_MAX_ITEMS);
 
 	nitems = mcvlist->nitems;
 	ndims = mcvlist->ndimensions;
diff --git a/src/backend/utils/adt/network.c b/src/backend/utils/adt/network.c
index 42a4d9d44e..361e6e19af 100644
--- a/src/backend/utils/adt/network.c
+++ b/src/backend/utils/adt/network.c
@@ -222,8 +222,10 @@ network_recv(StringInfo buf, bool is_cidr)
 		ereport(ERROR,
 				(errcode(ERRCODE_INVALID_BINARY_REPRESENTATION),
 		/* translator: %s is inet or cidr */
-				 errmsg("invalid length in external \"%s\" value",
-						is_cidr ? "cidr" : "inet")));
+				 errmsg("incorrect length in external \"%s\" value",
+						is_cidr ? "cidr" : "inet"),
+				 errdetail("Expected %d, got %d.",
+						   ip_addrsize(addr), nb)));
 
 	addrptr = (char *) ip_addr(addr);
 	for (i = 0; i < nb; i++)
diff --git a/src/backend/utils/adt/tsquery.c b/src/backend/utils/adt/tsquery.c
index 67ad876a27..a6fa770c95 100644
--- a/src/backend/utils/adt/tsquery.c
+++ b/src/backend/utils/adt/tsquery.c
@@ -1242,7 +1242,7 @@ tsqueryrecv(PG_FUNCTION_ARGS)
 
 	size = pq_getmsgint(buf, sizeof(uint32));
 	if (size > (MaxAllocSize / sizeof(QueryItem)))
-		elog(ERROR, "invalid size of tsquery");
+		elog(ERROR, "size of tsquery (%u) out of valid range", size);
 
 	/* Allocate space to temporarily hold operand strings */
 	operands = palloc(size * sizeof(char *));
diff --git a/src/backend/utils/adt/tsvector.c b/src/backend/utils/adt/tsvector.c
index 0e66f362c3..c0ce9282b9 100644
--- a/src/backend/utils/adt/tsvector.c
+++ b/src/backend/utils/adt/tsvector.c
@@ -462,7 +462,7 @@ tsvectorrecv(PG_FUNCTION_ARGS)
 
 	nentries = pq_getmsgint(buf, sizeof(int32));
 	if (nentries < 0 || nentries > (MaxAllocSize / sizeof(WordEntry)))
-		elog(ERROR, "invalid size of tsvector");
+		elog(ERROR, "size of tsvector (%d) out of valid range", nentries);
 
 	hdrlen = DATAHDRSIZE + sizeof(WordEntry) * nentries;
 
diff --git a/src/backend/utils/adt/varbit.c b/src/backend/utils/adt/varbit.c
index 3dbbd1207f..2da5d6ebea 100644
--- a/src/backend/utils/adt/varbit.c
+++ b/src/backend/utils/adt/varbit.c
@@ -344,7 +344,8 @@ bit_recv(PG_FUNCTION_ARGS)
 	if (bitlen < 0 || bitlen > VARBITMAXLEN)
 		ereport(ERROR,
 				(errcode(ERRCODE_INVALID_BINARY_REPRESENTATION),
-				 errmsg("invalid length in external bit string")));
+				 errmsg("length in external bit string (%d) out of valid range (%d..%d)",
+						bitlen, 0, VARBITMAXLEN)));
 
 	/*
 	 * Sometimes atttypmod is not supplied. If it is supplied we need to make
@@ -649,7 +650,8 @@ varbit_recv(PG_FUNCTION_ARGS)
 	if (bitlen < 0 || bitlen > VARBITMAXLEN)
 		ereport(ERROR,
 				(errcode(ERRCODE_INVALID_BINARY_REPRESENTATION),
-				 errmsg("invalid length in external bit string")));
+				 errmsg("length in external bit string (%d) out of valid range (%d..%d)",
+						bitlen, 0, VARBITMAXLEN)));
 
 	/*
 	 * Sometimes atttypmod is not supplied. If it is supplied we need to make
diff --git a/src/pl/plpython/expected/plpython_types.out b/src/pl/plpython/expected/plpython_types.out
index a470911c2e..fc451d86b4 100644
--- a/src/pl/plpython/expected/plpython_types.out
+++ b/src/pl/plpython/expected/plpython_types.out
@@ -691,7 +691,7 @@ CREATE FUNCTION test_type_conversion_mdarray_malformed() RETURNS int[] AS $$
 return [[1,2,3],[4,5]]
 $$ LANGUAGE plpython3u;
 SELECT * FROM test_type_conversion_mdarray_malformed();
-ERROR:  wrong length of inner sequence: has length 2, but 3 was expected
+ERROR:  incorrect length of inner sequence: has length 2, but 3 was expected
 DETAIL:  To construct a multidimensional array, the inner sequences must all have the same length.
 CONTEXT:  while creating return value
 PL/Python function "test_type_conversion_mdarray_malformed"
diff --git a/src/pl/plpython/plpy_typeio.c b/src/pl/plpython/plpy_typeio.c
index 7018c9d404..66850a00cb 100644
--- a/src/pl/plpython/plpy_typeio.c
+++ b/src/pl/plpython/plpy_typeio.c
@@ -1258,7 +1258,7 @@ PLySequence_ToArray_recurse(PLyObToDatum *elm, PyObject *list,
 	if (PySequence_Length(list) != dims[dim])
 		ereport(ERROR,
 				(errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR),
-				 errmsg("wrong length of inner sequence: has length %d, but %d was expected",
+				 errmsg("incorrect length of inner sequence: has length %d, but %d was expected",
 						(int) PySequence_Length(list), dims[dim]),
 				 (errdetail("To construct a multidimensional array, the inner sequences must all have the same length."))));
 
diff --git a/src/test/modules/test_rbtree/test_rbtree.c b/src/test/modules/test_rbtree/test_rbtree.c
index e4eb154378..99c288571a 100644
--- a/src/test/modules/test_rbtree/test_rbtree.c
+++ b/src/test/modules/test_rbtree/test_rbtree.c
@@ -505,7 +505,7 @@ test_rb_tree(PG_FUNCTION_ARGS)
 	int			size = PG_GETARG_INT32(0);
 
 	if (size <= 0 || size > MaxAllocSize / sizeof(int))
-		elog(ERROR, "invalid size for test_rb_tree: %d", size);
+		elog(ERROR, "size for test_rb_tree out of valid range: %d", size);
 	testleftright(size);
 	testrightleft(size);
 	testfind(size);
-- 
2.39.2