Re: psql exit status with multiple -c or -f
От | Pavel Stehule |
---|---|
Тема | Re: psql exit status with multiple -c or -f |
Дата | |
Msg-id | CAFj8pRCPBwXqcneE7v0qckDUNiMoo+5Ot2rXH96GAYYBEpt75A@mail.gmail.com обсуждение исходный текст |
Ответ на | Re: psql exit status with multiple -c or -f (Kyotaro HORIGUCHI <horiguchi.kyotaro@lab.ntt.co.jp>) |
Список | pgsql-hackers |
út 18. 12. 2018 v 9:14 odesílatel Kyotaro HORIGUCHI <horiguchi.kyotaro@lab.ntt.co.jp> napsal:
Hello.
At Mon, 17 Dec 2018 11:58:41 -0600, Justin Pryzby <pryzby@telsasoft.com> wrote in <20181217175841.GS13019@telsasoft.com>
> Our deployment script failed to notice dozens of commands failed in a
> transaction block and I only noticed due to keeping full logs and monitoring
> for error_severity>'LOG'. I would have thought that exit status would be
> nonzero had an error occured in an earlier script.
>
> The docs since PG9.6 say:
> https://www.postgresql.org/docs/9.6/app-psql.html
> |Exit Status
> |
> |psql returns 0 to the shell if it finished normally, 1 if a fatal error of its
> |own occurs (e.g. out of memory, file not found), 2 if the connection to the
> |server went bad and the session was not interactive, and 3 if an error occurred
> |in a script and the variable ON_ERROR_STOP was set.
>
> d5563d7df94488bf0ab52ac0678e8a07e5b8297e
> psql: Support multiple -c and -f options, and allow mixing them.
>
> If there's an error, it returns 1 (although that's not "a fatal error of its
> own").
>
> |[pryzbyj@database ~]$ psql ts -c foo 2>/dev/null ; echo $?
> |1
>
> But the error is "lost" if another script or -c runs without failing:
>
> |[pryzbyj@database ~]$ psql ts -txqc foo -c SELECT 2>/dev/null ; echo $?
> |0
As written in the documentation[1]:
> Because of this behavior, putting more than one SQL command in a
> single -c string often has unexpected results. It's better to use
> repeated -c commands or feed multiple commands to psql's standard
> input,
This seems saying that -c is equvalent to each line fed from
stdin or a line in a script.
The attached 0001 patch makes it clear in app-psql.html.
> Note, this works as expected:
>
> |[pryzbyj@database ~]$ psql ts -v ON_ERROR_STOP=1 -txqc foo -f /dev/null 2>/dev/null ; echo $?
> |1
The status should be 3, according to the documentation. Addition
to that, the current behavior looks inconsistent (if) considering
the equivalency between -c and a script line.
y.txt:
a)
foo;
select 1;
b)
select 1;
foo;
$ psql postgres -v ON_ERROR_STOP=0 -f ~/work/y.txt ; echo $?
$ psql postgres -v ON_ERROR_STOP=0 < ~/work/y.txt ; echo $?
All combinations return 0, and 3 when ON_ERROR_STOP=1.
But,
c) psql postgres -v ON_ERROR_STOP=0 -c foo -c 'select 1'; echo $?
d) psql postgres -v ON_ERROR_STOP=0 -c 'select 1' -c foo; echo $?
(c) returns 0 and (d) returns 1, but both return 1 when
ON_ERROR_STOP=1.
The attached second patch lets (c) and (d) behave the same as (a)
and (b).
Does it make sense?
+1
Pavel
regards.
[1]: https://www.postgresql.org/docs/11/app-psql.html
--
Kyotaro Horiguchi
NTT Open Source Software Center
В списке pgsql-hackers по дате отправления: