On Tue, Mar 21, 2023 at 3:33 PM Corey Huinker <corey.huin...@gmail.com> wrote:
> >> As you had it, any nonzero result would prevent backtick substitution. >> I'm not really sure how much thought went into the existing behavior, >> but I am pretty sure that it's not part of this patch's charter to >> change that. >> >> regards, tom lane >> > > The changes all make sense, thanks! > This is a follow up patch to apply the committed pattern to the various piped output commands. I spotted this oversight in the https://www.postgresql.org/message-id/CADkLM=dMG6AAWfeKvGnKOzz1O7ZNctFR1BzAA3K7-+XQxff=4...@mail.gmail.com thread and, whether or not that feature gets in, we should probably apply it to output pipes as well.
From 9e29989372b7f42fcb7eac6dd15769ebe643abb5 Mon Sep 17 00:00:00 2001 From: coreyhuinker <corey.huin...@gmail.com> Date: Fri, 24 Mar 2023 17:20:27 -0400 Subject: [PATCH v1] Have pipes set SHELL_ERROR and SHELL_EXIT_CODE. --- src/bin/psql/common.c | 20 +++++++++++++++++--- src/bin/psql/copy.c | 4 ++++ 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8..3be24250ad 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -103,7 +103,13 @@ setQFout(const char *fname) if (pset.queryFout && pset.queryFout != stdout && pset.queryFout != stderr) { if (pset.queryFoutPipe) - pclose(pset.queryFout); + { + char buf[32]; + int exit_code = pclose(pset.queryFout); + snprintf(buf, sizeof(buf), "%d", wait_result_to_exit_code(exit_code)); + SetVariable(pset.vars, "SHELL_EXIT_CODE", buf); + SetVariable(pset.vars, "SHELL_ERROR", (exit_code == 0) ? "false" : "true"); + } else fclose(pset.queryFout); } @@ -1652,7 +1658,11 @@ ExecQueryAndProcessResults(const char *query, { if (gfile_is_pipe) { - pclose(gfile_fout); + char buf[32]; + int exit_code = pclose(gfile_fout); + snprintf(buf, sizeof(buf), "%d", wait_result_to_exit_code(exit_code)); + SetVariable(pset.vars, "SHELL_EXIT_CODE", buf); + SetVariable(pset.vars, "SHELL_ERROR", (exit_code == 0) ? "false" : "true"); restore_sigpipe_trap(); } else @@ -1870,7 +1880,11 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) /* close \g argument file/pipe */ if (is_pipe) { - pclose(fout); + char buf[32]; + int exit_code = pclose(fout); + snprintf(buf, sizeof(buf), "%d", wait_result_to_exit_code(exit_code)); + SetVariable(pset.vars, "SHELL_EXIT_CODE", buf); + SetVariable(pset.vars, "SHELL_ERROR", (exit_code == 0) ? "false" : "true"); restore_sigpipe_trap(); } else diff --git a/src/bin/psql/copy.c b/src/bin/psql/copy.c index 110d2d7269..00e01095fe 100644 --- a/src/bin/psql/copy.c +++ b/src/bin/psql/copy.c @@ -375,6 +375,7 @@ do_copy(const char *args) { if (options->program) { + char buf[32]; int pclose_rc = pclose(copystream); if (pclose_rc != 0) @@ -391,6 +392,9 @@ do_copy(const char *args) } success = false; } + snprintf(buf, sizeof(buf), "%d", wait_result_to_exit_code(pclose_rc)); + SetVariable(pset.vars, "SHELL_EXIT_CODE", buf); + SetVariable(pset.vars, "SHELL_ERROR", (pclose_rc == 0) ? "false" : "true"); restore_sigpipe_trap(); } else -- 2.39.2