*** a/src/backend/utils/misc/guc-file.l --- b/src/backend/utils/misc/guc-file.l *************** *** 104,110 **** STRING \'([^'\\\n]|\\.|\'\')*\' void ProcessConfigFile(GucContext context) { ! int elevel; ConfigVariable *item, *head, *tail; --- 104,111 ---- void ProcessConfigFile(GucContext context) { ! int elevel, ! errorcount; ConfigVariable *item, *head, *tail; *************** *** 127,132 **** ProcessConfigFile(GucContext context) --- 128,134 ---- /* Parse the file into a list of option names and values */ head = tail = NULL; + errorcount = 0; if (!ParseConfigFile(ConfigFileName, NULL, 0, elevel, &head, &tail)) goto cleanup_list; *************** *** 161,167 **** ProcessConfigFile(GucContext context) goto cleanup_list; if (!call_string_check_hook(cvc_struct, &cvc, &extra, PGC_S_FILE, elevel)) ! goto cleanup_list; if (extra) free(extra); } --- 163,169 ---- goto cleanup_list; if (!call_string_check_hook(cvc_struct, &cvc, &extra, PGC_S_FILE, elevel)) ! errorcount++; if (extra) free(extra); } *************** *** 201,207 **** ProcessConfigFile(GucContext context) (errcode(ERRCODE_UNDEFINED_OBJECT), errmsg("unrecognized configuration parameter \"%s\"", item->name))); ! goto cleanup_list; } /* * 2. There is no GUC entry. If we called set_config_option then --- 203,209 ---- (errcode(ERRCODE_UNDEFINED_OBJECT), errmsg("unrecognized configuration parameter \"%s\"", item->name))); ! errorcount++; } /* * 2. There is no GUC entry. If we called set_config_option then *************** *** 221,228 **** ProcessConfigFile(GucContext context) if (!set_config_option(item->name, item->value, context, PGC_S_FILE, GUC_ACTION_SET, false)) ! goto cleanup_list; ! } /* * Check for variables having been removed from the config file, and --- 223,237 ---- if (!set_config_option(item->name, item->value, context, PGC_S_FILE, GUC_ACTION_SET, false)) ! errorcount++; ! ! /* avoid excessive bloat of the log file */ ! if (IsUnderPostmaster || errorcount >= 100 ) ! break; ! } ! /* Don't change configuration options if errors were detected earlier */ ! if (errorcount > 0) ! goto cleanup_list; /* * Check for variables having been removed from the config file, and *************** *** 447,455 **** bool ParseConfigFp(FILE *fp, const char *config_file, int depth, int elevel, ConfigVariable **head_p, ConfigVariable **tail_p) { - bool OK = true; YY_BUFFER_STATE lex_buffer; ! int token; /* * Parse --- 456,464 ---- ParseConfigFp(FILE *fp, const char *config_file, int depth, int elevel, ConfigVariable **head_p, ConfigVariable **tail_p) { YY_BUFFER_STATE lex_buffer; ! int token, ! errorcount; /* * Parse *************** *** 458,463 **** ParseConfigFp(FILE *fp, const char *config_file, int depth, int elevel, --- 467,473 ---- yy_switch_to_buffer(lex_buffer); ConfigFileLineno = 1; + errorcount = 0; /* This loop iterates once per logical line */ while ((token = yylex())) *************** *** 515,522 **** ParseConfigFp(FILE *fp, const char *config_file, int depth, int elevel, { pfree(opt_name); pfree(opt_value); ! OK = false; ! goto cleanup_exit; } yy_switch_to_buffer(lex_buffer); ConfigFileLineno = save_ConfigFileLineno; --- 525,531 ---- { pfree(opt_name); pfree(opt_value); ! goto parse_error; } yy_switch_to_buffer(lex_buffer); ConfigFileLineno = save_ConfigFileLineno; *************** *** 576,602 **** ParseConfigFp(FILE *fp, const char *config_file, int depth, int elevel, /* break out of loop if read EOF, else loop for next line */ if (token == 0) break; } /* successful completion of parsing */ - goto cleanup_exit; - - parse_error: - if (token == GUC_EOL || token == 0) - ereport(elevel, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("syntax error in file \"%s\" line %u, near end of line", - config_file, ConfigFileLineno - 1))); - else - ereport(elevel, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("syntax error in file \"%s\" line %u, near token \"%s\"", - config_file, ConfigFileLineno, yytext))); - OK = false; - - cleanup_exit: yy_delete_buffer(lex_buffer); ! return OK; } --- 585,613 ---- /* break out of loop if read EOF, else loop for next line */ if (token == 0) break; + /* skip over parse_error if we made it this far without error */ + continue; + + parse_error: + if (token == GUC_EOL || token == 0) + ereport(elevel, + (errcode(ERRCODE_SYNTAX_ERROR), + errmsg("syntax error in file \"%s\" line %u, near end of line", + config_file, ConfigFileLineno - 1))); + else + ereport(elevel, + (errcode(ERRCODE_SYNTAX_ERROR), + errmsg("syntax error in file \"%s\" line %u, near token \"%s\"", + config_file, ConfigFileLineno, yytext))); + errorcount++; + /* avoid excessive bloat of the log file */ + if (IsUnderPostmaster || errorcount >= 100) + break; } /* successful completion of parsing */ yy_delete_buffer(lex_buffer); ! return (errorcount == 0); }