]> granicus.if.org Git - postgresql/commitdiff
psql: Improve \pset without arguments
authorPeter Eisentraut <peter_e@gmx.net>
Sun, 19 Oct 2014 01:58:17 +0000 (21:58 -0400)
committerPeter Eisentraut <peter_e@gmx.net>
Sun, 19 Oct 2014 02:48:15 +0000 (22:48 -0400)
Revert the output of the individual backslash commands that change print
settings back to the 9.3 way (not showing the command name in
parentheses).  Implement \pset without arguments separately, showing all
settings with values in a table form.

src/bin/psql/command.c
src/test/regress/expected/psql.out

index 2227db476a4b76c19b9ebeff16218375dd1e53b2..5c430ea5c2b949585ef3db4ffb1c2f72a719d91b 100644 (file)
@@ -69,6 +69,7 @@ static void minimal_error_message(PGresult *res);
 
 static void printSSLInfo(void);
 static bool printPsetInfo(const char *param, struct printQueryOpt *popt);
+static char *pset_value_string(const char *param, struct printQueryOpt *popt);
 
 #ifdef WIN32
 static void checkWin32Codepage(void);
@@ -1050,9 +1051,9 @@ exec_command(const char *cmd,
 
                        int                     i;
                        static const char *const my_list[] = {
-                               "border", "columns", "expanded", "fieldsep",
+                               "border", "columns", "expanded", "fieldsep", "fieldsep_zero",
                                "footer", "format", "linestyle", "null",
-                               "numericlocale", "pager", "recordsep",
+                               "numericlocale", "pager", "recordsep", "recordsep_zero",
                                "tableattr", "title", "tuples_only",
                                "unicode_border_linestyle",
                                "unicode_column_linestyle",
@@ -1061,7 +1062,11 @@ exec_command(const char *cmd,
                        };
 
                        for (i = 0; my_list[i] != NULL; i++)
-                               printPsetInfo(my_list[i], &pset.popt);
+                       {
+                               char   *val = pset_value_string(my_list[i], &pset.popt);
+                               printf("%-24s %s\n", my_list[i], val);
+                               free(val);
+                       }
 
                        success = true;
                }
@@ -2214,10 +2219,6 @@ error:
 
 
 
-/*
- * do_pset
- *
- */
 static const char *
 _align2string(enum printFormat in)
 {
@@ -2287,6 +2288,10 @@ _unicode_linestyle2string(int linestyle)
        return "unknown";
 }
 
+/*
+ * do_pset
+ *
+ */
 bool
 do_pset(const char *param, const char *value, printQueryOpt *popt, bool quiet)
 {
@@ -2536,80 +2541,69 @@ printPsetInfo(const char *param, struct printQueryOpt *popt)
 
        /* show border style/width */
        if (strcmp(param, "border") == 0)
-       {
-               if (!popt->topt.border)
-                       printf(_("Border style (%s) unset.\n"), param);
-               else
-                       printf(_("Border style (%s) is %d.\n"), param,
-                                  popt->topt.border);
-       }
+               printf(_("Border style is %d.\n"), popt->topt.border);
 
        /* show the target width for the wrapped format */
        else if (strcmp(param, "columns") == 0)
        {
                if (!popt->topt.columns)
-                       printf(_("Target width (%s) unset.\n"), param);
+                       printf(_("Target width is unset.\n"));
                else
-                       printf(_("Target width (%s) is %d.\n"), param,
-                                  popt->topt.columns);
+                       printf(_("Target width is %d.\n"), popt->topt.columns);
        }
 
        /* 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 (%s) is on.\n"), param);
+                       printf(_("Expanded display is on.\n"));
                else if (popt->topt.expanded == 2)
-                       printf(_("Expanded display (%s) is used automatically.\n"), param);
+                       printf(_("Expanded display is used automatically.\n"));
                else
-                       printf(_("Expanded display (%s) is off.\n"), param);
+                       printf(_("Expanded display is off.\n"));
        }
 
        /* show field separator for unaligned text */
        else if (strcmp(param, "fieldsep") == 0)
        {
                if (popt->topt.fieldSep.separator_zero)
-                       printf(_("Field separator (%s) is zero byte.\n"), param);
+                       printf(_("Field separator is zero byte.\n"));
                else
-                       printf(_("Field separator (%s) is \"%s\".\n"), param,
+                       printf(_("Field separator is \"%s\".\n"),
                                   popt->topt.fieldSep.separator);
        }
 
        else if (strcmp(param, "fieldsep_zero") == 0)
        {
-               printf(_("Field separator (%s) is zero byte.\n"), param);
+               printf(_("Field separator is zero byte.\n"));
        }
 
        /* show disable "(x rows)" footer */
        else if (strcmp(param, "footer") == 0)
        {
                if (popt->topt.default_footer)
-                       printf(_("Default footer (%s) is on.\n"), param);
+                       printf(_("Default footer is on.\n"));
                else
-                       printf(_("Default footer (%s) is off.\n"), param);
+                       printf(_("Default footer is off.\n"));
        }
 
        /* show format */
        else if (strcmp(param, "format") == 0)
        {
-               if (!popt->topt.format)
-                       printf(_("Output format (%s) is aligned.\n"), param);
-               else
-                       printf(_("Output format (%s) is %s.\n"), param,
-                                  _align2string(popt->topt.format));
+               printf(_("Output format is %s.\n"), _align2string(popt->topt.format));
        }
 
        /* show table line style */
        else if (strcmp(param, "linestyle") == 0)
        {
-               printf(_("Line style (%s) is %s.\n"), param,
+               printf(_("Line style is %s.\n"),
                           get_line_style(&popt->topt)->name);
        }
 
        /* show null display */
        else if (strcmp(param, "null") == 0)
        {
-               printf(_("Null display (%s) is \"%s\".\n"), param,
+               printf(_("Null display is \"%s\".\n"),
                           popt->nullPrint ? popt->nullPrint : "");
        }
 
@@ -2617,65 +2611,65 @@ printPsetInfo(const char *param, struct printQueryOpt *popt)
        else if (strcmp(param, "numericlocale") == 0)
        {
                if (popt->topt.numericLocale)
-                       printf(_("Locale-adjusted numeric output (%s) is on.\n"), param);
+                       printf(_("Locale-adjusted numeric output is on.\n"));
                else
-                       printf(_("Locale-adjusted numeric output (%s) is off.\n"), param);
+                       printf(_("Locale-adjusted numeric output is off.\n"));
        }
 
        /* show toggle use of pager */
        else if (strcmp(param, "pager") == 0)
        {
                if (popt->topt.pager == 1)
-                       printf(_("Pager (%s) is used for long output.\n"), param);
+                       printf(_("Pager is used for long output.\n"));
                else if (popt->topt.pager == 2)
-                       printf(_("Pager (%s) is always used.\n"), param);
+                       printf(_("Pager is always used.\n"));
                else
-                       printf(_("Pager usage (%s) is off.\n"), param);
+                       printf(_("Pager usage is off.\n"));
        }
 
        /* show record separator for unaligned text */
        else if (strcmp(param, "recordsep") == 0)
        {
                if (popt->topt.recordSep.separator_zero)
-                       printf(_("Record separator (%s) is zero byte.\n"), param);
+                       printf(_("Record separator is zero byte.\n"));
                else if (strcmp(popt->topt.recordSep.separator, "\n") == 0)
-                       printf(_("Record separator (%s) is <newline>.\n"), param);
+                       printf(_("Record separator is <newline>.\n"));
                else
-                       printf(_("Record separator (%s) is \"%s\".\n"), param,
+                       printf(_("Record separator is \"%s\".\n"),
                                   popt->topt.recordSep.separator);
        }
 
        else if (strcmp(param, "recordsep_zero") == 0)
        {
-               printf(_("Record separator (%s) is zero byte.\n"), param);
+               printf(_("Record separator is zero byte.\n"));
        }
 
        /* show HTML table tag options */
        else if (strcmp(param, "T") == 0 || strcmp(param, "tableattr") == 0)
        {
                if (popt->topt.tableAttr)
-                       printf(_("Table attributes (%s) are \"%s\".\n"), param,
+                       printf(_("Table attributes are \"%s\".\n"),
                                   popt->topt.tableAttr);
                else
-                       printf(_("Table attributes (%s) unset.\n"), param);
+                       printf(_("Table attributes unset.\n"));
        }
 
        /* show title override */
        else if (strcmp(param, "title") == 0)
        {
                if (popt->title)
-                       printf(_("Title (%s) is \"%s\".\n"), param, popt->title);
+                       printf(_("Title is \"%s\".\n"), popt->title);
                else
-                       printf(_("Title (%s) unset.\n"), param);
+                       printf(_("Title is unset.\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)
-                       printf(_("Tuples only (%s) is on.\n"), param);
+                       printf(_("Tuples only is on.\n"));
                else
-                       printf(_("Tuples only (%s) is off.\n"), param);
+                       printf(_("Tuples only is off.\n"));
        }
 
        /* unicode style formatting */
@@ -2707,6 +2701,107 @@ printPsetInfo(const char *param, struct printQueryOpt *popt)
 }
 
 
+static const char *
+pset_bool_string(bool val)
+{
+       return val ? "on" : "off";
+}
+
+
+static char *
+pset_quoted_string(const char *str)
+{
+       char       *ret = pg_malloc(strlen(str) * 2 + 2);
+       char       *r = ret;
+
+       *r++ = '\'';
+
+       for (; *str; str++)
+       {
+               if (*str == '\n')
+               {
+                       *r++ = '\\';
+                       *r++ = 'n';
+               }
+               else if (*str == '\'')
+               {
+                       *r++ = '\\';
+                       *r++ = '\'';
+               }
+               else
+                       *r++ = *str;
+       }
+
+       *r++ = '\'';
+       *r = '\0';
+
+       return ret;
+}
+
+
+/*
+ * Return a malloc'ed string for the \pset value.
+ *
+ * Note that for some string parameters, print.c distinguishes between unset
+ * and empty string, but for others it doesn't.  This function should produce
+ * output that produces the correct setting when fed back into \pset.
+ */
+static char *
+pset_value_string(const char *param, struct printQueryOpt *popt)
+{
+       Assert(param != NULL);
+
+       if (strcmp(param, "border") == 0)
+               return psprintf("%d", popt->topt.border);
+       else if (strcmp(param, "columns") == 0)
+               return psprintf("%d", popt->topt.columns);
+       else if (strcmp(param, "expanded") == 0)
+               return pstrdup(popt->topt.expanded == 2
+                                          ? "auto"
+                                          : pset_bool_string(popt->topt.expanded));
+       else if (strcmp(param, "fieldsep") == 0)
+               return pset_quoted_string(popt->topt.fieldSep.separator
+                                                                 ? popt->topt.fieldSep.separator
+                                                                 : "");
+       else if (strcmp(param, "fieldsep_zero") == 0)
+               return pstrdup(pset_bool_string(popt->topt.fieldSep.separator_zero));
+       else if (strcmp(param, "footer") == 0)
+               return pstrdup(pset_bool_string(popt->topt.default_footer));
+       else if (strcmp(param, "format") == 0)
+               return psprintf("%s", _align2string(popt->topt.format));
+       else if (strcmp(param, "linestyle") == 0)
+               return psprintf("%s", get_line_style(&popt->topt)->name);
+       else if (strcmp(param, "null") == 0)
+               return pset_quoted_string(popt->nullPrint
+                                                                 ? popt->nullPrint
+                                                                 : "");
+       else if (strcmp(param, "numericlocale") == 0)
+               return pstrdup(pset_bool_string(popt->topt.numericLocale));
+       else if (strcmp(param, "pager") == 0)
+               return psprintf("%d", popt->topt.pager);
+       else if (strcmp(param, "recordsep") == 0)
+               return pset_quoted_string(popt->topt.recordSep.separator
+                                                                 ? popt->topt.recordSep.separator
+                                                                 : "");
+       else if (strcmp(param, "recordsep_zero") == 0)
+               return pstrdup(pset_bool_string(popt->topt.recordSep.separator_zero));
+       else if (strcmp(param, "tableattr") == 0)
+               return popt->topt.tableAttr ? pset_quoted_string(popt->topt.tableAttr) : pstrdup("");
+       else if (strcmp(param, "title") == 0)
+               return popt->title ? pset_quoted_string(popt->title) : pstrdup("");
+       else if (strcmp(param, "tuples_only") == 0)
+               return pstrdup(pset_bool_string(popt->topt.tuples_only));
+       else if (strcmp(param, "unicode_border_linestyle") == 0)
+               return pstrdup(_unicode_linestyle2string(popt->topt.unicode_border_linestyle));
+       else if (strcmp(param, "unicode_column_linestyle") == 0)
+               return pstrdup(_unicode_linestyle2string(popt->topt.unicode_column_linestyle));
+       else if (strcmp(param, "unicode_header_linestyle") == 0)
+               return pstrdup(_unicode_linestyle2string(popt->topt.unicode_header_linestyle));
+       else
+               return pstrdup("ERROR");
+}
+
+
 
 #ifndef WIN32
 #define DEFAULT_SHELL "/bin/sh"
index 3764127558c815ba627a7b66fd2301342fb7b450..e87b82b9910c4ce619f388293396d171ee289f90 100644 (file)
@@ -54,23 +54,25 @@ no rows returned for \gset
 \unset FETCH_COUNT
 -- show all pset options
 \pset
-Border style (border) is 1.
-Target width (columns) unset.
-Expanded display (expanded) is off.
-Field separator (fieldsep) is "|".
-Default footer (footer) is on.
-Output format (format) is aligned.
-Line style (linestyle) is ascii.
-Null display (null) is "".
-Locale-adjusted numeric output (numericlocale) is off.
-Pager (pager) is used for long output.
-Record separator (recordsep) is <newline>.
-Table attributes (tableattr) unset.
-Title (title) unset.
-Tuples only (tuples_only) is off.
-Unicode border linestyle is "single".
-Unicode column linestyle is "single".
-Unicode border linestyle is "single".
+border                   1
+columns                  0
+expanded                 off
+fieldsep                 '|'
+fieldsep_zero            off
+footer                   on
+format                   aligned
+linestyle                ascii
+null                     ''
+numericlocale            off
+pager                    1
+recordsep                '\n'
+recordsep_zero           off
+tableattr                
+title                    
+tuples_only              off
+unicode_border_linestyle single
+unicode_column_linestyle single
+unicode_header_linestyle single
 -- test multi-line headers, wrapping, and newline indicators
 prepare q as select array_to_string(array_agg(repeat('x',2*n)),E'\n') as "ab