postgresql.conf: patch to have ParseConfigFile report all parsing errors, then bail - Mailing list pgsql-hackers

From Selena Deckelmann
Subject postgresql.conf: patch to have ParseConfigFile report all parsing errors, then bail
Date
Msg-id 49B45460.6040108@endpoint.com
Whole thread Raw
Responses Re: postgresql.conf: patch to have ParseConfigFile report all parsing errors, then bail  (Alvaro Herrera <alvherre@commandprompt.com>)
Re: postgresql.conf: patch to have ParseConfigFile report all parsing errors, then bail  (Simon Riggs <simon@2ndQuadrant.com>)
Re: postgresql.conf: patch to have ParseConfigFile report all parsing errors, then bail  (Tom Lane <tgl@sss.pgh.pa.us>)
List pgsql-hackers
ParseConfigFile currently exits on the first parsing error. Changed
guc_file.l to report all parsing errors before exiting:
* Moved parse_error: block inside while() loop
* Removed cleanup_exit: and associated 'goto'
* Added ereport if ParseConfigFile() returns false
* changed OK to ok ;)
* Added comment - TODO: Report bogus variables in addition to parsing
errors before bailing out

-selena

--
Selena Deckelmann
End Point Corporation
selena@endpoint.com
503-282-2512
*** a/src/backend/utils/misc/guc-file.l
--- b/src/backend/utils/misc/guc-file.l
***************
*** 143,149 **** ProcessConfigFile(GucContext context)
--- 143,155 ----
      if (!ParseConfigFile(ConfigFileName, NULL,
                           0, context, elevel,
                           &head, &tail))
+     {
+         ereport(elevel,
+                 (errcode(ERRCODE_CONFIG_FILE_ERROR),
+                  errmsg("Did not reload \"%s\" due to earlier parsing error(s)", ConfigFileName)));
+         /* TODO: Report bogus variables in addition to parsing errors before bailing out */
          goto cleanup_list;
+     }

      /*
       * We need the proposed new value of custom_variable_classes to check
***************
*** 361,367 **** ParseConfigFile(const char *config_file, const char *calling_file,
                  struct name_value_pair **head_p,
                  struct name_value_pair **tail_p)
  {
!     bool        OK = true;
      char        abs_path[MAXPGPATH];
      FILE       *fp;
      YY_BUFFER_STATE lex_buffer;
--- 367,373 ----
                  struct name_value_pair **head_p,
                  struct name_value_pair **tail_p)
  {
!     bool        ok = true;
      char        abs_path[MAXPGPATH];
      FILE       *fp;
      YY_BUFFER_STATE lex_buffer;
***************
*** 461,472 **** ParseConfigFile(const char *config_file, const char *calling_file,
              if (!ParseConfigFile(opt_value, config_file,
                                   depth + 1, context, elevel,
                                   head_p, tail_p))
!             {
!                 pfree(opt_name);
!                 pfree(opt_value);
!                 OK = false;
!                 goto cleanup_exit;
!             }
              yy_switch_to_buffer(lex_buffer);
              ConfigFileLineno = save_ConfigFileLineno;
              pfree(opt_name);
--- 467,474 ----
              if (!ParseConfigFile(opt_value, config_file,
                                   depth + 1, context, elevel,
                                   head_p, tail_p))
!                 ok = false;
!
              yy_switch_to_buffer(lex_buffer);
              ConfigFileLineno = save_ConfigFileLineno;
              pfree(opt_name);
***************
*** 525,552 **** ParseConfigFile(const char *config_file, const char *calling_file,
          /* 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);
      FreeFile(fp);
!     return OK;
  }


--- 527,555 ----
          /* 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)));
!             ok = false;
!     }

!     /* completion of parsing */
      yy_delete_buffer(lex_buffer);
      FreeFile(fp);
!
!     return ok;
  }



pgsql-hackers by date:

Previous
From: Robert Lor
Date:
Subject: Re: Additional DTrace Probes
Next
From: Tom Lane
Date:
Subject: Re: compiler failures on buildfarm member wombat