I frequently find myself in the situation that I want the "\x" expanded output mode activated just for one query. There's little wrong with typing "\x" and re-executing the query in that case, but then I'm always annoyed that the expanded output is still active for the next query after that.
"\x auto" is not a fix for the problem; I have set up the pager to use "less -S" (non-wrapping) by default so I can scroll right/left through the query result instead of having it spread over several terminal lines. A workaround is to submit queries using "\x\g\x", but that's ugly, clutters the output with toggle messages, and will forget that "\x auto" was set. Mysql's CLI client is using \G for this purpose, and adding the very same functionality to psql fits nicely into the set of existing backslash commands: \g sends the query buffer, \G will do exactly the same as \g (including parameters), but forces expanded output just for this query. The same idea was discussed back in 2008. Back then the outcome was that "\x auto" was implemented, but I still think that \G is a useful feature to have on its own, and several people in the thread seem to have agreed back then. Patch attached, I'll add it to the next commit fest. Mit freundlichen Grüßen, Christoph Berg -- Senior Berater, Tel.: +49 2166 9901 187 credativ GmbH, HRB Mönchengladbach 12080, USt-ID-Nummer: DE204566209 Trompeterallee 108, 41189 Mönchengladbach Geschäftsführung: Dr. Michael Meskes, Jörg Folz, Sascha Heuer pgp fingerprint: 5C48 FE61 57F4 9179 5970 87C6 4C5A 6BAB 12D2 A7AE
diff --git a/doc/src/sgml/ref/psql-ref.sgml b/doc/src/sgml/ref/psql-ref.sgml new file mode 100644 index 640fe12..af85888 *** a/doc/src/sgml/ref/psql-ref.sgml --- b/doc/src/sgml/ref/psql-ref.sgml *************** Tue Oct 26 21:40:57 CEST 1999 *** 1891,1896 **** --- 1891,1908 ---- <varlistentry> + <term><literal>\G [ <replaceable class="parameter">filename</replaceable> ]</literal></term> + <term><literal>\G [ |<replaceable class="parameter">command</replaceable> ]</literal></term> + <listitem> + <para> + <literal>\G</literal> is equivalent to <literal>\g</literal>, but + forces expanded output mode for this query. + </para> + </listitem> + </varlistentry> + + + <varlistentry> <term><literal>\gexec</literal></term> <listitem> diff --git a/src/bin/psql/command.c b/src/bin/psql/command.c new file mode 100644 index 0c164a3..912f672 *** a/src/bin/psql/command.c --- b/src/bin/psql/command.c *************** exec_command(const char *cmd, *** 904,911 **** free(fname); } ! /* \g [filename] -- send query, optionally with output to file/pipe */ ! else if (strcmp(cmd, "g") == 0) { char *fname = psql_scan_slash_option(scan_state, OT_FILEPIPE, NULL, false); --- 904,914 ---- free(fname); } ! /* ! * \g [filename] -- send query, optionally with output to file/pipe ! * \G [filename] -- same as \g, with expanded mode forced ! */ ! else if (strcasecmp(cmd, "g") == 0) { char *fname = psql_scan_slash_option(scan_state, OT_FILEPIPE, NULL, false); *************** exec_command(const char *cmd, *** 918,923 **** --- 921,928 ---- pset.gfname = pg_strdup(fname); } free(fname); + if (strcmp(cmd, "G") == 0) + pset.g_expanded = true; status = PSQL_CMD_SEND; } diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c new file mode 100644 index e1b04de..4a75470 *** a/src/bin/psql/common.c --- b/src/bin/psql/common.c *************** PrintQueryTuples(const PGresult *results *** 770,775 **** --- 770,779 ---- { printQueryOpt my_popt = pset.popt; + /* one-shot expanded output requested via \G */ + if (pset.g_expanded) + my_popt.topt.expanded = true; + /* write output to \g argument, if any */ if (pset.gfname) { *************** sendquery_cleanup: *** 1411,1416 **** --- 1415,1423 ---- pset.gfname = NULL; } + /* reset \G's expanded-mode flag */ + pset.g_expanded = false; + /* reset \gset trigger */ if (pset.gset_prefix) { diff --git a/src/bin/psql/help.c b/src/bin/psql/help.c new file mode 100644 index 5365629..5e9c249 *** a/src/bin/psql/help.c --- b/src/bin/psql/help.c *************** slashUsage(unsigned short int pager) *** 174,179 **** --- 174,180 ---- fprintf(output, _(" \\copyright show PostgreSQL usage and distribution terms\n")); fprintf(output, _(" \\errverbose show most recent error message at maximum verbosity\n")); fprintf(output, _(" \\g [FILE] or ; execute query (and send results to file or |pipe)\n")); + fprintf(output, _(" \\G [FILE] as \\g, but force expanded output\n")); fprintf(output, _(" \\gexec execute query, then execute each value in its result\n")); fprintf(output, _(" \\gset [PREFIX] execute query and store results in psql variables\n")); fprintf(output, _(" \\q quit psql\n")); diff --git a/src/bin/psql/settings.h b/src/bin/psql/settings.h new file mode 100644 index 4c7c3b1..a13da33 *** a/src/bin/psql/settings.h --- b/src/bin/psql/settings.h *************** typedef struct _psqlSettings *** 91,96 **** --- 91,97 ---- printQueryOpt popt; char *gfname; /* one-shot file output argument for \g */ + bool g_expanded; /* one-shot expanded output requested via \G */ char *gset_prefix; /* one-shot prefix argument for \gset */ bool gexec_flag; /* one-shot flag to execute query's results */ bool crosstab_flag; /* one-shot request to crosstab results */ diff --git a/src/bin/psql/tab-complete.c b/src/bin/psql/tab-complete.c new file mode 100644 index d6fffcf..67801dd *** a/src/bin/psql/tab-complete.c --- b/src/bin/psql/tab-complete.c *************** psql_completion(const char *text, int st *** 1338,1344 **** "\\dm", "\\dn", "\\do", "\\dO", "\\dp", "\\drds", "\\ds", "\\dS", "\\dt", "\\dT", "\\dv", "\\du", "\\dx", "\\dy", "\\e", "\\echo", "\\ef", "\\encoding", "\\errverbose", "\\ev", ! "\\f", "\\g", "\\gexec", "\\gset", "\\h", "\\help", "\\H", "\\i", "\\ir", "\\l", "\\lo_import", "\\lo_export", "\\lo_list", "\\lo_unlink", "\\o", "\\p", "\\password", "\\prompt", "\\pset", "\\q", "\\qecho", "\\r", "\\s", "\\set", "\\setenv", "\\sf", "\\sv", "\\t", "\\T", --- 1338,1344 ---- "\\dm", "\\dn", "\\do", "\\dO", "\\dp", "\\drds", "\\ds", "\\dS", "\\dt", "\\dT", "\\dv", "\\du", "\\dx", "\\dy", "\\e", "\\echo", "\\ef", "\\encoding", "\\errverbose", "\\ev", ! "\\f", "\\g", "\\G", "\\gexec", "\\gset", "\\h", "\\help", "\\H", "\\i", "\\ir", "\\l", "\\lo_import", "\\lo_export", "\\lo_list", "\\lo_unlink", "\\o", "\\p", "\\password", "\\prompt", "\\pset", "\\q", "\\qecho", "\\r", "\\s", "\\set", "\\setenv", "\\sf", "\\sv", "\\t", "\\T",
-- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers