vs2015-parseNodeString-v1.patch

text/plain

Filename: vs2015-parseNodeString-v1.patch
Type: text/plain
Part: 0
Message: v16 fails to build w/ Visual Studio 2015

Patch

Format: unified
Series: patch v1
File+
src/backend/nodes/gen_node_support.pl 2 2
src/backend/nodes/readfuncs.c 2 10
Author:     Noah Misch <noah@leadboat.com>
Commit:     Noah Misch <noah@leadboat.com>

    Make parseNodeString() C idiom compatible with Visual Studio 2015.
    
    Between v15 and now, this function's "else if" chain grew from 252 lines
    to 592 lines, exceeding a compiler limit that manifests as "fatal error
    C1026: parser stack overflow, program too complex (compiling source file
    src/backend/nodes/readfuncs.c)".  Use "if (...)  return ...;" instead.
    
    Reviewed by FIXME.
    
    Discussion: https://postgr.es/m/FIXME

diff --git a/src/backend/nodes/gen_node_support.pl b/src/backend/nodes/gen_node_support.pl
index b89b491..72c7963 100644
--- a/src/backend/nodes/gen_node_support.pl
+++ b/src/backend/nodes/gen_node_support.pl
@@ -924,9 +924,9 @@ foreach my $n (@node_types)
 	  . "\t\t\t\t_out${n}(str, obj);\n"
 	  . "\t\t\t\tbreak;\n";
 
-	print $rfs "\telse if (MATCH(\"$N\", "
+	print $rfs "\tif (MATCH(\"$N\", "
 	  . length($N) . "))\n"
-	  . "\t\treturn_value = _read${n}();\n"
+	  . "\t\treturn (Node *) _read${n}();\n"
 	  unless $no_read;
 
 	next if elem $n, @custom_read_write;
diff --git a/src/backend/nodes/readfuncs.c b/src/backend/nodes/readfuncs.c
index 597e5b3..df72dc3 100644
--- a/src/backend/nodes/readfuncs.c
+++ b/src/backend/nodes/readfuncs.c
@@ -696,8 +696,6 @@ _readExtensibleNode(void)
 Node *
 parseNodeString(void)
 {
-	void	   *return_value;
-
 	READ_TEMP_LOCALS();
 
 	/* Guard against stack overflow due to overly complex expressions */
@@ -708,16 +706,10 @@ parseNodeString(void)
 #define MATCH(tokname, namelen) \
 	(length == namelen && memcmp(token, tokname, namelen) == 0)
 
-	if (false)
-		;
 #include "readfuncs.switch.c"
-	else
-	{
-		elog(ERROR, "badly formatted node string \"%.32s\"...", token);
-		return_value = NULL;	/* keep compiler quiet */
-	}
 
-	return (Node *) return_value;
+	elog(ERROR, "badly formatted node string \"%.32s\"...", token);
+	return NULL;				/* keep compiler quiet */
 }