From dee403f637f279813f0711bbc64c365cba82c18c Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Mon, 11 Mar 2024 14:07:52 +0100 Subject: [PATCH] Add nodeToStringWithoutLocations() --- src/backend/nodes/outfuncs.c | 30 +++++++++++++++++++++++++++++- src/include/nodes/nodes.h | 1 + 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c index 29cbc83bd9..ea0a6cb94d 100644 --- a/src/backend/nodes/outfuncs.c +++ b/src/backend/nodes/outfuncs.c @@ -25,6 +25,8 @@ #include "nodes/pg_list.h" #include "utils/datum.h" +static bool write_location_fields = true; + static void outChar(StringInfo str, char c); static void outDouble(StringInfo str, double d); @@ -88,7 +90,7 @@ static void outDouble(StringInfo str, double d); /* Write a parse location field (actually same as INT case) */ #define WRITE_LOCATION_FIELD(fldname) \ - appendStringInfo(str, " :" CppAsString(fldname) " %d", node->fldname) + appendStringInfo(str, " :" CppAsString(fldname) " %d", write_location_fields ? node->fldname : -1) /* Write a Node field */ #define WRITE_NODE_FIELD(fldname) \ @@ -770,6 +772,32 @@ nodeToString(const void *obj) return str.data; } +/* + * nodeToStringWithoutLocations - + * returns the ascii representation of the Node as a palloc'd string + * + * This form prints location fields with their default value (not the actual + * field value). This is useful for serializing node trees for storing into + * catalogs, where the location information is not useful since the original + * query string is not preserved anyway. + */ +char * +nodeToStringWithoutLocations(const void *obj) +{ + StringInfoData str; + bool save_write_location_fields; + + save_write_location_fields = write_location_fields; + write_location_fields = false; + + initStringInfo(&str); + outNode(&str, obj); + + write_location_fields = save_write_location_fields; + + return str.data; +} + /* * bmsToString - * returns the ascii representation of the Bitmapset as a palloc'd string diff --git a/src/include/nodes/nodes.h b/src/include/nodes/nodes.h index 2969dd831b..3abe47af94 100644 --- a/src/include/nodes/nodes.h +++ b/src/include/nodes/nodes.h @@ -195,6 +195,7 @@ extern void outBitmapset(struct StringInfoData *str, extern void outDatum(struct StringInfoData *str, uintptr_t value, int typlen, bool typbyval); extern char *nodeToString(const void *obj); +extern char *nodeToStringWithoutLocations(const void *obj); extern char *bmsToString(const struct Bitmapset *bms); /* -- 2.44.0