diff --git a/doc/src/sgml/ref/reset.sgml b/doc/src/sgml/ref/reset.sgml index 7bb87570add3fc4befbdd4cb78dd408a9fc316f5..85194663eb2e7baec5d3fc4ce4b7daad01e7d123 100644 --- a/doc/src/sgml/ref/reset.sgml +++ b/doc/src/sgml/ref/reset.sgml @@ -1,5 +1,5 @@ @@ -16,6 +16,9 @@ Postgres documentation RESET variable + +RESET ALL + Inputs @@ -30,6 +33,14 @@ RESET variable + + ALL + + + Resets all run-time parameters to default values. + + + diff --git a/doc/src/sgml/ref/show.sgml b/doc/src/sgml/ref/show.sgml index 934b0567f2d695d2f6c25acf0f098449cf08f9d3..3674a97c5ba5d57932ea5e32174b5e89187ee7e4 100644 --- a/doc/src/sgml/ref/show.sgml +++ b/doc/src/sgml/ref/show.sgml @@ -1,5 +1,5 @@ @@ -16,6 +16,9 @@ Postgres documentation SHOW name + +SHOW ALL + Inputs @@ -32,6 +35,14 @@ SHOW name + + ALL + + + Show all current session parameters. + + + diff --git a/src/backend/commands/variable.c b/src/backend/commands/variable.c index eb43be8f3f0e7a57edf3859b77fcdb83e7efae94..6f22bcc33d2de615ffd3c9ef37503284d8857f05 100644 --- a/src/backend/commands/variable.c +++ b/src/backend/commands/variable.c @@ -9,7 +9,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/commands/variable.c,v 1.48 2001/05/08 21:06:42 petere Exp $ + * $Header: /cvsroot/pgsql/src/backend/commands/variable.c,v 1.49 2001/06/07 04:50:56 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -39,9 +39,9 @@ #endif -static bool show_date(void); -static bool reset_date(void); -static bool parse_date(char *); +static bool show_datestyle(void); +static bool reset_datestyle(void); +static bool parse_datestyle(char *); static bool show_timezone(void); static bool reset_timezone(void); static bool parse_timezone(char *); @@ -192,7 +192,7 @@ static int DefaultDateStyle; static bool DefaultEuroDates; static bool -parse_date(char *value) +parse_datestyle(char *value) { char *tok; int dcnt = 0, @@ -200,7 +200,7 @@ parse_date(char *value) if (value == NULL) { - reset_date(); + reset_datestyle(); return TRUE; } @@ -261,7 +261,7 @@ parse_date(char *value) } static bool -show_date(void) +show_datestyle(void) { char buf[64]; @@ -291,7 +291,7 @@ show_date(void) } static bool -reset_date(void) +reset_datestyle(void) { DateStyle = DefaultDateStyle; EuroDates = DefaultEuroDates; @@ -325,7 +325,7 @@ set_default_datestyle(void) DBDate = strdup(DBDate); /* Parse desired setting into DateStyle/EuroDates */ - parse_date(DBDate); + parse_datestyle(DBDate); free(DBDate); @@ -396,7 +396,7 @@ show_timezone(void) tz = getenv("TZ"); - elog(NOTICE, "Time zone is %s", ((tz != NULL) ? tz : "unknown")); + elog(NOTICE, "Time zone is %s", ((tz != NULL) ? tz : "unset")); return TRUE; } /* show_timezone() */ @@ -586,7 +586,7 @@ parse_random_seed(char *value) static bool show_random_seed(void) { - elog(NOTICE, "Seed for random number generator is not known"); + elog(NOTICE, "Seed for random number generator is unavailable"); return (TRUE); } @@ -708,7 +708,7 @@ SetPGVariable(const char *name, const char *value) * Special cases ought to be removed and handled separately by TCOP */ if (strcasecmp(name, "datestyle") == 0) - parse_date(mvalue); + parse_datestyle(mvalue); else if (strcasecmp(name, "timezone") == 0) parse_timezone(mvalue); else if (strcasecmp(name, "DefaultXactIsoLevel") == 0) @@ -724,18 +724,17 @@ SetPGVariable(const char *name, const char *value) else if (strcasecmp(name, "session_authorization") == 0) SetSessionAuthorization(value); else - SetConfigOption(name, value, superuser() ? PGC_SUSET : PGC_USERSET); + SetConfigOption(name, value, superuser() ? PGC_SUSET : PGC_USERSET, false); if (mvalue) pfree(mvalue); } - void GetPGVariable(const char *name) { if (strcasecmp(name, "datestyle") == 0) - show_date(); + show_datestyle(); else if (strcasecmp(name, "timezone") == 0) show_timezone(); else if (strcasecmp(name, "DefaultXactIsoLevel") == 0) @@ -748,7 +747,17 @@ GetPGVariable(const char *name) show_server_encoding(); else if (strcasecmp(name, "seed") == 0) show_random_seed(); - else + else if (strcasecmp(name, "all") == 0) + { + ShowAllGUCConfig(); + show_datestyle(); + show_timezone(); + show_DefaultXactIsoLevel(); + show_XactIsoLevel(); + show_client_encoding(); + show_server_encoding(); + show_random_seed(); + } else { const char *val = GetConfigOption(name); @@ -760,7 +769,7 @@ void ResetPGVariable(const char *name) { if (strcasecmp(name, "datestyle") == 0) - reset_date(); + reset_datestyle(); else if (strcasecmp(name, "timezone") == 0) reset_timezone(); else if (strcasecmp(name, "DefaultXactIsoLevel") == 0) @@ -773,6 +782,17 @@ ResetPGVariable(const char *name) reset_server_encoding(); else if (strcasecmp(name, "seed") == 0) reset_random_seed(); - else - SetConfigOption(name, NULL, superuser() ? PGC_SUSET : PGC_USERSET); + else if (strcasecmp(name, "all") == 0) + { + reset_DefaultXactIsoLevel(); + reset_XactIsoLevel(); + reset_random_seed(); + /* reset_server_encoding(); */ + reset_client_encoding(); + reset_datestyle(); + reset_timezone(); + + ResetAllOptions(); + } else + SetConfigOption(name, NULL, superuser() ? PGC_SUSET : PGC_USERSET, false); } diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y index 6cf2adcb5ba852e8366ecbf5a620a406b2b5398e..308b49fd727c13bb593512f0bea1abc420769d00 100644 --- a/src/backend/parser/gram.y +++ b/src/backend/parser/gram.y @@ -11,7 +11,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.228 2001/06/04 23:27:23 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.229 2001/06/07 04:50:56 momjian Exp $ * * HISTORY * AUTHOR DATE MAJOR EVENT @@ -860,6 +860,12 @@ VariableShowStmt: SHOW ColId n->name = "timezone"; $$ = (Node *) n; } + | SHOW ALL + { + VariableShowStmt *n = makeNode(VariableShowStmt); + n->name = "all"; + $$ = (Node *) n; + } | SHOW TRANSACTION ISOLATION LEVEL { VariableShowStmt *n = makeNode(VariableShowStmt); @@ -886,6 +892,12 @@ VariableResetStmt: RESET ColId n->name = "XactIsoLevel"; $$ = (Node *) n; } + | RESET ALL + { + VariableResetStmt *n = makeNode(VariableResetStmt); + n->name = "all"; + $$ = (Node *) n; + } ; diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c index 6ccc9e577ba9d24da788fdd97353fd9cd7c1ad40..96d7d1e3ad9c1bdd64445084b46f65d2a350eed5 100644 --- a/src/backend/postmaster/postmaster.c +++ b/src/backend/postmaster/postmaster.c @@ -28,7 +28,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/postmaster/postmaster.c,v 1.216 2001/06/03 14:53:56 petere Exp $ + * $Header: /cvsroot/pgsql/src/backend/postmaster/postmaster.c,v 1.217 2001/06/07 04:50:57 momjian Exp $ * * NOTES * @@ -533,7 +533,7 @@ PostmasterMain(int argc, char *argv[]) elog(ERROR, "-c %s requires argument", optarg); } - SetConfigOption(name, value, PGC_POSTMASTER); + SetConfigOption(name, value, PGC_POSTMASTER, true); free(name); if (value) free(value); diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c index 19a44ff67d72c9304d637402b11bdb59c678629a..8e5115f755a23e901fa63bfcc70e09989152aff4 100644 --- a/src/backend/tcop/postgres.c +++ b/src/backend/tcop/postgres.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/tcop/postgres.c,v 1.218 2001/04/14 19:11:45 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/tcop/postgres.c,v 1.219 2001/06/07 04:50:57 momjian Exp $ * * NOTES * this is the "main" module of the postgres backend and @@ -1462,7 +1462,7 @@ PostgresMain(int argc, char *argv[], int real_argc, char *real_argv[], const cha /* all options are allowed if not under postmaster */ SetConfigOption(name, value, - (IsUnderPostmaster) ? PGC_BACKEND : PGC_POSTMASTER); + (IsUnderPostmaster) ? PGC_BACKEND : PGC_POSTMASTER, true); free(name); if (value) free(value); @@ -1709,7 +1709,7 @@ PostgresMain(int argc, char *argv[], int real_argc, char *real_argv[], const cha if (!IsUnderPostmaster) { puts("\nPOSTGRES backend interactive interface "); - puts("$Revision: 1.218 $ $Date: 2001/04/14 19:11:45 $\n"); + puts("$Revision: 1.219 $ $Date: 2001/06/07 04:50:57 $\n"); } /* diff --git a/src/backend/utils/misc/guc-file.l b/src/backend/utils/misc/guc-file.l index cb39525df928fa38519c3d6659fb50bbeed09e63..950dbb6ef92c9287ebf38c547192ac5fc551b548 100644 --- a/src/backend/utils/misc/guc-file.l +++ b/src/backend/utils/misc/guc-file.l @@ -4,7 +4,7 @@ * * Copyright 2000 by PostgreSQL Global Development Group * - * $Header: /cvsroot/pgsql/src/backend/utils/misc/guc-file.l,v 1.7 2001/06/01 20:29:43 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/misc/guc-file.l,v 1.8 2001/06/07 04:50:57 momjian Exp $ */ %{ @@ -260,13 +260,13 @@ ProcessConfigFile(GucContext context) */ for(item = head; item; item=item->next) { - if (!set_config_option(item->name, item->value, context, false)) + if (!set_config_option(item->name, item->value, context, false, false)) goto cleanup_exit; } /* If we got here all the options parsed okay. */ for(item = head; item; item=item->next) - set_config_option(item->name, item->value, context, true); + set_config_option(item->name, item->value, context, true, true); cleanup_exit: free_name_value_list(head); diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c index 6e080594f8b6662891da9be5b2bb5a0c566f22d2..78c569f80b882e405e0fbcc09ea56bd38bf775f0 100644 --- a/src/backend/utils/misc/guc.c +++ b/src/backend/utils/misc/guc.c @@ -4,7 +4,7 @@ * Support for grand unified configuration scheme, including SET * command, configuration file, and command line options. * - * $Header: /cvsroot/pgsql/src/backend/utils/misc/guc.c,v 1.36 2001/05/17 17:44:18 petere Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/misc/guc.c,v 1.37 2001/06/07 04:50:57 momjian Exp $ * * Copyright 2000 by PostgreSQL Global Development Group * Written by Peter Eisentraut . @@ -136,9 +136,10 @@ struct config_string const char *name; GucContext context; char **variable; - const char *default_val; + const char *boot_default_val; bool (*parse_hook) (const char *proposed); void (*assign_hook) (const char *newval); + char *default_val; }; @@ -433,6 +434,15 @@ ResetAllOptions(void) { char *str = NULL; + if (!ConfigureNamesString[i].default_val + && ConfigureNamesString[i].boot_default_val) + { + str = strdup(ConfigureNamesString[i].boot_default_val); + if (str == NULL) + elog(ERROR, "out of memory"); + + ConfigureNamesString[i].default_val = str; + } if (ConfigureNamesString[i].default_val) { str = strdup(ConfigureNamesString[i].default_val); @@ -582,7 +592,7 @@ parse_real(const char *value, double *result) */ bool set_config_option(const char *name, const char *value, GucContext - context, bool DoIt) + context, bool DoIt, bool makeDefault) { struct config_generic *record; enum config_type type; @@ -653,7 +663,11 @@ set_config_option(const char *name, const char *value, GucContext return false; } if (DoIt) + { *conf->variable = boolval; + if (makeDefault) + conf->default_val = boolval; + } } else if (DoIt) *conf->variable = conf->default_val; @@ -681,7 +695,11 @@ set_config_option(const char *name, const char *value, GucContext return false; } if (DoIt) + { *conf->variable = intval; + if (makeDefault) + conf->default_val = intval; + } } else if (DoIt) *conf->variable = conf->default_val; @@ -709,7 +727,11 @@ set_config_option(const char *name, const char *value, GucContext return false; } if (DoIt) + { *conf->variable = dval; + if (makeDefault) + conf->default_val = dval; + } } else if (DoIt) *conf->variable = conf->default_val; @@ -742,12 +764,33 @@ set_config_option(const char *name, const char *value, GucContext if (*conf->variable) free(*conf->variable); *conf->variable = str; + if (makeDefault) + { + if (conf->default_val) + free(conf->default_val); + str = strdup(value); + if (str == NULL) { + elog(elevel, "out of memory"); + return false; + } + conf->default_val = str; + } } } else if (DoIt) { char *str; + if (!conf->default_val && conf->boot_default_val) + { + str = strdup(conf->boot_default_val); + if (str == NULL) + { + elog(elevel, "out of memory"); + return false; + } + conf->boot_default_val = str; + } str = strdup(conf->default_val); if (str == NULL) { @@ -776,9 +819,9 @@ set_config_option(const char *name, const char *value, GucContext */ void SetConfigOption(const char *name, const char *value, GucContext - context) + context, bool makeDefault) { - (void) set_config_option(name, value, context, true); + (void) set_config_option(name, value, context, true, makeDefault); } @@ -826,6 +869,58 @@ GetConfigOption(const char *name) return NULL; } +static void +_ShowOption(enum config_type opttype, struct config_generic *record) +{ + static char buffer[256]; + char *val; + + switch (opttype) + { + case PGC_BOOL: + val = *((struct config_bool *) record)->variable ? "on" : "off"; + break; + case PGC_INT: + snprintf(buffer, 256, "%d", *((struct config_int *) record)->variable); + val = buffer; + break; + + case PGC_REAL: + snprintf(buffer, 256, "%g", *((struct config_real *) record)->variable); + val = buffer; + break; + + case PGC_STRING: + val = strlen(*((struct config_string *) record)->variable) != 0 ? + *((struct config_string *) record)->variable : "unset"; + break; + + default: + val = "???"; + } + elog(NOTICE, "%s is %s", record->name, val); +} + +void +ShowAllGUCConfig(void) +{ + int i; + + for (i = 0; ConfigureNamesBool[i].name; i++) + _ShowOption(PGC_BOOL, (struct config_generic *)&ConfigureNamesBool[i]); + + for (i = 0; ConfigureNamesInt[i].name; i++) + _ShowOption(PGC_INT, (struct config_generic *)&ConfigureNamesInt[i]); + + for (i = 0; ConfigureNamesReal[i].name; i++) + _ShowOption(PGC_REAL, (struct config_generic *)&ConfigureNamesReal[i]); + + for (i = 0; ConfigureNamesString[i].name; i++) + _ShowOption(PGC_STRING, (struct config_generic *)&ConfigureNamesString[i]); +} + + + /* diff --git a/src/include/utils/guc.h b/src/include/utils/guc.h index 978b9da859e7791e0d7623e4513516c5325601fa..1d925f0c3eade81346bb1e694cd33ae37899a506 100644 --- a/src/include/utils/guc.h +++ b/src/include/utils/guc.h @@ -4,7 +4,7 @@ * External declarations pertaining to backend/utils/misc/guc.c and * backend/utils/misc/guc-file.l * - * $Header: /cvsroot/pgsql/src/include/utils/guc.h,v 1.6 2001/03/22 04:01:12 momjian Exp $ + * $Header: /cvsroot/pgsql/src/include/utils/guc.h,v 1.7 2001/06/07 04:50:57 momjian Exp $ */ #ifndef GUC_H #define GUC_H @@ -46,12 +46,13 @@ typedef enum } GucContext; -void SetConfigOption(const char *name, const char *value, GucContext context); +void SetConfigOption(const char *name, const char *value, GucContext context, bool makeDefault); const char *GetConfigOption(const char *name); void ProcessConfigFile(GucContext context); void ResetAllOptions(void); void ParseLongOption(const char *string, char **name, char **value); -bool set_config_option(const char *name, const char *value, GucContext context, bool DoIt); +bool set_config_option(const char *name, const char *value, GucContext context, bool DoIt, bool makeDefault); +void ShowAllGUCConfig(void); extern bool Debug_print_query;