Index: doc/src/sgml/runtime.sgml
===================================================================
RCS file: /opt/src/cvs/pgsql-server/doc/src/sgml/runtime.sgml,v
retrieving revision 1.187
diff -c -r1.187 runtime.sgml
*** doc/src/sgml/runtime.sgml 25 Jun 2003 01:13:24 -0000 1.187
--- doc/src/sgml/runtime.sgml 26 Jun 2003 05:01:56 -0000
***************
*** 571,584 ****
name
text
! The name of the run-time configuration parameter
setting
text
! The current value of the run-time configuration parameter
--- 571,615 ----
name
text
! run-time configuration parameter name
setting
text
! current value of the parameter
+
+
+ context
+ text
+ context required to set the parameter's value
+
+
+
+ vartype
+ text
+ parameter type
+
+
+
+ source
+ text
+ source of the current parameter value
+
+
+
+ min_val
+ text
+ minimum allowed value of the parameter
+
+
+
+ max_val
+ text
+ maximum allowed value of the parameter
+
+
Index: src/backend/utils/misc/guc.c
===================================================================
RCS file: /opt/src/cvs/pgsql-server/src/backend/utils/misc/guc.c,v
retrieving revision 1.131
diff -c -r1.131 guc.c
*** src/backend/utils/misc/guc.c 11 Jun 2003 22:13:22 -0000 1.131
--- src/backend/utils/misc/guc.c 26 Jun 2003 04:03:00 -0000
***************
*** 159,168 ****
*/
enum config_type
{
! PGC_BOOL,
! PGC_INT,
! PGC_REAL,
! PGC_STRING
};
/* Generic fields applicable to all types of variables */
--- 159,208 ----
*/
enum config_type
{
! PGC_BOOL = 0,
! PGC_INT = 1,
! PGC_REAL = 2,
! PGC_STRING = 3
! };
!
! /*
! * Used for pg_settings. Keep in sync with config_type enum above
! */
! static char *config_type_name[] =
! {
! "bool",
! "integer",
! "real",
! "string"
! };
!
! /*
! * Used for pg_settings. Keep in sync with GucContext enum in guc.h
! */
! static char *GucContextName[] =
! {
! "internal",
! "postmaster",
! "sighup",
! "backend",
! "super-user",
! "user"
! };
!
! /*
! * Used for pg_settings. Keep in sync with GucSource enum in guc.h
! */
! static char *GucSourceName[] =
! {
! "default",
! "environment variable",
! "configuration file",
! "command line",
! "database",
! "user",
! "client",
! "override",
! "session"
};
/* Generic fields applicable to all types of variables */
***************
*** 2617,2639 ****
* Return GUC variable value by variable number; optionally return canonical
* form of name. Return value is palloc'd.
*/
! char *
! GetConfigOptionByNum(int varnum, const char **varname, bool *noshow)
{
! struct config_generic *conf;
/* check requested variable number valid */
Assert((varnum >= 0) && (varnum < num_guc_variables));
conf = guc_variables[varnum];
- if (varname)
- *varname = conf->name;
-
if (noshow)
*noshow = (conf->flags & GUC_NO_SHOW_ALL) ? true : false;
! return _ShowOption(conf);
}
/*
--- 2657,2758 ----
* Return GUC variable value by variable number; optionally return canonical
* form of name. Return value is palloc'd.
*/
! void
! GetConfigOptionByNum(int varnum, const char **values, bool *noshow)
{
! char buffer[256];
! struct config_generic *conf;
/* check requested variable number valid */
Assert((varnum >= 0) && (varnum < num_guc_variables));
conf = guc_variables[varnum];
if (noshow)
*noshow = (conf->flags & GUC_NO_SHOW_ALL) ? true : false;
! /* first get the generic attributes */
!
! /* name */
! values[0] = conf->name;
!
! /* setting : use _ShowOption in order to avoid duplicating the logic */
! values[1] = _ShowOption(conf);
!
! /* context */
! values[2] = GucContextName[conf->context];
!
! /* vartype */
! values[3] = config_type_name[conf->vartype];
!
! /* source */
! values[4] = GucSourceName[conf->source];
!
! /* now get the type specifc attributes */
! switch (conf->vartype)
! {
! case PGC_BOOL:
! {
! /* min_val */
! values[5] = NULL;
!
! /* max_val */
! values[6] = NULL;
! }
! break;
!
! case PGC_INT:
! {
! struct config_int *lconf = (struct config_int *) conf;
!
! /* min_val */
! snprintf(buffer, sizeof(buffer), "%d", lconf->min);
! values[5] = pstrdup(buffer);
!
! /* max_val */
! snprintf(buffer, sizeof(buffer), "%d", lconf->max);
! values[6] = pstrdup(buffer);
! }
! break;
!
! case PGC_REAL:
! {
! struct config_real *lconf = (struct config_real *) conf;
!
! /* min_val */
! snprintf(buffer, sizeof(buffer), "%g", lconf->min);
! values[5] = pstrdup(buffer);
!
! /* max_val */
! snprintf(buffer, sizeof(buffer), "%g", lconf->max);
! values[6] = pstrdup(buffer);
! }
! break;
!
! case PGC_STRING:
! {
! /* min_val */
! values[5] = NULL;
!
! /* max_val */
! values[6] = NULL;
! }
! break;
!
! default:
! {
! /*
! * should never get here, but in case we do, set 'em to NULL
! */
!
! /* min_val */
! values[5] = NULL;
!
! /* max_val */
! values[6] = NULL;
! }
! break;
! }
}
/*
***************
*** 2673,2678 ****
--- 2792,2799 ----
* show_all_settings - equiv to SHOW ALL command but implemented as
* a Table Function.
*/
+ #define NUM_PG_SETTINGS_ATTS 7
+
Datum
show_all_settings(PG_FUNCTION_ARGS)
{
***************
*** 2696,2707 ****
*/
oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
! /* need a tuple descriptor representing two TEXT columns */
! tupdesc = CreateTemplateTupleDesc(2, false);
TupleDescInitEntry(tupdesc, (AttrNumber) 1, "name",
TEXTOID, -1, 0, false);
TupleDescInitEntry(tupdesc, (AttrNumber) 2, "setting",
TEXTOID, -1, 0, false);
/* allocate a slot for a tuple with this tupdesc */
slot = TupleDescGetSlot(tupdesc);
--- 2817,2841 ----
*/
oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
! /*
! * need a tuple descriptor representing NUM_PG_SETTINGS_ATTS columns
! * of the appropriate types
! */
! tupdesc = CreateTemplateTupleDesc(NUM_PG_SETTINGS_ATTS, false);
TupleDescInitEntry(tupdesc, (AttrNumber) 1, "name",
TEXTOID, -1, 0, false);
TupleDescInitEntry(tupdesc, (AttrNumber) 2, "setting",
TEXTOID, -1, 0, false);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 3, "context",
+ TEXTOID, -1, 0, false);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 4, "vartype",
+ TEXTOID, -1, 0, false);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 5, "source",
+ TEXTOID, -1, 0, false);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 6, "min_val",
+ TEXTOID, -1, 0, false);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 7, "max_val",
+ TEXTOID, -1, 0, false);
/* allocate a slot for a tuple with this tupdesc */
slot = TupleDescGetSlot(tupdesc);
***************
*** 2732,2740 ****
if (call_cntr < max_calls) /* do when there is more left to send */
{
! char *values[2];
! char *varname;
! char *varval;
bool noshow;
HeapTuple tuple;
Datum result;
--- 2866,2872 ----
if (call_cntr < max_calls) /* do when there is more left to send */
{
! char *values[NUM_PG_SETTINGS_ATTS];
bool noshow;
HeapTuple tuple;
Datum result;
***************
*** 2744,2758 ****
*/
do
{
! varval = GetConfigOptionByNum(call_cntr,
! (const char **) &varname,
! &noshow);
if (noshow)
{
- /* varval is a palloc'd copy, so free it */
- if (varval != NULL)
- pfree(varval);
-
/* bump the counter and get the next config setting */
call_cntr = ++funcctx->call_cntr;
--- 2876,2884 ----
*/
do
{
! GetConfigOptionByNum(call_cntr, (const char **) values, &noshow);
if (noshow)
{
/* bump the counter and get the next config setting */
call_cntr = ++funcctx->call_cntr;
***************
*** 2762,2784 ****
}
} while (noshow);
- /*
- * Prepare a values array for storage in our slot. This should be
- * an array of C strings which will be processed later by the
- * appropriate "in" functions.
- */
- values[0] = varname;
- values[1] = varval;
-
/* build a tuple */
tuple = BuildTupleFromCStrings(attinmeta, values);
/* make the tuple into a datum */
result = TupleGetDatum(slot, tuple);
-
- /* Clean up */
- if (varval != NULL)
- pfree(varval);
SRF_RETURN_NEXT(funcctx, result);
}
--- 2888,2898 ----
Index: src/bin/initdb/initdb.sh
===================================================================
RCS file: /opt/src/cvs/pgsql-server/src/bin/initdb/initdb.sh,v
retrieving revision 1.192
diff -c -r1.192 initdb.sh
*** src/bin/initdb/initdb.sh 2 Jun 2003 19:00:29 -0000 1.192
--- src/bin/initdb/initdb.sh 26 Jun 2003 03:56:23 -0000
***************
*** 971,977 ****
CREATE VIEW pg_settings AS \
SELECT * \
! FROM pg_show_all_settings() AS A(name text, setting text);
CREATE RULE pg_settings_u AS \
ON UPDATE TO pg_settings \
--- 971,979 ----
CREATE VIEW pg_settings AS \
SELECT * \
! FROM pg_show_all_settings() AS A \
! (name text, setting text, context text, vartype text, \
! source text, min_val text, max_val text);
CREATE RULE pg_settings_u AS \
ON UPDATE TO pg_settings \
Index: src/include/utils/guc.h
===================================================================
RCS file: /opt/src/cvs/pgsql-server/src/include/utils/guc.h,v
retrieving revision 1.32
diff -c -r1.32 guc.h
*** src/include/utils/guc.h 11 Jun 2003 18:01:14 -0000 1.32
--- src/include/utils/guc.h 26 Jun 2003 02:58:54 -0000
***************
*** 49,63 ****
* we don't yet know if the user is a superuser.
*
* USERSET options can be set by anyone any time.
*/
typedef enum
{
! PGC_INTERNAL,
! PGC_POSTMASTER,
! PGC_SIGHUP,
! PGC_BACKEND,
! PGC_SUSET,
! PGC_USERSET
} GucContext;
/*
--- 49,65 ----
* we don't yet know if the user is a superuser.
*
* USERSET options can be set by anyone any time.
+ *
+ * Keep in sync with GucContextName in guc.c
*/
typedef enum
{
! PGC_INTERNAL = 0,
! PGC_POSTMASTER = 1,
! PGC_SIGHUP = 2,
! PGC_BACKEND = 3,
! PGC_SUSET = 4,
! PGC_USERSET = 5
} GucContext;
/*
***************
*** 69,74 ****
--- 71,78 ----
* Sources <= PGC_S_OVERRIDE will set the default used by RESET, as well
* as the current value. Note that source == PGC_S_OVERRIDE should be
* used when setting a PGC_INTERNAL option.
+ *
+ * Keep in sync with GucSourceName in guc.c
*/
typedef enum
{
***************
*** 83,89 ****
PGC_S_SESSION = 8 /* SET command */
} GucSource;
-
/* GUC vars that are actually declared in guc.c, rather than elsewhere */
extern bool log_statement;
extern bool log_duration;
--- 87,92 ----
***************
*** 123,129 ****
extern void ShowGUCConfigOption(const char *name, DestReceiver *dest);
extern void ShowAllGUCConfig(DestReceiver *dest);
extern char *GetConfigOptionByName(const char *name, const char **varname);
! extern char *GetConfigOptionByNum(int varnum, const char **varname, bool *noshow);
extern int GetNumConfigOptions(void);
extern void SetPGVariable(const char *name, List *args, bool is_local);
--- 126,132 ----
extern void ShowGUCConfigOption(const char *name, DestReceiver *dest);
extern void ShowAllGUCConfig(DestReceiver *dest);
extern char *GetConfigOptionByName(const char *name, const char **varname);
! extern void GetConfigOptionByNum(int varnum, const char **values, bool *noshow);
extern int GetNumConfigOptions(void);
extern void SetPGVariable(const char *name, List *args, bool is_local);
Index: src/test/regress/expected/rangefuncs.out
===================================================================
RCS file: /opt/src/cvs/pgsql-server/src/test/regress/expected/rangefuncs.out,v
retrieving revision 1.7
diff -c -r1.7 rangefuncs.out
*** src/test/regress/expected/rangefuncs.out 13 Feb 2003 20:45:22 -0000 1.7
--- src/test/regress/expected/rangefuncs.out 26 Jun 2003 02:58:54 -0000
***************
*** 1,4 ****
! SELECT * FROM pg_settings WHERE name LIKE 'enable%';
name | setting
------------------+---------
enable_hashagg | on
--- 1,4 ----
! SELECT name, setting FROM pg_settings WHERE name LIKE 'enable%';
name | setting
------------------+---------
enable_hashagg | on
Index: src/test/regress/expected/rules.out
===================================================================
RCS file: /opt/src/cvs/pgsql-server/src/test/regress/expected/rules.out,v
retrieving revision 1.75
diff -c -r1.75 rules.out
*** src/test/regress/expected/rules.out 26 May 2003 00:11:28 -0000 1.75
--- src/test/regress/expected/rules.out 26 Jun 2003 04:40:11 -0000
***************
*** 1273,1279 ****
pg_indexes | SELECT n.nspname AS schemaname, c.relname AS tablename, i.relname AS indexname, pg_get_indexdef(i.oid) AS indexdef FROM (((pg_index x JOIN pg_class c 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 = 'r'::"char") AND (i.relkind = 'i'::"char"));
pg_locks | SELECT l.relation, l."database", l."transaction", l.pid, l."mode", l.granted FROM pg_lock_status() l(relation oid, "database" oid, "transaction" xid, pid integer, "mode" text, granted boolean);
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 FROM pg_show_all_settings() a(name text, setting text);
pg_stat_activity | SELECT d.oid AS datid, d.datname, pg_stat_get_backend_pid(s.backendid) AS procpid, pg_stat_get_backend_userid(s.backendid) AS usesysid, u.usename, pg_stat_get_backend_activity(s.backendid) AS current_query, pg_stat_get_backend_activity_start(s.backendid) AS query_start FROM pg_database d, (SELECT pg_stat_get_backend_idset() AS backendid) s, pg_shadow u WHERE ((pg_stat_get_backend_dbid(s.backendid) = d.oid) AND (pg_stat_get_backend_userid(s.backendid) = u.usesysid));
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 = 'r'::"char");
pg_stat_all_tables | SELECT c.oid AS relid, n.nspname AS schemaname, c.relname, pg_stat_get_numscans(c.oid) AS seq_scan, pg_stat_get_tuples_returned(c.oid) AS seq_tup_read, sum(pg_stat_get_numscans(i.indexrelid)) AS idx_scan, sum(pg_stat_get_tuples_fetched(i.indexrelid)) AS idx_tup_fetch, pg_stat_get_tuples_inserted(c.oid) AS n_tup_ins, pg_stat_get_tuples_updated(c.oid) AS n_tup_upd, pg_stat_get_tuples_deleted(c.oid) AS n_tup_del FROM ((pg_class c LEFT JOIN pg_index i ON ((c.oid = i.indrelid))) LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace))) WHERE (c.relkind = 'r'::"char") GROUP BY c.oid, n.nspname, c.relname;
--- 1273,1279 ----
pg_indexes | SELECT n.nspname AS schemaname, c.relname AS tablename, i.relname AS indexname, pg_get_indexdef(i.oid) AS indexdef FROM (((pg_index x JOIN pg_class c 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 = 'r'::"char") AND (i.relkind = 'i'::"char"));
pg_locks | SELECT l.relation, l."database", l."transaction", l.pid, l."mode", l.granted FROM pg_lock_status() l(relation oid, "database" oid, "transaction" xid, pid integer, "mode" text, granted boolean);
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.context, a.vartype, a.source, a.min_val, a.max_val FROM pg_show_all_settings() a(name text, setting text, context text, vartype text, source text, min_val text, max_val text);
pg_stat_activity | SELECT d.oid AS datid, d.datname, pg_stat_get_backend_pid(s.backendid) AS procpid, pg_stat_get_backend_userid(s.backendid) AS usesysid, u.usename, pg_stat_get_backend_activity(s.backendid) AS current_query, pg_stat_get_backend_activity_start(s.backendid) AS query_start FROM pg_database d, (SELECT pg_stat_get_backend_idset() AS backendid) s, pg_shadow u WHERE ((pg_stat_get_backend_dbid(s.backendid) = d.oid) AND (pg_stat_get_backend_userid(s.backendid) = u.usesysid));
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 = 'r'::"char");
pg_stat_all_tables | SELECT c.oid AS relid, n.nspname AS schemaname, c.relname, pg_stat_get_numscans(c.oid) AS seq_scan, pg_stat_get_tuples_returned(c.oid) AS seq_tup_read, sum(pg_stat_get_numscans(i.indexrelid)) AS idx_scan, sum(pg_stat_get_tuples_fetched(i.indexrelid)) AS idx_tup_fetch, pg_stat_get_tuples_inserted(c.oid) AS n_tup_ins, pg_stat_get_tuples_updated(c.oid) AS n_tup_upd, pg_stat_get_tuples_deleted(c.oid) AS n_tup_del FROM ((pg_class c LEFT JOIN pg_index i ON ((c.oid = i.indrelid))) LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace))) WHERE (c.relkind = 'r'::"char") GROUP BY c.oid, n.nspname, c.relname;
Index: src/test/regress/sql/rangefuncs.sql
===================================================================
RCS file: /opt/src/cvs/pgsql-server/src/test/regress/sql/rangefuncs.sql,v
retrieving revision 1.4
diff -c -r1.4 rangefuncs.sql
*** src/test/regress/sql/rangefuncs.sql 30 Aug 2002 19:56:49 -0000 1.4
--- src/test/regress/sql/rangefuncs.sql 26 Jun 2003 02:58:54 -0000
***************
*** 1,4 ****
! SELECT * FROM pg_settings WHERE name LIKE 'enable%';
CREATE TABLE foo2(fooid int, f2 int);
INSERT INTO foo2 VALUES(1, 11);
--- 1,4 ----
! SELECT name, setting FROM pg_settings WHERE name LIKE 'enable%';
CREATE TABLE foo2(fooid int, f2 int);
INSERT INTO foo2 VALUES(1, 11);