diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2011-10-04 17:00:17 -0400 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2011-10-04 17:01:32 -0400 |
commit | 5aa09d5df3422bd9795271ac707f857eb1e88ab7 (patch) | |
tree | f6fd8acd0fdc5035f5250a2ceaeb34ae96508e5d /src | |
parent | 50af47f12bb8218625b7095da1d5678a1da8e9c2 (diff) |
Add sourcefile/sourceline data to EXEC_BACKEND GUC transmission files.
This oversight meant that on Windows, the pg_settings view would not
display source file or line number information for values coming from
postgresql.conf, unless the backend had received a SIGHUP since starting.
In passing, also make the error detection in read_nondefault_variables a
tad more thorough, and fix it to not lose precision on float GUCs (these
changes are already in HEAD as of my previous commit).
Diffstat (limited to 'src')
-rw-r--r-- | src/backend/utils/misc/guc.c | 36 |
1 files changed, 27 insertions, 9 deletions
diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c index 87d2a7a11eb..0ceb89fd504 100644 --- a/src/backend/utils/misc/guc.c +++ b/src/backend/utils/misc/guc.c @@ -6743,6 +6743,8 @@ is_newvalue_equal(struct config_generic * record, const char *newvalue) * * variable name, string, null terminated * variable value, string, null terminated + * variable sourcefile, string, null terminated (empty if none) + * variable sourceline, integer * variable source, integer */ static void @@ -6779,8 +6781,7 @@ write_one_nondefault_variable(FILE *fp, struct config_generic * gconf) { struct config_real *conf = (struct config_real *) gconf; - /* Could lose precision here? */ - fprintf(fp, "%f", *conf->variable); + fprintf(fp, "%.17g", *conf->variable); } break; @@ -6804,7 +6805,12 @@ write_one_nondefault_variable(FILE *fp, struct config_generic * gconf) fputc(0, fp); - fwrite(&gconf->source, sizeof(gconf->source), 1, fp); + if (gconf->sourcefile) + fprintf(fp, "%s", gconf->sourcefile); + fputc(0, fp); + + fwrite(&gconf->sourceline, 1, sizeof(gconf->sourceline), fp); + fwrite(&gconf->source, 1, sizeof(gconf->source), fp); } void @@ -6907,8 +6913,10 @@ read_nondefault_variables(void) { FILE *fp; char *varname, - *varvalue; - int varsource; + *varvalue, + *varsourcefile; + int varsourceline; + GucSource varsource; /* * Open file @@ -6933,16 +6941,26 @@ read_nondefault_variables(void) break; if ((record = find_option(varname, true, FATAL)) == NULL) - elog(FATAL, "failed to locate variable %s in exec config params file", varname); + elog(FATAL, "failed to locate variable \"%s\" in exec config params file", varname); + if ((varvalue = read_string_with_null(fp)) == NULL) elog(FATAL, "invalid format of exec config params file"); - if (fread(&varsource, sizeof(varsource), 1, fp) == 0) + if ((varsourcefile = read_string_with_null(fp)) == NULL) elog(FATAL, "invalid format of exec config params file"); + if (fread(&varsourceline, 1, sizeof(varsourceline), fp) != sizeof(varsourceline)) + elog(FATAL, "invalid format of exec config params file"); + if (fread(&varsource, 1, sizeof(varsource), fp) != sizeof(varsource)) + elog(FATAL, "invalid format of exec config params file"); + + (void) set_config_option(varname, varvalue, + record->context, varsource, + GUC_ACTION_SET, true); + if (varsourcefile[0]) + set_config_sourcefile(varname, varsourcefile, varsourceline); - (void) set_config_option(varname, varvalue, record->context, - varsource, GUC_ACTION_SET, true); free(varname); free(varvalue); + free(varsourcefile); } FreeFile(fp); |