From 7beb1186f3b58b0f76dae05cfb08a4ce48694518 Mon Sep 17 00:00:00 2001
From: Matthias van de Meent <boekewurm+postgres@gmail.com>
Date: Mon, 19 Feb 2024 13:53:00 +0100
Subject: [PATCH v6 8/8] nodeToString: omit serializing 0s in enum-typed
 fields.

---
 src/backend/nodes/outfuncs.c  |  5 +----
 src/backend/nodes/readfuncs.c | 16 +++++++++++-----
 2 files changed, 12 insertions(+), 9 deletions(-)

diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c
index e64f3c5975..0269daf484 100644
--- a/src/backend/nodes/outfuncs.c
+++ b/src/backend/nodes/outfuncs.c
@@ -112,10 +112,7 @@ static void outDouble(StringInfo str, double d);
 							 (int) node->fldname); \
 	} while (0)
 #define WRITE_ENUM_FIELD(fldname, enumtype) \
-	do { \
-		appendStringInfo(str, " :" CppAsString(fldname) " %d", \
-						 (int) node->fldname); \
-	} while (0)
+	WRITE_ENUM_FIELD_DEFAULT(fldname, enumtype, 0)
 
 /* Write a float field (actually, they're double) */
 #define WRITE_FLOAT_FIELD_DEFAULT(fldname, default) \
diff --git a/src/backend/nodes/readfuncs.c b/src/backend/nodes/readfuncs.c
index 5e082a2c37..c401edc686 100644
--- a/src/backend/nodes/readfuncs.c
+++ b/src/backend/nodes/readfuncs.c
@@ -142,13 +142,19 @@
 	READ_CHAR_FIELD_DEFAULT(fldname, '\0')
 
 /* Read an enumerated-type field that was written as an integer code */
-#define READ_ENUM_FIELD(fldname, enumtype) \
+
+#define READ_ENUM_FIELD_DEFAULT(fldname, enumtype, default) \
 	do { \
-		token = pg_strtok_fieldname(":" CppAsString(fldname), &length); \
-		Assert(token != NULL); \
-		token = pg_strtok(&length);		/* get field value */ \
-		local_node->fldname = (enumtype) atoi(token); \
+		if ((token = pg_strtok_fieldname(":" CppAsString(fldname), &length))) \
+		{ \
+			token = pg_strtok(&length);		/* get field value */ \
+			local_node->fldname = (enumtype) atoi(token); \
+		} \
+		else \
+			local_node->fldname = (enumtype) default; \
 	} while (0)
+#define READ_ENUM_FIELD(fldname, enumtype) \
+	READ_ENUM_FIELD_DEFAULT(fldname, enumtype, 0)
 
 /* Read a float field */
 #define READ_FLOAT_FIELD_DEFAULT(fldname, default_value) \
-- 
2.40.1

