diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/bin/psql/command.c | 189 | ||||
-rw-r--r-- | src/test/regress/expected/psql.out | 36 |
2 files changed, 161 insertions, 64 deletions
diff --git a/src/bin/psql/command.c b/src/bin/psql/command.c index 2227db476a4..5c430ea5c2b 100644 --- a/src/bin/psql/command.c +++ b/src/bin/psql/command.c @@ -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" diff --git a/src/test/regress/expected/psql.out b/src/test/regress/expected/psql.out index 3764127558c..e87b82b9910 100644 --- a/src/test/regress/expected/psql.out +++ b/src/test/regress/expected/psql.out @@ -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 |