Thread: psql command line client behaviour

psql command line client behaviour

From
Jiri Sadek
Date:
I was told about behaviour of psql command line client that seems as bug
to me. When I am connected to server (cmdline client, interactive mode)
and server is restarted next query fails and client try to reconnect to
server. Problem arise when I send more queries (not speaking that this
may not be a good habit) at once - on first one client detects that
connection is lost and try to reconnect and then rest of queries are
executed (but not the first one). This can have bad consequences (e.g.
if first query is BEGIN;):

sample (postgresql 8.3.15):

(test@[local:/var/opt/testdb/pg_sockets]:20000) 10:55:34 [testdb]
#> select 10; select 20;
  ?column?
----------
        10
(1 row)

Time: 0.142 ms
  ?column?
----------
        20
(1 row)

Time: 0.039 ms
(test@[local:/var/opt/testdb/pg_sockets]:20000) 10:55:42 [testdb]
#> select 10; select 20;
FATAL:  terminating connection due to administrator command
server closed the connection unexpectedly
This probably means the server terminated abnormally
before or while processing the request.
The connection to the server was lost. Attempting reset: Succeeded.
  ?column?
----------
        20
(1 row)

Time: 0.193 ms

I would suggest to not execute any query or all of them after reconnect.

Jiri

Re: psql command line client behaviour

From
Tom Lane
Date:
Jiri Sadek <jiri.sadek@gmail.com> writes:
> I was told about behaviour of psql command line client that seems as bug
> to me. When I am connected to server (cmdline client, interactive mode)
> and server is restarted next query fails and client try to reconnect to
> server. Problem arise when I send more queries (not speaking that this
> may not be a good habit) at once - on first one client detects that
> connection is lost and try to reconnect and then rest of queries are
> executed (but not the first one).

The reason it does that is that ON_ERROR_STOP isn't set.  If you don't
want execution of a multi-command string to continue after an error,
you should set that variable.  It's not obvious to me that loss of
connection should be treated differently here from other reasons for a
command failure.

Example:

$ psql
psql (9.1beta1)
Type "help" for help.

regression=# select 1/0; select 2;
ERROR:  division by zero
 ?column?
----------
        2
(1 row)

regression=# \set ON_ERROR_STOP 1
regression=# select 1/0; select 2;
ERROR:  division by zero
regression=#

            regards, tom lane