Make pg_hba parsing report all errors in the file before aborting the load,
authorMagnus Hagander <magnus@hagander.net>
Sat, 7 Mar 2009 21:28:00 +0000 (21:28 +0000)
committerMagnus Hagander <magnus@hagander.net>
Sat, 7 Mar 2009 21:28:00 +0000 (21:28 +0000)
instead of just reporting the first one.

Selena Deckelmann

src/backend/libpq/hba.c

index 6923d060864674ec0370c87de6efd2f3d2845511..893da079b67ad71e851b26da93b3d9e285ec251e 100644 (file)
@@ -1304,6 +1304,7 @@ load_hba(void)
        List *hba_line_nums = NIL;
        ListCell   *line, *line_num;
        List *new_parsed_lines = NIL;
+       bool ok = true;
 
        file = AllocateFile(HbaFileName, "r");
        if (file == NULL)
@@ -1332,17 +1333,29 @@ load_hba(void)
 
                if (!parse_hba_line(lfirst(line), lfirst_int(line_num), newline))
                {
-                       /* Parse error in the file, so bail out */
+                       /* Parse error in the file, so indicate there's a problem */
                        free_hba_record(newline);
                        pfree(newline);
-                       clean_hba_list(new_parsed_lines);
-                       /* Error has already been reported in the parsing function */
-                       return false;
+
+                       /*
+                        * Keep parsing the rest of the file so we can report errors
+                        * on more than the first row. Error has already been reported
+                        * in the parsing function, so no need to log it here.
+                        */
+                       ok = false;
+                       continue;
                }
 
                new_parsed_lines = lappend(new_parsed_lines, newline);
        }
 
+       if (!ok)
+       {
+               /* Parsing failed at one or more rows, so bail out */
+               clean_hba_list(new_parsed_lines);
+               return false;
+       }
+
        /* Loaded new file successfully, replace the one we use */
        clean_hba_list(parsed_hba_lines);
        parsed_hba_lines = new_parsed_lines;