27 #include "catalog/pg_class_d.h"
79 bool show_verbose,
bool show_system);
131 const char *cmd,
bool is_func);
163 int lineno,
bool discard_on_quit,
bool *edited);
164 static bool do_shell(
const char *command);
181 static void checkWin32Codepage(
void);
223 Assert(scan_state != NULL);
306 pg_log_warning(
"\\%s command ignored; use \\endif or Ctrl-C to exit current \\if block",
310 if (strcmp(cmd,
"a") == 0)
312 else if (strcmp(cmd,
"bind") == 0)
314 else if (strcmp(cmd,
"C") == 0)
316 else if (strcmp(cmd,
"c") == 0 || strcmp(cmd,
"connect") == 0)
318 else if (strcmp(cmd,
"cd") == 0)
320 else if (strcmp(cmd,
"conninfo") == 0)
324 else if (strcmp(cmd,
"copyright") == 0)
326 else if (strcmp(cmd,
"crosstabview") == 0)
328 else if (cmd[0] ==
'd')
330 else if (strcmp(cmd,
"e") == 0 || strcmp(cmd,
"edit") == 0)
332 query_buf, previous_buf);
333 else if (strcmp(cmd,
"ef") == 0)
335 else if (strcmp(cmd,
"ev") == 0)
337 else if (strcmp(cmd,
"echo") == 0 || strcmp(cmd,
"qecho") == 0 ||
338 strcmp(cmd,
"warn") == 0)
340 else if (strcmp(cmd,
"elif") == 0)
342 else if (strcmp(cmd,
"else") == 0)
344 else if (strcmp(cmd,
"endif") == 0)
346 else if (strcmp(cmd,
"encoding") == 0)
348 else if (strcmp(cmd,
"errverbose") == 0)
350 else if (strcmp(cmd,
"f") == 0)
352 else if (strcmp(cmd,
"g") == 0 || strcmp(cmd,
"gx") == 0)
354 else if (strcmp(cmd,
"gdesc") == 0)
356 else if (strcmp(cmd,
"getenv") == 0)
358 else if (strcmp(cmd,
"gexec") == 0)
360 else if (strcmp(cmd,
"gset") == 0)
362 else if (strcmp(cmd,
"h") == 0 || strcmp(cmd,
"help") == 0)
364 else if (strcmp(cmd,
"H") == 0 || strcmp(cmd,
"html") == 0)
366 else if (strcmp(cmd,
"i") == 0 || strcmp(cmd,
"include") == 0 ||
367 strcmp(cmd,
"ir") == 0 || strcmp(cmd,
"include_relative") == 0)
369 else if (strcmp(cmd,
"if") == 0)
371 else if (strcmp(cmd,
"l") == 0 || strcmp(cmd,
"list") == 0 ||
372 strcmp(cmd,
"l+") == 0 || strcmp(cmd,
"list+") == 0)
374 else if (strncmp(cmd,
"lo_", 3) == 0)
376 else if (strcmp(cmd,
"o") == 0 || strcmp(cmd,
"out") == 0)
378 else if (strcmp(cmd,
"p") == 0 || strcmp(cmd,
"print") == 0)
380 query_buf, previous_buf);
381 else if (strcmp(cmd,
"password") == 0)
383 else if (strcmp(cmd,
"prompt") == 0)
385 else if (strcmp(cmd,
"pset") == 0)
387 else if (strcmp(cmd,
"q") == 0 || strcmp(cmd,
"quit") == 0)
389 else if (strcmp(cmd,
"r") == 0 || strcmp(cmd,
"reset") == 0)
391 else if (strcmp(cmd,
"s") == 0)
393 else if (strcmp(cmd,
"set") == 0)
395 else if (strcmp(cmd,
"setenv") == 0)
397 else if (strcmp(cmd,
"sf") == 0 || strcmp(cmd,
"sf+") == 0)
399 else if (strcmp(cmd,
"sv") == 0 || strcmp(cmd,
"sv+") == 0)
401 else if (strcmp(cmd,
"t") == 0)
403 else if (strcmp(cmd,
"T") == 0)
405 else if (strcmp(cmd,
"timing") == 0)
407 else if (strcmp(cmd,
"unset") == 0)
409 else if (strcmp(cmd,
"w") == 0 || strcmp(cmd,
"write") == 0)
411 query_buf, previous_buf);
412 else if (strcmp(cmd,
"watch") == 0)
414 query_buf, previous_buf);
415 else if (strcmp(cmd,
"x") == 0)
417 else if (strcmp(cmd,
"z") == 0 || strcmp(cmd,
"zS") == 0)
419 else if (strcmp(cmd,
"!") == 0)
421 else if (strcmp(cmd,
"?") == 0)
478 if (nparams > nalloc)
480 nalloc = nalloc ? nalloc * 2 : 1;
536 static const char prefix[] =
"-reuse-previous=";
544 if (opt1 != NULL && strncmp(opt1, prefix,
sizeof(prefix) - 1) == 0)
599 dir = getenv(
"HOME");
600 if (dir == NULL || dir[0] ==
'\0')
602 uid_t user_id = geteuid();
606 pw = getpwuid(user_id);
611 pg_log_error(
"could not get home directory for user ID %ld: %s",
613 errno ?
strerror(errno) :
_(
"user does not exist"));
630 pg_log_error(
"\\%s: could not change directory to \"%s\": %m",
654 printf(
_(
"You are currently not connected to a database.\n"));
663 if (hostaddr && *hostaddr)
664 printf(
_(
"You are connected to database \"%s\" as user \"%s\" on address \"%s\" at port \"%s\".\n"),
667 printf(
_(
"You are connected to database \"%s\" as user \"%s\" via socket in \"%s\" at port \"%s\".\n"),
672 if (hostaddr && *hostaddr && strcmp(host, hostaddr) != 0)
673 printf(
_(
"You are connected to database \"%s\" as user \"%s\" on host \"%s\" (address \"%s\") at port \"%s\".\n"),
676 printf(
_(
"You are connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n"),
764 show_verbose = strchr(cmd,
'+') ?
true :
false;
765 show_system = strchr(cmd,
'S') ?
true :
false;
780 char *pattern2 = NULL;
782 if (pattern && cmd[2] !=
'\0' && cmd[2] !=
'+')
818 if (strncmp(cmd,
"dconfig", 7) == 0)
831 if (strncmp(cmd,
"ddp", 3) == 0)
851 show_verbose, show_system);
873 show_verbose, show_system);
910 if (cmd[2] ==
'd' && cmd[3] ==
's')
912 char *pattern2 = NULL;
1014 const char *pattern,
1015 bool show_verbose,
bool show_system)
1019 int num_arg_patterns = 0;
1029 arg_patterns[num_arg_patterns++] = ap;
1037 arg_patterns, num_arg_patterns,
1038 show_verbose, show_system);
1041 arg_patterns, num_arg_patterns,
1042 show_verbose, show_system);
1044 while (--num_arg_patterns >= 0)
1045 free(arg_patterns[num_arg_patterns]);
1084 strspn(fname,
"0123456789") == strlen(fname))
1103 bool discard_on_quit;
1110 discard_on_quit =
true;
1123 if (
do_edit(fname, query_buf, lineno, discard_on_quit, NULL))
1177 "CREATE FUNCTION ( )\n"
1180 " -- common options: IMMUTABLE STABLE STRICT SECURITY DEFINER\n"
1187 " -- something...\n");
1199 else if (is_func && lineno > 0)
1210 const char *lines = query_buf->
data;
1212 while (*lines !=
'\0')
1214 if (strncmp(lines,
"AS ", 3) == 0 ||
1215 strncmp(lines,
"BEGIN ", 6) == 0 ||
1216 strncmp(lines,
"RETURN ", 7) == 0)
1220 lines = strchr(lines,
'\n');
1230 bool edited =
false;
1232 if (!
do_edit(NULL, query_buf, lineno,
true, &edited))
1235 puts(
_(
"No changes"));
1258 bool no_newline =
false;
1262 if (strcmp(cmd,
"qecho") == 0)
1264 else if (strcmp(cmd,
"warn") == 0)
1272 if (first && !no_newline && !quoted && strcmp(
value,
"-n") == 0)
1352 puts(
_(
"out of memory"));
1355 puts(
_(
"There is no previous error."));
1405 if (fname && fname[0] ==
'(')
1409 active_branch, cmd);
1425 if (strcmp(cmd,
"gx") == 0)
1447 bool active_branch,
const char *cmd)
1450 bool found_r_paren =
false;
1477 if (optlen > 0 &&
option[optlen - 1] ==
')')
1480 found_r_paren =
true;
1487 char *valptr = strchr(
option,
'=');
1502 first_option = NULL;
1505 }
while (!found_r_paren);
1550 if (!myvar || !envvar)
1557 char *envval = getenv(envvar);
1634 (isspace((
unsigned char) opt[
len - 1])
1635 || opt[
len - 1] ==
';'))
1687 bool include_relative;
1689 include_relative = (strcmp(cmd,
"ir") == 0
1690 || strcmp(cmd,
"include_relative") == 0);
1951 show_verbose = strchr(cmd,
'+') ?
true :
false;
1982 if (strcmp(cmd + 3,
"export") == 0)
1996 else if (strcmp(cmd + 3,
"import") == 0)
2010 else if (strcmp(cmd + 3,
"list") == 0)
2012 else if (strcmp(cmd + 3,
"list+") == 0)
2015 else if (strcmp(cmd + 3,
"unlink") == 0)
2078 if (query_buf && query_buf->
len > 0)
2079 puts(query_buf->
data);
2080 else if (previous_buf && previous_buf->
len > 0)
2081 puts(previous_buf->
data);
2083 puts(
_(
"Query buffer is empty."));
2137 else if (strcmp(pw1, pw2) != 0)
2144 char *encrypted_password;
2148 if (!encrypted_password)
2192 *prompt_text = NULL;
2230 fputs(prompt_text,
stdout);
2236 pg_log_error(
"\\%s: could not read value for variable",
2277 static const char *
const my_list[] = {
2278 "border",
"columns",
"csv_fieldsep",
"expanded",
"fieldsep",
2279 "fieldsep_zero",
"footer",
"format",
"linestyle",
"null",
2280 "numericlocale",
"pager",
"pager_min_lines",
2281 "recordsep",
"recordsep_zero",
2282 "tableattr",
"title",
"tuples_only",
2283 "unicode_border_linestyle",
2284 "unicode_column_linestyle",
2285 "unicode_header_linestyle",
2290 for (
i = 0; my_list[
i] != NULL;
i++)
2338 puts(
_(
"Query buffer reset (cleared)."));
2360 printf(
_(
"Wrote history to file \"%s\".\n"), fname);
2445 else if (strchr(envvar,
'=') != NULL)
2447 pg_log_error(
"\\%s: environment variable name must not contain \"=\"",
2460 setenv(envvar, envval, 1);
2477 const char *cmd,
bool is_func)
2483 bool show_linenumbers = (strchr(cmd,
'+') != NULL);
2531 if (show_linenumbers)
2619 puts(
_(
"Timing is on."));
2621 puts(
_(
"Timing is off."));
2676 bool is_pipe =
false;
2693 if (fname[0] ==
'|')
2698 fd = popen(&fname[1],
"w");
2703 fd = fopen(fname,
"w");
2723 if (query_buf && query_buf->
len > 0)
2725 else if (previous_buf && previous_buf->
len > 0)
2730 result = pclose(
fd);
2740 result = fclose(
fd);
2782 sleep = strtod(opt, &opt_end);
2783 if (sleep < 0 || *opt_end || errno == ERANGE)
2785 pg_log_error(
"\\watch: incorrect interval value '%s'", opt);
2847 show_system = strchr(cmd,
'S') ?
true :
false;
2892 if (!opt0 || strcmp(opt0,
"commands") == 0)
2894 else if (strcmp(opt0,
"options") == 0)
2896 else if (strcmp(opt0,
"variables") == 0)
2938 if (*result ==
'\0' || strcmp(result,
"-") == 0)
2959 int num_options = 0;
2967 if (num_options > 0)
3066 return (strcmp(cmd,
"if") == 0 ||
3067 strcmp(cmd,
"elif") == 0 ||
3068 strcmp(cmd,
"else") == 0 ||
3069 strcmp(cmd,
"endif") == 0);
3107 Assert(new_len >= 0 && new_len <= query_buf->
len);
3108 query_buf->
len = new_len;
3109 query_buf->
data[new_len] =
'\0';
3128 if (query_buf && query_buf->
len == 0)
3174 if (new_val == NULL)
3177 if (old_val == NULL || strcmp(old_val, new_val) != 0)
3202 bool same_host =
false;
3204 char *client_encoding;
3206 bool keep_password =
true;
3207 bool has_connection_string;
3208 bool reuse_previous;
3210 has_connection_string =
dbname ?
3214 if (has_connection_string && (
user || host ||
port))
3216 pg_log_error(
"Do not give user, host, or port separately when using a connection string");
3220 switch (reuse_previous_specification)
3223 reuse_previous =
true;
3226 reuse_previous =
false;
3229 reuse_previous = !has_connection_string;
3251 pg_log_error(
"No database connection exists to re-use parameters from");
3260 if (has_connection_string)
3271 bool have_password =
false;
3273 for (ci = cinfo, replci = replcinfo;
3286 char *swap = replci->
val;
3298 if (replci->
val == NULL ||
3299 strcmp(ci->
val, replci->
val) != 0)
3301 if (strcmp(replci->
keyword,
"user") == 0 ||
3302 strcmp(replci->
keyword,
"host") == 0 ||
3303 strcmp(replci->
keyword,
"hostaddr") == 0 ||
3304 strcmp(replci->
keyword,
"port") == 0)
3305 keep_password =
false;
3308 if (strcmp(replci->
keyword,
"password") == 0)
3309 have_password =
true;
3311 else if (!reuse_previous)
3334 nconnopts = ci - cinfo;
3344 keep_password =
true;
3379 for (ci = cinfo; ci->
keyword; ci++)
3383 if (!(ci->
val && strcmp(
user, ci->
val) == 0))
3384 keep_password =
false;
3386 else if (host && strcmp(ci->
keyword,
"host") == 0)
3388 if (ci->
val && strcmp(host, ci->
val) == 0)
3391 keep_password =
false;
3393 else if (
port && strcmp(ci->
keyword,
"port") == 0)
3395 if (!(ci->
val && strcmp(
port, ci->
val) == 0))
3396 keep_password =
false;
3401 nconnopts = ci - cinfo;
3423 bool canceled =
false;
3442 if (
pset.
notty || getenv(
"PGCLIENTENCODING"))
3443 client_encoding = NULL;
3445 client_encoding =
"auto";
3450 const char **keywords =
pg_malloc((nconnopts + 1) *
sizeof(*keywords));
3464 for (ci = cinfo; ci->
keyword; ci++)
3466 keywords[paramnum] = ci->
keyword;
3470 else if (
user && strcmp(ci->
keyword,
"user") == 0)
3472 else if (host && strcmp(ci->
keyword,
"host") == 0)
3473 values[paramnum++] = host;
3474 else if (host && !same_host && strcmp(ci->
keyword,
"hostaddr") == 0)
3477 values[paramnum++] = NULL;
3479 else if (
port && strcmp(ci->
keyword,
"port") == 0)
3482 else if ((
password || !keep_password) &&
3483 strcmp(ci->
keyword,
"password") == 0)
3485 else if (strcmp(ci->
keyword,
"fallback_application_name") == 0)
3487 else if (client_encoding &&
3488 strcmp(ci->
keyword,
"client_encoding") == 0)
3489 values[paramnum++] = client_encoding;
3495 keywords[paramnum] = NULL;
3513 bool canceled =
false;
3618 if (hostaddr && *hostaddr)
3619 printf(
_(
"You are now connected to database \"%s\" as user \"%s\" on address \"%s\" at port \"%s\".\n"),
3622 printf(
_(
"You are now connected to database \"%s\" as user \"%s\" via socket in \"%s\" at port \"%s\".\n"),
3627 if (hostaddr && *hostaddr && strcmp(connhost, hostaddr) != 0)
3628 printf(
_(
"You are now connected to database \"%s\" as user \"%s\" on host \"%s\" (address \"%s\") at port \"%s\".\n"),
3631 printf(
_(
"You are now connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n"),
3636 printf(
_(
"You are now connected to database \"%s\" as user \"%s\".\n"),
3658 int client_ver = PG_VERSION_NUM;
3672 sverbuf,
sizeof(sverbuf));
3676 printf(
_(
"%s (%s, server %s)\n"),
3680 else if (in_startup)
3689 printf(
_(
"WARNING: %s major version %s, server major version %s.\n"
3690 " Some psql features might not work.\n"),
3693 cverbuf,
sizeof(cverbuf)),
3695 sverbuf,
sizeof(sverbuf)));
3699 checkWin32Codepage();
3715 const char *protocol;
3717 const char *compression;
3726 printf(
_(
"SSL connection (protocol: %s, cipher: %s, compression: %s)\n"),
3727 protocol ? protocol :
_(
"unknown"),
3728 cipher ? cipher :
_(
"unknown"),
3729 (compression && strcmp(compression,
"off") != 0) ?
_(
"on") :
_(
"off"));
3743 printf(
_(
"GSSAPI-encrypted connection\n"));
3754 checkWin32Codepage(
void)
3760 concp = GetConsoleCP();
3763 printf(
_(
"WARNING: Console code page (%u) differs from Windows code page (%u)\n"
3764 " 8-bit characters might not work correctly. See psql reference\n"
3765 " page \"Notes for Windows users\" for details.\n"),
3842 const char *editorName;
3843 const char *editor_lineno_arg = NULL;
3850 editorName = getenv(
"PSQL_EDITOR");
3852 editorName = getenv(
"EDITOR");
3854 editorName = getenv(
"VISUAL");
3861 editor_lineno_arg = getenv(
"PSQL_EDITOR_LINENUMBER_ARG");
3862 #ifdef DEFAULT_EDITOR_LINENUMBER_ARG
3863 if (!editor_lineno_arg)
3866 if (!editor_lineno_arg)
3868 pg_log_error(
"environment variable PSQL_EDITOR_LINENUMBER_ARG must be set to specify a line number");
3882 sys =
psprintf(
"exec %s %s%d '%s'",
3883 editorName, editor_lineno_arg, lineno, fname);
3889 sys =
psprintf(
"\"%s\" %s%d \"%s\"",
3890 editorName, editor_lineno_arg, lineno, fname);
3896 result = system(sys);
3898 pg_log_error(
"could not start editor \"%s\"", editorName);
3899 else if (result == 127)
3923 int lineno,
bool discard_on_quit,
bool *edited)
3926 FILE *stream = NULL;
3934 fname = filename_arg;
3939 const char *tmpdir = getenv(
"TMPDIR");
3950 pg_log_error(
"could not locate temporary directory: %s",
3962 snprintf(fnametmp,
sizeof(fnametmp),
"%s%spsql.edit.%d.sql", tmpdir,
3963 "/", (
int) getpid());
3965 snprintf(fnametmp,
sizeof(fnametmp),
"%s%spsql.edit.%d.sql", tmpdir,
3966 "" , (
int) getpid());
3969 fname = (
const char *) fnametmp;
3971 fd = open(fname, O_WRONLY | O_CREAT | O_EXCL, 0600);
3973 stream = fdopen(
fd,
"w");
3975 if (
fd == -1 || !stream)
3977 pg_log_error(
"could not open temporary file \"%s\": %m", fname);
3982 unsigned int ql = query_buf->
len;
3985 if (ql > 0 && query_buf->
data[ql - 1] !=
'\n')
3991 if (fwrite(query_buf->
data, 1, ql, stream) != ql)
3995 if (fclose(stream) != 0)
3998 if (remove(fname) != 0)
4003 else if (fclose(stream) != 0)
4006 if (remove(fname) != 0)
4025 ut.modtime = ut.actime = time(NULL) - 2;
4026 (void) utime(fname, &ut);
4064 while (fgets(line,
sizeof(line), stream) != NULL)
4087 if (discard_on_quit)
4094 if (remove(fname) == -1)
4129 else if (strcmp(
filename,
"-") != 0)
4207 return "latex-longtable";
4277 vallen = strlen(
value);
4280 if (strcmp(param,
"format") == 0)
4282 static const struct fmt
4313 pg_log_error(
"\\pset: ambiguous abbreviation \"%s\" matches both \"%s\" and \"%s\"",
4315 formats[match_pos].
name, formats[
i].
name);
4321 popt->
topt.
format = formats[match_pos].number;
4333 pg_log_error(
"\\pset: allowed formats are aligned, asciidoc, csv, html, latex, latex-longtable, troff-ms, unaligned, wrapped");
4340 else if (strcmp(param,
"linestyle") == 0)
4352 pg_log_error(
"\\pset: allowed line styles are ascii, old-ascii, unicode");
4358 else if (strcmp(param,
"unicode_border_linestyle") == 0)
4367 pg_log_error(
"\\pset: allowed Unicode border line styles are single, double");
4373 else if (strcmp(param,
"unicode_column_linestyle") == 0)
4382 pg_log_error(
"\\pset: allowed Unicode column line styles are single, double");
4388 else if (strcmp(param,
"unicode_header_linestyle") == 0)
4397 pg_log_error(
"\\pset: allowed Unicode header line styles are single, double");
4403 else if (strcmp(param,
"border") == 0)
4410 else if (strcmp(param,
"x") == 0 ||
4411 strcmp(param,
"expanded") == 0 ||
4412 strcmp(param,
"vertical") == 0)
4433 else if (strcmp(param,
"xheader_width") == 0)
4449 pg_log_error(
"\\pset: allowed xheader_width values are full (default), column, page, or a number specifying the exact width.");
4456 else if (strcmp(param,
"csv_fieldsep") == 0)
4461 if (strlen(
value) != 1)
4463 pg_log_error(
"\\pset: csv_fieldsep must be a single one-byte character");
4468 pg_log_error(
"\\pset: csv_fieldsep cannot be a double quote, a newline, or a carriage return");
4476 else if (strcmp(param,
"numericlocale") == 0)
4485 else if (strcmp(param,
"null") == 0)
4495 else if (strcmp(param,
"fieldsep") == 0)
4505 else if (strcmp(param,
"fieldsep_zero") == 0)
4513 else if (strcmp(param,
"recordsep") == 0)
4523 else if (strcmp(param,
"recordsep_zero") == 0)
4531 else if (strcmp(param,
"t") == 0 || strcmp(param,
"tuples_only") == 0)
4540 else if (strcmp(param,
"C") == 0 || strcmp(param,
"title") == 0)
4550 else if (strcmp(param,
"T") == 0 || strcmp(param,
"tableattr") == 0)
4560 else if (strcmp(param,
"pager") == 0)
4582 else if (strcmp(param,
"pager_min_lines") == 0)
4589 else if (strcmp(param,
"footer") == 0)
4598 else if (strcmp(param,
"columns") == 0)
4624 if (strcmp(param,
"border") == 0)
4628 else if (strcmp(param,
"columns") == 0)
4631 printf(
_(
"Target width is unset.\n"));
4637 else if (strcmp(param,
"x") == 0 || strcmp(param,
"expanded") == 0 || strcmp(param,
"vertical") == 0)
4640 printf(
_(
"Expanded display is on.\n"));
4642 printf(
_(
"Expanded display is used automatically.\n"));
4644 printf(
_(
"Expanded display is off.\n"));
4648 else if (strcmp(param,
"xheader_width") == 0)
4651 printf(
_(
"Expanded header width is 'full'.\n"));
4653 printf(
_(
"Expanded header width is 'column'.\n"));
4655 printf(
_(
"Expanded header width is 'page'.\n"));
4661 else if (strcmp(param,
"csv_fieldsep") == 0)
4663 printf(
_(
"Field separator for CSV is \"%s\".\n"),
4668 else if (strcmp(param,
"fieldsep") == 0)
4671 printf(
_(
"Field separator is zero byte.\n"));
4673 printf(
_(
"Field separator is \"%s\".\n"),
4677 else if (strcmp(param,
"fieldsep_zero") == 0)
4679 printf(
_(
"Field separator is zero byte.\n"));
4683 else if (strcmp(param,
"footer") == 0)
4686 printf(
_(
"Default footer is on.\n"));
4688 printf(
_(
"Default footer is off.\n"));
4692 else if (strcmp(param,
"format") == 0)
4698 else if (strcmp(param,
"linestyle") == 0)
4700 printf(
_(
"Line style is %s.\n"),
4705 else if (strcmp(param,
"null") == 0)
4707 printf(
_(
"Null display is \"%s\".\n"),
4712 else if (strcmp(param,
"numericlocale") == 0)
4715 printf(
_(
"Locale-adjusted numeric output is on.\n"));
4717 printf(
_(
"Locale-adjusted numeric output is off.\n"));
4721 else if (strcmp(param,
"pager") == 0)
4724 printf(
_(
"Pager is used for long output.\n"));
4726 printf(
_(
"Pager is always used.\n"));
4728 printf(
_(
"Pager usage is off.\n"));
4732 else if (strcmp(param,
"pager_min_lines") == 0)
4735 "Pager won't be used for less than %d lines.\n",
4741 else if (strcmp(param,
"recordsep") == 0)
4744 printf(
_(
"Record separator is zero byte.\n"));
4746 printf(
_(
"Record separator is <newline>.\n"));
4748 printf(
_(
"Record separator is \"%s\".\n"),
4752 else if (strcmp(param,
"recordsep_zero") == 0)
4754 printf(
_(
"Record separator is zero byte.\n"));
4758 else if (strcmp(param,
"T") == 0 || strcmp(param,
"tableattr") == 0)
4761 printf(
_(
"Table attributes are \"%s\".\n"),
4764 printf(
_(
"Table attributes unset.\n"));
4768 else if (strcmp(param,
"C") == 0 || strcmp(param,
"title") == 0)
4773 printf(
_(
"Title is unset.\n"));
4777 else if (strcmp(param,
"t") == 0 || strcmp(param,
"tuples_only") == 0)
4780 printf(
_(
"Tuples only is on.\n"));
4782 printf(
_(
"Tuples only is off.\n"));
4786 else if (strcmp(param,
"unicode_border_linestyle") == 0)
4788 printf(
_(
"Unicode border line style is \"%s\".\n"),
4792 else if (strcmp(param,
"unicode_column_linestyle") == 0)
4794 printf(
_(
"Unicode column line style is \"%s\".\n"),
4798 else if (strcmp(param,
"unicode_header_linestyle") == 0)
4800 printf(
_(
"Unicode header line style is \"%s\".\n"),
4883 return val ?
"on" :
"off";
4902 else if (*
str ==
'\'')
4930 if (strcmp(param,
"border") == 0)
4932 else if (strcmp(param,
"columns") == 0)
4934 else if (strcmp(param,
"csv_fieldsep") == 0)
4936 else if (strcmp(param,
"expanded") == 0)
4940 else if (strcmp(param,
"fieldsep") == 0)
4944 else if (strcmp(param,
"fieldsep_zero") == 0)
4946 else if (strcmp(param,
"footer") == 0)
4948 else if (strcmp(param,
"format") == 0)
4950 else if (strcmp(param,
"linestyle") == 0)
4952 else if (strcmp(param,
"null") == 0)
4956 else if (strcmp(param,
"numericlocale") == 0)
4958 else if (strcmp(param,
"pager") == 0)
4960 else if (strcmp(param,
"pager_min_lines") == 0)
4962 else if (strcmp(param,
"recordsep") == 0)
4966 else if (strcmp(param,
"recordsep_zero") == 0)
4968 else if (strcmp(param,
"tableattr") == 0)
4970 else if (strcmp(param,
"title") == 0)
4972 else if (strcmp(param,
"tuples_only") == 0)
4974 else if (strcmp(param,
"unicode_border_linestyle") == 0)
4976 else if (strcmp(param,
"unicode_column_linestyle") == 0)
4978 else if (strcmp(param,
"unicode_header_linestyle") == 0)
4980 else if (strcmp(param,
"xheader_width") == 0)
4992 snprintf(wbuff,
sizeof(wbuff),
"%d",
5004 #define DEFAULT_SHELL "/bin/sh"
5010 #define DEFAULT_SHELL "cmd.exe"
5022 const char *shellName;
5024 shellName = getenv(
"SHELL");
5026 if (shellName == NULL)
5027 shellName = getenv(
"COMSPEC");
5029 if (shellName == NULL)
5034 sys =
psprintf(
"exec %s", shellName);
5036 sys =
psprintf(
"\"%s\"", shellName);
5038 result = system(sys);
5042 result = system(command);
5044 if (result == 127 || result == -1)
5061 long sleep_ms = (long) (sleep * 1000);
5063 const char *strftime_fmt;
5064 const char *user_title;
5066 const char *pagerprog = NULL;
5067 FILE *pagerpipe = NULL;
5071 sigset_t sigalrm_sigchld_sigint;
5072 sigset_t sigalrm_sigchld;
5078 if (!query_buf || query_buf->
len <= 0)
5080 pg_log_error(
"\\watch cannot be used with an empty query");
5085 sigemptyset(&sigalrm_sigchld_sigint);
5086 sigaddset(&sigalrm_sigchld_sigint,
SIGCHLD);
5087 sigaddset(&sigalrm_sigchld_sigint,
SIGALRM);
5088 sigaddset(&sigalrm_sigchld_sigint, SIGINT);
5090 sigemptyset(&sigalrm_sigchld);
5091 sigaddset(&sigalrm_sigchld,
SIGCHLD);
5092 sigaddset(&sigalrm_sigchld,
SIGALRM);
5094 sigemptyset(&sigint);
5095 sigaddset(&sigint, SIGINT);
5101 sigprocmask(SIG_BLOCK, &sigalrm_sigchld, NULL);
5107 interval.it_value.tv_sec = sleep_ms / 1000;
5108 interval.it_value.tv_usec = (sleep_ms % 1000) * 1000;
5124 pagerprog = getenv(
"PSQL_WATCH_PAGER");
5130 pagerpipe = popen(pagerprog,
"w");
5142 strftime_fmt =
"%c";
5157 user_title = myopt.
title;
5158 title_len = (user_title ? strlen(user_title) : 0) + 256;
5172 strftime(timebuf,
sizeof(timebuf), strftime_fmt, localtime(&timer));
5175 snprintf(title, title_len,
_(
"%s\t%s (every %gs)\n"),
5176 user_title, timebuf, sleep);
5178 snprintf(title, title_len,
_(
"%s (every %gs)\n"),
5180 myopt.
title = title;
5192 if (pagerpipe && ferror(pagerpipe))
5213 for (
long i = sleep_ms;
i > 0;)
5215 long s =
Min(
i, 1000L);
5225 sigprocmask(SIG_BLOCK, &sigint, NULL);
5232 int signal_received;
5234 errno = sigwait(&sigalrm_sigchld_sigint, &signal_received);
5248 if (signal_received == SIGINT || signal_received ==
SIGCHLD)
5255 sigprocmask(SIG_UNBLOCK, &sigint, NULL);
5284 sigprocmask(SIG_UNBLOCK, &sigalrm_sigchld_sigint, NULL);
5300 printf(
_(
"********* QUERY **********\n"
5302 "**************************\n\n"), query);
5307 _(
"********* QUERY **********\n"
5309 "**************************\n\n"), query);
5347 strchr(desc,
'(') ?
"regprocedure" :
"regproc");
5399 "SELECT pg_catalog.pg_get_functiondef(%u)",
5420 "SELECT nspname, relname, relkind, "
5421 "pg_catalog.pg_get_viewdef(c.oid, true), "
5422 "pg_catalog.array_remove(pg_catalog.array_remove(c.reloptions,'check_option=local'),'check_option=cascaded') AS reloptions, "
5423 "CASE WHEN 'check_option=local' = ANY (c.reloptions) THEN 'LOCAL'::text "
5424 "WHEN 'check_option=cascaded' = ANY (c.reloptions) THEN 'CASCADED'::text ELSE NULL END AS checkoption "
5425 "FROM pg_catalog.pg_class c "
5426 "LEFT JOIN pg_catalog.pg_namespace n "
5427 "ON c.relnamespace = n.oid WHERE c.oid = %u",
5433 "SELECT nspname, relname, relkind, "
5434 "pg_catalog.pg_get_viewdef(c.oid, true), "
5435 "c.reloptions AS reloptions, "
5436 "NULL AS checkoption "
5437 "FROM pg_catalog.pg_class c "
5438 "LEFT JOIN pg_catalog.pg_namespace n "
5439 "ON c.relnamespace = n.oid WHERE c.oid = %u",