Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 90433c3

Browse files
committed
Handle corner cases correctly in psql's reconnection logic.
After an unexpected connection loss and successful reconnection, psql neglected to resynchronize its internal state about the server, such as server version. Ordinarily we'd be reconnecting to the same server and so this isn't really necessary, but there are scenarios where we do need to update --- one example is where we have a list of possible connection targets and they're not all alike. Define "resynchronize" as including connection_warnings(), so that this case acts the same as \connect. This seems useful; for example, if the server version did change, the user might wish to know that. An attuned user might also notice that the new connection isn't SSL-encrypted, for example, though this approach isn't especially in-your-face about such changes. Although this part is a behavioral change, it only affects interactive sessions, so it should not break any applications. Also, in do_connect, make sure that we desynchronize correctly when abandoning an old connection in non-interactive mode. These problems evidently are the result of people patching only one of the two places where psql deals with connection changes, so insert some cross-referencing comments in hopes of forestalling future bugs of the same ilk. Lastly, in Windows builds, issue codepage mismatch warnings only at startup, not during reconnections. psql's codepage can't change during a reconnect, so complaining about it again seems like useless noise. Peter Billen and Tom Lane. Back-patch to all supported branches. Discussion: https://postgr.es/m/CAMTXbE8e6U=EBQfNSe01Ej17CBStGiudMAGSOPaw-ALxM-5jXg@mail.gmail.com
1 parent 5eec908 commit 90433c3

File tree

2 files changed

+24
-2
lines changed

2 files changed

+24
-2
lines changed

src/bin/psql/command.c

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3117,8 +3117,14 @@ do_connect(enum trivalue reuse_previous_specification,
31173117
pg_log_error("\\connect: %s", PQerrorMessage(n_conn));
31183118
if (o_conn)
31193119
{
3120+
/*
3121+
* Transition to having no connection. Keep this bit in sync
3122+
* with CheckConnection().
3123+
*/
31203124
PQfinish(o_conn);
31213125
pset.db = NULL;
3126+
ResetCancelConn();
3127+
UnsyncVariables();
31223128
}
31233129
}
31243130

@@ -3132,7 +3138,8 @@ do_connect(enum trivalue reuse_previous_specification,
31323138

31333139
/*
31343140
* Replace the old connection with the new one, and update
3135-
* connection-dependent variables.
3141+
* connection-dependent variables. Keep the resynchronization logic in
3142+
* sync with CheckConnection().
31363143
*/
31373144
PQsetNoticeProcessor(n_conn, NoticeProcessor, NULL);
31383145
pset.db = n_conn;
@@ -3223,7 +3230,8 @@ connection_warnings(bool in_startup)
32233230
sverbuf, sizeof(sverbuf)));
32243231

32253232
#ifdef WIN32
3226-
checkWin32Codepage();
3233+
if (in_startup)
3234+
checkWin32Codepage();
32273235
#endif
32283236
printSSLInfo();
32293237
printGSSInfo();

src/bin/psql/common.c

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -402,13 +402,27 @@ CheckConnection(void)
402402
if (!OK)
403403
{
404404
fprintf(stderr, _("Failed.\n"));
405+
406+
/*
407+
* Transition to having no connection. Keep this bit in sync with
408+
* do_connect().
409+
*/
405410
PQfinish(pset.db);
406411
pset.db = NULL;
407412
ResetCancelConn();
408413
UnsyncVariables();
409414
}
410415
else
416+
{
411417
fprintf(stderr, _("Succeeded.\n"));
418+
419+
/*
420+
* Re-sync, just in case anything changed. Keep this in sync with
421+
* do_connect().
422+
*/
423+
SyncVariables();
424+
connection_warnings(false); /* Must be after SyncVariables */
425+
}
412426
}
413427

414428
return OK;

0 commit comments

Comments
 (0)