From: Marko Tiikkaja <marko@joh.to>
To: PostgreSQL hackers <pgsql-hackers@postgresql.org>
Subject: psql: add \pset true/false
Date: Wed, 28 Oct 2015 10:03:18 +0100
Message-ID: <56308F56.8060908@joh.to> (raw)
List-Unsubscribe: <mailto:majordomo@postgresql.org?body=unsub%20pgsql-hackers>
Hello hello,
Since the default t/f output for booleans is not very user friendly,
attached is a patch which enables you to do for example the following:
=# \pset true TRUE
Boolean TRUE display is "TRUE".
=# \pset false FALSE
Boolean FALSE display is "FALSE".
=# select true, false;
bool | bool
------+-------
TRUE | FALSE
(1 row)
(For anyone reviewing: I didn't touch the parts of describe.c which do
this for nullPrint:
myopt.nullPrint = NULL;
since I thought it was dubious in the first place, and I don't think we
output booleans in the describe commands.)
.m
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackersAttachments:psqltruefalse_v1.patch (text/x-patch, 6.2K) downloaddiff --git a/doc/src/sgml/ref/psql-ref.sgml b/doc/src/sgml/ref/psql-ref.sgmlindex 212dbfa..2048ba3 100644--- a/doc/src/sgml/ref/psql-ref.sgml+++ b/doc/src/sgml/ref/psql-ref.sgml@@ -2229,6 +2229,26 @@ lo_import 152801
</varlistentry>
<varlistentry>
+ <term><literal>true</literal></term>+ <listitem>+ <para>+ Sets the string to be printed in place of a boolean TRUE value.+ The default is to print a 't' character.+ </para>+ </listitem>+ </varlistentry>++ <varlistentry>+ <term><literal>false</literal></term>+ <listitem>+ <para>+ Sets the string to be printed in place of a boolean FALSE value.+ The default is to print an 'f' character.+ </para>+ </listitem>+ </varlistentry>++ <varlistentry>
<term><literal>null</literal></term>
<listitem>
<para>
diff --git a/src/bin/psql/command.c b/src/bin/psql/command.cindex 5163c76..7fadb0a 100644--- a/src/bin/psql/command.c+++ b/src/bin/psql/command.c@@ -1151,7 +1151,7 @@ exec_command(const char *cmd,
int i;
static const char *const my_list[] = {
"border", "columns", "expanded", "fieldsep", "fieldsep_zero",
- "footer", "format", "linestyle", "null",+ "footer", "format", "linestyle", "true", "false", "null",
"numericlocale", "pager", "pager_min_lines",
"recordsep", "recordsep_zero",
"tableattr", "title", "tuples_only",
@@ -2591,6 +2591,26 @@ do_pset(const char *param, const char *value, printQueryOpt *popt, bool quiet)
}
}
+ /* boolean TRUE display */+ else if (strcmp(param, "true") == 0)+ {+ if (value)+ {+ free(popt->truePrint);+ popt->truePrint = pg_strdup(value);+ }+ }++ /* boolean FALSE display */+ else if (strcmp(param, "false") == 0)+ {+ if (value)+ {+ free(popt->falsePrint);+ popt->falsePrint = pg_strdup(value);+ }+ }+
/* field separator for unaligned text */
else if (strcmp(param, "fieldsep") == 0)
{
@@ -2782,6 +2802,20 @@ printPsetInfo(const char *param, struct printQueryOpt *popt)
popt->nullPrint ? popt->nullPrint : "");
}
+ /* show true display */+ else if (strcmp(param, "true") == 0)+ {+ printf(_("Boolean TRUE display is \"%s\".\n"),+ popt->truePrint ? popt->truePrint : "t");+ }++ /* show false display */+ else if (strcmp(param, "false") == 0)+ {+ printf(_("Boolean FALSE display is \"%s\".\n"),+ popt->falsePrint ? popt->falsePrint : "f");+ }+
/* show locale-aware numeric output */
else if (strcmp(param, "numericlocale") == 0)
{
@@ -2953,6 +2987,14 @@ pset_value_string(const char *param, struct printQueryOpt *popt)
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, "true") == 0)+ return pset_quoted_string(popt->truePrint+ ? popt->truePrint+ : "t");+ else if (strcmp(param, "false") == 0)+ return pset_quoted_string(popt->falsePrint+ ? popt->falsePrint+ : "f");
else if (strcmp(param, "null") == 0)
return pset_quoted_string(popt->nullPrint
? popt->nullPrint
diff --git a/src/bin/psql/help.c b/src/bin/psql/help.cindex 5b63e76..d0bf418 100644--- a/src/bin/psql/help.c+++ b/src/bin/psql/help.c@@ -258,7 +258,7 @@ slashUsage(unsigned short int pager)
fprintf(output, _(" \\H toggle HTML output mode (currently %s)\n"),
ON(pset.popt.topt.format == PRINT_HTML));
fprintf(output, _(" \\pset [NAME [VALUE]] set table output option\n"
- " (NAME := {format|border|expanded|fieldsep|fieldsep_zero|footer|null|\n"+ " (NAME := {format|border|expanded|fieldsep|fieldsep_zero|footer|true|false|null|\n"
" numericlocale|recordsep|recordsep_zero|tuples_only|title|tableattr|pager|\n"
" unicode_border_linestyle|unicode_column_linestyle|unicode_header_linestyle})\n"));
fprintf(output, _(" \\t [on|off] show only rows (currently %s)\n"),
@@ -371,6 +371,8 @@ helpVariables(unsigned short int pager)
fprintf(output, _(" format set output format [unaligned, aligned, wrapped, html, asciidoc, ...]\n"));
fprintf(output, _(" footer enable or disable display of the table footer [on, off]\n"));
fprintf(output, _(" linestyle set the border line drawing style [ascii, old-ascii, unicode]\n"));
+ fprintf(output, _(" true set the string to be prined in place of a TRUE value\n"));+ fprintf(output, _(" false set the string to be prined in place of a FALSE value\n"));
fprintf(output, _(" null set the string to be printed in place of a null value\n"));
fprintf(output, _(" numericlocale enable or disable display of a locale-specific character to separate\n"
" groups of digits [on, off]\n"));
diff --git a/src/bin/psql/print.c b/src/bin/psql/print.cindex ad4350e..ba5c651 100644--- a/src/bin/psql/print.c+++ b/src/bin/psql/print.c@@ -3215,6 +3215,13 @@ printQuery(const PGresult *result, const printQueryOpt *opt, FILE *fout, FILE *f
cell = format_numeric_locale(cell);
mustfree = true;
}
+ else if (PQftype(result, c) == BOOLOID)+ {+ if (cell[0] == 't' && opt->truePrint)+ cell = opt->truePrint;+ else if (cell[0] == 'f' && opt->falsePrint)+ cell = opt->falsePrint;+ }
}
translate = (opt->translate_columns && opt->translate_columns[c]);
diff --git a/src/bin/psql/print.h b/src/bin/psql/print.hindex b0b6bf5..7949c18 100644--- a/src/bin/psql/print.h+++ b/src/bin/psql/print.h@@ -152,6 +152,8 @@ typedef struct printQueryOpt
{
printTableOpt topt; /* the options above */
char *nullPrint; /* how to print null entities */
+ char *truePrint; /* how to print TRUE booleans */+ char *falsePrint; /* how to print FALSE booleans */
bool quote; /* quote all values as much as possible */
char *title; /* override title */
char **footers; /* override footer (default is "(xx rows)") */
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Reply to all the recipients using the --to and --cc options:
reply via email
To: pgsql-hackers@postgresql.org
Cc: marko@joh.to
Subject: Re: psql: add \pset true/false
In-Reply-To: <56308F56.8060908@joh.to>
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox