diff --git a/doc/src/sgml/advanced.sgml b/doc/src/sgml/advanced.sgml index 2807c8bc86b20f1071a54f2e4b3309458fa44008..1cf2c63ffab1c3ee4154effa474047c63c90c343 100644 --- a/doc/src/sgml/advanced.sgml +++ b/doc/src/sgml/advanced.sgml @@ -1,5 +1,5 @@ <!-- -$Header: /cvsroot/pgsql/doc/src/sgml/advanced.sgml,v 1.14 2000/06/14 13:12:52 thomas Exp $ +$Header: /cvsroot/pgsql/doc/src/sgml/advanced.sgml,v 1.15 2000/06/22 22:31:15 petere Exp $ --> <chapter id="advanced"> @@ -116,22 +116,25 @@ SELECT name, altitude support this <quote>ONLY</quote> notation. </para> - <para> - Deprecated: In previous versions of postgres, the default was not to - get access to child classes. By experience this was found to be error - prone. Under the old syntax, to get the sub-classes you append "*" - to the table name. For example - - <programlisting> + <note> + <title>Deprecated</title> + <para> + In previous versions of <productname>Postgres</productname>, the + default was not to get access to child tables. This was found to + be error prone and is also in violation of SQL. Under the old + syntax, to get the sub-classes you append "*" to the table name. + For example +<programlisting> SELECT * from cities*; - </programlisting> - - This old behaviour is still available by using a SET command: - - <programlisting> -SET EXAMINE_SUBCLASS TO on; - </programlisting> - </para> +</programlisting> + To get the old behavior, the set configuration option + <literal>SQL_Inheritance</literal> to off, e.g., +<programlisting> +SET SQL_Inheritance TO OFF; +</programlisting> + or add a line in your <filename>postgresql.conf</filename> file. + </para> + </note> </sect1> <sect1> diff --git a/doc/src/sgml/inherit.sgml b/doc/src/sgml/inherit.sgml index 73a2678655da7fd2dcc72d28cc448b385cb08025..774795f94d93154f61bb3c13096f6ce5a3138c98 100644 --- a/doc/src/sgml/inherit.sgml +++ b/doc/src/sgml/inherit.sgml @@ -1,5 +1,5 @@ <!-- -$Header: /cvsroot/pgsql/doc/src/sgml/Attic/inherit.sgml,v 1.9 2000/06/14 13:12:52 thomas Exp $ +$Header: /cvsroot/pgsql/doc/src/sgml/Attic/inherit.sgml,v 1.10 2000/06/22 22:31:15 petere Exp $ --> <chapter id="inherit"> @@ -96,19 +96,25 @@ CREATE TABLE capitals UNDER cities ( <command>UPDATE</command> and <command>DELETE</command> -- support this <quote>ONLY</quote> notation. </para> - <para> - Deprecated: In previous versions of postgres, the default was not to - get access to child classes. By experience this was found to be error - prone. Under the old syntax, to get the sub-classes you append "*" - to the table name. For example - <programlisting> - SELECT * from cities*; - </programlisting> - This old behaviour is still available by using a SET command... - <programlisting> - SET EXAMINE_SUBCLASS TO on; - </programlisting> - </para> + <note> + <title>Deprecated</title> + <para> + In previous versions of <productname>Postgres</productname>, the + default was not to get access to child tables. This was found to + be error prone and is also in violation of SQL. Under the old + syntax, to get the sub-classes you append "*" to the table name. + For example +<programlisting> +SELECT * from cities*; +</programlisting> + To get the old behavior, the set configuration option + <literal>SQL_Inheritance</literal> to off, e.g., +<programlisting> +SET SQL_Inheritance TO OFF; +</programlisting> + or add a line in your <filename>postgresql.conf</filename> file. + </para> + </note> </chapter> <!-- Keep this comment at the end of the file diff --git a/doc/src/sgml/ref/select.sgml b/doc/src/sgml/ref/select.sgml index 8b21a3438d3e16c84d6604944bef4205808b7f4c..c9b412d9bbb164f2d7f99f86c597ab4bb5390e46 100644 --- a/doc/src/sgml/ref/select.sgml +++ b/doc/src/sgml/ref/select.sgml @@ -1,5 +1,5 @@ <!-- -$Header: /cvsroot/pgsql/doc/src/sgml/ref/select.sgml,v 1.29 2000/06/09 01:44:00 momjian Exp $ +$Header: /cvsroot/pgsql/doc/src/sgml/ref/select.sgml,v 1.30 2000/06/22 22:31:16 petere Exp $ Postgres documentation --> @@ -208,7 +208,7 @@ SELECT [ ALL | DISTINCT [ ON ( <replaceable class="PARAMETER">expression</replac This was previously the default result, and getting subclasses was obtained by appending <command>*</command> to the table name. The old behaviour is available via the command - <command>SET EXAMINE_SUBCLASS TO 'on';</command> + <command>SET SQL_Inheritance TO OFF;</command> </para> <para> diff --git a/doc/src/sgml/runtime.sgml b/doc/src/sgml/runtime.sgml index b92a1cc67b285dbb9abde4e8d4d68eaefd7b2f0b..1f9a940aa00880092e5077c27812382971ead710 100644 --- a/doc/src/sgml/runtime.sgml +++ b/doc/src/sgml/runtime.sgml @@ -1,5 +1,5 @@ <!-- -$Header: /cvsroot/pgsql/doc/src/sgml/runtime.sgml,v 1.11 2000/06/18 21:24:51 petere Exp $ +$Header: /cvsroot/pgsql/doc/src/sgml/runtime.sgml,v 1.12 2000/06/22 22:31:15 petere Exp $ --> <Chapter Id="runtime"> @@ -914,6 +914,23 @@ env PGOPTIONS='--geqo=off' psql </para> </listitem> </varlistentry> + + <varlistentry> + <term>SQL_INHERITANCE (<type>bool</type>)</term> + <listitem> + <para> + This controls the inheritance semantics, in particular whether + subtables are included into the consideration of various + commands by default. This was not the case in versions prior + to 7.1. If you need this behaviour you can set this variable + to off, but in the long run you are encouraged to change your + applications to use the <literal>ONLY</literal> keyword to + exclude subtables. See the SQL language reference and the + <citetitle>User's Guide</citetitle> for more information about + inheritance. + </para> + </listitem> + </varlistentry> </variablelist> </para> </sect2> diff --git a/src/backend/bootstrap/bootstrap.c b/src/backend/bootstrap/bootstrap.c index 532d1bc3a82e1c0dc2e8102ca4cba59f3635cede..b49d5ef8bf35d33c6f2450cca25099cebca56b8d 100644 --- a/src/backend/bootstrap/bootstrap.c +++ b/src/backend/bootstrap/bootstrap.c @@ -8,7 +8,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/bootstrap/bootstrap.c,v 1.86 2000/06/17 23:41:27 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/bootstrap/bootstrap.c,v 1.87 2000/06/22 22:31:17 petere Exp $ * *------------------------------------------------------------------------- */ @@ -35,6 +35,7 @@ #include "tcop/tcopprot.h" #include "utils/builtins.h" #include "utils/fmgroids.h" +#include "utils/guc.h" #include "utils/lsyscache.h" #include "utils/portal.h" @@ -248,8 +249,11 @@ BootstrapMain(int argc, char *argv[]) Quiet = false; Noversion = false; dbName = NULL; - DataDir = getenv("PGDATA"); /* Null if no PGDATA variable */ - IsUnderPostmaster = false; + if (!IsUnderPostmaster) + { + ResetAllOptions(); + DataDir = getenv("PGDATA"); /* Null if no PGDATA variable */ + } while ((flag = getopt(argc, argv, "D:dCQxpB:F")) != EOF) { @@ -275,7 +279,7 @@ BootstrapMain(int argc, char *argv[]) xloginit = true; break; case 'p': - IsUnderPostmaster = true; + /* indicates fork from postmaster */ break; case 'B': NBuffers = atoi(optarg); diff --git a/src/backend/commands/variable.c b/src/backend/commands/variable.c index 27a732ec57ec14e1e06b62c316b93d02ad1eb097..154be6a23dd39206432bed819e15ab682bbbcf8c 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.37 2000/06/14 18:17:25 petere Exp $ + * $Header: /cvsroot/pgsql/src/backend/commands/variable.c,v 1.38 2000/06/22 22:31:17 petere Exp $ * *------------------------------------------------------------------------- */ @@ -49,12 +49,7 @@ static bool parse_XactIsoLevel(char *); static bool parse_random_seed(char *); static bool show_random_seed(void); static bool reset_random_seed(void); -static bool parse_examine_subclass(char *); -static bool show_examine_subclass(void); -static bool reset_examine_subclass(void); -#define examine_subclass_default true -bool examine_subclass = examine_subclass_default; /* * get_token @@ -169,44 +164,6 @@ get_token(char **tok, char **val, char *str) return str; } -/* - * - * EXAMINE_SUBCLASS - * - */ -#define EXAMINE_SUBCLASS "EXAMINE_SUBCLASS" - -static bool -parse_examine_subclass(char *value) -{ - if (strcasecmp(value, "on") == 0) - examine_subclass = true; - else if (strcasecmp(value, "off") == 0) - examine_subclass = false; - else if (strcasecmp(value, "default") == 0) - examine_subclass = examine_subclass_default; - else - elog(ERROR, "Bad value for %s (%s)", EXAMINE_SUBCLASS, value); - return TRUE; -} - -static bool -show_examine_subclass() -{ - - if (examine_subclass) - elog(NOTICE, "%s is ON", EXAMINE_SUBCLASS); - else - elog(NOTICE, "%s is OFF", EXAMINE_SUBCLASS); - return TRUE; -} - -static bool -reset_examine_subclass(void) -{ - examine_subclass = examine_subclass_default; - return TRUE; -} /* * DATE_STYLE @@ -571,7 +528,7 @@ void SetPGVariable(const char *name, const char *value) { /* - * Special cases ought to be removed are handled separately + * Special cases ought to be removed and handled separately * by TCOP */ if (strcasecmp(name, "datestyle")==0) @@ -588,8 +545,6 @@ SetPGVariable(const char *name, const char *value) #endif else if (strcasecmp(name, "random_seed")==0) parse_random_seed(pstrdup(value)); - else if (strcasecmp(name, "examine_subclass")==0) - parse_examine_subclass(pstrdup(value)); else SetConfigOption(name, value, superuser() ? PGC_SUSET : PGC_USERSET); } @@ -612,12 +567,10 @@ GetPGVariable(const char *name) #endif else if (strcasecmp(name, "random_seed")==0) show_random_seed(); - else if (strcasecmp(name, "examine_subclass")==0) - show_examine_subclass(); else { - const char * val = GetConfigOption(name, superuser()); - elog(NOTICE, "%s = %s", name, val); + const char * val = GetConfigOption(name); + elog(NOTICE, "%s is %s", name, val); } } @@ -638,8 +591,6 @@ ResetPGVariable(const char *name) #endif else if (strcasecmp(name, "random_seed")==0) reset_random_seed(); - else if (strcasecmp(name, "examine_subclass")==0) - reset_examine_subclass(); else SetConfigOption(name, NULL, superuser() ? PGC_SUSET : PGC_USERSET); } diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y index 3f52e80105028dcc776031f6fc9fc5e4f3a6c1df..b17185e4639efd8bf8386f5e0fccbba2d366c249 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.173 2000/06/12 19:40:40 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.174 2000/06/22 22:31:18 petere Exp $ * * HISTORY * AUTHOR DATE MAJOR EVENT @@ -49,7 +49,7 @@ #include "storage/lmgr.h" #include "utils/acl.h" #include "utils/numeric.h" -#include "commands/variable.h" +#include "utils/guc.h" #ifdef MULTIBYTE #include "miscadmin.h" @@ -884,7 +884,7 @@ AlterTableStmt: AlterTableStmt *n = makeNode(AlterTableStmt); n->subtype = 'A'; n->relname = $3; - n->inh = $4 || examine_subclass; + n->inh = $4 || SQL_inheritance; n->def = $7; $$ = (Node *)n; } @@ -894,7 +894,7 @@ AlterTableStmt: AlterTableStmt *n = makeNode(AlterTableStmt); n->subtype = 'T'; n->relname = $3; - n->inh = $4 || examine_subclass; + n->inh = $4 || SQL_inheritance; n->name = $7; n->def = $8; $$ = (Node *)n; @@ -905,7 +905,7 @@ AlterTableStmt: AlterTableStmt *n = makeNode(AlterTableStmt); n->subtype = 'D'; n->relname = $3; - n->inh = $4 || examine_subclass; + n->inh = $4 || SQL_inheritance; n->name = $7; n->behavior = $8; $$ = (Node *)n; @@ -916,7 +916,7 @@ AlterTableStmt: AlterTableStmt *n = makeNode(AlterTableStmt); n->subtype = 'C'; n->relname = $3; - n->inh = $4 || examine_subclass; + n->inh = $4 || SQL_inheritance; n->def = $6; $$ = (Node *)n; } @@ -926,7 +926,7 @@ AlterTableStmt: AlterTableStmt *n = makeNode(AlterTableStmt); n->subtype = 'X'; n->relname = $3; - n->inh = $4 || examine_subclass; + n->inh = $4 || SQL_inheritance; n->name = $7; n->behavior = $8; $$ = (Node *)n; @@ -2562,7 +2562,7 @@ RenameStmt: ALTER TABLE relation_name opt_inh_star { RenameStmt *n = makeNode(RenameStmt); n->relname = $3; - n->inh = $4 || examine_subclass; + n->inh = $4 || SQL_inheritance; n->column = $7; n->newname = $9; $$ = (Node *)n; @@ -3806,7 +3806,7 @@ relation_expr: relation_name /* default inheritance */ $$ = makeNode(RelExpr); $$->relname = $1; - $$->inh = examine_subclass; + $$->inh = SQL_inheritance; } | relation_name '*' %prec '=' { diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c index ca32fcbe496401bb4e36d68e9b50c203142668bf..f712d7cfecac7a18259112902dabd06d89f11047 100644 --- a/src/backend/postmaster/postmaster.c +++ b/src/backend/postmaster/postmaster.c @@ -11,7 +11,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/postmaster/postmaster.c,v 1.148 2000/06/14 18:17:38 petere Exp $ + * $Header: /cvsroot/pgsql/src/backend/postmaster/postmaster.c,v 1.149 2000/06/22 22:31:20 petere Exp $ * * NOTES * @@ -364,6 +364,8 @@ PostmasterMain(int argc, char *argv[]) bool DataDirOK; /* We have a usable PGDATA value */ char original_extraoptions[MAXPGPATH]; + IsUnderPostmaster = true; /* so that backends know this */ + *original_extraoptions = '\0'; progname = argv[0]; @@ -379,7 +381,8 @@ PostmasterMain(int argc, char *argv[]) ResetAllOptions(); MyProcPid = getpid(); - DataDir = getenv("PGDATA"); /* default value */ + if (getenv("PGDATA")) + DataDir = strdup(getenv("PGDATA")); /* default value */ if (getenv("PGPORT")) PostPortName = atoi(getenv("PGPORT")); @@ -401,7 +404,11 @@ PostmasterMain(int argc, char *argv[]) while ((opt = getopt(argc, argv, "A:a:B:b:D:d:Film:MN:no:p:Ss-:")) != EOF) { if (opt == 'D') - DataDir = optarg; + { + if (DataDir) + free(DataDir); + DataDir = strdup(optarg); + } } optind = 1; /* start over */ @@ -2040,7 +2047,7 @@ PostmasterRandom(void) if (!initialized) { - Assert(random_seed != 0 && !IsUnderPostmaster); + Assert(random_seed != 0); srandom(random_seed); initialized = true; } diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c index 631f482e81aaf339ae9d259648cce7d46f361ba8..9209b6509f2e840cb1a70235e6ac61824e70b458 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.160 2000/06/15 04:10:19 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/tcop/postgres.c,v 1.161 2000/06/22 22:31:20 petere Exp $ * * NOTES * this is the "main" module of the postgres backend and @@ -824,13 +824,15 @@ PostgresMain(int argc, char *argv[], int real_argc, char *real_argv[]) /* * Set default values for command-line options. */ - IsUnderPostmaster = false; Noversion = false; EchoQuery = false; -#ifdef LOCK_MGR_DEBUG - LockDebug = 0; -#endif - DataDir = getenv("PGDATA"); + + if (!IsUnderPostmaster) + { + ResetAllOptions(); + if (getenv("PGDATA")) + DataDir = strdup(getenv("PGDATA")); + } StatFp = stderr; SetProcessingMode(InitProcessing); @@ -891,7 +893,11 @@ PostgresMain(int argc, char *argv[], int real_argc, char *real_argv[]) case 'D': /* PGDATA directory */ if (secure) - DataDir = optarg; + { + if (DataDir) + free(DataDir); + DataDir = strdup(optarg); + } break; case 'd': /* debug level */ @@ -1022,8 +1028,7 @@ PostgresMain(int argc, char *argv[], int real_argc, char *real_argv[]) */ if (secure) { - IsUnderPostmaster = true; - DBName = optarg; + DBName = strdup(optarg); secure = false; /* subsequent switches are NOT * secure */ } @@ -1170,12 +1175,6 @@ PostgresMain(int argc, char *argv[], int real_argc, char *real_argv[]) proc_exit(1); } - /* - * Make a copy of DataDir because the arguments and environment - * might be moved around later on. - */ - DataDir = strdup(DataDir); - /* * 1. Set BlockSig and UnBlockSig masks. 2. Set up signal handlers. 3. * Allow only SIGUSR1 signal (we never block it) during @@ -1330,7 +1329,12 @@ PostgresMain(int argc, char *argv[], int real_argc, char *real_argv[]) /* - * Set process params for ps + * Set process parameters for ps + * + * WARNING: On some platforms the environment will be moved + * around to make room for the ps display string. So any + * references to optarg or getenv() from above will be invalid + * after this call. Better use strdup or something similar. */ init_ps_display(real_argc, real_argv, userName, DBName, remote_host); set_ps_display("startup"); @@ -1382,7 +1386,7 @@ PostgresMain(int argc, char *argv[], int real_argc, char *real_argv[]) if (!IsUnderPostmaster) { puts("\nPOSTGRES backend interactive interface "); - puts("$Revision: 1.160 $ $Date: 2000/06/15 04:10:19 $\n"); + puts("$Revision: 1.161 $ $Date: 2000/06/22 22:31:20 $\n"); } /* diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c index 300bb19b60a3adde5c87989933ad3c70d6450458..f2cbe3651d39f08def7e7b25d5816e155f873154 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.3 2000/06/15 04:10:30 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/misc/guc.c,v 1.4 2000/06/22 22:31:21 petere Exp $ * * Copyright 2000 by PostgreSQL Global Development Group * Written by Peter Eisentraut <peter_e@gmx.net>. @@ -49,6 +49,7 @@ bool Show_executor_stats = false; bool Show_query_stats = false; /* this is sort of all three above together */ bool Show_btree_build_stats = false; +bool SQL_inheritance; enum config_type @@ -115,6 +116,23 @@ struct config_string }; +/* + * TO ADD AN OPTION: + * + * 1. Declare a global variable of type bool, int, double, or char* + * and make use of it. + * + * 2. Decide at what times it's safe to set the option. See guc.h for + * details. + * + * 3. Decide on a name, a default value, upper and lower bounds (if + * applicable), etc. + * + * 4. Add a record below. + * + * 5. Don't forget to document that option. + */ + /******** option names follow ********/ @@ -133,27 +151,27 @@ ConfigureNamesBool[] = {"geqo", PGC_USERSET, &enable_geqo, true}, {"net_server", PGC_POSTMASTER, &NetServer, false}, - {"fsync", PGC_BACKEND, &enableFsync, true}, - - {"log_connections", PGC_POSTMASTER, &Log_connections, false}, - {"log_timestamp", PGC_BACKEND, &Log_timestamp, false}, - {"log_pid", PGC_BACKEND, &Log_pid, false}, - - {"debug_print_query", PGC_SUSET, &Debug_print_query, false}, - {"debug_print_parse", PGC_SUSET, &Debug_print_parse, false}, - {"debug_print_rewritten", PGC_SUSET, &Debug_print_rewritten, false}, - {"debug_print_plan", PGC_SUSET, &Debug_print_plan, false}, - {"debug_pretty_print", PGC_SUSET, &Debug_pretty_print, false}, - - {"show_parser_stats", PGC_SUSET, &Show_parser_stats, false}, - {"show_planner_stats", PGC_SUSET, &Show_planner_stats, false}, - {"show_executor_stats", PGC_SUSET, &Show_executor_stats, false}, - {"show_query_stats", PGC_SUSET, &Show_query_stats, false}, + {"fsync", PGC_USERSET, &enableFsync, true}, + + {"log_connections", PGC_SIGHUP, &Log_connections, false}, + {"log_timestamp", PGC_SIGHUP, &Log_timestamp, false}, + {"log_pid", PGC_SIGHUP, &Log_pid, false}, + + {"debug_print_query", PGC_USERSET, &Debug_print_query, false}, + {"debug_print_parse", PGC_USERSET, &Debug_print_parse, false}, + {"debug_print_rewritten", PGC_USERSET, &Debug_print_rewritten, false}, + {"debug_print_plan", PGC_USERSET, &Debug_print_plan, false}, + {"debug_pretty_print", PGC_USERSET, &Debug_pretty_print, false}, + + {"show_parser_stats", PGC_USERSET, &Show_parser_stats, false}, + {"show_planner_stats", PGC_USERSET, &Show_planner_stats, false}, + {"show_executor_stats", PGC_USERSET, &Show_executor_stats, false}, + {"show_query_stats", PGC_USERSET, &Show_query_stats, false}, #ifdef BTREE_BUILD_STATS {"show_btree_build_stats", PGC_SUSET, &Show_btree_build_stats, false}, #endif - {"trace_notify", PGC_SUSET, &Trace_notify, false}, + {"trace_notify", PGC_USERSET, &Trace_notify, false}, #ifdef LOCK_DEBUG {"trace_locks", PGC_SUSET, &Trace_locks, false}, @@ -162,8 +180,10 @@ ConfigureNamesBool[] = {"debug_deadlocks", PGC_SUSET, &Debug_deadlocks, false}, #endif - {"hostlookup", PGC_POSTMASTER, &HostnameLookup, false}, - {"showportnumber", PGC_POSTMASTER, &ShowPortNumber, false}, + {"hostlookup", PGC_SIGHUP, &HostnameLookup, false}, + {"showportnumber", PGC_SIGHUP, &ShowPortNumber, false}, + + {"sql_inheritance", PGC_USERSET, &SQL_inheritance, true}, {NULL, 0, NULL, false} }; @@ -187,7 +207,7 @@ ConfigureNamesInt[] = 1000, 0, INT_MAX}, #ifdef ENABLE_SYSLOG - {"syslog", PGC_POSTMASTER, &Use_syslog, + {"syslog", PGC_SIGHUP, &Use_syslog, 0, 0, 2}, #endif @@ -203,11 +223,10 @@ ConfigureNamesInt[] = {"port", PGC_POSTMASTER, &PostPortName, DEF_PGPORT, 1, 65535}, - /* XXX Is this really changeable at runtime? */ - {"sort_mem", PGC_SUSET, &SortMem, + {"sort_mem", PGC_USERSET, &SortMem, 512, 1, INT_MAX}, - {"debug_level", PGC_SUSET, &DebugLvl, + {"debug_level", PGC_USERSET, &DebugLvl, 0, 0, 16}, #ifdef LOCK_DEBUG @@ -217,7 +236,7 @@ ConfigureNamesInt[] = 0, 0, INT_MAX}, #endif {"max_expr_depth", PGC_USERSET, &max_expr_depth, - DEFAULT_MAX_EXPR_DEPTH, 10, INT_MAX}, + DEFAULT_MAX_EXPR_DEPTH, 10, INT_MAX}, {NULL, 0, NULL, 0, 0, 0} }; @@ -483,29 +502,45 @@ set_config_option(const char * name, const char * value, GucContext return false; } - if (record->context < context) + /* + * Check if the option can be set at this time. See guc.h for the + * precise rules. Note that we don't want to throw errors if we're + * in the SIGHUP context. In that case we just ignore the attempt. + */ + if (record->context == PGC_POSTMASTER && context != PGC_POSTMASTER) { - /* can't set option right now */ - switch (context) - { - case PGC_USERSET: - elog(ERROR, "permission denied"); - /*NORETURN*/ - case PGC_SUSET: - elog(ERROR, "%s can only be set at startup", name); - /*NORETURN*/ - case PGC_SIGHUP: - /* ignore the option */ - return true; - case PGC_BACKEND: - /* ignore; is this the right thing to do? */ - return true; - default: - elog(FATAL, "%s:%d: internal error", __FILE__, __LINE__); - /*NORETURN*/ - } + if (context != PGC_SIGHUP) + elog(ERROR, "%s cannot be changed after server start", name); + else + return true; } + else if (record->context == PGC_SIGHUP && context != PGC_SIGHUP && + context != PGC_POSTMASTER) + { + elog(ERROR, "%s cannot be changed now", name); + /* Hmm, the idea of the SIGHUP context is "ought to be global, + * but can be changed after postmaster start". But there's + * nothing that prevents a crafty administrator from sending + * SIGHUP signals to individual backends only. */ + } + else if (record->context == PGC_BACKEND && context != PGC_BACKEND + && context != PGC_POSTMASTER) + { + if (context != PGC_SIGHUP) + elog(ERROR, "%s cannot be set after connection start", name); + else + return true; + } + else if (record->context == PGC_SUSET && (context == PGC_USERSET + || context == PGC_BACKEND)) + { + elog(ERROR, "permission denied"); + } + + /* + * Evaluate value and set variable + */ switch(type) { case PGC_BOOL: @@ -652,7 +687,7 @@ SetConfigOption(const char * name, const char * value, GucContext * valid until the next call to configuration related functions. */ const char * -GetConfigOption(const char * name, bool issuper) +GetConfigOption(const char * name) { struct config_generic * record; static char buffer[256]; @@ -662,13 +697,10 @@ GetConfigOption(const char * name, bool issuper) if (opttype == PGC_NONE) elog(ERROR, "not a valid option name: %s", name); - if (record->context < PGC_USERSET && !issuper) - elog(ERROR, "permission denied"); - switch(opttype) { case PGC_BOOL: - return *((struct config_bool *)record)->variable ? "true" : "false"; + return *((struct config_bool *)record)->variable ? "on" : "off"; case PGC_INT: snprintf(buffer, 256, "%d", *((struct config_int *)record)->variable); diff --git a/src/bin/initdb/initdb.sh b/src/bin/initdb/initdb.sh index 663b8a16c852de16d29d8d4f72aec440fd6df8a6..a83bb981246c04c97bf6a7968babcdf0534c1973 100644 --- a/src/bin/initdb/initdb.sh +++ b/src/bin/initdb/initdb.sh @@ -26,7 +26,7 @@ # # # IDENTIFICATION -# $Header: /cvsroot/pgsql/src/bin/initdb/Attic/initdb.sh,v 1.96 2000/06/12 03:40:41 momjian Exp $ +# $Header: /cvsroot/pgsql/src/bin/initdb/Attic/initdb.sh,v 1.97 2000/06/22 22:31:22 petere Exp $ # #------------------------------------------------------------------------- @@ -460,6 +460,7 @@ then cp "$PG_HBA_SAMPLE" "$PGDATA"/pg_hba.conf || exit_nicely cp "$POSTGRESQL_CONF_SAMPLE" "$PGDATA"/postgresql.conf || exit_nicely + chmod 0600 "$PGDATA"/pg_hba.conf "$PGDATA"/postgresql.conf echo "Adding template1 database to pg_database" diff --git a/src/include/commands/variable.h b/src/include/commands/variable.h index de26bcd6e04a56449bc90bf05fc32e2c1fb22f7a..87334dda4d4c7e3d04e3ace270dccd754cc9836e 100644 --- a/src/include/commands/variable.h +++ b/src/include/commands/variable.h @@ -2,7 +2,7 @@ * Headers for handling of 'SET var TO', 'SHOW var' and 'RESET var' * statements * - * $Id: variable.h,v 1.11 2000/06/09 01:44:24 momjian Exp $ + * $Id: variable.h,v 1.12 2000/06/22 22:31:23 petere Exp $ * */ #ifndef VARIABLE_H @@ -13,6 +13,5 @@ extern void GetPGVariable(const char *name); extern void ResetPGVariable(const char *name); extern void set_default_datestyle(void); -extern bool examine_subclass; #endif /* VARIABLE_H */ diff --git a/src/include/utils/guc.h b/src/include/utils/guc.h index bf0dfcbe4dcff2d2d1a239029008e35fb49b0646..c4ff10a14013ac1058d80210ce1180fee4769761 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.1 2000/05/31 00:28:40 petere Exp $ + * $Header: /cvsroot/pgsql/src/include/utils/guc.h,v 1.2 2000/06/22 22:31:24 petere Exp $ */ #ifndef GUC_H #define GUC_H @@ -12,20 +12,43 @@ #include "postgres.h" /* - * This is sort of a permission list. Those contexts with a higher - * number can also be set via the lower numbered ways. + * Certain options can only be set at certain times. The rules are + * like this: + * + * POSTMASTER options can only be set when the postmaster starts, + * either from the configuration file or the command line. + * + * SIGHUP options can only be set at postmaster startup or by changing + * the configuration file and sending the HUP signal to the postmaster + * or a backend process. (Notice that the signal receipt will not be + * evaluated immediately. The postmaster and the backend block at a + * certain point in their main loop. It's safer to wait than to read a + * file asynchronously.) + * + * BACKEND options can only be set at postmaster startup or with the + * PGOPTIONS variable from the client when the connection is + * initiated. Note that you cannot change this kind of option using + * the SIGHUP mechanism, that would defeat the purpose of this being + * fixed for a given backend once started. + * + * SUSET options can be set at postmaster startup, with the SIGHUP + * mechanism, or from SQL if you're a superuser. These options cannot + * be set using the PGOPTIONS mechanism, because there is not check as + * to who does this. + * + * USERSET options can be set by anyone any time. */ typedef enum { - PGC_POSTMASTER = 1, /* static postmaster option */ - PGC_BACKEND = 2, /* per backend startup option */ - PGC_SIGHUP = 4, /* can change this option via SIGHUP */ - PGC_SUSET = 8, /* can change this option via SET if superuser */ - PGC_USERSET = 16, /* everyone can change this option via SET */ + PGC_POSTMASTER, + PGC_SIGHUP, + PGC_BACKEND, + PGC_SUSET, + PGC_USERSET, } GucContext; void SetConfigOption(const char * name, const char * value, GucContext context); -const char * GetConfigOption(const char * name, bool issuper); +const char * GetConfigOption(const char * name); void ProcessConfigFile(GucContext context); void ResetAllOptions(void); @@ -44,4 +67,6 @@ extern bool Show_executor_stats; extern bool Show_query_stats; extern bool Show_btree_build_stats; +extern bool SQL_inheritance; + #endif /*GUC_H*/