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