Re: default to to ON_ERROR_STOP=on (Re: psql: exit status with multiple -c and -f)

From: Pavel Stehule <pavel(dot)stehule(at)gmail(dot)com>
To: Justin Pryzby <pryzby(at)telsasoft(dot)com>
Cc: PostgreSQL Hackers <pgsql-hackers(at)postgresql(dot)org>, Robert Haas <rhaas(at)postgresql(dot)org>, "David G(dot) Johnston" <david(dot)g(dot)johnston(at)gmail(dot)com>, Kyotaro HORIGUCHI <horiguchi(dot)kyotaro(at)lab(dot)ntt(dot)co(dot)jp>
Subject: Re: default to to ON_ERROR_STOP=on (Re: psql: exit status with multiple -c and -f)
Date: 2021-12-27 16:26:28
Message-ID: CAFj8pRAhE5WQBAipnhWbW=Y4gYePSBgLYw822y-Cy-L2p7OEXQ@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

po 27. 12. 2021 v 17:10 odesílatel Justin Pryzby <pryzby(at)telsasoft(dot)com>
napsal:

> On Mon, Dec 06, 2021 at 09:08:56AM -0600, Justin Pryzby wrote:
> > I raised this issue a few years ago.
> >
> https://www.postgresql.org/message-id/20181217175841.GS13019%40telsasoft.com
> >
> > |[pryzbyj(at)database ~]$ psql -v VERBOSITY=terse ts -xtc 'ONE' -c "SELECT
> 'TWO'"; echo "exit status $?"
> > |ERROR: syntax error at or near "ONE" at character 1
> > |?column? | TWO
> > |
> > |exit status 0
> >
> > The documentation doen't say what the exit status should be in this case:
> > | 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.
> >
> > It returns 1 if the final command fails, even though it's not a "fatal
> error"
> > (it would've happily kept running more commands).
> >
> > | x=`some_command_that_fails`
> > | rm -fr "$x/$y # removes all your data
> >
> > | psql -c "begin; C REATE TABLE newtable(LIKE oldtable) INSERT INTO
> newtable SELECT * FROM oldtable; commit" -c "DROP TABLE oldtable
> > | psql -v VERBOSITY=terse ts -xtc '0CREATE TABLE newtbl(i int)' -c
> 'INSERT INTO newtbl SELECT * FROM tbl' -c 'DROP TABLE IF EXISTS tbl' -c
> 'ALTER TABLE newtbl RENAME TO tbl'; echo ret=$?
> >
> > David J suggested to change the default value of ON_ERROR_STOP. The exit
> > status in the non-default case would have to be documented. That's one
> > solution, and allows the old behavior if anybody wants it. That
> probably does
> > what most people want, too. This is more likely to expose a real
> problem that
> > someone would have missed than to break a legitimate use. That doesn't
> appear
> > to break regression tests at all.
>
> I was wrong - the regression tests specifically exercise failure cases, so
> the
> scripts must continue after errors.
>
> I think the current behavior of the regression test SQL scripts is exactly
> the
> opposite of what's desirable for almost all other scripts. The attached
> makes
> ON_ERROR_STOP the default, and runs the regression tests with
> ON_ERROR_STOP=0.
>
> Is it viable to consider changing this ?
>

I have not any problems with the proposed feature, and I agree so proposed
behavior is more practical for users. Unfortunately, it breaks a lot of
applications' regress tests, but it can be fixed easily, and it is better
to do it quickly without more complications.

Regards

Pavel

In response to

Browse pgsql-hackers by date

  From Date Subject
Next Message Joel Jacobson 2021-12-27 16:39:08 Re: Foreign key joins revisited
Previous Message Justin Pryzby 2021-12-27 16:10:21 default to to ON_ERROR_STOP=on (Re: psql: exit status with multiple -c and -f)