Avoid throwing away the error message in syncrep_yyerror.
authorRobert Haas <rhaas@postgresql.org>
Thu, 24 Jul 2025 17:30:43 +0000 (13:30 -0400)
committerRobert Haas <rhaas@postgresql.org>
Mon, 28 Jul 2025 14:35:05 +0000 (10:35 -0400)
Commit 473a575e05979b4dbb28b3f2544f4ec8f184ce65 purported to make this
function stash the error message in *syncrep_parse_result_p, but
it didn't actually.

As a result, an attempt to set synchronous_standby_names to any value
that does not parse resulted in a generic "parser failed." message
rather than anything more specific. This fixes that.

Discussion: http://postgr.es/m/CA+TgmoYF9wPNZ-Q_EMfib_espgHycY-eX__6Tzo2GpYpVXqCdQ@mail.gmail.com
Backpatch-through: 18

src/backend/replication/syncrep_scanner.l

index 7dec1f869c74542db727a7c1d623abc8d5c2e4b9..02004d621e73daac5b67c09f66fb992766831469 100644 (file)
@@ -157,17 +157,16 @@ syncrep_yyerror(SyncRepConfigData **syncrep_parse_result_p, char **syncrep_parse
 {
    struct yyguts_t *yyg = (struct yyguts_t *) yyscanner;   /* needed for yytext
                                                             * macro */
-   char *syncrep_parse_error_msg = *syncrep_parse_error_msg_p;
 
    /* report only the first error in a parse operation */
-   if (syncrep_parse_error_msg)
+   if (*syncrep_parse_error_msg_p)
        return;
    if (yytext[0])
-       syncrep_parse_error_msg = psprintf("%s at or near \"%s\"",
-                                          message, yytext);
+       *syncrep_parse_error_msg_p = psprintf("%s at or near \"%s\"",
+                                             message, yytext);
    else
-       syncrep_parse_error_msg = psprintf("%s at end of input",
-                                          message);
+       *syncrep_parse_error_msg_p = psprintf("%s at end of input",
+                                             message);
 }
 
 void