Hi, I was looking at psql 8.3 documention about \pset options and saw that there was the following note :
"Note: It is an error to call \pset without any arguments. In the future this case might show the current status of all printing options." I looked backward and forward to find that this note is present in all versions since 7.1 up to 9.3, maybe it is time to add this little feature. I've attached a patch to add the usage of the \pset command without any arguments to displays current status of all printing options instead of the error message. Here is a sample output: (postgres@[local]:5494) [postgres] > \pset Output format is aligned. Border style is 2. Expanded display is used automatically. Null display is "NULL". Field separator is "|". Tuples only is off. Title is unset. Table attributes unset. Line style is unicode. Pager is used for long output. Record separator is <newline>. (postgres@[local]:5494) [postgres] > To avoid redundant code I've added a new method printPsetInfo() so that do_pset() and exec_command() will used the same output message, they are all in src/bin/psql/command.c. For example: (postgres@[local]:5494) [postgres] > \pset null 'NULL' Null display is "NULL". (postgres@[local]:5494) [postgres] > The patch print all variables information from struct printTableOpt when \pset is given without any arguments and also update documentation. Let me know if there's any additional work to do on this basic patch or something that I've omitted. Best regards, -- Gilles Darold http://dalibo.com - http://dalibo.org
diff --git a/doc/src/sgml/ref/psql-ref.sgml b/doc/src/sgml/ref/psql-ref.sgml index 574db5c..a3bf555 100644 --- a/doc/src/sgml/ref/psql-ref.sgml +++ b/doc/src/sgml/ref/psql-ref.sgml @@ -2272,13 +2272,9 @@ lo_import 152801 </para> </tip> - <note> - <para> - It is an error to call <command>\pset</command> without any - arguments. In the future this case might show the current status - of all printing options. + <para><command>\pset</> without any arguments displays current status + of all printing options. </para> - </note> </listitem> </varlistentry> diff --git a/src/bin/psql/command.c b/src/bin/psql/command.c index 351e684..daf7ac7 100644 --- a/src/bin/psql/command.c +++ b/src/bin/psql/command.c @@ -68,6 +68,7 @@ static int strip_lineno_from_funcdesc(char *func); static void minimal_error_message(PGresult *res); static void printSSLInfo(void); +static bool printPsetInfo(const char *param, struct printQueryOpt *popt); #ifdef WIN32 static void checkWin32Codepage(void); @@ -1045,8 +1046,16 @@ exec_command(const char *cmd, if (!opt0) { - psql_error("\\%s: missing required argument\n", cmd); - success = false; + size_t i; + /* list all variables */ + static const char *const my_list[] = {"format", "border", + "expanded", "null", "fieldsep", "tuples_only", "title", + "tableattr", "linestyle", "pager", "recordsep", NULL}; + for (i = 0; my_list[i] != NULL; i++) { + printPsetInfo(my_list[i], &pset.popt); + } + + success = true; } else success = do_pset(opt0, opt1, &pset.popt, pset.quiet); @@ -2275,8 +2284,6 @@ do_pset(const char *param, const char *value, printQueryOpt *popt, bool quiet) return false; } - if (!quiet) - printf(_("Output format is %s.\n"), _align2string(popt->topt.format)); } /* set table line style */ @@ -2295,10 +2302,6 @@ do_pset(const char *param, const char *value, printQueryOpt *popt, bool quiet) psql_error("\\pset: allowed line styles are ascii, old-ascii, unicode\n"); return false; } - - if (!quiet) - printf(_("Line style is %s.\n"), - get_line_style(&popt->topt)->name); } /* set border style/width */ @@ -2306,9 +2309,6 @@ do_pset(const char *param, const char *value, printQueryOpt *popt, bool quiet) { if (value) popt->topt.border = atoi(value); - - if (!quiet) - printf(_("Border style is %d.\n"), popt->topt.border); } /* set expanded/vertical mode */ @@ -2320,15 +2320,6 @@ do_pset(const char *param, const char *value, printQueryOpt *popt, bool quiet) popt->topt.expanded = ParseVariableBool(value); else popt->topt.expanded = !popt->topt.expanded; - if (!quiet) - { - if (popt->topt.expanded == 1) - printf(_("Expanded display is on.\n")); - else if (popt->topt.expanded == 2) - printf(_("Expanded display is used automatically.\n")); - else - printf(_("Expanded display is off.\n")); - } } /* locale-aware numeric output */ @@ -2338,13 +2329,6 @@ do_pset(const char *param, const char *value, printQueryOpt *popt, bool quiet) popt->topt.numericLocale = ParseVariableBool(value); else popt->topt.numericLocale = !popt->topt.numericLocale; - if (!quiet) - { - if (popt->topt.numericLocale) - puts(_("Showing locale-adjusted numeric output.")); - else - puts(_("Locale-adjusted numeric output is off.")); - } } /* null display */ @@ -2355,8 +2339,6 @@ do_pset(const char *param, const char *value, printQueryOpt *popt, bool quiet) free(popt->nullPrint); popt->nullPrint = pg_strdup(value); } - if (!quiet) - printf(_("Null display is \"%s\".\n"), popt->nullPrint ? popt->nullPrint : ""); } /* field separator for unaligned text */ @@ -2368,13 +2350,6 @@ do_pset(const char *param, const char *value, printQueryOpt *popt, bool quiet) popt->topt.fieldSep.separator = pg_strdup(value); popt->topt.fieldSep.separator_zero = false; } - if (!quiet) - { - if (popt->topt.fieldSep.separator_zero) - printf(_("Field separator is zero byte.\n")); - else - printf(_("Field separator is \"%s\".\n"), popt->topt.fieldSep.separator); - } } else if (strcmp(param, "fieldsep_zero") == 0) @@ -2382,8 +2357,6 @@ do_pset(const char *param, const char *value, printQueryOpt *popt, bool quiet) free(popt->topt.fieldSep.separator); popt->topt.fieldSep.separator = NULL; popt->topt.fieldSep.separator_zero = true; - if (!quiet) - printf(_("Field separator is zero byte.\n")); } /* record separator for unaligned text */ @@ -2395,15 +2368,6 @@ do_pset(const char *param, const char *value, printQueryOpt *popt, bool quiet) popt->topt.recordSep.separator = pg_strdup(value); popt->topt.recordSep.separator_zero = false; } - if (!quiet) - { - if (popt->topt.recordSep.separator_zero) - printf(_("Record separator is zero byte.\n")); - else if (strcmp(popt->topt.recordSep.separator, "\n") == 0) - printf(_("Record separator is <newline>.")); - else - printf(_("Record separator is \"%s\".\n"), popt->topt.recordSep.separator); - } } else if (strcmp(param, "recordsep_zero") == 0) @@ -2411,8 +2375,6 @@ do_pset(const char *param, const char *value, printQueryOpt *popt, bool quiet) free(popt->topt.recordSep.separator); popt->topt.recordSep.separator = NULL; popt->topt.recordSep.separator_zero = true; - if (!quiet) - printf(_("Record separator is zero byte.\n")); } /* toggle between full and tuples-only format */ @@ -2422,13 +2384,6 @@ do_pset(const char *param, const char *value, printQueryOpt *popt, bool quiet) popt->topt.tuples_only = ParseVariableBool(value); else popt->topt.tuples_only = !popt->topt.tuples_only; - if (!quiet) - { - if (popt->topt.tuples_only) - puts(_("Showing only tuples.")); - else - puts(_("Tuples only is off.")); - } } /* set title override */ @@ -2439,14 +2394,6 @@ do_pset(const char *param, const char *value, printQueryOpt *popt, bool quiet) popt->title = NULL; else popt->title = pg_strdup(value); - - if (!quiet) - { - if (popt->title) - printf(_("Title is \"%s\".\n"), popt->title); - else - printf(_("Title is unset.\n")); - } } /* set HTML table tag options */ @@ -2457,14 +2404,6 @@ do_pset(const char *param, const char *value, printQueryOpt *popt, bool quiet) popt->topt.tableAttr = NULL; else popt->topt.tableAttr = pg_strdup(value); - - if (!quiet) - { - if (popt->topt.tableAttr) - printf(_("Table attribute is \"%s\".\n"), popt->topt.tableAttr); - else - printf(_("Table attributes unset.\n")); - } } /* toggle use of pager */ @@ -2481,15 +2420,6 @@ do_pset(const char *param, const char *value, printQueryOpt *popt, bool quiet) popt->topt.pager = 0; else popt->topt.pager = 1; - if (!quiet) - { - if (popt->topt.pager == 1) - puts(_("Pager is used for long output.")); - else if (popt->topt.pager == 2) - puts(_("Pager is always used.")); - else - puts(_("Pager usage is off.")); - } } /* disable "(x rows)" footer */ @@ -2499,13 +2429,6 @@ do_pset(const char *param, const char *value, printQueryOpt *popt, bool quiet) popt->topt.default_footer = ParseVariableBool(value); else popt->topt.default_footer = !popt->topt.default_footer; - if (!quiet) - { - if (popt->topt.default_footer) - puts(_("Default footer is on.")); - else - puts(_("Default footer is off.")); - } } /* set border style/width */ @@ -2513,9 +2436,6 @@ do_pset(const char *param, const char *value, printQueryOpt *popt, bool quiet) { if (value) popt->topt.columns = atoi(value); - - if (!quiet) - printf(_("Target width is %d.\n"), popt->topt.columns); } else @@ -2524,10 +2444,164 @@ do_pset(const char *param, const char *value, printQueryOpt *popt, bool quiet) return false; } + if (!quiet) + printPsetInfo(param, &pset.popt); + return true; } +static bool +printPsetInfo(const char *param, struct printQueryOpt *popt) +{ + Assert(param != NULL); + + /* show format */ + if (strcmp(param, "format") == 0) + { + if (!popt->topt.format) + ; + else + printf(_("Output format is %s.\n"), + _align2string(popt->topt.format)); + } + /* show table line style */ + else if (strcmp(param, "linestyle") == 0) + { + if (!popt->topt.line_style) + ; + else + printf(_("Line style is %s.\n"), + get_line_style(&popt->topt)->name); + } + + /* show border style/width */ + else if (strcmp(param, "border") == 0) + { + if (!popt->topt.border) + ; + else + printf(_("Border style is %d.\n"), + popt->topt.border); + } + + /* show expanded/vertical mode */ + else if (strcmp(param, "x") == 0 || strcmp(param, "expanded") == 0 || strcmp(param, "vertical") == 0) + { + if (popt->topt.expanded == 1) + printf(_("Expanded display is on.\n")); + else if (popt->topt.expanded == 2) + printf(_("Expanded display is used automatically.\n")); + else + printf(_("Expanded display is off.\n")); + } + + /* show locale-aware numeric output */ + else if (strcmp(param, "numericlocale") == 0) + { + if (popt->topt.numericLocale) + puts(_("Showing locale-adjusted numeric output.")); + else + puts(_("Locale-adjusted numeric output is off.")); + } + + /* show null display */ + else if (strcmp(param, "null") == 0) + { + printf(_("Null display is \"%s\".\n"), popt->nullPrint ? popt->nullPrint : ""); + } + + /* show field separator for unaligned text */ + else if (strcmp(param, "fieldsep") == 0) + { + if (popt->topt.fieldSep.separator_zero) + printf(_("Field separator is zero byte.\n")); + else + printf(_("Field separator is \"%s\".\n"), popt->topt.fieldSep.separator); + } + + else if (strcmp(param, "fieldsep_zero") == 0) + { + printf(_("Field separator is zero byte.\n")); + } + + /* show record separator for unaligned text */ + else if (strcmp(param, "recordsep") == 0) + { + if (popt->topt.recordSep.separator_zero) + printf(_("Record separator is zero byte.\n")); + else if (strcmp(popt->topt.recordSep.separator, "\n") == 0) + printf(_("Record separator is <newline>.\n")); + else + printf(_("Record separator is \"%s\".\n"), popt->topt.recordSep.separator); + } + + else if (strcmp(param, "recordsep_zero") == 0) + { + printf(_("Record separator is zero byte.\n")); + } + + /* show toggle between full and tuples-only format */ + else if (strcmp(param, "t") == 0 || strcmp(param, "tuples_only") == 0) + { + if (popt->topt.tuples_only) + puts(_("Showing only tuples.")); + else + puts(_("Tuples only is off.")); + } + + /* show title override */ + else if (strcmp(param, "title") == 0) + { + if (popt->title) + printf(_("Title is \"%s\".\n"), popt->title); + else + printf(_("Title is unset.\n")); + } + + /* show HTML table tag options */ + else if (strcmp(param, "T") == 0 || strcmp(param, "tableattr") == 0) + { + if (popt->topt.tableAttr) + printf(_("Table attribute is \"%s\".\n"), popt->topt.tableAttr); + else + printf(_("Table attributes unset.\n")); + } + + /* show toggle use of pager */ + else if (strcmp(param, "pager") == 0) + { + if (popt->topt.pager == 1) + puts(_("Pager is used for long output.")); + else if (popt->topt.pager == 2) + puts(_("Pager is always used.")); + else + puts(_("Pager usage is off.")); + } + + /* disable "(x rows)" footer */ + else if (strcmp(param, "footer") == 0) + { + if (popt->topt.default_footer) + puts(_("Default footer is on.")); + else + puts(_("Default footer is off.")); + } + + /* set border style/width */ + else if (strcmp(param, "columns") == 0) + { + printf(_("Target width is %d.\n"), popt->topt.columns); + } + + else + { + psql_error("\\pset: unknown option: %s\n", param); + return false; + } + + return true; +} #ifndef WIN32 #define DEFAULT_SHELL "/bin/sh"
-- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers