aboutsummaryrefslogtreecommitdiff
path: root/src/bin/psql/help.c
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2017-03-30 12:59:11 -0400
committerTom Lane <tgl@sss.pgh.pa.us>2017-03-30 12:59:24 -0400
commite984ef5861df4bc9733b36271d05763e82de7c04 (patch)
tree6e4d3da7bffef5e8f4255f073d89b18a1d6ce893 /src/bin/psql/help.c
parentffae6733db1f9d4a3a75d737a00ee2a4a3e01849 (diff)
downloadpostgresql-e984ef5861df4bc9733b36271d05763e82de7c04.tar.gz
postgresql-e984ef5861df4bc9733b36271d05763e82de7c04.zip
Support \if ... \elif ... \else ... \endif in psql scripting.
This patch adds nestable conditional blocks to psql. The control structure feature per se is complete, but the boolean expressions understood by \if and \elif are pretty primitive; basically, after variable substitution and backtick expansion, the result has to be "true" or "false" or one of the other standard spellings of a boolean value. But that's enough for many purposes, since you can always do the heavy lifting on the server side; and we can extend it later. Along the way, pay down some of the technical debt that had built up around psql/command.c: * Refactor exec_command() into a function per command, instead of being a 1500-line monstrosity. This makes the file noticeably longer because of repetitive function header/trailer overhead, but it seems much more readable. * Teach psql_get_variable() and psqlscanslash.l to suppress variable substitution and backtick expansion on the basis of the conditional stack state, thereby allowing removal of the OT_NO_EVAL kluge. * Fix the no-doubt-once-expedient hack of sometimes silently substituting mainloop.c's previous_buf for query_buf when calling HandleSlashCmds. (It's a bit remarkable that commands like \r worked at all with that.) Recall of a previous query is now done explicitly in the slash commands where that should happen. Corey Huinker, reviewed by Fabien Coelho, further hacking by me Discussion: https://postgr.es/m/CADkLM=c94OSRTnat=LX0ivNq4pxDNeoomFfYvBKM5N_xfmLtAA@mail.gmail.com
Diffstat (limited to 'src/bin/psql/help.c')
-rw-r--r--src/bin/psql/help.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/src/bin/psql/help.c b/src/bin/psql/help.c
index ba14df0344d..ac435220e62 100644
--- a/src/bin/psql/help.c
+++ b/src/bin/psql/help.c
@@ -167,7 +167,7 @@ slashUsage(unsigned short int pager)
* Use "psql --help=commands | wc" to count correctly. It's okay to count
* the USE_READLINE line even in builds without that.
*/
- output = PageOutput(113, pager ? &(pset.popt.topt) : NULL);
+ output = PageOutput(122, pager ? &(pset.popt.topt) : NULL);
fprintf(output, _("General\n"));
fprintf(output, _(" \\copyright show PostgreSQL usage and distribution terms\n"));
@@ -210,6 +210,13 @@ slashUsage(unsigned short int pager)
fprintf(output, _(" \\qecho [STRING] write string to query output stream (see \\o)\n"));
fprintf(output, "\n");
+ fprintf(output, _("Conditional\n"));
+ fprintf(output, _(" \\if EXPR begin conditional block\n"));
+ fprintf(output, _(" \\elif EXPR alternative within current conditional block\n"));
+ fprintf(output, _(" \\else final alternative within current conditional block\n"));
+ fprintf(output, _(" \\endif end conditional block\n"));
+ fprintf(output, "\n");
+
fprintf(output, _("Informational\n"));
fprintf(output, _(" (options: S = show system objects, + = additional detail)\n"));
fprintf(output, _(" \\d[S+] list tables, views, and sequences\n"));