diff --git a/doc/src/sgml/ref/psql-ref.sgml b/doc/src/sgml/ref/psql-ref.sgml
index c90947bba90..f382034c313 100644
--- a/doc/src/sgml/ref/psql-ref.sgml
+++ b/doc/src/sgml/ref/psql-ref.sgml
@@ -157,8 +157,7 @@ EOF
Echo the actual queries generated by \d and other backslash
commands. You can use this to study psql's
internal operations. This is equivalent to
- setting the variable ECHO_HIDDEN from within
- psql.
+ setting the variable ECHO_HIDDEN to on>.
@@ -317,8 +316,8 @@ EOF
quietly. By default, it prints welcome messages and various
informational output. If this option is used, none of this
happens. This is useful with the option.
- Within psql you can also set the
- QUIET variable to achieve the same effect.
+ This is equivalent to setting the variable QUIET
+ to on>.
@@ -2455,8 +2454,9 @@ bar
ECHO_HIDDEN
- When this variable is set and a backslash command queries the
- database, the query is first shown. This way you can study the
+ When this variable is set to on> and a backslash command
+ queries the database, the query is first shown.
+ This feature helps you to study
PostgreSQL internals and provide
similar functionality in your own programs. (To select this behavior
on program start-up, use the switch .) If you set
@@ -2614,16 +2614,16 @@ bar
ON_ERROR_ROLLBACK
- When on>, if a statement in a transaction block
+ When set to on>, if a statement in a transaction block
generates an error, the error is ignored and the transaction
- continues. When interactive>, such errors are only
+ continues. When set to interactive>, such errors are only
ignored in interactive sessions, and not when reading script
- files. When off> (the default), a statement in a
+ files. When unset or set to off>, a statement in a
transaction block that generates an error aborts the entire
- transaction. The on_error_rollback-on mode works by issuing an
+ transaction. The error rollback mode works by issuing an
implicit SAVEPOINT> for you, just before each command
- that is in a transaction block, and rolls back to the savepoint
- on error.
+ that is in a transaction block, and then rolling back to the
+ savepoint if the command fails.
@@ -2636,9 +2636,10 @@ bar
as a malformed SQL command or internal
meta-command, processing continues. This has been the
traditional behavior of psql but it
- is sometimes not desirable. If this variable is set, script
- processing will immediately terminate. If the script was called
- from another script it will terminate in the same fashion. If
+ is sometimes not desirable. If this variable is set to on>,
+ script processing will immediately terminate after an error.
+ If the script was called
+ from another script, that one will terminate in the same fashion. If
the outermost script was not called from an interactive
psql session but rather using the
option, psql will
@@ -2677,8 +2678,8 @@ bar
QUIET
- This variable is equivalent to the command line option
- . It is probably not too useful in
+ Setting this variable to on> is equivalent to the command
+ line option . It is probably not too useful in
interactive mode.
@@ -2688,8 +2689,8 @@ bar
SINGLELINE
- This variable is equivalent to the command line option
- .
+ Setting this variable to on> is equivalent to the command
+ line option .
@@ -2698,8 +2699,8 @@ bar
SINGLESTEP
- This variable is equivalent to the command line option
- .
+ Setting this variable to on> is equivalent to the command
+ line option .
diff --git a/src/bin/psql/command.c b/src/bin/psql/command.c
index 35c757ec415..d2967edaa0a 100644
--- a/src/bin/psql/command.c
+++ b/src/bin/psql/command.c
@@ -1025,7 +1025,7 @@ exec_command(const char *cmd,
OT_NORMAL, NULL, false);
if (opt)
- pset.timing = ParseVariableBool(opt);
+ pset.timing = ParseVariableBool(opt, "\\timing");
else
pset.timing = !pset.timing;
if (!pset.quiet)
@@ -1882,10 +1882,12 @@ do_pset(const char *param, const char *value, printQueryOpt *popt, bool quiet)
}
/* set expanded/vertical mode */
- else if (strcmp(param, "x") == 0 || strcmp(param, "expanded") == 0 || strcmp(param, "vertical") == 0)
+ else if (strcmp(param, "x") == 0 ||
+ strcmp(param, "expanded") == 0 ||
+ strcmp(param, "vertical") == 0)
{
if (value)
- popt->topt.expanded = ParseVariableBool(value);
+ popt->topt.expanded = ParseVariableBool(value, param);
else
popt->topt.expanded = !popt->topt.expanded;
if (!quiet)
@@ -1898,7 +1900,7 @@ do_pset(const char *param, const char *value, printQueryOpt *popt, bool quiet)
else if (strcmp(param, "numericlocale") == 0)
{
if (value)
- popt->topt.numericLocale = ParseVariableBool(value);
+ popt->topt.numericLocale = ParseVariableBool(value, param);
else
popt->topt.numericLocale = !popt->topt.numericLocale;
if (!quiet)
@@ -1955,7 +1957,7 @@ do_pset(const char *param, const char *value, printQueryOpt *popt, bool quiet)
else if (strcmp(param, "t") == 0 || strcmp(param, "tuples_only") == 0)
{
if (value)
- popt->topt.tuples_only = ParseVariableBool(value);
+ popt->topt.tuples_only = ParseVariableBool(value, param);
else
popt->topt.tuples_only = !popt->topt.tuples_only;
if (!quiet)
@@ -2009,10 +2011,12 @@ do_pset(const char *param, const char *value, printQueryOpt *popt, bool quiet)
if (value && pg_strcasecmp(value, "always") == 0)
popt->topt.pager = 2;
else if (value)
- if (ParseVariableBool(value))
+ {
+ if (ParseVariableBool(value, param))
popt->topt.pager = 1;
else
popt->topt.pager = 0;
+ }
else if (popt->topt.pager == 1)
popt->topt.pager = 0;
else
@@ -2032,7 +2036,7 @@ do_pset(const char *param, const char *value, printQueryOpt *popt, bool quiet)
else if (strcmp(param, "footer") == 0)
{
if (value)
- popt->default_footer = ParseVariableBool(value);
+ popt->default_footer = ParseVariableBool(value, param);
else
popt->default_footer = !popt->default_footer;
if (!quiet)
diff --git a/src/bin/psql/startup.c b/src/bin/psql/startup.c
index 805909ea254..15a0965865f 100644
--- a/src/bin/psql/startup.c
+++ b/src/bin/psql/startup.c
@@ -631,31 +631,31 @@ showVersion(void)
static void
autocommit_hook(const char *newval)
{
- pset.autocommit = ParseVariableBool(newval);
+ pset.autocommit = ParseVariableBool(newval, "AUTOCOMMIT");
}
static void
on_error_stop_hook(const char *newval)
{
- pset.on_error_stop = ParseVariableBool(newval);
+ pset.on_error_stop = ParseVariableBool(newval, "ON_ERROR_STOP");
}
static void
quiet_hook(const char *newval)
{
- pset.quiet = ParseVariableBool(newval);
+ pset.quiet = ParseVariableBool(newval, "QUIET");
}
static void
singleline_hook(const char *newval)
{
- pset.singleline = ParseVariableBool(newval);
+ pset.singleline = ParseVariableBool(newval, "SINGLELINE");
}
static void
singlestep_hook(const char *newval)
{
- pset.singlestep = ParseVariableBool(newval);
+ pset.singlestep = ParseVariableBool(newval, "SINGLESTEP");
}
static void
@@ -669,12 +669,18 @@ echo_hook(const char *newval)
{
if (newval == NULL)
pset.echo = PSQL_ECHO_NONE;
- else if (strcmp(newval, "queries") == 0)
+ else if (pg_strcasecmp(newval, "queries") == 0)
pset.echo = PSQL_ECHO_QUERIES;
- else if (strcmp(newval, "all") == 0)
+ else if (pg_strcasecmp(newval, "all") == 0)
pset.echo = PSQL_ECHO_ALL;
- else
+ else if (pg_strcasecmp(newval, "none") == 0)
pset.echo = PSQL_ECHO_NONE;
+ else
+ {
+ psql_error("unrecognized value \"%s\" for \"%s\"; assuming \"%s\"\n",
+ newval, "ECHO", "none");
+ pset.echo = PSQL_ECHO_NONE;
+ }
}
static void
@@ -682,12 +688,12 @@ echo_hidden_hook(const char *newval)
{
if (newval == NULL)
pset.echo_hidden = PSQL_ECHO_HIDDEN_OFF;
- else if (strcmp(newval, "noexec") == 0)
+ else if (pg_strcasecmp(newval, "noexec") == 0)
pset.echo_hidden = PSQL_ECHO_HIDDEN_NOEXEC;
- else if (pg_strcasecmp(newval, "off") == 0)
- pset.echo_hidden = PSQL_ECHO_HIDDEN_OFF;
- else
+ else if (ParseVariableBool(newval, "ECHO_HIDDEN"))
pset.echo_hidden = PSQL_ECHO_HIDDEN_ON;
+ else /* ParseVariableBool printed msg if needed */
+ pset.echo_hidden = PSQL_ECHO_HIDDEN_OFF;
}
static void
@@ -697,10 +703,10 @@ on_error_rollback_hook(const char *newval)
pset.on_error_rollback = PSQL_ERROR_ROLLBACK_OFF;
else if (pg_strcasecmp(newval, "interactive") == 0)
pset.on_error_rollback = PSQL_ERROR_ROLLBACK_INTERACTIVE;
- else if (pg_strcasecmp(newval, "off") == 0)
- pset.on_error_rollback = PSQL_ERROR_ROLLBACK_OFF;
- else
+ else if (ParseVariableBool(newval, "ON_ERROR_ROLLBACK"))
pset.on_error_rollback = PSQL_ERROR_ROLLBACK_ON;
+ else /* ParseVariableBool printed msg if needed */
+ pset.on_error_rollback = PSQL_ERROR_ROLLBACK_OFF;
}
static void
@@ -708,14 +714,20 @@ histcontrol_hook(const char *newval)
{
if (newval == NULL)
pset.histcontrol = hctl_none;
- else if (strcmp(newval, "ignorespace") == 0)
+ else if (pg_strcasecmp(newval, "ignorespace") == 0)
pset.histcontrol = hctl_ignorespace;
- else if (strcmp(newval, "ignoredups") == 0)
+ else if (pg_strcasecmp(newval, "ignoredups") == 0)
pset.histcontrol = hctl_ignoredups;
- else if (strcmp(newval, "ignoreboth") == 0)
+ else if (pg_strcasecmp(newval, "ignoreboth") == 0)
pset.histcontrol = hctl_ignoreboth;
- else
+ else if (pg_strcasecmp(newval, "none") == 0)
pset.histcontrol = hctl_none;
+ else
+ {
+ psql_error("unrecognized value \"%s\" for \"%s\"; assuming \"%s\"\n",
+ newval, "HISTCONTROL", "none");
+ pset.histcontrol = hctl_none;
+ }
}
static void
@@ -741,14 +753,18 @@ verbosity_hook(const char *newval)
{
if (newval == NULL)
pset.verbosity = PQERRORS_DEFAULT;
- else if (strcmp(newval, "default") == 0)
+ else if (pg_strcasecmp(newval, "default") == 0)
pset.verbosity = PQERRORS_DEFAULT;
- else if (strcmp(newval, "terse") == 0)
+ else if (pg_strcasecmp(newval, "terse") == 0)
pset.verbosity = PQERRORS_TERSE;
- else if (strcmp(newval, "verbose") == 0)
+ else if (pg_strcasecmp(newval, "verbose") == 0)
pset.verbosity = PQERRORS_VERBOSE;
else
+ {
+ psql_error("unrecognized value \"%s\" for \"%s\"; assuming \"%s\"\n",
+ newval, "VERBOSITY", "default");
pset.verbosity = PQERRORS_DEFAULT;
+ }
if (pset.db)
PQsetErrorVerbosity(pset.db, pset.verbosity);
diff --git a/src/bin/psql/variables.c b/src/bin/psql/variables.c
index 7a479a50604..ce0d983f52c 100644
--- a/src/bin/psql/variables.c
+++ b/src/bin/psql/variables.c
@@ -49,11 +49,16 @@ GetVariable(VariableSpace space, const char *name)
}
/*
- * Try to interpret value as boolean value. Valid values are: true,
- * false, yes, no, on, off, 1, 0; as well as unique prefixes thereof.
+ * Try to interpret "value" as boolean value.
+ *
+ * Valid values are: true, false, yes, no, on, off, 1, 0; as well as unique
+ * prefixes thereof.
+ *
+ * "name" is the name of the variable we're assigning to, to use in error
+ * report if any. Pass name == NULL to suppress the error report.
*/
bool
-ParseVariableBool(const char *value)
+ParseVariableBool(const char *value, const char *name)
{
size_t len;
@@ -82,7 +87,9 @@ ParseVariableBool(const char *value)
else
{
/* NULL is treated as false, so a non-matching value is 'true' */
- psql_error("unrecognized boolean value; assuming \"on\".\n");
+ if (name)
+ psql_error("unrecognized value \"%s\" for \"%s\"; assuming \"%s\"\n",
+ value, name, "on");
return true;
}
/* suppress compiler warning */
diff --git a/src/bin/psql/variables.h b/src/bin/psql/variables.h
index eb73ebdc062..2c49137e4dc 100644
--- a/src/bin/psql/variables.h
+++ b/src/bin/psql/variables.h
@@ -39,7 +39,7 @@ typedef struct _variable *VariableSpace;
VariableSpace CreateVariableSpace(void);
const char *GetVariable(VariableSpace space, const char *name);
-bool ParseVariableBool(const char *val);
+bool ParseVariableBool(const char *value, const char *name);
int ParseVariableNum(const char *val,
int defaultval,
int faultval,