Hi, Here's a patch to add source file and line numbers to GUC variables. Basically this makes pg_settings look like this:
alvherre=# select name, setting, sourcefile, sourceline from pg_settings where name like '%work%'; name | setting | sourcefile | sourceline ------------------------+---------+--------------------------------------------+------------ autovacuum_max_workers | 3 | | maintenance_work_mem | 32768 | /pgsql/install/00head/data/postgresql.conf | 119 work_mem | 2048 | /pgsql/install/00head/data/workmem.conf | 4 (3 lignes) This should make life easier for tools trying to find the config file each setting is from (and possibly edit it). It was initially authored by Magnus, but I had to hit it with the clue stick until it understood reset sources, i.e. to make it behave sanely when a session has a SET value and then a SIGHUP causes the backend to read a config file that has changed underneath it: -- initial value was 1MB alvherre=# select name, setting, sourcefile, sourceline from pg_settings where name = 'work_mem'; name | setting | sourcefile | sourceline ------------------------+---------+--------------------------------------------+------------ work_mem | 1024 | /pgsql/install/00head/data/workmem.conf | 1 (1 ligne) alvherre=# set work_mem to 200; SET alvherre=# select name, setting, sourcefile, sourceline from pg_settings where name = 'work_mem'; name | setting | sourcefile | sourceline ------------------------+---------+--------------------------------------------+------------ work_mem | 200 | | (1 ligne) -- SIGHUP happened here, file was changed to 2MB and the setting moved some lines below alvherre=# select name, setting, sourcefile, sourceline from pg_settings where name = 'work_mem'; name | setting | sourcefile | sourceline ------------------------+---------+--------------------------------------------+------------ work_mem | 200 | | (1 ligne) alvherre=# reset work_mem ; RESET alvherre=# select name, setting, sourcefile, sourceline from pg_settings where name = 'work_mem'; name | setting | sourcefile | sourceline ------------------------+---------+--------------------------------------------+------------ work_mem | 2048 | /pgsql/install/00head/data/workmem.conf | 4 (1 ligne) -- Alvaro Herrera http://www.CommandPrompt.com/ PostgreSQL Replication, Consulting, Custom Development, 24x7 support
Index: src/backend/utils/adt/ri_triggers.c =================================================================== RCS file: /home/alvherre/Code/cvs/pgsql/src/backend/utils/adt/ri_triggers.c,v retrieving revision 1.109 diff -c -p -r1.109 ri_triggers.c *** src/backend/utils/adt/ri_triggers.c 19 May 2008 04:14:24 -0000 1.109 --- src/backend/utils/adt/ri_triggers.c 18 Aug 2008 15:50:26 -0000 *************** RI_Initial_Check(Trigger *trigger, Relat *** 2738,2743 **** --- 2738,2744 ---- snprintf(workmembuf, sizeof(workmembuf), "%d", maintenance_work_mem); (void) set_config_option("work_mem", workmembuf, PGC_USERSET, PGC_S_SESSION, + NULL, 0, GUC_ACTION_LOCAL, true); if (SPI_connect() != SPI_OK_CONNECT) *************** RI_Initial_Check(Trigger *trigger, Relat *** 2827,2832 **** --- 2828,2834 ---- snprintf(workmembuf, sizeof(workmembuf), "%d", old_work_mem); (void) set_config_option("work_mem", workmembuf, PGC_USERSET, PGC_S_SESSION, + NULL, 0, GUC_ACTION_LOCAL, true); return true; Index: src/backend/utils/misc/guc-file.l =================================================================== RCS file: /home/alvherre/Code/cvs/pgsql/src/backend/utils/misc/guc-file.l,v retrieving revision 1.56 diff -c -p -r1.56 guc-file.l *** src/backend/utils/misc/guc-file.l 22 Aug 2008 00:20:40 -0000 1.56 --- src/backend/utils/misc/guc-file.l 25 Aug 2008 15:22:27 -0000 *************** struct name_value_pair *** 39,44 **** --- 39,46 ---- { char *name; char *value; + char *filename; + int sourceline; struct name_value_pair *next; }; *************** ProcessConfigFile(GucContext context) *** 232,238 **** } if (!set_config_option(item->name, item->value, context, ! PGC_S_FILE, GUC_ACTION_SET, false)) goto cleanup_list; } --- 234,240 ---- } if (!set_config_option(item->name, item->value, context, ! PGC_S_FILE, NULL, 0, GUC_ACTION_SET, false)) goto cleanup_list; } *************** ProcessConfigFile(GucContext context) *** 280,286 **** /* Now we can re-apply the wired-in default */ set_config_option(gconf->name, NULL, context, PGC_S_DEFAULT, ! GUC_ACTION_SET, true); } /* --- 282,288 ---- /* Now we can re-apply the wired-in default */ set_config_option(gconf->name, NULL, context, PGC_S_DEFAULT, ! NULL, 0, GUC_ACTION_SET, true); } /* *************** ProcessConfigFile(GucContext context) *** 296,314 **** envvar = getenv("PGDATESTYLE"); if (envvar != NULL) set_config_option("datestyle", envvar, PGC_POSTMASTER, ! PGC_S_ENV_VAR, GUC_ACTION_SET, true); envvar = getenv("PGCLIENTENCODING"); if (envvar != NULL) set_config_option("client_encoding", envvar, PGC_POSTMASTER, ! PGC_S_ENV_VAR, GUC_ACTION_SET, true); /* If we got here all the options checked out okay, so apply them. */ for (item = head; item; item = item->next) { set_config_option(item->name, item->value, context, ! PGC_S_FILE, GUC_ACTION_SET, true); } /* Remember when we last successfully loaded the config file. */ --- 298,317 ---- envvar = getenv("PGDATESTYLE"); if (envvar != NULL) set_config_option("datestyle", envvar, PGC_POSTMASTER, ! PGC_S_ENV_VAR, NULL, 0, GUC_ACTION_SET, true); envvar = getenv("PGCLIENTENCODING"); if (envvar != NULL) set_config_option("client_encoding", envvar, PGC_POSTMASTER, ! PGC_S_ENV_VAR, NULL, 0, GUC_ACTION_SET, true); /* If we got here all the options checked out okay, so apply them. */ for (item = head; item; item = item->next) { set_config_option(item->name, item->value, context, ! PGC_S_FILE, item->filename, item->sourceline, ! GUC_ACTION_SET, true); } /* Remember when we last successfully loaded the config file. */ *************** ParseConfigFile(const char *config_file, *** 483,488 **** --- 486,493 ---- pfree(item->value); item->name = opt_name; item->value = opt_value; + item->filename = pstrdup(config_file); + item->sourceline = ConfigFileLineno-1; } else { *************** ParseConfigFile(const char *config_file, *** 490,495 **** --- 495,502 ---- item = palloc(sizeof *item); item->name = opt_name; item->value = opt_value; + item->filename = pstrdup(config_file); + item->sourceline = ConfigFileLineno-1; item->next = *head_p; *head_p = item; if (*tail_p == NULL) *************** ParseConfigFile(const char *config_file, *** 502,507 **** --- 509,516 ---- item = palloc(sizeof *item); item->name = opt_name; item->value = opt_value; + item->filename = pstrdup(config_file); + item->sourceline = ConfigFileLineno-1; item->next = NULL; if (*head_p == NULL) *head_p = item; *************** free_name_value_list(struct name_value_p *** 553,558 **** --- 562,568 ---- pfree(item->name); pfree(item->value); + pfree(item->filename); pfree(item); item = next; } Index: src/backend/utils/misc/guc.c =================================================================== RCS file: /home/alvherre/Code/cvs/pgsql/src/backend/utils/misc/guc.c,v retrieving revision 1.469 diff -c -p -r1.469 guc.c *** src/backend/utils/misc/guc.c 22 Aug 2008 18:47:07 -0000 1.469 --- src/backend/utils/misc/guc.c 28 Aug 2008 17:08:30 -0000 *************** InitializeGUCOptions(void) *** 3200,3205 **** --- 3200,3209 ---- gconf->reset_source = PGC_S_DEFAULT; gconf->source = PGC_S_DEFAULT; gconf->stack = NULL; + gconf->sourcefile = NULL; + gconf->sourceline = 0; + gconf->reset_sourcefile = NULL; + gconf->reset_sourceline = 0; switch (gconf->vartype) { *************** ResetAllOptions(void) *** 3541,3547 **** PGC_S_SESSION)) elog(ERROR, "failed to reset %s", conf->gen.name); *conf->variable = conf->reset_val; - conf->gen.source = conf->gen.reset_source; break; } case PGC_INT: --- 3545,3550 ---- *************** ResetAllOptions(void) *** 3553,3559 **** PGC_S_SESSION)) elog(ERROR, "failed to reset %s", conf->gen.name); *conf->variable = conf->reset_val; - conf->gen.source = conf->gen.reset_source; break; } case PGC_REAL: --- 3556,3561 ---- *************** ResetAllOptions(void) *** 3565,3571 **** PGC_S_SESSION)) elog(ERROR, "failed to reset %s", conf->gen.name); *conf->variable = conf->reset_val; - conf->gen.source = conf->gen.reset_source; break; } case PGC_STRING: --- 3567,3572 ---- *************** ResetAllOptions(void) *** 3594,3600 **** } set_string_field(conf, conf->variable, str); - conf->gen.source = conf->gen.reset_source; break; } case PGC_ENUM: --- 3595,3600 ---- *************** ResetAllOptions(void) *** 3606,3616 **** PGC_S_SESSION)) elog(ERROR, "failed to reset %s", conf->gen.name); *conf->variable = conf->reset_val; - conf->gen.source = conf->gen.reset_source; break; } } if (gconf->flags & GUC_REPORT) ReportGUCOption(gconf); } --- 3606,3621 ---- PGC_S_SESSION)) elog(ERROR, "failed to reset %s", conf->gen.name); *conf->variable = conf->reset_val; break; } } + gconf->source = gconf->reset_source; + if (gconf->sourcefile) + free(gconf->sourcefile); + gconf->sourcefile = gconf->reset_sourcefile; + gconf->sourceline = gconf->reset_sourceline; + if (gconf->flags & GUC_REPORT) ReportGUCOption(gconf); } *************** call_string_assign_hook(GucStringAssignH *** 4499,4504 **** --- 4504,4534 ---- return result; } + /* + * Set the fields for source file and line number the setting came from. + * If the setting came from something that's not a file, clear the fields. + */ + static void + set_config_sourcefile(struct config_generic *conf, const char *sourcefile, + int sourceline) + { + if (conf->source != PGC_S_FILE) + { + if (conf->sourcefile) + free(conf->sourcefile); + conf->sourcefile = NULL; + conf->sourceline = 0; + } + else + { + /* NULL sourcefile means don't touch what's in the field */ + if (sourcefile == NULL) + return; + + conf->sourcefile = guc_strdup(ERROR, sourcefile); + conf->sourceline = sourceline; + } + } /* * Sets option `name' to given value. The value should be a string *************** call_string_assign_hook(GucStringAssignH *** 4530,4535 **** --- 4560,4566 ---- bool set_config_option(const char *name, const char *value, GucContext context, GucSource source, + const char *sourcefile, int sourceline, GucAction action, bool changeVal) { struct config_generic *record; *************** set_config_option(const char *name, cons *** 4722,4727 **** --- 4753,4760 ---- { newval = conf->reset_val; source = conf->gen.reset_source; + sourcefile = conf->gen.reset_sourcefile; + sourceline = conf->gen.reset_sourceline; } /* Save old value to support transaction abort */ *************** set_config_option(const char *name, cons *** 4742,4747 **** --- 4775,4781 ---- { *conf->variable = newval; conf->gen.source = source; + set_config_sourcefile(&conf->gen, sourcefile, sourceline); } if (makeDefault) { *************** set_config_option(const char *name, cons *** 4751,4756 **** --- 4785,4792 ---- { conf->reset_val = newval; conf->gen.reset_source = source; + conf->gen.reset_sourcefile = sourcefile ? guc_strdup(elevel, sourcefile) : NULL; + conf->gen.reset_sourceline = sourceline; } for (stack = conf->gen.stack; stack; stack = stack->prev) { *************** set_config_option(const char *name, cons *** 4797,4802 **** --- 4833,4840 ---- { newval = conf->reset_val; source = conf->gen.reset_source; + sourcefile = conf->gen.reset_sourcefile; + sourceline = conf->gen.reset_sourceline; } /* Save old value to support transaction abort */ *************** set_config_option(const char *name, cons *** 4817,4822 **** --- 4855,4861 ---- { *conf->variable = newval; conf->gen.source = source; + set_config_sourcefile(&conf->gen, sourcefile, sourceline); } if (makeDefault) { *************** set_config_option(const char *name, cons *** 4826,4831 **** --- 4865,4872 ---- { conf->reset_val = newval; conf->gen.reset_source = source; + conf->gen.reset_sourcefile = sourcefile ? guc_strdup(elevel, sourcefile) : NULL; + conf->gen.reset_sourceline = sourceline; } for (stack = conf->gen.stack; stack; stack = stack->prev) { *************** set_config_option(const char *name, cons *** 4869,4874 **** --- 4910,4917 ---- { newval = conf->reset_val; source = conf->gen.reset_source; + sourcefile = conf->gen.reset_sourcefile; + sourceline = conf->gen.reset_sourceline; } /* Save old value to support transaction abort */ *************** set_config_option(const char *name, cons *** 4889,4894 **** --- 4932,4938 ---- { *conf->variable = newval; conf->gen.source = source; + set_config_sourcefile(&conf->gen, sourcefile, sourceline); } if (makeDefault) { *************** set_config_option(const char *name, cons *** 4898,4903 **** --- 4942,4949 ---- { conf->reset_val = newval; conf->gen.reset_source = source; + conf->gen.reset_sourcefile = sourcefile ? guc_strdup(elevel, sourcefile) : NULL; + conf->gen.reset_sourceline = sourceline; } for (stack = conf->gen.stack; stack; stack = stack->prev) { *************** set_config_option(const char *name, cons *** 4956,4961 **** --- 5002,5009 ---- return false; } source = conf->gen.reset_source; + sourcefile = conf->gen.reset_sourcefile; + sourceline = conf->gen.reset_sourceline; } /* Save old value to support transaction abort */ *************** set_config_option(const char *name, cons *** 5003,5008 **** --- 5051,5057 ---- { set_string_field(conf, conf->variable, newval); conf->gen.source = source; + set_config_sourcefile(&conf->gen, sourcefile, sourceline); } if (makeDefault) { *************** set_config_option(const char *name, cons *** 5012,5017 **** --- 5061,5068 ---- { set_string_field(conf, &conf->reset_val, newval); conf->gen.reset_source = source; + conf->gen.reset_sourcefile = sourcefile ? guc_strdup(elevel, sourcefile) : NULL; + conf->gen.reset_sourceline = sourceline; } for (stack = conf->gen.stack; stack; stack = stack->prev) { *************** set_config_option(const char *name, cons *** 5056,5061 **** --- 5107,5114 ---- { newval = conf->reset_val; source = conf->gen.reset_source; + sourcefile = conf->gen.reset_sourcefile; + sourceline = conf->gen.reset_sourceline; } /* Save old value to support transaction abort */ *************** set_config_option(const char *name, cons *** 5077,5082 **** --- 5130,5136 ---- { *conf->variable = newval; conf->gen.source = source; + set_config_sourcefile(&conf->gen, sourcefile, sourceline); } if (makeDefault) { *************** set_config_option(const char *name, cons *** 5086,5091 **** --- 5140,5147 ---- { conf->reset_val = newval; conf->gen.reset_source = source; + conf->gen.reset_sourcefile = sourcefile ? guc_strdup(elevel, sourcefile) : NULL; + conf->gen.reset_sourceline = sourceline; } for (stack = conf->gen.stack; stack; stack = stack->prev) { *************** set_config_option(const char *name, cons *** 5111,5127 **** * Set a config option to the given value. See also set_config_option, * this is just the wrapper to be called from outside GUC. NB: this * is used only for non-transactional operations. */ void SetConfigOption(const char *name, const char *value, GucContext context, GucSource source) { ! (void) set_config_option(name, value, context, source, GUC_ACTION_SET, true); } - /* * Fetch the current value of the option `name'. If the option doesn't exist, * throw an ereport and don't return. --- 5167,5185 ---- * Set a config option to the given value. See also set_config_option, * this is just the wrapper to be called from outside GUC. NB: this * is used only for non-transactional operations. + * + * Note: there is no support here for setting source file/line, as it + * is currently not needed. */ void SetConfigOption(const char *name, const char *value, GucContext context, GucSource source) { ! (void) set_config_option(name, value, context, source, NULL, 0, GUC_ACTION_SET, true); } /* * Fetch the current value of the option `name'. If the option doesn't exist, * throw an ereport and don't return. *************** ExecSetVariableStmt(VariableSetStmt *stm *** 5424,5429 **** --- 5482,5488 ---- ExtractSetVariableArgs(stmt), (superuser() ? PGC_SUSET : PGC_USERSET), PGC_S_SESSION, + NULL, 0, action, true); break; *************** ExecSetVariableStmt(VariableSetStmt *stm *** 5481,5486 **** --- 5540,5546 ---- NULL, (superuser() ? PGC_SUSET : PGC_USERSET), PGC_S_SESSION, + NULL, 0, action, true); break; *************** SetPGVariable(const char *name, List *ar *** 5526,5531 **** --- 5586,5592 ---- argstring, (superuser() ? PGC_SUSET : PGC_USERSET), PGC_S_SESSION, + NULL, 0, is_local ? GUC_ACTION_LOCAL : GUC_ACTION_SET, true); } *************** set_config_by_name(PG_FUNCTION_ARGS) *** 5569,5574 **** --- 5630,5636 ---- value, (superuser() ? PGC_SUSET : PGC_USERSET), PGC_S_SESSION, + NULL, 0, is_local ? GUC_ACTION_LOCAL : GUC_ACTION_SET, true); *************** define_custom_variable(struct config_gen *** 5661,5666 **** --- 5723,5729 ---- if (value) set_config_option(name, value, pHolder->gen.context, pHolder->gen.source, + NULL, 0, GUC_ACTION_SET, true); /* *************** GetConfigOptionByNum(int varnum, const c *** 6144,6149 **** --- 6207,6225 ---- } break; } + + /* If the setting came from a config file, set the source location */ + if (conf->source == PGC_S_FILE) + { + values[12] = conf->sourcefile; + snprintf(buffer, sizeof(buffer), "%d", conf->sourceline); + values[13] = pstrdup(buffer); + } + else + { + values[12] = NULL; + values[13] = NULL; + } } /* *************** show_config_by_name(PG_FUNCTION_ARGS) *** 6179,6185 **** * show_all_settings - equiv to SHOW ALL command but implemented as * a Table Function. */ ! #define NUM_PG_SETTINGS_ATTS 12 Datum show_all_settings(PG_FUNCTION_ARGS) --- 6255,6261 ---- * show_all_settings - equiv to SHOW ALL command but implemented as * a Table Function. */ ! #define NUM_PG_SETTINGS_ATTS 14 Datum show_all_settings(PG_FUNCTION_ARGS) *************** show_all_settings(PG_FUNCTION_ARGS) *** 6231,6236 **** --- 6307,6316 ---- TEXTOID, -1, 0); TupleDescInitEntry(tupdesc, (AttrNumber) 12, "enumvals", TEXTOID, -1, 0); + TupleDescInitEntry(tupdesc, (AttrNumber) 13, "sourcefile", + TEXTOID, -1, 0); + TupleDescInitEntry(tupdesc, (AttrNumber) 14, "sourceline", + INT4OID, -1, 0); /* * Generate attribute metadata needed later to produce tuples from raw *************** read_nondefault_variables(void) *** 6702,6708 **** elog(FATAL, "invalid format of exec config params file"); (void) set_config_option(varname, varvalue, record->context, ! varsource, GUC_ACTION_SET, true); free(varname); free(varvalue); } --- 6782,6788 ---- elog(FATAL, "invalid format of exec config params file"); (void) set_config_option(varname, varvalue, record->context, ! varsource, NULL, 0, GUC_ACTION_SET, true); free(varname); free(varvalue); } *************** ProcessGUCArray(ArrayType *array, *** 6799,6805 **** continue; } ! (void) set_config_option(name, value, context, source, action, true); free(name); if (value) --- 6879,6885 ---- continue; } ! (void) set_config_option(name, value, context, source, NULL, 0, action, true); free(name); if (value) *************** GUCArrayAdd(ArrayType *array, const char *** 6826,6832 **** /* test if the option is valid */ set_config_option(name, value, superuser() ? PGC_SUSET : PGC_USERSET, ! PGC_S_TEST, GUC_ACTION_SET, false); /* convert name to canonical spelling, so we can use plain strcmp */ (void) GetConfigOptionByName(name, &varname); --- 6906,6912 ---- /* test if the option is valid */ set_config_option(name, value, superuser() ? PGC_SUSET : PGC_USERSET, ! PGC_S_TEST, NULL, 0, GUC_ACTION_SET, false); /* convert name to canonical spelling, so we can use plain strcmp */ (void) GetConfigOptionByName(name, &varname); *************** GUCArrayDelete(ArrayType *array, const c *** 6904,6910 **** /* test if the option is valid */ set_config_option(name, NULL, superuser() ? PGC_SUSET : PGC_USERSET, ! PGC_S_TEST, GUC_ACTION_SET, false); /* convert name to canonical spelling, so we can use plain strcmp */ (void) GetConfigOptionByName(name, &varname); --- 6984,6990 ---- /* test if the option is valid */ set_config_option(name, NULL, superuser() ? PGC_SUSET : PGC_USERSET, ! PGC_S_TEST, NULL, 0, GUC_ACTION_SET, false); /* convert name to canonical spelling, so we can use plain strcmp */ (void) GetConfigOptionByName(name, &varname); Index: src/include/catalog/pg_proc.h =================================================================== RCS file: /home/alvherre/Code/cvs/pgsql/src/include/catalog/pg_proc.h,v retrieving revision 1.512 diff -c -p -r1.512 pg_proc.h *** src/include/catalog/pg_proc.h 25 Aug 2008 11:18:43 -0000 1.512 --- src/include/catalog/pg_proc.h 25 Aug 2008 23:35:59 -0000 *************** DATA(insert OID = 2077 ( current_settin *** 3157,3163 **** DESCR("SHOW X as a function"); DATA(insert OID = 2078 ( set_config PGNSP PGUID 12 1 0 0 f f f f v 3 25 "25 25 16" _null_ _null_ _null_ set_config_by_name _null_ _null_ _null_ )); DESCR("SET X as a function"); ! DATA(insert OID = 2084 ( pg_show_all_settings PGNSP PGUID 12 1 1000 0 f f t t s 0 2249 "" "{25,25,25,25,25,25,25,25,25,25,25,25}" "{o,o,o,o,o,o,o,o,o,o,o,o}" "{name,setting,unit,category,short_desc,extra_desc,context,vartype,source,min_val,max_val,enumvals}" show_all_settings _null_ _null_ _null_ )); DESCR("SHOW ALL as a function"); DATA(insert OID = 1371 ( pg_lock_status PGNSP PGUID 12 1 1000 0 f f t t v 0 2249 "" "{25,26,26,23,21,25,28,26,26,21,25,23,25,16}" "{o,o,o,o,o,o,o,o,o,o,o,o,o,o}" "{locktype,database,relation,page,tuple,virtualxid,transactionid,classid,objid,objsubid,virtualtransaction,pid,mode,granted}" pg_lock_status _null_ _null_ _null_ )); DESCR("view system lock information"); --- 3157,3163 ---- DESCR("SHOW X as a function"); DATA(insert OID = 2078 ( set_config PGNSP PGUID 12 1 0 0 f f f f v 3 25 "25 25 16" _null_ _null_ _null_ set_config_by_name _null_ _null_ _null_ )); DESCR("SET X as a function"); ! DATA(insert OID = 2084 ( pg_show_all_settings PGNSP PGUID 12 1 1000 0 f f t t s 0 2249 "" "{25,25,25,25,25,25,25,25,25,25,25,25,25,23}" "{o,o,o,o,o,o,o,o,o,o,o,o,o,o}" "{name,setting,unit,category,short_desc,extra_desc,context,vartype,source,min_val,max_val,enumvals,sourcefile,sourceline}" show_all_settings _null_ _null_ _null_ )); DESCR("SHOW ALL as a function"); DATA(insert OID = 1371 ( pg_lock_status PGNSP PGUID 12 1 1000 0 f f t t v 0 2249 "" "{25,26,26,23,21,25,28,26,26,21,25,23,25,16}" "{o,o,o,o,o,o,o,o,o,o,o,o,o,o}" "{locktype,database,relation,page,tuple,virtualxid,transactionid,classid,objid,objsubid,virtualtransaction,pid,mode,granted}" pg_lock_status _null_ _null_ _null_ )); DESCR("view system lock information"); Index: src/include/utils/guc.h =================================================================== RCS file: /home/alvherre/Code/cvs/pgsql/src/include/utils/guc.h,v retrieving revision 1.98 diff -c -p -r1.98 guc.h *** src/include/utils/guc.h 23 Jul 2008 17:29:53 -0000 1.98 --- src/include/utils/guc.h 18 Aug 2008 15:50:26 -0000 *************** extern bool parse_int(const char *value, *** 229,234 **** --- 229,235 ---- extern bool parse_real(const char *value, double *result); extern bool set_config_option(const char *name, const char *value, GucContext context, GucSource source, + const char *sourcefile, int sourceline, GucAction action, bool changeVal); extern char *GetConfigOptionByName(const char *name, const char **varname); extern void GetConfigOptionByNum(int varnum, const char **values, bool *noshow); Index: src/include/utils/guc_tables.h =================================================================== RCS file: /home/alvherre/Code/cvs/pgsql/src/include/utils/guc_tables.h,v retrieving revision 1.41 diff -c -p -r1.41 guc_tables.h *** src/include/utils/guc_tables.h 17 Mar 2008 17:45:09 -0000 1.41 --- src/include/utils/guc_tables.h 28 Aug 2008 16:59:18 -0000 *************** struct config_generic *** 126,131 **** --- 126,135 ---- GucSource reset_source; /* source of the reset_value */ GucSource source; /* source of the current actual value */ GucStack *stack; /* stacked prior values */ + char *sourcefile; /* file this settings is from (NULL if not file) */ + int sourceline; /* line in source file */ + char *reset_sourcefile; /* file that the reset_val is from */ + int reset_sourceline; /* line in source file for reset_val */ }; /* bit values in flags field */ Index: src/test/regress/expected/rules.out =================================================================== RCS file: /home/alvherre/Code/cvs/pgsql/src/test/regress/expected/rules.out,v retrieving revision 1.141 diff -c -p -r1.141 rules.out *** src/test/regress/expected/rules.out 25 Aug 2008 11:18:43 -0000 1.141 --- src/test/regress/expected/rules.out 25 Aug 2008 15:25:41 -0000 *************** SELECT viewname, definition FROM pg_view *** 1287,1293 **** pg_prepared_xacts | SELECT p.transaction, p.gid, p.prepared, u.rolname AS owner, d.datname AS database FROM ((pg_prepared_xact() p(transaction, gid, prepared, ownerid, dbid) LEFT JOIN pg_authid u ON ((p.ownerid = u.oid))) LEFT JOIN pg_database d ON ((p.dbid = d.oid))); pg_roles | SELECT pg_authid.rolname, pg_authid.rolsuper, pg_authid.rolinherit, pg_authid.rolcreaterole, pg_authid.rolcreatedb, pg_authid.rolcatupdate, pg_authid.rolcanlogin, pg_authid.rolconnlimit, '********'::text AS rolpassword, pg_authid.rolvaliduntil, pg_authid.rolconfig, pg_authid.oid FROM pg_authid; pg_rules | SELECT n.nspname AS schemaname, c.relname AS tablename, r.rulename, pg_get_ruledef(r.oid) AS definition FROM ((pg_rewrite r JOIN pg_class c ON ((c.oid = r.ev_class))) LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace))) WHERE (r.rulename <> '_RETURN'::name); ! pg_settings | SELECT a.name, a.setting, a.unit, a.category, a.short_desc, a.extra_desc, a.context, a.vartype, a.source, a.min_val, a.max_val, a.enumvals FROM pg_show_all_settings() a(name, setting, unit, category, short_desc, extra_desc, context, vartype, source, min_val, max_val, enumvals); pg_shadow | SELECT pg_authid.rolname AS usename, pg_authid.oid AS usesysid, pg_authid.rolcreatedb AS usecreatedb, pg_authid.rolsuper AS usesuper, pg_authid.rolcatupdate AS usecatupd, pg_authid.rolpassword AS passwd, (pg_authid.rolvaliduntil)::abstime AS valuntil, pg_authid.rolconfig AS useconfig FROM pg_authid WHERE pg_authid.rolcanlogin; pg_stat_activity | SELECT s.datid, d.datname, s.procpid, s.usesysid, u.rolname AS usename, s.current_query, s.waiting, s.xact_start, s.query_start, s.backend_start, s.client_addr, s.client_port FROM pg_database d, pg_stat_get_activity(NULL::integer) s(datid, procpid, usesysid, current_query, waiting, xact_start, query_start, backend_start, client_addr, client_port), pg_authid u WHERE ((s.datid = d.oid) AND (s.usesysid = u.oid)); pg_stat_all_indexes | SELECT c.oid AS relid, i.oid AS indexrelid, n.nspname AS schemaname, c.relname, i.relname AS indexrelname, pg_stat_get_numscans(i.oid) AS idx_scan, pg_stat_get_tuples_returned(i.oid) AS idx_tup_read, pg_stat_get_tuples_fetched(i.oid) AS idx_tup_fetch FROM (((pg_class c JOIN pg_index x ON ((c.oid = x.indrelid))) JOIN pg_class i ON ((i.oid = x.indexrelid))) LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace))) WHERE (c.relkind = ANY (ARRAY['r'::"char", 't'::"char"])); --- 1287,1293 ---- pg_prepared_xacts | SELECT p.transaction, p.gid, p.prepared, u.rolname AS owner, d.datname AS database FROM ((pg_prepared_xact() p(transaction, gid, prepared, ownerid, dbid) LEFT JOIN pg_authid u ON ((p.ownerid = u.oid))) LEFT JOIN pg_database d ON ((p.dbid = d.oid))); pg_roles | SELECT pg_authid.rolname, pg_authid.rolsuper, pg_authid.rolinherit, pg_authid.rolcreaterole, pg_authid.rolcreatedb, pg_authid.rolcatupdate, pg_authid.rolcanlogin, pg_authid.rolconnlimit, '********'::text AS rolpassword, pg_authid.rolvaliduntil, pg_authid.rolconfig, pg_authid.oid FROM pg_authid; pg_rules | SELECT n.nspname AS schemaname, c.relname AS tablename, r.rulename, pg_get_ruledef(r.oid) AS definition FROM ((pg_rewrite r JOIN pg_class c ON ((c.oid = r.ev_class))) LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace))) WHERE (r.rulename <> '_RETURN'::name); ! pg_settings | SELECT a.name, a.setting, a.unit, a.category, a.short_desc, a.extra_desc, a.context, a.vartype, a.source, a.min_val, a.max_val, a.enumvals, a.sourcefile, a.sourceline FROM pg_show_all_settings() a(name, setting, unit, category, short_desc, extra_desc, context, vartype, source, min_val, max_val, enumvals, sourcefile, sourceline); pg_shadow | SELECT pg_authid.rolname AS usename, pg_authid.oid AS usesysid, pg_authid.rolcreatedb AS usecreatedb, pg_authid.rolsuper AS usesuper, pg_authid.rolcatupdate AS usecatupd, pg_authid.rolpassword AS passwd, (pg_authid.rolvaliduntil)::abstime AS valuntil, pg_authid.rolconfig AS useconfig FROM pg_authid WHERE pg_authid.rolcanlogin; pg_stat_activity | SELECT s.datid, d.datname, s.procpid, s.usesysid, u.rolname AS usename, s.current_query, s.waiting, s.xact_start, s.query_start, s.backend_start, s.client_addr, s.client_port FROM pg_database d, pg_stat_get_activity(NULL::integer) s(datid, procpid, usesysid, current_query, waiting, xact_start, query_start, backend_start, client_addr, client_port), pg_authid u WHERE ((s.datid = d.oid) AND (s.usesysid = u.oid)); pg_stat_all_indexes | SELECT c.oid AS relid, i.oid AS indexrelid, n.nspname AS schemaname, c.relname, i.relname AS indexrelname, pg_stat_get_numscans(i.oid) AS idx_scan, pg_stat_get_tuples_returned(i.oid) AS idx_tup_read, pg_stat_get_tuples_fetched(i.oid) AS idx_tup_fetch FROM (((pg_class c JOIN pg_index x ON ((c.oid = x.indrelid))) JOIN pg_class i ON ((i.oid = x.indexrelid))) LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace))) WHERE (c.relkind = ANY (ARRAY['r'::"char", 't'::"char"]));
-- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers