From 66989aa2d6de4ccb469750fe661e525404cf5990 Mon Sep 17 00:00:00 2001 From: Joe Conway Date: Wed, 3 Dec 2003 18:52:00 +0000 Subject: [PATCH] Added new group of read-only GUC variables to allow simple access to certain compile-time options (FUNC_MAX_ARGS, INDEX_MAX_KEYS, NAMEDATALEN, BLCKSZ, HAVE_INT64_TIMESTAMP). Also added "category", "short_desc", and "extra_desc" to the pg_settings view. Per recent discussion here: http://archives.postgresql.org/pgsql-patches/2003-11/msg00363.php --- src/backend/catalog/system_views.sql | 6 +- src/backend/utils/misc/guc.c | 117 ++++++++++++++++++++++----- src/include/utils/guc_tables.h | 5 +- src/test/regress/expected/rules.out | 2 +- 4 files changed, 103 insertions(+), 27 deletions(-) diff --git a/src/backend/catalog/system_views.sql b/src/backend/catalog/system_views.sql index 0149fed03d..21f986ebfa 100644 --- a/src/backend/catalog/system_views.sql +++ b/src/backend/catalog/system_views.sql @@ -3,7 +3,7 @@ * * Copyright 1996-2003, PostgreSQL Global Development Group * - * $PostgreSQL: pgsql/src/backend/catalog/system_views.sql,v 1.3 2003/11/29 22:39:40 pgsql Exp $ + * $PostgreSQL: pgsql/src/backend/catalog/system_views.sql,v 1.4 2003/12/03 18:52:00 joe Exp $ */ CREATE VIEW pg_user AS @@ -260,8 +260,8 @@ CREATE VIEW pg_locks AS 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); + (name text, setting text, category text, short_desc text, extra_desc text, + context text, vartype text, source text, min_val text, max_val text); CREATE RULE pg_settings_u AS ON UPDATE TO pg_settings diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c index 18cd7e147e..705dd166e4 100644 --- a/src/backend/utils/misc/guc.c +++ b/src/backend/utils/misc/guc.c @@ -10,7 +10,7 @@ * Written by Peter Eisentraut . * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/misc/guc.c,v 1.174 2003/12/01 22:08:00 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/utils/misc/guc.c,v 1.175 2003/12/03 18:52:00 joe Exp $ * *-------------------------------------------------------------------- */ @@ -158,7 +158,11 @@ static char *server_version_string; static char *session_authorization_string; static char *timezone_string; static char *XactIsoLevel_string; - +static int max_function_args; +static int max_index_keys; +static int max_identifier_length; +static int block_size; +static bool integer_datetimes; /* Macros for freeing malloc'd pointers only if appropriate to do so */ /* Some of these tests are probably redundant, but be safe ... */ @@ -304,6 +308,8 @@ const char *const config_group_names[] = gettext_noop("Version and Platform Compatibility / Other Platforms and Clients"), /* DEVELOPER_OPTIONS */ gettext_noop("Developer Options"), + /* COMPILE_OPTIONS */ + gettext_noop("Compiled-in Options"), /* help_config wants this array to be null-terminated */ NULL }; @@ -842,6 +848,20 @@ static struct config_bool ConfigureNamesBool[] = true, NULL, NULL }, + { + {"integer_datetimes", PGC_INTERNAL, COMPILE_OPTIONS, + gettext_noop("Datetimes are integer based"), + NULL, + GUC_NOT_IN_SAMPLE | GUC_DISALLOW_IN_FILE + }, + &integer_datetimes, +#ifdef HAVE_INT64_TIMESTAMP + true, NULL, NULL +#else + false, NULL, NULL +#endif + }, + /* End-of-list marker */ { {NULL, 0, 0, NULL, NULL}, NULL, false, NULL, NULL @@ -1238,6 +1258,46 @@ static struct config_int ConfigureNamesInt[] = 100, 1, 1000, NULL, NULL }, + { + {"max_function_args", PGC_INTERNAL, COMPILE_OPTIONS, + gettext_noop("Shows the maximum number of function arguments"), + NULL, + GUC_NOT_IN_SAMPLE | GUC_DISALLOW_IN_FILE + }, + &max_function_args, + FUNC_MAX_ARGS, FUNC_MAX_ARGS, FUNC_MAX_ARGS, NULL, NULL + }, + + { + {"max_index_keys", PGC_INTERNAL, COMPILE_OPTIONS, + gettext_noop("Shows the maximum number of index keys"), + NULL, + GUC_NOT_IN_SAMPLE | GUC_DISALLOW_IN_FILE + }, + &max_index_keys, + INDEX_MAX_KEYS, INDEX_MAX_KEYS, INDEX_MAX_KEYS, NULL, NULL + }, + + { + {"max_identifier_length", PGC_INTERNAL, COMPILE_OPTIONS, + gettext_noop("Shows the maximum identifier length"), + NULL, + GUC_NOT_IN_SAMPLE | GUC_DISALLOW_IN_FILE + }, + &max_identifier_length, + NAMEDATALEN - 1, NAMEDATALEN - 1, NAMEDATALEN - 1, NULL, NULL + }, + + { + {"block_size", PGC_INTERNAL, COMPILE_OPTIONS, + gettext_noop("Shows size of a disk block"), + NULL, + GUC_NOT_IN_SAMPLE | GUC_DISALLOW_IN_FILE + }, + &block_size, + BLCKSZ, BLCKSZ, BLCKSZ, NULL, NULL + }, + /* End-of-list marker */ { {NULL, 0, 0, NULL, NULL}, NULL, 0, 0, 0, NULL, NULL @@ -3478,14 +3538,23 @@ GetConfigOptionByNum(int varnum, const char **values, bool *noshow) /* setting : use _ShowOption in order to avoid duplicating the logic */ values[1] = _ShowOption(conf); + /* group */ + values[2] = config_group_names[conf->group]; + + /* short_desc */ + values[3] = conf->short_desc; + + /* extra_desc */ + values[4] = conf->long_desc; + /* context */ - values[2] = GucContext_Names[conf->context]; + values[5] = GucContext_Names[conf->context]; /* vartype */ - values[3] = config_type_names[conf->vartype]; + values[6] = config_type_names[conf->vartype]; /* source */ - values[4] = GucSource_Names[conf->source]; + values[7] = GucSource_Names[conf->source]; /* now get the type specifc attributes */ switch (conf->vartype) @@ -3493,10 +3562,10 @@ GetConfigOptionByNum(int varnum, const char **values, bool *noshow) case PGC_BOOL: { /* min_val */ - values[5] = NULL; + values[8] = NULL; /* max_val */ - values[6] = NULL; + values[9] = NULL; } break; @@ -3506,11 +3575,11 @@ GetConfigOptionByNum(int varnum, const char **values, bool *noshow) /* min_val */ snprintf(buffer, sizeof(buffer), "%d", lconf->min); - values[5] = pstrdup(buffer); + values[8] = pstrdup(buffer); /* max_val */ snprintf(buffer, sizeof(buffer), "%d", lconf->max); - values[6] = pstrdup(buffer); + values[9] = pstrdup(buffer); } break; @@ -3520,21 +3589,21 @@ GetConfigOptionByNum(int varnum, const char **values, bool *noshow) /* min_val */ snprintf(buffer, sizeof(buffer), "%g", lconf->min); - values[5] = pstrdup(buffer); + values[8] = pstrdup(buffer); /* max_val */ snprintf(buffer, sizeof(buffer), "%g", lconf->max); - values[6] = pstrdup(buffer); + values[9] = pstrdup(buffer); } break; case PGC_STRING: { /* min_val */ - values[5] = NULL; + values[8] = NULL; /* max_val */ - values[6] = NULL; + values[9] = NULL; } break; @@ -3546,10 +3615,10 @@ GetConfigOptionByNum(int varnum, const char **values, bool *noshow) */ /* min_val */ - values[5] = NULL; + values[8] = NULL; /* max_val */ - values[6] = NULL; + values[9] = NULL; } break; } @@ -3592,7 +3661,7 @@ show_config_by_name(PG_FUNCTION_ARGS) * show_all_settings - equiv to SHOW ALL command but implemented as * a Table Function. */ -#define NUM_PG_SETTINGS_ATTS 7 +#define NUM_PG_SETTINGS_ATTS 10 Datum show_all_settings(PG_FUNCTION_ARGS) @@ -3626,15 +3695,21 @@ show_all_settings(PG_FUNCTION_ARGS) TEXTOID, -1, 0, false); TupleDescInitEntry(tupdesc, (AttrNumber) 2, "setting", TEXTOID, -1, 0, false); - TupleDescInitEntry(tupdesc, (AttrNumber) 3, "context", + TupleDescInitEntry(tupdesc, (AttrNumber) 3, "category", TEXTOID, -1, 0, false); - TupleDescInitEntry(tupdesc, (AttrNumber) 4, "vartype", + TupleDescInitEntry(tupdesc, (AttrNumber) 4, "short_desc", TEXTOID, -1, 0, false); - TupleDescInitEntry(tupdesc, (AttrNumber) 5, "source", + TupleDescInitEntry(tupdesc, (AttrNumber) 5, "extra_desc", TEXTOID, -1, 0, false); - TupleDescInitEntry(tupdesc, (AttrNumber) 6, "min_val", + TupleDescInitEntry(tupdesc, (AttrNumber) 6, "context", TEXTOID, -1, 0, false); - TupleDescInitEntry(tupdesc, (AttrNumber) 7, "max_val", + TupleDescInitEntry(tupdesc, (AttrNumber) 7, "vartype", + TEXTOID, -1, 0, false); + TupleDescInitEntry(tupdesc, (AttrNumber) 8, "source", + TEXTOID, -1, 0, false); + TupleDescInitEntry(tupdesc, (AttrNumber) 9, "min_val", + TEXTOID, -1, 0, false); + TupleDescInitEntry(tupdesc, (AttrNumber) 10, "max_val", TEXTOID, -1, 0, false); /* allocate a slot for a tuple with this tupdesc */ diff --git a/src/include/utils/guc_tables.h b/src/include/utils/guc_tables.h index e0fad72b68..c596e964eb 100644 --- a/src/include/utils/guc_tables.h +++ b/src/include/utils/guc_tables.h @@ -7,7 +7,7 @@ * * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group * - * $PostgreSQL: pgsql/src/include/utils/guc_tables.h,v 1.7 2003/11/29 22:41:15 pgsql Exp $ + * $PostgreSQL: pgsql/src/include/utils/guc_tables.h,v 1.8 2003/12/03 18:52:00 joe Exp $ * *------------------------------------------------------------------------- */ @@ -50,7 +50,8 @@ enum config_group COMPAT_OPTIONS, COMPAT_OPTIONS_PREVIOUS, COMPAT_OPTIONS_CLIENT, - DEVELOPER_OPTIONS + DEVELOPER_OPTIONS, + COMPILE_OPTIONS }; /* diff --git a/src/test/regress/expected/rules.out b/src/test/regress/expected/rules.out index ae7d0feea6..f6a98527fd 100644 --- a/src/test/regress/expected/rules.out +++ b/src/test/regress/expected/rules.out @@ -1278,7 +1278,7 @@ SELECT viewname, definition FROM pg_views WHERE schemaname <> 'information_schem 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_settings | SELECT a.name, a.setting, a.category, a.short_desc, a.extra_desc, a.context, a.vartype, a.source, a.min_val, a.max_val FROM pg_show_all_settings() a(name text, setting text, category text, short_desc text, extra_desc 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;