[patch] GUC source file and line number
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
Attachments:
guc-sourcefile.patchtext/x-diff; charset=us-asciiDownload
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"]));
This looks quite handy. Needs to have an update to the view-pg-settings
section of the docs before it gets applied though.
I'd also like to get the default boot_val for each parameter exposed,
similarly to how the min and max are available. That should be easy to do
using your changes as a guide for what to touch. I'll try to fit that in
this weekend so it makes the commitfest deadline. I'll update the docs
for all the changes (the ones in there already and the one I add) while
I'm at it and submit a combined patch.
--
* Greg Smith gsmith@gregsmith.com http://www.gregsmith.com Baltimore, MD
Greg Smith wrote:
This looks quite handy. Needs to have an update to the view-pg-settings
section of the docs before it gets applied though.I'd also like to get the default boot_val for each parameter exposed,
similarly to how the min and max are available. That should be easy to
do using your changes as a guide for what to touch. I'll try to fit
that in this weekend so it makes the commitfest deadline. I'll update
the docs for all the changes (the ones in there already and the one I
add) while I'm at it and submit a combined patch.
Doing that is going to be a whole lot easier and less invasive, so I'd
suggest doing it as a separate patch. While there may be a small
conflict, it's going to be easy to resolve, and I think keeping them
apart makes it a lot easier to review - at least to review the simple patch.
//Magnus
On Thursday 28 August 2008 13:08:58 Alvaro Herrera wrote:
Hi,
Here's a patch to add source file and line numbers to GUC variables.
Basically this makes pg_settings look like this:
<snip>
This should make life easier for tools trying to find the config file
each setting is from (and possibly edit it).
If I have read this patch right, anything commented out (aka all of our
default values) will emit null in these fields... right? Trying to decide
just how helpful this will actually be for tool writers.
--
Robert Treat
Build A Brighter LAMP :: Linux Apache {middleware} PostgreSQL
Robert Treat wrote:
On Thursday 28 August 2008 13:08:58 Alvaro Herrera wrote:
This should make life easier for tools trying to find the config file
each setting is from (and possibly edit it).If I have read this patch right, anything commented out (aka all of our
default values) will emit null in these fields... right?
Of course.
Trying to decide just how helpful this will actually be for tool
writers.
Oh, it's easy -- just rip all the commented stuff out of the default
file. It's useless anyway.
--
Alvaro Herrera http://www.CommandPrompt.com/
The PostgreSQL Company - Command Prompt, Inc.