Re: [HACKERS] One-shot expanded output in psql using \gx
* Noah Misch (n...@leadboat.com) wrote: > On Tue, Aug 15, 2017 at 10:24:34PM +0200, Tobias Bussmann wrote: > > I've tested the new \gx against 10beta and current git HEAD. Actually one > > of my favourite features of PostgreSQL 10! However in my environment it was > > behaving strangely. After some debugging I found that \gx does not work if > > you have \set FETCH_COUNT n before. Please find attached a patch that fixes > > this incl. new regression test. Fixed in 0cdc3e4. Thanks for the report! Stephen signature.asc Description: Digital signature
Re: [HACKERS] One-shot expanded output in psql using \gx
* Noah Misch (n...@leadboat.com) wrote: > On Tue, Aug 15, 2017 at 10:24:34PM +0200, Tobias Bussmann wrote: > > I've tested the new \gx against 10beta and current git HEAD. Actually one > > of my favourite features of PostgreSQL 10! However in my environment it was > > behaving strangely. After some debugging I found that \gx does not work if > > you have \set FETCH_COUNT n before. Please find attached a patch that fixes > > this incl. new regression test. > > [Action required within three days. This is a generic notification.] > > The above-described topic is currently a PostgreSQL 10 open item. Stephen, > since you committed the patch believed to have created it, you own this open > item. If some other commit is more relevant or if this does not belong as a > v10 open item, please let us know. Otherwise, please observe the policy on > open item ownership[1] and send a status update within three calendar days of > this message. Include a date for your subsequent status update. Testers may > discover new open items at any time, and I want to plan to get them all fixed > well in advance of shipping v10. Consequently, I will appreciate your efforts > toward speedy resolution. Thanks. Just to preempt the coming nagging email, yes, I'm aware I didn't get to finish this today (though at least today, unlike yesterday, I looked at it and started to play with it.. I blame the celestial bodies that caused an impressive traffic jam on Monday night causing me to lose basically all of Tuesday too..). I'll provide an update tomorrow. Thanks! Stephen signature.asc Description: Digital signature
Re: [HACKERS] One-shot expanded output in psql using \gx
Noah, all, * Noah Misch (n...@leadboat.com) wrote: > On Tue, Aug 15, 2017 at 10:24:34PM +0200, Tobias Bussmann wrote: > > I've tested the new \gx against 10beta and current git HEAD. Actually one > > of my favourite features of PostgreSQL 10! However in my environment it was > > behaving strangely. After some debugging I found that \gx does not work if > > you have \set FETCH_COUNT n before. Please find attached a patch that fixes > > this incl. new regression test. > > [Action required within three days. This is a generic notification.] I'll address this on Tuesday, 8/22. Thanks! Stephen signature.asc Description: Digital signature
Re: [HACKERS] One-shot expanded output in psql using \gx
Noah, all, On Wed, Aug 16, 2017 at 22:24 Noah Mischwrote: > On Tue, Aug 15, 2017 at 10:24:34PM +0200, Tobias Bussmann wrote: > > I've tested the new \gx against 10beta and current git HEAD. Actually > one of my favourite features of PostgreSQL 10! However in my environment it > was behaving strangely. After some debugging I found that \gx does not work > if you have \set FETCH_COUNT n before. Please find attached a patch that > fixes this incl. new regression test. > > [Action required within three days. This is a generic notification.] > > The above-described topic is currently a PostgreSQL 10 open item. Stephen, > since you committed the patch believed to have created it, you own this > open > item. If some other commit is more relevant or if this does not belong as > a > v10 open item, please let us know. Otherwise, please observe the policy on > open item ownership[1] and send a status update within three calendar days > of > this message. Include a date for your subsequent status update. Testers > may > discover new open items at any time, and I want to plan to get them all > fixed > well in advance of shipping v10. Consequently, I will appreciate your > efforts > toward speedy resolution. Thanks. I'm in Boston this week but should be able to address this no later than Monday, August 21st, and I will provide an update then. Thanks! Stephen
Re: [HACKERS] One-shot expanded output in psql using \gx
On Tue, Aug 15, 2017 at 10:24:34PM +0200, Tobias Bussmann wrote: > I've tested the new \gx against 10beta and current git HEAD. Actually one of > my favourite features of PostgreSQL 10! However in my environment it was > behaving strangely. After some debugging I found that \gx does not work if > you have \set FETCH_COUNT n before. Please find attached a patch that fixes > this incl. new regression test. [Action required within three days. This is a generic notification.] The above-described topic is currently a PostgreSQL 10 open item. Stephen, since you committed the patch believed to have created it, you own this open item. If some other commit is more relevant or if this does not belong as a v10 open item, please let us know. Otherwise, please observe the policy on open item ownership[1] and send a status update within three calendar days of this message. Include a date for your subsequent status update. Testers may discover new open items at any time, and I want to plan to get them all fixed well in advance of shipping v10. Consequently, I will appreciate your efforts toward speedy resolution. Thanks. [1] https://www.postgresql.org/message-id/20170404140717.GA2675809%40tornado.leadboat.com -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers
Re: [HACKERS] One-shot expanded output in psql using \gx
I've tested the new \gx against 10beta and current git HEAD. Actually one of my favourite features of PostgreSQL 10! However in my environment it was behaving strangely. After some debugging I found that \gx does not work if you have \set FETCH_COUNT n before. Please find attached a patch that fixes this incl. new regression test. Best regards, Tobias psql_gx_fetch_count_v1.patch Description: Binary data -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers
Re: [HACKERS] One-shot expanded output in psql using \gx
* Daniel Verite (dan...@manitou-mail.org) wrote: > Christoph Berg wrote: > > > Both fixed, thanks for the review! Version 3 attached. > > It looks good to me. > > Stephen Frost is also reviewer on the patch, so I'm moving the > status back to "Needs review" at > https://commitfest.postgresql.org/13/973/ > and let him proceed. Right, starting to look at it now. Thanks! Stephen signature.asc Description: Digital signature
Re: [HACKERS] One-shot expanded output in psql using \gx
Christoph Berg wrote: > Both fixed, thanks for the review! Version 3 attached. It looks good to me. Stephen Frost is also reviewer on the patch, so I'm moving the status back to "Needs review" at https://commitfest.postgresql.org/13/973/ and let him proceed. Best regards, -- Daniel Vérité PostgreSQL-powered mailer: http://www.manitou-mail.org Twitter: @DanielVerite -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers
Re: [HACKERS] One-shot expanded output in psql using \gx
Re: Daniel Verite 2017-03-03 <4d84079e-325b-48c5-83e6-bb54bb567...@manitou-mail.org> > - tab-completion: works but the list in tab-complete.c:backslash_commands[] > is sorted alphabetically so "\\gx" should come after "\\gset" Good catch, it was still in that place from when it was named \G. In the \? output I left it directly after \g because the help text starts with "as \g ..." and it is IMHO more closely related to \g than \gexec and \gset which differ more in functionality. > unsigned short int expanded;/* expanded/vertical output (if supported > by >* output format); 0=no, 1=yes, 2=auto */ > Although there is still code that puts true/false in this variable > (probably because it was a bool before?), I assume that for new > code, assigning 0/1/2 should be preferred. Right. I had seen both being used and went with "true", but "1" is better style. Both fixed, thanks for the review! Version 3 attached. Christoph -- 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 ae58708..e0302ea *** 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 + \gx [ filename ] + \gx [ |command ] + + + \gx is equivalent to \g, but + forces expanded output mode for this query. + + + + + + \gexec diff --git a/src/bin/psql/command.c b/src/bin/psql/command.c new file mode 100644 index a52adc8..07efc27 *** a/src/bin/psql/command.c --- b/src/bin/psql/command.c *** exec_command(const char *cmd, *** 906,913 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); --- 906,916 free(fname); } ! /* ! * \g [filename] -- send query, optionally with output to file/pipe ! * \gx [filename] -- same as \g, with expanded mode forced ! */ ! else if (strcmp(cmd, "g") == 0 || strcmp(cmd, "gx") == 0) { char *fname = psql_scan_slash_option(scan_state, OT_FILEPIPE, NULL, false); *** exec_command(const char *cmd, *** 920,925 --- 923,930 pset.gfname = pg_strdup(fname); } free(fname); + if (strcmp(cmd, "gx") == 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 5349c39..1aa56ab *** 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 \gx */ + if (pset.g_expanded) + my_popt.topt.expanded = 1; + /* write output to \g argument, if any */ if (pset.gfname) { *** sendquery_cleanup: *** 1410,1415 --- 1414,1422 pset.gfname = NULL; } + /* reset \gx'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 91cf0be..c390f87 *** a/src/bin/psql/help.c --- b/src/bin/psql/help.c *** slashUsage(unsigned short int pager) *** 173,178 --- 173,179 fprintf(output, _(" \\copyright show PostgreSQL usage and distribution terms\n")); fprintf(output, _(" \\errverboseshow 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, _(" \\gx [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 195f5a1..70ff181 *** 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 \gx */ char *gset_prefix; /* one-shot prefix argument for \gset */ bool gexec_flag; /* one-shot flag to
Re: [HACKERS] One-shot expanded output in psql using \gx
Christoph Berg wrote: > The new version tests \g and \gx with a new query, and > re-running it on the last query buffer. Thanks, here's a review: The patch compiles and works as expected. The code follows the same pattern as other one-shot command modifiers, setting a flag in the global "pset" struct in exec_command() and resetting it at the end of SendQuery(). - make installcheck-world: ok - sgml doc: ok - help text: ok - includes regression tests: ok - tab-completion: works but the list in tab-complete.c:backslash_commands[] is sorted alphabetically so "\\gx" should come after "\\gset" - another nitpick: in PrintQueryTuples() it assigns a bool: + /* one-shot expanded output requested via \gx */ + if (pset.g_expanded) + my_popt.topt.expanded = true; + "expanded" is defined as a tri-valued short int (print.h:98): typedef struct printTableOpt { // unsigned short int expanded;/* expanded/vertical output (if supported by * output format); 0=no, 1=yes, 2=auto */ Although there is still code that puts true/false in this variable (probably because it was a bool before?), I assume that for new code, assigning 0/1/2 should be preferred. Best regards, -- Daniel Vérité PostgreSQL-powered mailer: http://www.manitou-mail.org Twitter: @DanielVerite -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers
Re: [HACKERS] One-shot expanded output in psql using \gx
On Thu, Feb 09, 2017 at 11:12:00AM +0100, Christoph Berg wrote: > Re: David Fetter 2017-02-08 <20170208151214.ga8...@fetter.org> > > Would you be open to saving the next person some work by doing > > something similar to how \d is done, namely looking for an 'x' > > modifier after g without regard to how far after? As of this writing, > > the \d version starts at line 398 in master. > > I think that ship has sailed, given there's already \gset. > Supporting \g[optionset] next to it *now*, given no one knows how > "optionset" is going to evolve seems like premature optimization. Good point. Thanks for looking it over. Best, David. -- David Fetterhttp://fetter.org/ Phone: +1 415 235 3778 AIM: dfetter666 Yahoo!: dfetter Skype: davidfetter XMPP: david(dot)fetter(at)gmail(dot)com Remember to vote! Consider donating to Postgres: http://www.postgresql.org/about/donate -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers
Re: [HACKERS] One-shot expanded output in psql using \gx
Re: David Fetter 2017-02-08 <20170208151214.ga8...@fetter.org> > Would you be open to saving the next person some work by doing > something similar to how \d is done, namely looking for an 'x' > modifier after g without regard to how far after? As of this writing, > the \d version starts at line 398 in master. I think that ship has sailed, given there's already \gset. Supporting \g[optionset] next to it *now*, given no one knows how "optionset" is going to evolve seems like premature optimization. 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 -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers
Re: [HACKERS] One-shot expanded output in psql using \gx
On Wed, Feb 08, 2017 at 03:52:40PM +0100, Christoph Berg wrote: > Re: David Fetter 2017-02-07 <20170207051659.gc3...@fetter.org> > > On Mon, Feb 06, 2017 at 08:54:13PM +0100, Christoph Berg wrote: > > > The majority of voices here was in favor of using \gx, so here is > > > another version of the same patch which implements that. > > > > Patch is useful, and works as documented. > > > > Maybe it could get a test or two in src/test/regress/*/psql.* > > Good point. The new version tests \g and \gx with a new query, and > re-running it on the last query buffer. > > ! /* \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); > --- 910,920 > free(fname); > } > > ! /* > ! * \g [filename] -- send query, optionally with output to file/pipe > ! * \gx [filename] -- same as \g, with expanded mode forced > ! */ > ! else if (strcmp(cmd, "g") == 0 || strcmp(cmd, "gx") == 0) > { > char *fname = psql_scan_slash_option(scan_state, > >OT_FILEPIPE, NULL, false); > *** exec_command(const char *cmd, > *** 924,929 > --- 927,934 > pset.gfname = pg_strdup(fname); > } > free(fname); > + if (strcmp(cmd, "gx") == 0) > + pset.g_expanded = true; > status = PSQL_CMD_SEND; > } Would you be open to saving the next person some work by doing something similar to how \d is done, namely looking for an 'x' modifier after g without regard to how far after? As of this writing, the \d version starts at line 398 in master. Best, David. -- David Fetterhttp://fetter.org/ Phone: +1 415 235 3778 AIM: dfetter666 Yahoo!: dfetter Skype: davidfetter XMPP: david(dot)fetter(at)gmail(dot)com Remember to vote! Consider donating to Postgres: http://www.postgresql.org/about/donate -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers
Re: [HACKERS] One-shot expanded output in psql using \gx
Re: David Fetter 2017-02-07 <20170207051659.gc3...@fetter.org> > On Mon, Feb 06, 2017 at 08:54:13PM +0100, Christoph Berg wrote: > > The majority of voices here was in favor of using \gx, so here is > > another version of the same patch which implements that. > > Patch is useful, and works as documented. > > Maybe it could get a test or two in src/test/regress/*/psql.* Good point. The new version tests \g and \gx with a new query, and re-running it on the last query buffer. Christoph -- 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 ae58708..e0302ea *** 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 + \gx [ filename ] + \gx [ |command ] + + + \gx is equivalent to \g, but + forces expanded output mode for this query. + + + + + + \gexec diff --git a/src/bin/psql/command.c b/src/bin/psql/command.c new file mode 100644 index f17f610..6e140fe *** a/src/bin/psql/command.c --- b/src/bin/psql/command.c *** exec_command(const char *cmd, *** 910,917 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); --- 910,920 free(fname); } ! /* ! * \g [filename] -- send query, optionally with output to file/pipe ! * \gx [filename] -- same as \g, with expanded mode forced ! */ ! else if (strcmp(cmd, "g") == 0 || strcmp(cmd, "gx") == 0) { char *fname = psql_scan_slash_option(scan_state, OT_FILEPIPE, NULL, false); *** exec_command(const char *cmd, *** 924,929 --- 927,934 pset.gfname = pg_strdup(fname); } free(fname); + if (strcmp(cmd, "gx") == 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 5349c39..4534bd9 *** 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 \gx */ + if (pset.g_expanded) + my_popt.topt.expanded = true; + /* write output to \g argument, if any */ if (pset.gfname) { *** sendquery_cleanup: *** 1410,1415 --- 1414,1422 pset.gfname = NULL; } + /* reset \gx'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 3e3cab4..2aece7e *** 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, _(" \\errverboseshow 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, _(" \\gx [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 195f5a1..70ff181 *** 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 \gx */ 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 6e759d0..0bd2ae3 *** 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",
Re: [HACKERS] One-shot expanded output in psql using \gx
On Mon, Feb 06, 2017 at 08:54:13PM +0100, Christoph Berg wrote: > The majority of voices here was in favor of using \gx, so here is > another version of the same patch which implements that. Patch is useful, and works as documented. Maybe it could get a test or two in src/test/regress/*/psql.* Best, David. -- David Fetterhttp://fetter.org/ Phone: +1 415 235 3778 AIM: dfetter666 Yahoo!: dfetter Skype: davidfetter XMPP: david(dot)fetter(at)gmail(dot)com Remember to vote! Consider donating to Postgres: http://www.postgresql.org/about/donate -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers
Re: [HACKERS] One-shot expanded output in psql using \gx
The majority of voices here was in favor of using \gx, so here is another version of the same patch which implements that. Christoph diff --git a/doc/src/sgml/ref/psql-ref.sgml b/doc/src/sgml/ref/psql-ref.sgml new file mode 100644 index ae58708..e0302ea *** 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 + \gx [ filename ] + \gx [ |command ] + + + \gx is equivalent to \g, but + forces expanded output mode for this query. + + + + + + \gexec diff --git a/src/bin/psql/command.c b/src/bin/psql/command.c new file mode 100644 index f17f610..6e140fe *** a/src/bin/psql/command.c --- b/src/bin/psql/command.c *** exec_command(const char *cmd, *** 910,917 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); --- 910,920 free(fname); } ! /* ! * \g [filename] -- send query, optionally with output to file/pipe ! * \gx [filename] -- same as \g, with expanded mode forced ! */ ! else if (strcmp(cmd, "g") == 0 || strcmp(cmd, "gx") == 0) { char *fname = psql_scan_slash_option(scan_state, OT_FILEPIPE, NULL, false); *** exec_command(const char *cmd, *** 924,929 --- 927,934 pset.gfname = pg_strdup(fname); } free(fname); + if (strcmp(cmd, "gx") == 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 5349c39..4534bd9 *** 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 \gx */ + if (pset.g_expanded) + my_popt.topt.expanded = true; + /* write output to \g argument, if any */ if (pset.gfname) { *** sendquery_cleanup: *** 1410,1415 --- 1414,1422 pset.gfname = NULL; } + /* reset \gx'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 3e3cab4..2aece7e *** 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, _(" \\errverboseshow 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, _(" \\gx [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 195f5a1..70ff181 *** 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 \gx */ 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 6e759d0..0bd2ae3 *** 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", "\\gx", "\\gexec", "\\gset", "\\h", "\\help", "\\H", "\\i", "\\ir", "\\l",