Skip to content

Commit beac4bd

Browse files
committed
Fix psql's \connect command some more.
Jasen Betts reported yet another unintended side effect of commit 85c5428: reconnecting with "\c service=whatever" did not have the expected results. The reason is that starting from the output of PQconndefaults() effectively allows environment variables (such as PGPORT) to override entries in the service file, whereas the normal priority is the other way around. Not using PQconndefaults at all would require yet a third main code path in do_connect's parameter setup, so I don't really want to fix it that way. But we can have the logic effectively ignore all the default values for just a couple more lines of code. This patch doesn't change the behavior for "\c -reuse-previous=on service=whatever". That remains significantly different from before 85c5428, because many more parameters will be re-used, and thus not be possible for service entries to replace. But I think this is (mostly?) intentional. In any case, since libpq does not report where it got parameter values from, it's hard to do differently. Per bug #16936 from Jasen Betts. As with the previous patches, back-patch to all supported branches. (9.5 is unfortunately now out of support, so this won't get fixed there.) Discussion: https://postgr.es/m/16936-3f524322a53a29f0@postgresql.org
1 parent 1c457b8 commit beac4bd

File tree

1 file changed

+19
-0
lines changed

1 file changed

+19
-0
lines changed

src/bin/psql/command.c

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3004,6 +3004,25 @@ do_connect(enum trivalue reuse_previous_specification,
30043004
if (strcmp(replci->keyword, "password") == 0)
30053005
have_password = true;
30063006
}
3007+
else if (!reuse_previous)
3008+
{
3009+
/*
3010+
* When we have a connstring and are not re-using
3011+
* parameters, swap *all* entries, even those not set
3012+
* by the connstring. This avoids absorbing
3013+
* environment-dependent defaults from the result of
3014+
* PQconndefaults(). We don't want to do that because
3015+
* they'd override service-file entries if the
3016+
* connstring specifies a service parameter, whereas
3017+
* the priority should be the other way around. libpq
3018+
* can certainly recompute any defaults we don't pass
3019+
* here. (In this situation, it's a bit wasteful to
3020+
* have called PQconndefaults() at all, but not doing
3021+
* so would require yet another major code path here.)
3022+
*/
3023+
replci->val = ci->val;
3024+
ci->val = NULL;
3025+
}
30073026
}
30083027
Assert(ci->keyword == NULL && replci->keyword == NULL);
30093028

0 commit comments

Comments
 (0)