1 /*
2  * psql - the PostgreSQL interactive terminal
3  *
4  * Copyright (c) 2000-2018, PostgreSQL Global Development Group
5  *
6  * src/bin/psql/help.c
7  */
8 #include "postgres_fe.h"
9 
10 #ifndef WIN32
11 #include <unistd.h>				/* for geteuid() */
12 #else
13 #include <win32.h>
14 #endif
15 
16 #ifndef WIN32
17 #include <sys/ioctl.h>			/* for ioctl() */
18 #endif
19 
20 #ifdef HAVE_TERMIOS_H
21 #include <termios.h>
22 #endif
23 
24 #include "common.h"
25 #include "common/username.h"
26 #include "help.h"
27 #include "input.h"
28 #include "settings.h"
29 #include "sql_help.h"
30 
31 
32 /*
33  * PLEASE:
34  * If you change something in this file, also make the same changes
35  * in the DocBook documentation, file ref/psql-ref.sgml. If you don't
36  * know how to do it, please find someone who can help you.
37  */
38 
39 
40 /*
41  * usage
42  *
43  * print out command line arguments
44  */
45 #define ON(var) (var ? _("on") : _("off"))
46 
47 void
usage(unsigned short int pager)48 usage(unsigned short int pager)
49 {
50 	const char *env;
51 	const char *user;
52 	char	   *errstr;
53 	FILE	   *output;
54 
55 	/* Find default user, in case we need it. */
56 	user = getenv("PGUSER");
57 	if (!user)
58 	{
59 		user = get_user_name(&errstr);
60 		if (!user)
61 		{
62 			psql_error("%s\n", errstr);
63 			exit(EXIT_FAILURE);
64 		}
65 	}
66 
67 	/*
68 	 * Keep this line count in sync with the number of lines printed below!
69 	 * Use "psql --help=options | wc" to count correctly.
70 	 */
71 	output = PageOutput(61, pager ? &(pset.popt.topt) : NULL);
72 
73 	fprintf(output, _("psql is the PostgreSQL interactive terminal.\n\n"));
74 	fprintf(output, _("Usage:\n"));
75 	fprintf(output, _("  psql [OPTION]... [DBNAME [USERNAME]]\n\n"));
76 
77 	fprintf(output, _("General options:\n"));
78 	/* Display default database */
79 	env = getenv("PGDATABASE");
80 	if (!env)
81 		env = user;
82 	fprintf(output, _("  -c, --command=COMMAND    run only single command (SQL or internal) and exit\n"));
83 	fprintf(output, _("  -d, --dbname=DBNAME      database name to connect to (default: \"%s\")\n"), env);
84 	fprintf(output, _("  -f, --file=FILENAME      execute commands from file, then exit\n"));
85 	fprintf(output, _("  -l, --list               list available databases, then exit\n"));
86 	fprintf(output, _("  -v, --set=, --variable=NAME=VALUE\n"
87 					  "                           set psql variable NAME to VALUE\n"
88 					  "                           (e.g., -v ON_ERROR_STOP=1)\n"));
89 	fprintf(output, _("  -V, --version            output version information, then exit\n"));
90 	fprintf(output, _("  -X, --no-psqlrc          do not read startup file (~/.psqlrc)\n"));
91 	fprintf(output, _("  -1 (\"one\"), --single-transaction\n"
92 					  "                           execute as a single transaction (if non-interactive)\n"));
93 	fprintf(output, _("  -?, --help[=options]     show this help, then exit\n"));
94 	fprintf(output, _("      --help=commands      list backslash commands, then exit\n"));
95 	fprintf(output, _("      --help=variables     list special variables, then exit\n"));
96 
97 	fprintf(output, _("\nInput and output options:\n"));
98 	fprintf(output, _("  -a, --echo-all           echo all input from script\n"));
99 	fprintf(output, _("  -b, --echo-errors        echo failed commands\n"));
100 	fprintf(output, _("  -e, --echo-queries       echo commands sent to server\n"));
101 	fprintf(output, _("  -E, --echo-hidden        display queries that internal commands generate\n"));
102 	fprintf(output, _("  -L, --log-file=FILENAME  send session log to file\n"));
103 	fprintf(output, _("  -n, --no-readline        disable enhanced command line editing (readline)\n"));
104 	fprintf(output, _("  -o, --output=FILENAME    send query results to file (or |pipe)\n"));
105 	fprintf(output, _("  -q, --quiet              run quietly (no messages, only query output)\n"));
106 	fprintf(output, _("  -s, --single-step        single-step mode (confirm each query)\n"));
107 	fprintf(output, _("  -S, --single-line        single-line mode (end of line terminates SQL command)\n"));
108 
109 	fprintf(output, _("\nOutput format options:\n"));
110 	fprintf(output, _("  -A, --no-align           unaligned table output mode\n"));
111 	fprintf(output, _("  -F, --field-separator=STRING\n"
112 					  "                           field separator for unaligned output (default: \"%s\")\n"),
113 			DEFAULT_FIELD_SEP);
114 	fprintf(output, _("  -H, --html               HTML table output mode\n"));
115 	fprintf(output, _("  -P, --pset=VAR[=ARG]     set printing option VAR to ARG (see \\pset command)\n"));
116 	fprintf(output, _("  -R, --record-separator=STRING\n"
117 					  "                           record separator for unaligned output (default: newline)\n"));
118 	fprintf(output, _("  -t, --tuples-only        print rows only\n"));
119 	fprintf(output, _("  -T, --table-attr=TEXT    set HTML table tag attributes (e.g., width, border)\n"));
120 	fprintf(output, _("  -x, --expanded           turn on expanded table output\n"));
121 	fprintf(output, _("  -z, --field-separator-zero\n"
122 					  "                           set field separator for unaligned output to zero byte\n"));
123 	fprintf(output, _("  -0, --record-separator-zero\n"
124 					  "                           set record separator for unaligned output to zero byte\n"));
125 
126 	fprintf(output, _("\nConnection options:\n"));
127 	/* Display default host */
128 	env = getenv("PGHOST");
129 	fprintf(output, _("  -h, --host=HOSTNAME      database server host or socket directory (default: \"%s\")\n"),
130 			env ? env : _("local socket"));
131 	/* Display default port */
132 	env = getenv("PGPORT");
133 	fprintf(output, _("  -p, --port=PORT          database server port (default: \"%s\")\n"),
134 			env ? env : DEF_PGPORT_STR);
135 	/* Display default user */
136 	env = getenv("PGUSER");
137 	if (!env)
138 		env = user;
139 	fprintf(output, _("  -U, --username=USERNAME  database user name (default: \"%s\")\n"), env);
140 	fprintf(output, _("  -w, --no-password        never prompt for password\n"));
141 	fprintf(output, _("  -W, --password           force password prompt (should happen automatically)\n"));
142 
143 	fprintf(output, _("\nFor more information, type \"\\?\" (for internal commands) or \"\\help\" (for SQL\n"
144 					  "commands) from within psql, or consult the psql section in the PostgreSQL\n"
145 					  "documentation.\n\n"));
146 	fprintf(output, _("Report bugs to <pgsql-bugs@postgresql.org>.\n"));
147 
148 	ClosePager(output);
149 }
150 
151 
152 /*
153  * slashUsage
154  *
155  * print out help for the backslash commands
156  */
157 void
slashUsage(unsigned short int pager)158 slashUsage(unsigned short int pager)
159 {
160 	FILE	   *output;
161 	char	   *currdb;
162 
163 	currdb = PQdb(pset.db);
164 
165 	/*
166 	 * Keep this line count in sync with the number of lines printed below!
167 	 * Use "psql --help=commands | wc" to count correctly.  It's okay to count
168 	 * the USE_READLINE line even in builds without that.
169 	 */
170 	output = PageOutput(125, pager ? &(pset.popt.topt) : NULL);
171 
172 	fprintf(output, _("General\n"));
173 	fprintf(output, _("  \\copyright             show PostgreSQL usage and distribution terms\n"));
174 	fprintf(output, _("  \\crosstabview [COLUMNS] execute query and display results in crosstab\n"));
175 	fprintf(output, _("  \\errverbose            show most recent error message at maximum verbosity\n"));
176 	fprintf(output, _("  \\g [FILE] or ;         execute query (and send results to file or |pipe)\n"));
177 	fprintf(output, _("  \\gdesc                 describe result of query, without executing it\n"));
178 	fprintf(output, _("  \\gexec                 execute query, then execute each value in its result\n"));
179 	fprintf(output, _("  \\gset [PREFIX]         execute query and store results in psql variables\n"));
180 	fprintf(output, _("  \\gx [FILE]             as \\g, but forces expanded output mode\n"));
181 	fprintf(output, _("  \\q                     quit psql\n"));
182 	fprintf(output, _("  \\watch [SEC]           execute query every SEC seconds\n"));
183 	fprintf(output, "\n");
184 
185 	fprintf(output, _("Help\n"));
186 
187 	fprintf(output, _("  \\? [commands]          show help on backslash commands\n"));
188 	fprintf(output, _("  \\? options             show help on psql command-line options\n"));
189 	fprintf(output, _("  \\? variables           show help on special variables\n"));
190 	fprintf(output, _("  \\h [NAME]              help on syntax of SQL commands, * for all commands\n"));
191 	fprintf(output, "\n");
192 
193 	fprintf(output, _("Query Buffer\n"));
194 	fprintf(output, _("  \\e [FILE] [LINE]       edit the query buffer (or file) with external editor\n"));
195 	fprintf(output, _("  \\ef [FUNCNAME [LINE]]  edit function definition with external editor\n"));
196 	fprintf(output, _("  \\ev [VIEWNAME [LINE]]  edit view definition with external editor\n"));
197 	fprintf(output, _("  \\p                     show the contents of the query buffer\n"));
198 	fprintf(output, _("  \\r                     reset (clear) the query buffer\n"));
199 #ifdef USE_READLINE
200 	fprintf(output, _("  \\s [FILE]              display history or save it to file\n"));
201 #endif
202 	fprintf(output, _("  \\w FILE                write query buffer to file\n"));
203 	fprintf(output, "\n");
204 
205 	fprintf(output, _("Input/Output\n"));
206 	fprintf(output, _("  \\copy ...              perform SQL COPY with data stream to the client host\n"));
207 	fprintf(output, _("  \\echo [STRING]         write string to standard output\n"));
208 	fprintf(output, _("  \\i FILE                execute commands from file\n"));
209 	fprintf(output, _("  \\ir FILE               as \\i, but relative to location of current script\n"));
210 	fprintf(output, _("  \\o [FILE]              send all query results to file or |pipe\n"));
211 	fprintf(output, _("  \\qecho [STRING]        write string to query output stream (see \\o)\n"));
212 	fprintf(output, "\n");
213 
214 	fprintf(output, _("Conditional\n"));
215 	fprintf(output, _("  \\if EXPR               begin conditional block\n"));
216 	fprintf(output, _("  \\elif EXPR             alternative within current conditional block\n"));
217 	fprintf(output, _("  \\else                  final alternative within current conditional block\n"));
218 	fprintf(output, _("  \\endif                 end conditional block\n"));
219 	fprintf(output, "\n");
220 
221 	fprintf(output, _("Informational\n"));
222 	fprintf(output, _("  (options: S = show system objects, + = additional detail)\n"));
223 	fprintf(output, _("  \\d[S+]                 list tables, views, and sequences\n"));
224 	fprintf(output, _("  \\d[S+]  NAME           describe table, view, sequence, or index\n"));
225 	fprintf(output, _("  \\da[S]  [PATTERN]      list aggregates\n"));
226 	fprintf(output, _("  \\dA[+]  [PATTERN]      list access methods\n"));
227 	fprintf(output, _("  \\db[+]  [PATTERN]      list tablespaces\n"));
228 	fprintf(output, _("  \\dc[S+] [PATTERN]      list conversions\n"));
229 	fprintf(output, _("  \\dC[+]  [PATTERN]      list casts\n"));
230 	fprintf(output, _("  \\dd[S]  [PATTERN]      show object descriptions not displayed elsewhere\n"));
231 	fprintf(output, _("  \\dD[S+] [PATTERN]      list domains\n"));
232 	fprintf(output, _("  \\ddp    [PATTERN]      list default privileges\n"));
233 	fprintf(output, _("  \\dE[S+] [PATTERN]      list foreign tables\n"));
234 	fprintf(output, _("  \\det[+] [PATTERN]      list foreign tables\n"));
235 	fprintf(output, _("  \\des[+] [PATTERN]      list foreign servers\n"));
236 	fprintf(output, _("  \\deu[+] [PATTERN]      list user mappings\n"));
237 	fprintf(output, _("  \\dew[+] [PATTERN]      list foreign-data wrappers\n"));
238 	fprintf(output, _("  \\df[anptw][S+] [PATRN] list [only agg/normal/procedures/trigger/window] functions\n"));
239 	fprintf(output, _("  \\dF[+]  [PATTERN]      list text search configurations\n"));
240 	fprintf(output, _("  \\dFd[+] [PATTERN]      list text search dictionaries\n"));
241 	fprintf(output, _("  \\dFp[+] [PATTERN]      list text search parsers\n"));
242 	fprintf(output, _("  \\dFt[+] [PATTERN]      list text search templates\n"));
243 	fprintf(output, _("  \\dg[S+] [PATTERN]      list roles\n"));
244 	fprintf(output, _("  \\di[S+] [PATTERN]      list indexes\n"));
245 	fprintf(output, _("  \\dl                    list large objects, same as \\lo_list\n"));
246 	fprintf(output, _("  \\dL[S+] [PATTERN]      list procedural languages\n"));
247 	fprintf(output, _("  \\dm[S+] [PATTERN]      list materialized views\n"));
248 	fprintf(output, _("  \\dn[S+] [PATTERN]      list schemas\n"));
249 	fprintf(output, _("  \\do[S+] [PATTERN]      list operators\n"));
250 	fprintf(output, _("  \\dO[S+] [PATTERN]      list collations\n"));
251 	fprintf(output, _("  \\dp     [PATTERN]      list table, view, and sequence access privileges\n"));
252 	fprintf(output, _("  \\drds [PATRN1 [PATRN2]] list per-database role settings\n"));
253 	fprintf(output, _("  \\dRp[+] [PATTERN]      list replication publications\n"));
254 	fprintf(output, _("  \\dRs[+] [PATTERN]      list replication subscriptions\n"));
255 	fprintf(output, _("  \\ds[S+] [PATTERN]      list sequences\n"));
256 	fprintf(output, _("  \\dt[S+] [PATTERN]      list tables\n"));
257 	fprintf(output, _("  \\dT[S+] [PATTERN]      list data types\n"));
258 	fprintf(output, _("  \\du[S+] [PATTERN]      list roles\n"));
259 	fprintf(output, _("  \\dv[S+] [PATTERN]      list views\n"));
260 	fprintf(output, _("  \\dx[+]  [PATTERN]      list extensions\n"));
261 	fprintf(output, _("  \\dy[+]  [PATTERN]      list event triggers\n"));
262 	fprintf(output, _("  \\l[+]   [PATTERN]      list databases\n"));
263 	fprintf(output, _("  \\sf[+]  FUNCNAME       show a function's definition\n"));
264 	fprintf(output, _("  \\sv[+]  VIEWNAME       show a view's definition\n"));
265 	fprintf(output, _("  \\z      [PATTERN]      same as \\dp\n"));
266 	fprintf(output, "\n");
267 
268 	fprintf(output, _("Formatting\n"));
269 	fprintf(output, _("  \\a                     toggle between unaligned and aligned output mode\n"));
270 	fprintf(output, _("  \\C [STRING]            set table title, or unset if none\n"));
271 	fprintf(output, _("  \\f [STRING]            show or set field separator for unaligned query output\n"));
272 	fprintf(output, _("  \\H                     toggle HTML output mode (currently %s)\n"),
273 			ON(pset.popt.topt.format == PRINT_HTML));
274 	fprintf(output, _("  \\pset [NAME [VALUE]]   set table output option\n"
275 					  "                         (NAME := {border|columns|expanded|fieldsep|fieldsep_zero|\n"
276 					  "                         footer|format|linestyle|null|numericlocale|pager|\n"
277 					  "                         pager_min_lines|recordsep|recordsep_zero|tableattr|title|\n"
278 					  "                         tuples_only|unicode_border_linestyle|\n"
279 					  "                         unicode_column_linestyle|unicode_header_linestyle})\n"));
280 	fprintf(output, _("  \\t [on|off]            show only rows (currently %s)\n"),
281 			ON(pset.popt.topt.tuples_only));
282 	fprintf(output, _("  \\T [STRING]            set HTML <table> tag attributes, or unset if none\n"));
283 	fprintf(output, _("  \\x [on|off|auto]       toggle expanded output (currently %s)\n"),
284 			pset.popt.topt.expanded == 2 ? "auto" : ON(pset.popt.topt.expanded));
285 	fprintf(output, "\n");
286 
287 	fprintf(output, _("Connection\n"));
288 	if (currdb)
289 		fprintf(output, _("  \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n"
290 						  "                         connect to new database (currently \"%s\")\n"),
291 				currdb);
292 	else
293 		fprintf(output, _("  \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n"
294 						  "                         connect to new database (currently no connection)\n"));
295 	fprintf(output, _("  \\conninfo              display information about current connection\n"));
296 	fprintf(output, _("  \\encoding [ENCODING]   show or set client encoding\n"));
297 	fprintf(output, _("  \\password [USERNAME]   securely change the password for a user\n"));
298 	fprintf(output, "\n");
299 
300 	fprintf(output, _("Operating System\n"));
301 	fprintf(output, _("  \\cd [DIR]              change the current working directory\n"));
302 	fprintf(output, _("  \\setenv NAME [VALUE]   set or unset environment variable\n"));
303 	fprintf(output, _("  \\timing [on|off]       toggle timing of commands (currently %s)\n"),
304 			ON(pset.timing));
305 	fprintf(output, _("  \\! [COMMAND]           execute command in shell or start interactive shell\n"));
306 	fprintf(output, "\n");
307 
308 	fprintf(output, _("Variables\n"));
309 	fprintf(output, _("  \\prompt [TEXT] NAME    prompt user to set internal variable\n"));
310 	fprintf(output, _("  \\set [NAME [VALUE]]    set internal variable, or list all if no parameters\n"));
311 	fprintf(output, _("  \\unset NAME            unset (delete) internal variable\n"));
312 	fprintf(output, "\n");
313 
314 	fprintf(output, _("Large Objects\n"));
315 	fprintf(output, _("  \\lo_export LOBOID FILE\n"
316 					  "  \\lo_import FILE [COMMENT]\n"
317 					  "  \\lo_list\n"
318 					  "  \\lo_unlink LOBOID      large object operations\n"));
319 
320 	ClosePager(output);
321 }
322 
323 
324 /*
325  * helpVariables
326  *
327  * show list of available variables (options) from command line
328  */
329 void
helpVariables(unsigned short int pager)330 helpVariables(unsigned short int pager)
331 {
332 	FILE	   *output;
333 
334 	/*
335 	 * Keep this line count in sync with the number of lines printed below!
336 	 * Use "psql --help=variables | wc" to count correctly; but notice that
337 	 * Windows builds currently print one more line than non-Windows builds.
338 	 * Using the larger number is fine.
339 	 */
340 	output = PageOutput(156, pager ? &(pset.popt.topt) : NULL);
341 
342 	fprintf(output, _("List of specially treated variables\n\n"));
343 
344 	fprintf(output, _("psql variables:\n"));
345 	fprintf(output, _("Usage:\n"));
346 	fprintf(output, _("  psql --set=NAME=VALUE\n  or \\set NAME VALUE inside psql\n\n"));
347 
348 	fprintf(output, _("  AUTOCOMMIT\n"
349 					  "    if set, successful SQL commands are automatically committed\n"));
350 	fprintf(output, _("  COMP_KEYWORD_CASE\n"
351 					  "    determines the case used to complete SQL key words\n"
352 					  "    [lower, upper, preserve-lower, preserve-upper]\n"));
353 	fprintf(output, _("  DBNAME\n"
354 					  "    the currently connected database name\n"));
355 	fprintf(output, _("  ECHO\n"
356 					  "    controls what input is written to standard output\n"
357 					  "    [all, errors, none, queries]\n"));
358 	fprintf(output, _("  ECHO_HIDDEN\n"
359 					  "    if set, display internal queries executed by backslash commands;\n"
360 					  "    if set to \"noexec\", just show them without execution\n"));
361 	fprintf(output, _("  ENCODING\n"
362 					  "    current client character set encoding\n"));
363 	fprintf(output, _("  ERROR\n"
364 					  "    true if last query failed, else false\n"));
365 	fprintf(output, _("  FETCH_COUNT\n"
366 					  "    the number of result rows to fetch and display at a time (0 = unlimited)\n"));
367 	fprintf(output, _("  HISTCONTROL\n"
368 					  "    controls command history [ignorespace, ignoredups, ignoreboth]\n"));
369 	fprintf(output, _("  HISTFILE\n"
370 					  "    file name used to store the command history\n"));
371 	fprintf(output, _("  HISTSIZE\n"
372 					  "    maximum number of commands to store in the command history\n"));
373 	fprintf(output, _("  HOST\n"
374 					  "    the currently connected database server host\n"));
375 	fprintf(output, _("  IGNOREEOF\n"
376 					  "    number of EOFs needed to terminate an interactive session\n"));
377 	fprintf(output, _("  LASTOID\n"
378 					  "    value of the last affected OID\n"));
379 	fprintf(output, _("  LAST_ERROR_MESSAGE\n"
380 					  "  LAST_ERROR_SQLSTATE\n"
381 					  "    message and SQLSTATE of last error, or empty string and \"00000\" if none\n"));
382 	fprintf(output, _("  ON_ERROR_ROLLBACK\n"
383 					  "    if set, an error doesn't stop a transaction (uses implicit savepoints)\n"));
384 	fprintf(output, _("  ON_ERROR_STOP\n"
385 					  "    stop batch execution after error\n"));
386 	fprintf(output, _("  PORT\n"
387 					  "    server port of the current connection\n"));
388 	fprintf(output, _("  PROMPT1\n"
389 					  "    specifies the standard psql prompt\n"));
390 	fprintf(output, _("  PROMPT2\n"
391 					  "    specifies the prompt used when a statement continues from a previous line\n"));
392 	fprintf(output, _("  PROMPT3\n"
393 					  "    specifies the prompt used during COPY ... FROM STDIN\n"));
394 	fprintf(output, _("  QUIET\n"
395 					  "    run quietly (same as -q option)\n"));
396 	fprintf(output, _("  ROW_COUNT\n"
397 					  "    number of rows returned or affected by last query, or 0\n"));
398 	fprintf(output, _("  SERVER_VERSION_NAME\n"
399 					  "  SERVER_VERSION_NUM\n"
400 					  "    server's version (in short string or numeric format)\n"));
401 	fprintf(output, _("  SHOW_CONTEXT\n"
402 					  "    controls display of message context fields [never, errors, always]\n"));
403 	fprintf(output, _("  SINGLELINE\n"
404 					  "    if set, end of line terminates SQL commands (same as -S option)\n"));
405 	fprintf(output, _("  SINGLESTEP\n"
406 					  "    single-step mode (same as -s option)\n"));
407 	fprintf(output, _("  SQLSTATE\n"
408 					  "    SQLSTATE of last query, or \"00000\" if no error\n"));
409 	fprintf(output, _("  USER\n"
410 					  "    the currently connected database user\n"));
411 	fprintf(output, _("  VERBOSITY\n"
412 					  "    controls verbosity of error reports [default, verbose, terse]\n"));
413 	fprintf(output, _("  VERSION\n"
414 					  "  VERSION_NAME\n"
415 					  "  VERSION_NUM\n"
416 					  "    psql's version (in verbose string, short string, or numeric format)\n"));
417 
418 	fprintf(output, _("\nDisplay settings:\n"));
419 	fprintf(output, _("Usage:\n"));
420 	fprintf(output, _("  psql --pset=NAME[=VALUE]\n  or \\pset NAME [VALUE] inside psql\n\n"));
421 
422 	fprintf(output, _("  border\n"
423 					  "    border style (number)\n"));
424 	fprintf(output, _("  columns\n"
425 					  "    target width for the wrapped format\n"));
426 	fprintf(output, _("  expanded (or x)\n"
427 					  "    expanded output [on, off, auto]\n"));
428 	fprintf(output, _("  fieldsep\n"
429 					  "    field separator for unaligned output (default \"%s\")\n"),
430 			DEFAULT_FIELD_SEP);
431 	fprintf(output, _("  fieldsep_zero\n"
432 					  "    set field separator for unaligned output to a zero byte\n"));
433 	fprintf(output, _("  footer\n"
434 					  "    enable or disable display of the table footer [on, off]\n"));
435 	fprintf(output, _("  format\n"
436 					  "    set output format [unaligned, aligned, wrapped, html, asciidoc, ...]\n"));
437 	fprintf(output, _("  linestyle\n"
438 					  "    set the border line drawing style [ascii, old-ascii, unicode]\n"));
439 	fprintf(output, _("  null\n"
440 					  "    set the string to be printed in place of a null value\n"));
441 	fprintf(output, _("  numericlocale\n"
442 					  "    enable display of a locale-specific character to separate groups of digits\n"));
443 	fprintf(output, _("  pager\n"
444 					  "    control when an external pager is used [yes, no, always]\n"));
445 	fprintf(output, _("  recordsep\n"
446 					  "    record (line) separator for unaligned output\n"));
447 	fprintf(output, _("  recordsep_zero\n"
448 					  "    set record separator for unaligned output to a zero byte\n"));
449 	fprintf(output, _("  tableattr (or T)\n"
450 					  "    specify attributes for table tag in html format, or proportional\n"
451 					  "    column widths for left-aligned data types in latex-longtable format\n"));
452 	fprintf(output, _("  title\n"
453 					  "    set the table title for subsequently printed tables\n"));
454 	fprintf(output, _("  tuples_only\n"
455 					  "    if set, only actual table data is shown\n"));
456 	fprintf(output, _("  unicode_border_linestyle\n"
457 					  "  unicode_column_linestyle\n"
458 					  "  unicode_header_linestyle\n"
459 					  "    set the style of Unicode line drawing [single, double]\n"));
460 
461 	fprintf(output, _("\nEnvironment variables:\n"));
462 	fprintf(output, _("Usage:\n"));
463 
464 #ifndef WIN32
465 	fprintf(output, _("  NAME=VALUE [NAME=VALUE] psql ...\n  or \\setenv NAME [VALUE] inside psql\n\n"));
466 #else
467 	fprintf(output, _("  set NAME=VALUE\n  psql ...\n  or \\setenv NAME [VALUE] inside psql\n\n"));
468 #endif
469 
470 	fprintf(output, _("  COLUMNS\n"
471 					  "    number of columns for wrapped format\n"));
472 	fprintf(output, _("  PGAPPNAME\n"
473 					  "    same as the application_name connection parameter\n"));
474 	fprintf(output, _("  PGDATABASE\n"
475 					  "    same as the dbname connection parameter\n"));
476 	fprintf(output, _("  PGHOST\n"
477 					  "    same as the host connection parameter\n"));
478 	fprintf(output, _("  PGPASSWORD\n"
479 					  "    connection password (not recommended)\n"));
480 	fprintf(output, _("  PGPASSFILE\n"
481 					  "    password file name\n"));
482 	fprintf(output, _("  PGPORT\n"
483 					  "    same as the port connection parameter\n"));
484 	fprintf(output, _("  PGUSER\n"
485 					  "    same as the user connection parameter\n"));
486 	fprintf(output, _("  PSQL_EDITOR, EDITOR, VISUAL\n"
487 					  "    editor used by the \\e, \\ef, and \\ev commands\n"));
488 	fprintf(output, _("  PSQL_EDITOR_LINENUMBER_ARG\n"
489 					  "    how to specify a line number when invoking the editor\n"));
490 	fprintf(output, _("  PSQL_HISTORY\n"
491 					  "    alternative location for the command history file\n"));
492 	fprintf(output, _("  PSQL_PAGER, PAGER\n"
493 					  "    name of external pager program\n"));
494 	fprintf(output, _("  PSQLRC\n"
495 					  "    alternative location for the user's .psqlrc file\n"));
496 	fprintf(output, _("  SHELL\n"
497 					  "    shell used by the \\! command\n"));
498 	fprintf(output, _("  TMPDIR\n"
499 					  "    directory for temporary files\n"));
500 
501 	ClosePager(output);
502 }
503 
504 
505 /*
506  * helpSQL -- help with SQL commands
507  *
508  * Note: we assume caller removed any trailing spaces in "topic".
509  */
510 void
helpSQL(const char * topic,unsigned short int pager)511 helpSQL(const char *topic, unsigned short int pager)
512 {
513 #define VALUE_OR_NULL(a) ((a) ? (a) : "")
514 
515 	if (!topic || strlen(topic) == 0)
516 	{
517 		/* Print all the available command names */
518 		int			screen_width;
519 		int			ncolumns;
520 		int			nrows;
521 		FILE	   *output;
522 		int			i;
523 		int			j;
524 
525 		/* Find screen width to determine how many columns will fit */
526 #ifdef TIOCGWINSZ
527 		struct winsize screen_size;
528 
529 		if (ioctl(fileno(stdout), TIOCGWINSZ, &screen_size) == -1)
530 			screen_width = 80;	/* ioctl failed, assume 80 */
531 		else
532 			screen_width = screen_size.ws_col;
533 #else
534 		screen_width = 80;		/* default assumption */
535 #endif
536 
537 		ncolumns = (screen_width - 3) / (QL_MAX_CMD_LEN + 1);
538 		ncolumns = Max(ncolumns, 1);
539 		nrows = (QL_HELP_COUNT + (ncolumns - 1)) / ncolumns;
540 
541 		output = PageOutput(nrows + 1, pager ? &(pset.popt.topt) : NULL);
542 
543 		fputs(_("Available help:\n"), output);
544 
545 		for (i = 0; i < nrows; i++)
546 		{
547 			fprintf(output, "  ");
548 			for (j = 0; j < ncolumns - 1; j++)
549 				fprintf(output, "%-*s",
550 						QL_MAX_CMD_LEN + 1,
551 						VALUE_OR_NULL(QL_HELP[i + j * nrows].cmd));
552 			if (i + j * nrows < QL_HELP_COUNT)
553 				fprintf(output, "%s",
554 						VALUE_OR_NULL(QL_HELP[i + j * nrows].cmd));
555 			fputc('\n', output);
556 		}
557 
558 		ClosePager(output);
559 	}
560 	else
561 	{
562 		int			i,
563 					pass;
564 		FILE	   *output = NULL;
565 		size_t		len,
566 					wordlen,
567 					j;
568 		int			nl_count;
569 
570 		/*
571 		 * len is the amount of the input to compare to the help topic names.
572 		 * We first try exact match, then first + second words, then first
573 		 * word only.
574 		 */
575 		len = strlen(topic);
576 
577 		for (pass = 1; pass <= 3; pass++)
578 		{
579 			if (pass > 1)		/* Nothing on first pass - try the opening
580 								 * word(s) */
581 			{
582 				wordlen = j = 1;
583 				while (j < len && topic[j++] != ' ')
584 					wordlen++;
585 				if (pass == 2 && j < len)
586 				{
587 					wordlen++;
588 					while (j < len && topic[j++] != ' ')
589 						wordlen++;
590 				}
591 				if (wordlen >= len)
592 				{
593 					/* Failed to shorten input, so try next pass if any */
594 					continue;
595 				}
596 				len = wordlen;
597 			}
598 
599 			/*
600 			 * Count newlines for pager.  This logic must agree with what the
601 			 * following loop will do!
602 			 */
603 			nl_count = 0;
604 			for (i = 0; QL_HELP[i].cmd; i++)
605 			{
606 				if (pg_strncasecmp(topic, QL_HELP[i].cmd, len) == 0 ||
607 					strcmp(topic, "*") == 0)
608 				{
609 					/* magic constant here must match format below! */
610 					nl_count += 5 + QL_HELP[i].nl_count;
611 
612 					/* If we have an exact match, exit.  Fixes \h SELECT */
613 					if (pg_strcasecmp(topic, QL_HELP[i].cmd) == 0)
614 						break;
615 				}
616 			}
617 			/* If no matches, don't open the output yet */
618 			if (nl_count == 0)
619 				continue;
620 
621 			if (!output)
622 				output = PageOutput(nl_count, pager ? &(pset.popt.topt) : NULL);
623 
624 			for (i = 0; QL_HELP[i].cmd; i++)
625 			{
626 				if (pg_strncasecmp(topic, QL_HELP[i].cmd, len) == 0 ||
627 					strcmp(topic, "*") == 0)
628 				{
629 					PQExpBufferData buffer;
630 
631 					initPQExpBuffer(&buffer);
632 					QL_HELP[i].syntaxfunc(&buffer);
633 					/* # of newlines in format must match constant above! */
634 					fprintf(output, _("Command:     %s\n"
635 									  "Description: %s\n"
636 									  "Syntax:\n%s\n\n"),
637 							QL_HELP[i].cmd,
638 							_(QL_HELP[i].help),
639 							buffer.data);
640 					termPQExpBuffer(&buffer);
641 
642 					/* If we have an exact match, exit.  Fixes \h SELECT */
643 					if (pg_strcasecmp(topic, QL_HELP[i].cmd) == 0)
644 						break;
645 				}
646 			}
647 			break;
648 		}
649 
650 		/* If we never found anything, report that */
651 		if (!output)
652 		{
653 			output = PageOutput(2, pager ? &(pset.popt.topt) : NULL);
654 			fprintf(output, _("No help available for \"%s\".\n"
655 							  "Try \\h with no arguments to see available help.\n"),
656 					topic);
657 		}
658 
659 		ClosePager(output);
660 	}
661 }
662 
663 
664 
665 void
print_copyright(void)666 print_copyright(void)
667 {
668 	puts(
669 		 "PostgreSQL Database Management System\n"
670 		 "(formerly known as Postgres, then as Postgres95)\n\n"
671 		 "Portions Copyright (c) 1996-2018, PostgreSQL Global Development Group\n\n"
672 		 "Portions Copyright (c) 1994, The Regents of the University of California\n\n"
673 		 "Permission to use, copy, modify, and distribute this software and its\n"
674 		 "documentation for any purpose, without fee, and without a written agreement\n"
675 		 "is hereby granted, provided that the above copyright notice and this\n"
676 		 "paragraph and the following two paragraphs appear in all copies.\n\n"
677 		 "IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR\n"
678 		 "DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING\n"
679 		 "LOST PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS\n"
680 		 "DOCUMENTATION, EVEN IF THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED OF THE\n"
681 		 "POSSIBILITY OF SUCH DAMAGE.\n\n"
682 		 "THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES,\n"
683 		 "INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY\n"
684 		 "AND FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS\n"
685 		 "ON AN \"AS IS\" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATIONS TO\n"
686 		 "PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.\n"
687 		);
688 }
689