Is it time to kill support for very old servers?

Started by Tom Laneover 9 years ago41 messages
#1Tom Lane
tgl@sss.pgh.pa.us

pg_dump alleges support for dumping from servers back to 7.0. Would v10
be a good time to remove some of that code? It's getting harder and
harder to even compile those ancient branches, let alone get people to
test against them (cf. 4806f26f9). My initial thought is to cut support
for pre-7.3 or maybe pre-7.4 servers, as that would allow removal of
support for cases where the server lacks schemas or pg_depend, each of
which requires a fair deal of klugery in pg_dump.

In the same line, maybe we should kill libpq's support for V2 protocol
(which would make the cutoff 7.4). And maybe the server's support too,
though that wouldn't save very much code. The argument for cutting this
isn't so much that we would remove lots of code as that we're removing
code that never gets tested, at least not by us.

One small problem with cutting libpq's V2 support is that the server's
report_fork_failure_to_client() function still sends a V2-style message.
We could change that in HEAD, certainly, but we don't really want modern
libpq unable to parse such a message from an older server. Possibly we
could handle that specific case with a little special-purpose code and
still be able to take out most of fe-protocol2.c.

Thoughts?

regards, tom lane

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#2Magnus Hagander
magnus@hagander.net
In reply to: Tom Lane (#1)
Re: Is it time to kill support for very old servers?

On Fri, Oct 7, 2016 at 4:06 PM, Tom Lane <tgl@sss.pgh.pa.us> wrote:

pg_dump alleges support for dumping from servers back to 7.0. Would v10
be a good time to remove some of that code? It's getting harder and
harder to even compile those ancient branches, let alone get people to
test against them (cf. 4806f26f9). My initial thought is to cut support
for pre-7.3 or maybe pre-7.4 servers, as that would allow removal of
support for cases where the server lacks schemas or pg_depend, each of
which requires a fair deal of klugery in pg_dump.

+1 for doing it, and also picking a version that's "easily explainable". If
we can say "now we support back to 8.0" that's a lot better than saying 8.1
or 7.4.

In the same line, maybe we should kill libpq's support for V2 protocol
(which would make the cutoff 7.4). And maybe the server's support too,
though that wouldn't save very much code. The argument for cutting this
isn't so much that we would remove lots of code as that we're removing
code that never gets tested, at least not by us.

Which is a pretty strong argument in itself.

One small problem with cutting libpq's V2 support is that the server's
report_fork_failure_to_client() function still sends a V2-style message.
We could change that in HEAD, certainly, but we don't really want modern
libpq unable to parse such a message from an older server. Possibly we
could handle that specific case with a little special-purpose code and
still be able to take out most of fe-protocol2.c.

Thoughts?

I agree we want the new libpq to be able to deal with that one from old
versions, because 9.6 isn't really old yet. We *should* probably change it
in head for the future anyway, but that means we have to keep it around in
libpq for quite a long while anyway.

Unless the special purpose code becomes long and complicated, I think
that's the best way to do it.

--
Magnus Hagander
Me: http://www.hagander.net/
Work: http://www.redpill-linpro.com/

#3Robert Haas
robertmhaas@gmail.com
In reply to: Tom Lane (#1)
Re: Is it time to kill support for very old servers?

On Fri, Oct 7, 2016 at 10:06 AM, Tom Lane <tgl@sss.pgh.pa.us> wrote:

pg_dump alleges support for dumping from servers back to 7.0. Would v10
be a good time to remove some of that code? It's getting harder and
harder to even compile those ancient branches, let alone get people to
test against them (cf. 4806f26f9). My initial thought is to cut support
for pre-7.3 or maybe pre-7.4 servers, as that would allow removal of
support for cases where the server lacks schemas or pg_depend, each of
which requires a fair deal of klugery in pg_dump.

It's been a long time since I've seen any 7.x versions in the wild,
and the pg_dump stuff is a nuisance to maintain. +1 for dropping
support for anything pre-7.4. Anybody who is upgrading from 7.3 to 10
isn't likely to want to do it in one swing anyway. In the real world,
few upgrades span 14 major versions.

In the same line, maybe we should kill libpq's support for V2 protocol
(which would make the cutoff 7.4). And maybe the server's support too,
though that wouldn't save very much code. The argument for cutting this
isn't so much that we would remove lots of code as that we're removing
code that never gets tested, at least not by us.

One small problem with cutting libpq's V2 support is that the server's
report_fork_failure_to_client() function still sends a V2-style message.
We could change that in HEAD, certainly, but we don't really want modern
libpq unable to parse such a message from an older server. Possibly we
could handle that specific case with a little special-purpose code and
still be able to take out most of fe-protocol2.c.

I definitely think we can't remove client support for anything that
modern servers still send, even if we change 10devel so that it no
longer does so. I think we have to at least wait until all versions
that might send a message are EOL before removing client-side support
for it -- and maybe a bit longer than that.

--
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#4Greg Stark
stark@mit.edu
In reply to: Tom Lane (#1)
Re: Is it time to kill support for very old servers?

On Fri, Oct 7, 2016 at 3:06 PM, Tom Lane <tgl@sss.pgh.pa.us> wrote:

pg_dump alleges support for dumping from servers back to 7.0. Would v10
be a good time to remove some of that code? It's getting harder and
harder to even compile those ancient branches, let alone get people to
test against them (cf. 4806f26f9). My initial thought is to cut support
for pre-7.3 or maybe pre-7.4 servers, as that would allow removal of
support for cases where the server lacks schemas or pg_depend, each of
which requires a fair deal of klugery in pg_dump.

I might be expected to be the holdout here but it seems sensible to
me. Removing code in pg_dump to deal with lacking schemas and
pg_depend seems like a major simplification.

In the same line, maybe we should kill libpq's support for V2 protocol
(which would make the cutoff 7.4). And maybe the server's support too,
though that wouldn't save very much code. The argument for cutting this
isn't so much that we would remove lots of code as that we're removing
code that never gets tested, at least not by us.

If it's testing we're concerned about IIRC the current servers can be
arm-twisted into speaking V2 protocol. So it should be possible to
test both modern servers and modern pg_dump using V2 protocol with a
simple tweak.

Somehow removing the whole protocol support seems a bit different to
me than removing pg_dump logic. For one it's nice to be able to run a
modern psql against old servers so you can run a benchmark script. For
another there may be binary-only applications or drivers out there
that are using V2 for whatever reason.

--
greg

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#5Tom Lane
tgl@sss.pgh.pa.us
In reply to: Greg Stark (#4)
Re: Is it time to kill support for very old servers?

Greg Stark <stark@mit.edu> writes:

On Fri, Oct 7, 2016 at 3:06 PM, Tom Lane <tgl@sss.pgh.pa.us> wrote:

In the same line, maybe we should kill libpq's support for V2 protocol
(which would make the cutoff 7.4). And maybe the server's support too,
though that wouldn't save very much code. The argument for cutting this
isn't so much that we would remove lots of code as that we're removing
code that never gets tested, at least not by us.

Somehow removing the whole protocol support seems a bit different to
me than removing pg_dump logic. For one it's nice to be able to run a
modern psql against old servers so you can run a benchmark script.

Yeah, but surely pre-7.4 servers are no longer of much interest for that;
or if you want historical results you should also use a matching libpq.

For another there may be binary-only applications or drivers out there
that are using V2 for whatever reason.

The problem with letting it just sit there is that we're not, in fact,
testing it. If we take the above argument seriously then we should
provide some way to configure libpq to prefer V2 and run regression
tests in that mode. Otherwise, if/when we break it, we'll never know it
till we get field reports.

regards, tom lane

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#6Robert Haas
robertmhaas@gmail.com
In reply to: Tom Lane (#5)
Re: Is it time to kill support for very old servers?

On Fri, Oct 7, 2016 at 11:34 AM, Tom Lane <tgl@sss.pgh.pa.us> wrote:

Greg Stark <stark@mit.edu> writes:

On Fri, Oct 7, 2016 at 3:06 PM, Tom Lane <tgl@sss.pgh.pa.us> wrote:

In the same line, maybe we should kill libpq's support for V2 protocol
(which would make the cutoff 7.4). And maybe the server's support too,
though that wouldn't save very much code. The argument for cutting this
isn't so much that we would remove lots of code as that we're removing
code that never gets tested, at least not by us.

Somehow removing the whole protocol support seems a bit different to
me than removing pg_dump logic. For one it's nice to be able to run a
modern psql against old servers so you can run a benchmark script.

Yeah, but surely pre-7.4 servers are no longer of much interest for that;
or if you want historical results you should also use a matching libpq.

For another there may be binary-only applications or drivers out there
that are using V2 for whatever reason.

The problem with letting it just sit there is that we're not, in fact,
testing it. If we take the above argument seriously then we should
provide some way to configure libpq to prefer V2 and run regression
tests in that mode. Otherwise, if/when we break it, we'll never know it
till we get field reports.

I agree with that. I think it would be fine to keep V2 support if
somebody wants to do the work to let us have adequate test coverage,
but if nobody volunteers I think we might as well rip it out. I don't
particularly enjoy committing things only to be told that they've
broken something I can't test without unreasonable effort.

--
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#7Tom Lane
tgl@sss.pgh.pa.us
In reply to: Robert Haas (#6)
Re: Is it time to kill support for very old servers?

Robert Haas <robertmhaas@gmail.com> writes:

On Fri, Oct 7, 2016 at 11:34 AM, Tom Lane <tgl@sss.pgh.pa.us> wrote:

Greg Stark <stark@mit.edu> writes:

For another there may be binary-only applications or drivers out there
that are using V2 for whatever reason.

The problem with letting it just sit there is that we're not, in fact,
testing it. If we take the above argument seriously then we should
provide some way to configure libpq to prefer V2 and run regression
tests in that mode. Otherwise, if/when we break it, we'll never know it
till we get field reports.

I agree with that. I think it would be fine to keep V2 support if
somebody wants to do the work to let us have adequate test coverage,
but if nobody volunteers I think we might as well rip it out. I don't
particularly enjoy committing things only to be told that they've
broken something I can't test without unreasonable effort.

When I wrote the above I was thinking of an essentially user-facing
libpq feature, similar to the one JDBC has, to force use of V2 protocol.
But actually, for testing purposes, I don't think that's what we want.
Any such feature would fail to exercise libpq's logic for falling back
from V3 to V2 when it connects to an old server, which is surely something
we'd like to test without actually having a pre-7.4 server at hand.

So what I'm thinking is it'd be sufficient to do something like
this in pqcomm.h:

+#ifndef FORCE_OLD_PROTOCOL
 #define PG_PROTOCOL_LATEST		PG_PROTOCOL(3,0)
+#else /* make like a pre-7.4 server for testing purposes */
+#define PG_PROTOCOL_LATEST		PG_PROTOCOL(2,0)
+#endif

which would cause the server to reject 3.0 requests just as if it were
ancient. Then we could test with that #define, maybe have a buildfarm
critter doing it. (This might break pqmq.c though, so we might need
to work slightly harder than this.)

Also, I realized while perusing this that the server still has support
for protocol 1.0 (!). That's *definitely* dead code. There's not much
of it, but still, I'd rather rip it out than continue to pretend it's
supported.

regards, tom lane

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#8Steve Crawford
scrawford@pinpointresearch.com
In reply to: Tom Lane (#7)
Re: Is it time to kill support for very old servers?

This thread gets me thinking about the definition of "support." While
support in practice seems to primarily relate to fixes/updates to the
supported version itself it could just as well apply to interoperability
support by newer versions.

Given that the standard PostgreSQL upgrade process involves upgrading
clients first and using pg_dump from the newer version, it is reasonable to
assume that the clients/utilities for a given version would support
interacting with any prior version that was not EOL at the time the new
major version is released.

In other words, 9.6 was released last month, the same month that 9.1 was
EOL, so 9.6 clients should work with 9.1 through 9.6 servers but from my
perspective there is no need to *guarantee* that 10 would do so. The
standard caveats apply. A new version *might* work for an unsupported older
version but no assurance is offered.

This is effectively a 5-year upgrade "grace period" *after* the EOL date of
a given version which seems plenty generous.

Defining the term of backward compatibility support might be useful in the
future when these types of questions arise.

Cheers,
Steve

On Fri, Oct 7, 2016 at 9:06 AM, Tom Lane <tgl@sss.pgh.pa.us> wrote:

Show quoted text

Robert Haas <robertmhaas@gmail.com> writes:

On Fri, Oct 7, 2016 at 11:34 AM, Tom Lane <tgl@sss.pgh.pa.us> wrote:

Greg Stark <stark@mit.edu> writes:

For another there may be binary-only applications or drivers out there
that are using V2 for whatever reason.

The problem with letting it just sit there is that we're not, in fact,
testing it. If we take the above argument seriously then we should
provide some way to configure libpq to prefer V2 and run regression
tests in that mode. Otherwise, if/when we break it, we'll never know it
till we get field reports.

I agree with that. I think it would be fine to keep V2 support if
somebody wants to do the work to let us have adequate test coverage,
but if nobody volunteers I think we might as well rip it out. I don't
particularly enjoy committing things only to be told that they've
broken something I can't test without unreasonable effort.

When I wrote the above I was thinking of an essentially user-facing
libpq feature, similar to the one JDBC has, to force use of V2 protocol.
But actually, for testing purposes, I don't think that's what we want.
Any such feature would fail to exercise libpq's logic for falling back
from V3 to V2 when it connects to an old server, which is surely something
we'd like to test without actually having a pre-7.4 server at hand.

So what I'm thinking is it'd be sufficient to do something like
this in pqcomm.h:

+#ifndef FORCE_OLD_PROTOCOL
#define PG_PROTOCOL_LATEST             PG_PROTOCOL(3,0)
+#else /* make like a pre-7.4 server for testing purposes */
+#define PG_PROTOCOL_LATEST             PG_PROTOCOL(2,0)
+#endif

which would cause the server to reject 3.0 requests just as if it were
ancient. Then we could test with that #define, maybe have a buildfarm
critter doing it. (This might break pqmq.c though, so we might need
to work slightly harder than this.)

Also, I realized while perusing this that the server still has support
for protocol 1.0 (!). That's *definitely* dead code. There's not much
of it, but still, I'd rather rip it out than continue to pretend it's
supported.

regards, tom lane

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#9Jim Nasby
Jim.Nasby@BlueTreble.com
In reply to: Steve Crawford (#8)
Re: Is it time to kill support for very old servers?

On 10/7/16 1:08 PM, Steve Crawford wrote:

This is effectively a 5-year upgrade "grace period" *after* the EOL date
of a given version which seems plenty generous.

IMHO we need to be careful here. It's not at all unusual to see servers
running versions that are *far* older than that. It's certainly
understandable that we're not actively supporting those versions any
more, but we also don't want people to effectively be stranded on them
because they can't even get the data out and back into a newer version.
So I think pg_dump at least should try to support as far back as we can
without jumping to lots of hoops in code. I think moving the limit to
8.0 is fine, but I'm not so comfortable with making that limit 9.1.
--
Jim Nasby, Data Architect, Blue Treble Consulting, Austin TX
Experts in Analytics, Data Architecture and PostgreSQL
Data in Trouble? Get it in Treble! http://BlueTreble.com
855-TREBLE2 (855-873-2532) mobile: 512-569-9461

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#10Craig Ringer
craig@2ndquadrant.com
In reply to: Jim Nasby (#9)
Re: Is it time to kill support for very old servers?

On 10 October 2016 at 10:45, Jim Nasby <Jim.Nasby@bluetreble.com> wrote:

On 10/7/16 1:08 PM, Steve Crawford wrote:

This is effectively a 5-year upgrade "grace period" *after* the EOL date
of a given version which seems plenty generous.

IMHO we need to be careful here. It's not at all unusual to see servers
running versions that are *far* older than that. It's certainly
understandable that we're not actively supporting those versions any more,
but we also don't want people to effectively be stranded on them because
they can't even get the data out and back into a newer version. So I think
pg_dump at least should try to support as far back as we can without jumping
to lots of hoops in code. I think moving the limit to 8.0 is fine, but I'm
not so comfortable with making that limit 9.1.

The oldest I deal with is 8.2, and that's enough of an aberration that
expecting them to go via 9.6 isn't wholly unreasonable. I agree 9.0 is
way too far.

--
Craig Ringer http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#11Tom Lane
tgl@sss.pgh.pa.us
In reply to: Robert Haas (#6)
Re: Is it time to kill support for very old servers?

Robert Haas <robertmhaas@gmail.com> writes:

On Fri, Oct 7, 2016 at 11:34 AM, Tom Lane <tgl@sss.pgh.pa.us> wrote:

The problem with letting it just sit there is that we're not, in fact,
testing it. If we take the above argument seriously then we should
provide some way to configure libpq to prefer V2 and run regression
tests in that mode. Otherwise, if/when we break it, we'll never know it
till we get field reports.

I agree with that. I think it would be fine to keep V2 support if
somebody wants to do the work to let us have adequate test coverage,
but if nobody volunteers I think we might as well rip it out. I don't
particularly enjoy committing things only to be told that they've
broken something I can't test without unreasonable effort.

I experimented with this and found out that a majority of the regression
tests fall over, because the error messages come out formatted differently
when using V2. You don't get separate DETAIL or HINT fields, nor cursor
positions, etc. So there's boatloads of silly diffs like this:

***************
*** 69,75 ****
  INSERT INTO testschema.atable VALUES(3);      -- ok
  INSERT INTO testschema.atable VALUES(1);      -- fail (checks index)
  ERROR:  duplicate key value violates unique constraint "anindex"
- DETAIL:  Key (column1)=(1) already exists.
  SELECT COUNT(*) FROM testschema.atable;               -- checks heap
   count 
  -------
--- 69,74 ----

Some of the tests have harder-to-ignore failures because protocol V2
had no way to recover from a failure during COPY IN, short of aborting
the connection:

--- 34,42 ----
  -- missing data: should fail
  COPY x from stdin;
  ERROR:  invalid input syntax for integer: ""
! FATAL:  terminating connection because protocol synchronization was lost
  COPY x from stdin;
! server closed the connection unexpectedly
! 	This probably means the server terminated abnormally
! 	before or while processing the request.
! connection to server was lost

At this point I'm feeling pretty discouraged about testability of V2.
I can't see us maintaining a variant regression test suite that would
accommodate these issues. So the easy idea of "build with some extra
#define and then run the usual regression tests" is out.

Now, we hardly need the entire regression suite to provide adequate
coverage of V2 protocol. You could imagine a small dedicated test
that just checks basic commands, errors, notices, COPY. The problem
is that we'd need infrastructure in either the backend or libpq to
dynamically force use of V2 for that test, and that's work that I for
one don't really care to put in.

Not sure where to go from here, but the idea of dropping V2 support
is seeming attractive again. Or we could just continue the policy
of benign neglect.

regards, tom lane

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#12Heikki Linnakangas
hlinnaka@iki.fi
In reply to: Tom Lane (#11)
Re: Is it time to kill support for very old servers?

On 10/11/2016 08:23 PM, Tom Lane wrote:

Not sure where to go from here, but the idea of dropping V2 support
is seeming attractive again. Or we could just continue the policy
of benign neglect.

Let's drop it.

- Heikki

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#13Tom Lane
tgl@sss.pgh.pa.us
In reply to: Tom Lane (#1)
1 attachment(s)
Re: Is it time to kill support for very old servers?

I wrote:

pg_dump alleges support for dumping from servers back to 7.0. Would v10
be a good time to remove some of that code? It's getting harder and
harder to even compile those ancient branches, let alone get people to
test against them (cf. 4806f26f9). My initial thought is to cut support
for pre-7.3 or maybe pre-7.4 servers, as that would allow removal of
support for cases where the server lacks schemas or pg_depend, each of
which requires a fair deal of klugery in pg_dump.

Per subsequent discussion, we should use a round number as the version
cutoff, so attached is a patch that removes pg_dump/pg_dumpall support
for dumping from servers before 8.0. This eliminates circa 1500 lines
of code, or about 4% of the existing code in src/bin/pg_dump/. So it's
not a huge savings, but it eliminates a lot of hard-to-test cases.

I (think I) did not do anything that would damage pg_restore's ability to
read dump archives produced by pre-8.0 versions. I'm pretty hesitant to
remove that code since (a) there's not all that much of it, and (b) it's
easy to imagine scenarios where an old backup dump is all someone's got.
However, that's another set of cases that's darn hard to test, so it's
somewhat questionable whether we may have broken it already.

Comments, objections?

regards, tom lane

Attachments:

pg_dump-drop-old-server-support.patch.gzapplication/x-gzip; name=pg_dump-drop-old-server-support.patch.gzDownload
��=�Wpg_dump-drop-old-server-support.patch�<kw�6���_�jO������&{[It���I���{t(��P�JP��n���|H���������@`0����x�
�{'d�����������|:;�?��qE�b�mO�q<�?0�.��U+�v�:��X�T��j����l��M�P�1�I��,7��������,wns��!�:a�x��Gq��N�_����c��L�g3?��>0�p��B��D�|9f������Q��J�0��� ���lf��-��i�!�&f�Nh0X�%\������R��9���b>�����O��������:���������{��".��
�.V)�Fs�������tjz��o��H^����uMt�������N�+?`��3�����@ns��l8���s��O�e�`��k�C���7�������;�����nX���%u���g�b��Mw�:c������U��k:�#Rbq�^�fh,������YI�=O���x���U}����7�c'����q��~�C��\W����4>_��r)��c�]�V�W$����h��XOG�L�����$���H`k��Q+���������B~���m.N���^L}��|����A�G��&T![8��<?d#���3��@��qd
N"�$���<����fR�IxK���9������S	X�-nC��NXN.'z�@�f����13@t�a��J������_������qVnj�Gqz�`�. �{��Z/{7:���m��!��|���@K���e!���2��2�����0��W�~���3�i�����p����:aj�����^		d�������J�Ml��x��+���U��s����'�>w�����~�����S7�����]Ip�o.�rR�%�}�:���
:���y�����()�@�
:��#�A%�v��n�\i���DG�������i�Xb�����&�'�L&���a^��kr�"RaA1�D��%T�B���cbi����
�N�yf���Z����}~)�.����n��b�������i}���f`M�-3���n������n��Rm�j�v;P����uU��A����e���d'�7�M�4�6�F�U�5?C��yXT?���������SR�b$���[��Bs���<n�W���0�`��q"�g-NG�uv?�E�����X���	*�e��h�>�B�|%��?7I�|��nl����U,�������b�Fo�5�|��w
�!����B���u:�"��4q�n�K��A?P^?�y�Dk����!YG�{����@�������I�;�O��"5-���t a6$|��p������#���slX�k�p��j�xC��/p�'��s$
0�M�`�C�+BkL����X""Ngd�����:�fhM�����|�l��t�ej]�H�9�X�� I1������l�N�������C:��P��oK��V1����G�c:�d�^;���h�w��>0e�99��U���0����i��7��	��v�k��?��S0O|�����`H.����[sD�@N�|�����[3��������(��	��z8�����<rq�x�)=B"Q�����Z�����`~l�dR�(������o�9����t�A�j�����M��[3��8�7��	y
n�IH�,��n�j�Yd�������)����5�R�<h~h�����R��w������k����)�@]_<��`�;��;{e�_���C18�Er)�t)�!��F�V�����y��Q�c��o��*��&u�*�x\�abu=�Hi�J�
Y�>?��?�(���2��p�'i5�ap�V���(�PG=�R�=�������$�N_��t��Q
��<q����r�3�izK�����Oa����y��3��'x���E����_��8��Z2�B�*K8�{�d�������a�o_�o�[1�y�����u��/[�����#�����z�a���H�M�6�X�m�v�=X��gF�{E`�
Hq�)�=p������*�M�m��@�U"��K��/�f��Zrp�/��]p��}���E�[p���}��#���7�~�l��9T\���a�F�*3$�'�g�&���y��X
5�r���:�fx�R��Z�*�.��5	|��lo��30��s3�<�����`e���,�<g-��}y�2��x_�I%��L��������j=����'~8#w��0����B�u�SO���s*y�F���#���
�GO�p{a^���@@s��WnQ�S����������������]��;��vo���b�������G��<T��!�r9&I�z���W��^It�)�`���T�K����0=��Hm��y%���=Gt�f�ZT&&R+��An|������r�P��#'�8�����(���T
8B�������h���:� o2m8�	0W��B�1'����
��|�u3 �I:
B&a����@0���
���2=4�hbs���%CSm^$L8��v��cs=���B�p0�	���9�c�������aT
�/�LWh6f�zq��Pw�X��`N�	T��&��c����7�<�G�D97"H��]�������
s���,���h�(M�W�@��@��0�gb��{@(��cp-a���T������F����B;
��$�_.#���Mx&��X�o
[m}d���cI	`���L\��cxJe����0�c� a�Nl��������	�P�i�.3-�3�z-q�>�������-���)�[%Z��S�7HtB��?��Ux8�
���I�,���\��A�r|�w�5��gwN1���8�;�����?��w�����t������[���D���X1��p��f8��{��,T�Mbu����B����2�a3�S��A8����i�a�zi�����(E�����B7�x��3����j.�"l��8���9*)�R��V3�����a�
��?0��#�p������Z�Xm_9B&��)��N�XE{i�D� n�y�u�B7
�\� Q��-l�����>�^R��V�h�Z�'�����-���~��,���GG��]�}3hS��u��6}��|�\�\�s�s�i��_���w��T�_����WT?p���������s@y
�b���,>C}>�*�#ib6�%�s�@��C�	}���u�������>����{O��,�=�>&)�<��QV�ZCyY����c�������Jg�t���d@��7g��pu����rYW������}�XQ�V�����^���*/���G��7��"@�H��}CY��K�Q�t.�3J���&i�����B�������9g<Y��j���u�E�lC�d2�	�m��N�H���e�\o�GdFFK�
)�Sx�Fz��I���L<dC!�Y��.��(|�r�:��FL�"�������X|����4p�'�'�F��t���`K����]\�YMq�/{��J��.�[|����i��@2�m���|��i_]���oo�;w��m*����-�����4�V^R#f���pNa�O;=<���m���P�U]�����]��������2��Q�^��^�m��)3������(P��LA�1���,&��]���+�Z��-���
�~���R������(�-!F��������v���*�7����v��?���+�?�K��X�C8��<��w"g$����M�����]��F�\�J�5� *���9��n���2���
������)��-O��E�,cLTlVn�KSn&����|~9#v����8�iN<��K\|��$Q���%��W����~�8["�+�`n�m����w��*0eeKT���KmLb�"o*{�j�?�.R��%���Q)h{��;��VT��85�j�O���y���-�����^�T>�p�v�8���{�o�%��b!�h���2=�h�p�c��`�6u= 9������= ��i�x��5�5<"Gu�~����Y��L�+.�Yi$�fq�p(G+��=��f�jD7'*@��J�*��%V��8��:�����^
�1PIy�x�0_������/�YN�����$��jg�t�6��7�9J��l��J��XU\�0������������Q218���D�r�%����,S���#X�5��D��;���\bv�bE�����o��*��2x~�F�egT=�%��4�=6��G���!�8���"�5�4OS�M/��Fvm�����^Y!ce+��#����r�����-���Z��H}�9�����k���3�3���w��j��F����F��u��e��(����J��Q-����-�'�%T��)��!l�9^P���)<�s�����,f�k���[X3;+��bub����Ij�5V����?�&�~�?�8�yt�gM������O�����j���%�yx1�������{�����Z��;�k�;2������.��rq���,\��?�K�P8\x�NA���n	A'R���a�X
��|P��,����X��rs��1��|+_,�����^��2�K�W�X��E<��7�i��n�������v��6��m���R=�B8�Vu�������@�}
+a`�g��l>r+��]�(�:�w���W�_�X����(��A.][_��	�����������<,o�a9����<�J�skC��cy/>���cyo>���k|TzM)\��$(�CSe�{��[�#^m��J
/����Lj���������ts�Y3��J)�6�S�
���s8��U:T�f���JaQq����������ET9&���NKj�?���9�_�r�*I���C5�������C����Gs�g$���W�����9BG���Y�%VsHh,��~���j������/X���$.i�({��[����+��p�����9�Y����K��=����a�`y���X4K//�sUW�bQ$0|�L�`Q��/~���E��Q�|�U��^D*OU�Y�x���o�qH���i��������n����R����?��L(���AZ���"��������c��Z=�W�^j4o;|On��i�|-��Od������F�g�Q<�7�Pz���V8����3!
�a q���o���mJ=����^r*��Z�!q�Z���)X�d���h���h�����+����E�Pk� 4k_A�J�eo�����������J��A��Q���
��TL)�
�8�l&1���~@����������������e{����M�"v�-�����s�f�1����a:)�Y�
i�k���ss�0T��#��X!�~�����@��X�������s���P��3��W�hE�����������$�/I~�$��	S��a�*���Ok�_��1R+�����D�{�$���������V�|�1.�**��,�\|.����'/���Kf���ND����V���k(eE2�R�%7�^T�~���}1��j�^K�k�����N|�vk�v+W��M�N'���_h~�{z���l1q\yu�j]���z�z�ct��9�z��vx�{{�����
o�#
 � 7���_�Ox��?�s���":��_%���[�r����>c��	�.2�K�-�w
���VKf��T}&Q4$:wxO�|��OQ��z������`�|"�E�r*��u'@:����Xm���f|����������`���B��K
�)�%B��k5V�F$��M��!������=)P��
�U�U���7Q�"�aP��K�`Lr4�"��)g����U$S����(�:���v��:�%1��p�^�g��i��������S3�����5H�7z���~�}}�a���J�������o&V�v��_;'�/���J���+M@�����Roy*��V)%���_�`[�JF��@��!h�'Q%�Z�C�z��<�����k�n�8u�%���N�C�+R%��h>P*��iU������mcY�����*���4���u^���^Y���,7I� ��J�I�~���Y0X	.��8u�,�Yz�{�{z�W��Bm
�D����@N-i.x3|�����o����6���=}d��b;��QE�)w�����o�vJ�������`���Ur���u�#MU���]!>h�����T���HB(3�����_���}L��b�R��2*�{ �~#4*|^���C
�R���� 7h���i�5�a��;����H�fG{(�J����q��l���
��5��i��C��rE��@�����v�U�!�|~@�8�KEnG�X��n��� w7���^��"N�b�Z�Km86�G�]CF#�����%�`�����xm��cG4-����s����Y�������i�(����3�u2�Bl�$_<_0�l��������/U�$���0���k7��V;,-��Z,����0_#&��,����pF��Y{����p���Q���6�/��a e�����
��l��#exx`�Jwo5�-��z�OQw����\�=���H��������3t|��N7�*H������
�p�>|�C�Yo�PZ��*�����-1����2N��gsv�;��o��;\x��`>)��>8<�n�i��W`/���_��H�S0���a�Yqy�m�|i2��O���������x�/�}<��m���=,�`������{�~�9#��<M�x���:����V�q�ih�L�� w���[&�R1zl������c��X����6t=�����Ld|Ld����+x���yt�b�������-1md=���,G�^�0������x4�h��o����J�U�D�������r��[�KL&�51�l�����^�O��Fy��g��{�LW��r�)���R*�0�t/�$��IJ��h��W�JiI�lm�n����w������g�@�k�+g�#A8n0p��f0/@�S����YMsZH�	K@��!b��\�
��O�M��@���4�����h�*�AQ@���/�-�_����0=0���}}G��<����D`� �_����,Pf#���!3_���D���
�MT����*�p]1{=Mi�Hq~;����������$|��
T��q5*�jSOM���S
t��@����])�q��4=:������/t����>lp����T�8.�%�%94��`�$�Q�5q�0��TA����9,��`�_��h�F�i�����V4k9�0��r�W����'��K����b�CW}����������A3�?��n�Y��*g�6W
�`�F&��K/��7��v��)#�����:�&��x����^��N�Q]�U����)R�"Nu��jv
M������Z���v6��ss��F]�\c�cz9��Y��� %����u������I��
"w�W�j��R�x�vq�"�C�aZ�e���1���
-�F��������W�)�0\��G�����m����0�m���0*�CKw����)������Q�.�vl������g���������P���]6��9A~>���AZF������
��@��D�������]��Tq���\��npz8�����x�S��.�.�/W���lQ���-��k�?\��f��!e���fS�y��|X���� ��!l��oU� ��������cE[n$�^2�����ZX����PyJ�l?�Na[������/��+-
k�pC'sEJA1�FA��V���Y�W*�:K���,��dxc
���3
<{2�����=�����
�y�kx	S�>TDKo1E�����u�OJc�b�]w*:��;���+Z�]ohe7��f�*�H�PI��R*�%H��4/�!���~��XP�-���?w���4��z�|jF��9I�V(9�s�"�j�5��S8�_�f4Q1�(#{���L�����U��E!te��
���*�R��!1I�d�������)U�!��F��4F������!O��Oi�B"�v���N�i�*�R��{|N���o���;���:�q������hp�^���\\eH2��Z�Du�c�Z��h��d��u6G�/~��I~e�_�8�U������w��������8�F|-�wE8�Z���	���]�f��xT������2�W��1���j�D_9�W����li����dT��m��E��<>Ve5�t�� gx�M$�����]�3y/�K*@i']�"�R��v��j����k:�eDo��,�>xl��10���i.^)��a��������T��%���2O� ����W�n�tM�K����,O�����Y.Ax�����q�?N����)�
y�J��$��������b��lW��Vv��5l�=�}�CoR�Ja������������=�Nx_�W�v%�ko�	%F�������O�\�3�HIZ����w�c�����	�g�(4t-�U��,�W�d�C�<{=�g?t���0���C��Q���\tp�I�'qz������I?'c	����ji�7N��uA�L!�����
�vA�2��y&~^{��l�V����J��hF.&�h����.W��%�0��W������NDC��k����������-�(�&���������4��
���<u���d\��^����c������^1��e��uS��i��AMJ��Y��Q��X�����)o���.�����w��j�
��-���+�����jR�'�Z�Bk������+j7���v�~��d�&c� �E+�������;x�
���t��g%�=6l�+��t!(��'���u�D��^��o�`-���$��L��f��
�6)���t*���N�C���=�"T�bm�6�$��#�y�5��S�����(c���H��d�u�m�����!��F���L�Zd^�M@G����0u�YW�i3Pn��W>	���wK����;��T����������.?����]���
)����g�������h��}E6�R]�V>��r`�����cLmU�$B�b�>.'X[�i�+���Y
I����������N-�js��W��J�	Z=����k�+���i�]C�i�Z���ue���4�?~�E�"�t��."���Yh�|,��;"kx��e�d� ����\r�6��R D�F���Q]H�g�	?�yy;�P�3�1SFi�S��C������s:]���TU�Wb�.>��h���>�3�����C6iX�o�t�6�����o������W���w���z7`��	����7���vY��u���9�Y�Y7���1<�r����q�xoYs	��B����;�Oa|���$�p�V��||z4������W�3��"|�VK<�!�����{W�p�8�
v�i�3K�f��[)������,�5t��v��0W���Sz����|*���ut��:���S�:z,���<S�n �:w&T�R\���@��H�KNLAM��y�~AFb��31���cbPN�sh������"�k�i�gxM�@��#>u�A�����\�<:�:<;��<?8>�|��?�������//[*�|��\����&�V��o]t�����
oa�TGV�y���`)+�%���O	7����� ��n����
�����AX%0�>ar�H�����J��|`hbDY���7*���WEB��l�sp���J�����&���U�p�����nD��%��d����%,����YA�w�#e��������6�$�m���l�K�;���}W�k��_+]���+�@`~��Q�t"E9�|o����s@����s�xX�iI$q��,���.�p6�<���I��K���A4���5"�v0�E��	h[���v"xMu��G$����j�.�����[7�^�&��L�!@Q�t�f�Q&^��?�y���t��Ta�#	���X��!]-��gmD��E����������/)��T.EA�V���tD���v"�ts��=@����
�^r���n��������������.�{���7�.s���$	������p��%���&z�A��X��&���4�Kg��_Bs����R S���p[�xg��X��V�b���6�+�\�"�`4��������7������gNi�%�m7W���o�<�ov��hL&���s���D:H�d�������#����\�
@�"	��A�*������
����t"%v��{�����n���R6�1�2�e�nbS�^���u�g�R�|�a�2�g^�<N���v��~���&�H��d�,7>�$�_R��`"�������}S%G����_��d������c�F~���H�����Y"2D96��G�"Q7+�5�co�U~����Ev#
G���������bS��sq������@�r���PB�Kt����F����8�=C"�0z4vb:�Lu�a�mt{�.V��4K�}/���qa{��9�p�����#�Fi�f�k�
����_�-�0��iH���
��\u�����j�]��]��H�oT�@L;@��2&�S�Q4b+L���D�(��=��l�Z��*�2g���MMaL�_���C����kc�3�����Lm�)��G�dq�}�G�l����
^r �Z���g�>����"����JbO����h��b7�a�i�)�;����l���;�V��wk��n���~�A����.EZdM�2���U-���2�!X�����,t�$��D�a@_���R��3���Gxr�"��E����.������1]zQp;�{�5�>�)�pa��������?�=�����V���_+���n��Q��f��_`���z�<�G�8F(���D������D�}e�����q�N����[�C�2��^r�x��lU����#�7�F3+�q3�u��):lVZ{�L7����^|�>����ST�l�w�3�
u�C~��J��a��u�� F�Cn��'N����c��k����� h�O%4"��F%�$h��/��R�H��J�{���^����D�5��o����d�����\x<��<�gWB��Af�14�%��
�b�v{�tQ���z	�����O"�{*�^�e��Ho7�	c���K�������kL�]���.@�-�:�Qh D�s���e�}��+���X�'�������|*T��y���n����^�l��u��!R."����:�
}�YM�����O�qy�/O8���Z�v
���2��ip�M����}��G�?��������0�������	�#@�S��S=���$WaB.r��=)�i����xhP���p�5�}ON���C���N��
0�L��<�:�-Rb�L/���0�j���mCBB�m��������|s
�����rb)0]���yDAM����6����k�����!�K_V�������`
��+���H�*���w�x����?�- �lI?p�w��FJL�)3k�0��"#EY�j��������7��Y=�`��]`��6��:X�z�
�����P
��n8L3%:���=BdKD���:�����"Z��z��OG��
���i�_"�m�������iA%�r���������Qd�G����J%�pr%rM�kH��\uo���@]��{_.��;.}t�oIb�v��k�>g[�kf=�)-*#�SX+���|���6�ab[P���q��@FU��0J��I�^��/�U��Q)�k�r������h�2W����^A���iP�����>F�McSWW��
�l�9������2_�������gvy�n�Mi��G{�]:�S���F�m�����L���(@���Ae��m�����I��-t��
�.D�uc�"��qZD9�T��bj9�����	�!�v�%�F�s���5y~������V���J���Z���6����b�A0��Q�i~I��e�H�n��Sny\��$�&��p�(/`���7o�I�SddDn��
��B��i(�N�}
�����zr'�%D;FX+�\�oKy���;�I�tP?�"pQ������T���T�m|����P���t��v��*2�J������4��`h�fa�?e��<^�l1G�Y���h,�#�}s��O��3�C��}���B��o)'7����W�b����r�@�)�VlAnM)"���|Q@�@2��P&�u�x-��(�4P:.�VF���D�(|���.0u8~�Y�n�[�,s����c3_��K,?�y]9y}�d��e_��t�~�8��L��y�h7*]���{����=8����f�p��|���������J���f�~&������V�M��;$`����������&P:�0u��0/G��>@�7//�$��W?�o0��[D�C2&Q����H�~���rb�O�����/���G��p\Z���t��s�Z71�F�Y�6���������1[�����2l�Y�h������E��3���#��>���i��'��-����������/�EV_��Z!E������<k���|$m�Z��gzV�U�J$/D���W�����(-�?��mR��S�xd
�-T��B�aJ��������j����
s�5����{(-kj��[*uJ��k��C(qE���zz%O��V6zu������s�KH\.�bbL/�r4��K��^��|�����/_����:�Q�#1RJ�����
����~���/V�E���=�{�Y�5K��rF���F2/f���at�V&����/b'R)���)�1�s�	���������?]�3}S���.��R�.1l�����&��fo&���i���+���� � ��T,/�6��[Z���o�>��H%�K�_�1�I��mUz������[��EJ��u��-�c��f��(��5�����lV��bj}�X������0t��1��n����??�j�M%��d��D:Up�h���^����
6���#��m�)����iA{�)����_)���b�T�!���u�>/�RMK�/5O2��#�
�������jG��n���"e8��h�*,�����q��;��6�.��OL�K�.F]��3�]��8������9J�i���6��JP|��p�q,���VCM��� c����o�`�7��g(>��S��T��^��-<x�,{���
�mY���I��>�h���b�,�+#6���<����,�Ee�
�Y%��TL�6�'�tG��c,*�^�Kw!�"��!��'�_�oW��o��r��K_D���G.���*�[&���w�������5�V��������r��A�
����:s�i����O��oRl�����ox����a	�"E�b�_�\Y$�^����������$����8i��2;��V���9��].,�6%I�g<�����<�j�6���-�?5D$�F�������-������E�*5E�U���U���(�~Pc
�/�#��5���-����c�3�2�V7<}�qO���^��8�3g�,�|�����!�E������G&��R<����A�Z�~th���)'��J6<Y���S�:�a_�<���������oa"��j!�f?X�����T�g�������g�`��P������,��r9*z��%l��
�����g
-����N���o4��k�y:w���\��H�jR4Z��D�������W�)�**��;��#�p�< �e�7s������1���?o��
��2>�W�D���UM>�1�d��;�@��'��WfE ���dUR�`{��@}����ZID�E{����y�K�*j�W*
I3y����Pg���gM�H,�����?WV"7�����S�HPu���;��dWT>zb���L�+A|%��LKM�0������rI�O��W���d��o��,�qZ���?����0��������J��/�*U���(����4s��]������Tw�5�`|3��E����&��B�}������6�h#���i���Y#et��V^�C�k�+������:w�������o�;�~�c���:H~6"e�a��)�Gh^��������0�����nM��-�c��mr���^
��;c�|5��3�^����2��e�&���o���O�������������]F���A|�����Fh�\���!�?�h��2�^��LHvM^�Y�JQ���_��9;�:>�z�����f���"��]d�r�BC�����:�Ey�./���b�@�F�Mt��H�%�@��3��!�����1���(�a�[a=�$���M��+_�U�E�zB���GO��?U;�T�g'�_[<������OX�+���@2�������NN.^�DT�������d��4"��3�TN��<��
������Nv)��)���Q�S���U\j3&��Gm��Vs��T��1{zJ�)x}�<��v�L����������~RY�xC��(@�s$��<%|��h@�2��J����"i�@,�I��\���g\L�_�<��N�|��u�`mg|��l��v�'����t��9��6^�Nf��t{j@��3T��N.�H4�����s|���'���_3*�`�'P���w��r�#�#{%.h���6faB��*��O�&��v������gM<	(�CCv���	Bc%b��4�&���6r�^X����w���d��UR���FO��Cb�=����p
�VR���y���^��M�X�!N��p���M��F�����-����7�OP�����1!�J����#��ix������w�����`$�m��q�wx��T
mp��r�<X6	dQ9)��7f���e������� ���o�<���,�(vQ3����X�5I\3:6��q��SR�0���~���w�I��pQb��� U�P��</�����Q�����o�;���bq�*WQ-����J��#�LM�*��/�Ht"feC,�����n�n��E0t��G ]X�,�t���-�����g�H���OZ��P�����G�.JI�F�`yJl<�d�q��E���;���3,5Z`�?�y�1�1J<Y�iO}Z+eNbt���V6���o��v��w]b����!7F�j�Qo�v�p������v��u�ze����'@�e`�
���h�YJ����oo'f[���k[Th���{E�����@&�c��	���HX��Z����@��O�UkY��i�@����H�Mr(�8Z��:�%;��,��I@�`A��L���bw���e���tf�����onL�&�Xp���5��=��cC7��v�����G;S8���u;���4��*��B�00P��vr�6��n4Z�H<�����'�9�_�R����=�����@^<U,P�y�,�|�oJ%g]�
�&�o�&�����H���G��j�I��f���t oDawZ]�$-g������W�M[E�r��o��h:m4��|d�>2_Z����F����?�G�
�-�m��pN���5�lw1�t�;�X	�8�6��H�l�I�]���	;�(G��SL��n�x;�����������E�3�]�&/>�Z>����	5�{�������0�u��R���2�����i���T��ym|IN������������6����\>��_�Rz�������&�O��*�s�����h)�aY���`����C���]�p���'���)-/8�&oAg8�P������r�8�'������Snr��U���2qc�h��]����:�D��y�j�8��w�"�!&�ju��r��k�����M���&�m�J����c������ZU��B�#�-��D������;�R�����\����w��*d�D4�g�����==����v��[�$rz>��,�}4ck�����G��c��B��e��[�@"�L�S94x�v�K�!�[d��	��b������>j4������/7�����������cq�����G1���=����$�F�	2�er�Q#�4b��T%f���H2�$�i�B����I��l���:$&� �c�����)���F;;�������r�b��b�r����\��ox�V�gs4b���2YC��vC��c�����53��_�mk��c^�3�<UD����?���{x�S�x����"<�:����&�(D� Zq���������\I1���m�9�s��iG}�e���o��� ��G0?�9�����V4�Qr�>�4Y!�4�b�#UJ��+��h�|�Q-M�'�K�d|�B(��g�$�
O��1�q���T)�s
�T������y�(��'��`�����S�DT=l�\i_�[t�& A2"[��%��"�bP�-����hZ@�������}|���������g��!�bwvp�L�����Lag#��8z�Dp�8�DWB��Ak�yE?��r�#!S�Z�HH�����<0�&8`�F���q�l�3��_S��J���|q���Zr�����F��8W���RV���
��jBD�W��"�5n2!w��mD�Q���c�0��h�P�m���,]�|�a�.�����f�����*3O��g����&*��b�4? $L�%:�IT�w/o(���5��(T��zq����w���X�O��M)=�i����7N��L�?�y������ �[}k�MtF����r���'p|z�����@���L*l�CV��a�glOo��m�&z��H����r}��*:�U�����}�q2t���vV���M'��.(�����������S=�
��x�8�I�F}<���K�`��^]f����a����I���ms2�L��6F�4����3E��
zY�^���/c��pn70^�����"����9���\q��$�p�����I/�{��X��H���t�@��p�����.����h0��0�y��uZ���q����g��6Ya���L����f�s��h���X�t�W�B%`��6�kT�-Z��F�W7�9(bXS�Qj�
�;��l<�[KoU����i����=C��\R�u
Y��:�Xk�@J�j&Fv������������C�i��	���F��>(�2^��4���F���#������Qg���*t|�k�iz��f�{�%R��#����8��=���zwzH�2[��rO
�rH�bR�R��u����jG,_LP%���;^����.-2q�b����������+�pTx��HGz��'"�������N�E��>a
�kZ����5����6�z�����m'Y!~����p�9g���s>�6�'�FS3Q<��r4c�++����B�ld��	#���|����!O�T�WiAF�Z86p��X�v�UB����'��
���p���&��	"D5�Nl
+"�`�^D_��
B/�^��f>\d�<h=4'��� ��6��f�	=�������
DpdxN�EG�Dh��
���u"��J9�6/�t|�;{{y|vz�'+���u��r�j��|8�gU�*TW�$�B��wqi�U�k%�I�~��0���d��U3z���/�����O/^�
/��-g����T�G�I�F����a��Cd���z:h�8�4�2�6�2b1U[�r*h��X��`����kL��7D��(�p��4z���i�~9��,^V�����/�48v�hV5|C3�b"�k|�'V����`
�EIT�_mP���%�D�g�[<����#IE��@	���K�����`�o�� �L�u���
q/zF��,��E\��5��DG�dq�o��Q��zA��^��Y�Fb�^}�rY�8HpgN���$�tH�Q�S;��,����V����*X�)�d������Y��a��d/��=*SH�N-�����z��]f�O\���7_�N�Gh������o��$�Q���]s��	\�G��f`}�x��<1|O%�&���V�K<��T�0������na�-�jg�
Mg9s1b�J�����$S��L.yyE��5PI_*�vG%���?\~IV w)�Zio����\�"'�� "&��'�����vvd�����>1u$��u,L_�UI�C/�q����f�����=�X���X����������[<��0�b��q������X\����
7h��l���n�xTL��8sOD�P\�q1z
�!�\���m5�H��1�<���8l;���xx���g�L���O�*�g���������oSx������-�4�H/M�,s'@@8;g������������R�CeB�Q��~
�A��O�~A��������w�|�������X���b��<N1��Rx����M�����Y������9�^.���_8�=A�)[�����5$�[P����zPn����zv��k;<f��6m��i�v��&lf���������H��
�9���p6�����e[���q2#Q�z���r�'��&�[�ZV1������zg����I�)�]Pt~���C��C[X���ivzE�;A�<��|{�w�>�cT<W�m�q���������l�����L�P=�����\�s�~�O����.,V��d�@f����R\E��o�?��L�n-����Y�pdGJ�p&���=
�:u4�������e�/�j�M�[�:��?C���'\KCOK��bq{����� ���qk�����~�-{}�~���1/���5��"-QJ;R������m�y/\�0�����;��������`��w&������a����od�-�p�����[�F(L��Ck���e+ne#+,N�'�	_���/����"�L�s3s)��_4�H	�U��snX���7�-z��.�lr��������vE���/gTF�y����4;�=-=>���&uT ��p
�)\�Po���bt�I��Zw#������\�a(\�"�BR�Y��`���S*<�5F�U{��+v�x�;L�l�tzY��	��t�R��H�b;����S$T�!��s��C�(Q�D�r,��y&����a!���s�� 7~�='�RZt?�,���>��et�z�WR��#n(���i*���1@�i���(�
�q��`�����~'$����4�X�����8Z���8��<sF��n����{"��@���m;����p'&�k�w
��*i����<����}��S�(7�E~��x�^�i�(�����PP��uSD�ZE��S��ho�P!������/�W�2������cNvO��i������IJ���3*�����O!�|�X�@ryE���[������Pk��Z��&o�����k6��m������xE��@����[D��*���'�����:e�-���5����
c-r�^I�^
^a����QZatD36E0c
/�F�C�^/�{v"=?g'VP���|o1��1�!�2&��������?b
���3�gF�������b��q!��y8���mO ��d��D@S�`���7����Q��s:wl�$�}O���o�H��N9��������<v��#�A���fx�����	\�E]��%�����
�<�����,Q?�-Y�G�������z���
�AvT�����	H[�S�>�����������v�����E*k\����_����p�o3A�S:�g�U^�q������nQB���o�,p�[9}}�����+CY��o�7?j����&�'��>���'����	lz<B�~������Ad�O]?��b��K%����]�1�C��R&����qsU�������.��#�N�6���@�����{�Z����{-���.r�O6�!!��hVzJ��b���pr,@�� ��+�u��{�+�N$���p�y=;�NK.1grT�Bv�����D���L����uk��4Jix2����B�k���o���j��K��)8�-���3Y��D��=��A3�
��:T���d���� �6�A�4����:�l��2C��,tr�E�"DYG�6�?�!��<��8Un����wG�#Sa�>
:tm+z��S�T���-�z��ph�p�Z0��O`��u�'b�|�7ZB3+Y��n����Xp���%�����;Y��6F��3`&M��x|?�U��r�LF�A����|#�{}�'�3}����_�v�)I�Bo>>F���������� ��GZ����d���g�N���{{vq���9F�?����	��w�;}�����8�qp�:�5�:�L����H�+�7��F���o����\�=8�6�z�����"���F�5����apr������f������/T����Wo�?�I��V����������������W�����V���}''�o�_�b���<?����u||z4�Y��uz�N�itc���~=��2�9��<?8>��
bsz�?�6����������o.T�F
(8�����{��qb��l=�PkK�=:>��zw9x��1�gX�����o_�����|p���
��c�~lU�W�N.��O�~~pz]��c��<9{)�n$_��4����q*�.F@I�$�6������e�bx{>xu>���������	�����P���H�����XwX�E�m��B����������+������A�
�0��=	H�}Y������d����^���sL���ey�-�:l�2[�}9��e	9lk�F�������]��r3�BS"Q	#E�x�\��Vi�������L��X0_h���=���[�� U2�=���?W����]�s�4CI��d	}�%[{#C*��^��Q��������T�f,�r8���S-P���`���6��-�aqF�{��OgU��3�i#l����1�3���O��+
���[k���������k�:�f�E|y�C�
�h�Qp\����[��b�$ji�R�]�{��J��'MU5Q�Z����;���;�z��6����,��eO^%���m�7�J	�@</:�����s���Z��A%v��A����X��5�f�5��u���t|h�C��'�9��a	s�y���6�HESd�U��~'����f5�P�?A���-�&JcI+��
��Gs_���������c��HN	"�"DV�~>�X�p��[��-x��,�&�Q=�Q�Vqs�9�����0�]���u�S��F�k�2�r
}�I�C�L��GZ3���"�V������_d�W��z���h�?z�#8�5�I�2����L��L�q���9e�c�����n-��6Q�[��X�arL��X�����t�qZ�c_VG���vYYs�l�koT�����HD7n�k�]���h`+�2�_(�!Mi�U�K��Tq���T3�C�P�G��%�j���������Moy��O<TB��3����T[Nlu	�sg�v���G�!t��LX��,�|<P�F)N�}���������u*�~�*
��'
���_xg.A�� /�
d#��`��H������E_�wHq�dN��5�NeI���C��m���������9�b�k!�fc�a�
���C�$�FAF}l���"��"d�g���~���)��]�;�9��&��h�[T�4,��]�W��K�mU����Y�U��
�z4�B=H<��z+*k�(��;-������e��
���_�!r�����Ot�PE��7��BS���go_a��o���S(����'�
�1WX=<%������|�����A��F����^�b8��m��1�xg���t�z��7���z@��!���1�/:SG�:9	n\���62"c��xjQN��W{�gPp����������z�O����U��hTTk���5t�qy��%����W\���{�j��k_f�F�[t6�p�X�]>W��t��-Cc)�o6M���GtC+������L�*a�(��3�%�-]��*2��'�;BM�����D��W���,�t���bN��
��	���5���>��je�����Zue�� H��S�u�����A�l\����i�(z�##�(��#k;����\k����)c	�d���"���o�����l�>k>w,W0��"� ��H�
�+�����r4�(z�N����KF8jN����/�Z|�z-���
V��[��
~\d�F)<�y

�(�������dO�5��>�.q7��Q��{��s4�H8����^<�� �������u�W�K�k�I�%�D��a4O���Y ��"������4�/�d�p���U����R���[��S��F�&�������B'a���uqOlu��.�����������L<P	��s���t\��_�Y�B�K����B��r��*4�u���I�����_���M�(w�����������X�i�m^%�47r4�~J���%�l�v&��I���|���x9��=�vol_��gN+�T����F������8S{f���M���4������D9�>PN=�[��r��#�D����c��p�Uo�C�xHj��w�[��1�H��\����k���g'���)�d�Y�TvDL�*�L�}������"��O�03�T?�]��>A4,�%���k�����	��7��nW���*�NN=�A��������7^S�4=�O$W[y?F�?Gb��+ ��W]DR%����:)�t�rXO����V���Qv�z��m�*F��}�+���F�vr��z��[�5�����=c�?;���kH���.��J\�O���N\����iT����{4[*Tx�����!W����f��DM����Gx,][�Z�Q�d��L��'��Z��=t�N������j�c������A&����N���*����b8!���&�b������]�������b��5�����
�����<�j���o��W�~6D������>�
�}�
������Z�����u&CY��D���p���Ny�V����)����<M�%�&&�Z��D0�C~���xR�0�������?�7��2wo6��x��H���f���-r�k���^����
#14Robert Haas
robertmhaas@gmail.com
In reply to: Heikki Linnakangas (#12)
Re: Is it time to kill support for very old servers?

On Tue, Oct 11, 2016 at 11:34 AM, Heikki Linnakangas <hlinnaka@iki.fi> wrote:

On 10/11/2016 08:23 PM, Tom Lane wrote:

Not sure where to go from here, but the idea of dropping V2 support
is seeming attractive again. Or we could just continue the policy
of benign neglect.

Let's drop it.

I agree. The evidence in Tom's latest email suggests that getting
this to a point where it can be tested will be more work than
anybody's likely to want to put in, and the return on investment
doesn't seem likely to be good.

--
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#15Andres Freund
andres@anarazel.de
In reply to: Tom Lane (#1)
Re: Is it time to kill support for very old servers?

Hi,

Re-upping this topic.

On 2016-10-07 10:06:07 -0400, Tom Lane wrote:

In the same line, maybe we should kill libpq's support for V2 protocol
(which would make the cutoff 7.4). And maybe the server's support too,
though that wouldn't save very much code. The argument for cutting this
isn't so much that we would remove lots of code as that we're removing
code that never gets tested, at least not by us.

I'd like to do this in the not too far away future for at least the
backend. There's enough not particularly pretty code to deal with v2
that that'd be worthwhile.

One small problem with cutting libpq's V2 support is that the server's
report_fork_failure_to_client() function still sends a V2-style message.
We could change that in HEAD, certainly, but we don't really want modern
libpq unable to parse such a message from an older server. Possibly we
could handle that specific case with a little special-purpose code and
still be able to take out most of fe-protocol2.c.

We should really fix that so it reports the error as a v3 message,
independent of ripping out libpq-fe support for v2.

Greetings,

Andres Freund

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#16Tom Lane
tgl@sss.pgh.pa.us
In reply to: Andres Freund (#15)
Re: Is it time to kill support for very old servers?

Andres Freund <andres@anarazel.de> writes:

Re-upping this topic.

On 2016-10-07 10:06:07 -0400, Tom Lane wrote:

In the same line, maybe we should kill libpq's support for V2 protocol
(which would make the cutoff 7.4). And maybe the server's support too,
though that wouldn't save very much code. The argument for cutting this
isn't so much that we would remove lots of code as that we're removing
code that never gets tested, at least not by us.

I'd like to do this in the not too far away future for at least the
backend. There's enough not particularly pretty code to deal with v2
that that'd be worthwhile.

Hm, I don't recall that there's very much on the server side that could be
saved --- what's incurring your ire, exactly?

One small problem with cutting libpq's V2 support is that the server's
report_fork_failure_to_client() function still sends a V2-style message.

We should really fix that so it reports the error as a v3 message,
independent of ripping out libpq-fe support for v2.

It might be reasonable to do that, but libpq would have to be prepared
for the other case for many years to come :-(

The real problem in this area, to my mind, is that we're not testing that
code --- either end of it --- in any systematic way. If it's broken it
could take us quite a while to notice.

regards, tom lane

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#17Andres Freund
andres@anarazel.de
In reply to: Tom Lane (#16)
Re: Is it time to kill support for very old servers?

Hi,

On 2017-09-13 23:39:21 -0400, Tom Lane wrote:

Andres Freund <andres@anarazel.de> writes:

Re-upping this topic.

On 2016-10-07 10:06:07 -0400, Tom Lane wrote:

In the same line, maybe we should kill libpq's support for V2 protocol
(which would make the cutoff 7.4). And maybe the server's support too,
though that wouldn't save very much code. The argument for cutting this
isn't so much that we would remove lots of code as that we're removing
code that never gets tested, at least not by us.

I'd like to do this in the not too far away future for at least the
backend. There's enough not particularly pretty code to deal with v2
that that'd be worthwhile.

Hm, I don't recall that there's very much on the server side that could be
saved --- what's incurring your ire, exactly?

In this specific instance it's SendRowDescriptionMessage() for a queries
returning a lot of columns that execute fast. The additional branches
due to the if (proto >= 3) conditionals are noticeable. It's easy enough
to fix by having two for() for the two cases. The added code is annoying
but bearable, what actually concerns me is that it's really hard to test
the v2 support.

One small problem with cutting libpq's V2 support is that the server's
report_fork_failure_to_client() function still sends a V2-style message.

We should really fix that so it reports the error as a v3 message,
independent of ripping out libpq-fe support for v2.

It might be reasonable to do that, but libpq would have to be prepared
for the other case for many years to come :-(

Right. But there seems pretty much no way to get around that. At least
none that I can see? It might be worthwhile and more testable to add a
special case V2 handling for the oom-fork case, but still.

The real problem in this area, to my mind, is that we're not testing that
code --- either end of it --- in any systematic way. If it's broken it
could take us quite a while to notice.

Yea, that concerns me a lot too (see above).

Greetings,

Andres Freund

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#18Robert Haas
robertmhaas@gmail.com
In reply to: Tom Lane (#16)
Re: Is it time to kill support for very old servers?

On Wed, Sep 13, 2017 at 11:39 PM, Tom Lane <tgl@sss.pgh.pa.us> wrote:

One small problem with cutting libpq's V2 support is that the server's
report_fork_failure_to_client() function still sends a V2-style message.

We should really fix that so it reports the error as a v3 message,
independent of ripping out libpq-fe support for v2.

It might be reasonable to do that, but libpq would have to be prepared
for the other case for many years to come :-(

Well, let's get that much done anyway. I'm not 100% sure whether the
time has come to kill v2 with fire, but doing the things that have
been done first has got to be a good idea either way.

--
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#19Andres Freund
andres@anarazel.de
In reply to: Tom Lane (#16)
Re: Is it time to kill support for very old servers?

On 2017-09-13 23:39:21 -0400, Tom Lane wrote:

The real problem in this area, to my mind, is that we're not testing that
code --- either end of it --- in any systematic way. If it's broken it
could take us quite a while to notice.

Independent of the thrust of my question - why aren't we adding a
'force-v2' option to libpq? A test that basically does something like
postgres[22923][1]=# \setenv PGFORCEV2 1
postgres[22923][1]=# \c
You are now connected to database "postgres" as user "andres".
postgres[22924][1]=>
seems easy enough to add, in fact I tested the above.

And the protocol coverage of the v2 protocol seems small enough that a
single not too large file ought to cover most if it quite easily.

Greetings,

Andres Freund

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#20Michael Paquier
michael.paquier@gmail.com
In reply to: Andres Freund (#19)
Re: Is it time to kill support for very old servers?

On Mon, Sep 18, 2017 at 6:53 PM, Andres Freund <andres@anarazel.de> wrote:

On 2017-09-13 23:39:21 -0400, Tom Lane wrote:

The real problem in this area, to my mind, is that we're not testing that
code --- either end of it --- in any systematic way. If it's broken it
could take us quite a while to notice.

Independent of the thrust of my question - why aren't we adding a
'force-v2' option to libpq? A test that basically does something like
postgres[22923][1]=# \setenv PGFORCEV2 1
postgres[22923][1]=# \c
You are now connected to database "postgres" as user "andres".
postgres[22924][1]=>
seems easy enough to add, in fact I tested the above.

And the protocol coverage of the v2 protocol seems small enough that a
single not too large file ought to cover most if it quite easily.

It seems to me that you are looking more for a connection parameter here.
--
Michael

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#21Andres Freund
andres@anarazel.de
In reply to: Michael Paquier (#20)
Re: Is it time to kill support for very old servers?

On September 18, 2017 3:50:17 AM PDT, Michael Paquier <michael.paquier@gmail.com> wrote:

On Mon, Sep 18, 2017 at 6:53 PM, Andres Freund <andres@anarazel.de>
wrote:

On 2017-09-13 23:39:21 -0400, Tom Lane wrote:

The real problem in this area, to my mind, is that we're not testing

that

code --- either end of it --- in any systematic way. If it's broken

it

could take us quite a while to notice.

Independent of the thrust of my question - why aren't we adding a
'force-v2' option to libpq? A test that basically does something

like

postgres[22923][1]=# \setenv PGFORCEV2 1
postgres[22923][1]=# \c
You are now connected to database "postgres" as user "andres".
postgres[22924][1]=>
seems easy enough to add, in fact I tested the above.

And the protocol coverage of the v2 protocol seems small enough that

a

single not too large file ought to cover most if it quite easily.

It seems to me that you are looking more for a connection parameter
here.

I'm not seeing a meaningful distinction here? Env vars and connection parameters are handled using the same framework in libpq. And using the env var in the test would be better, because you'd only set one value - hard to do within our non TAP tests (i.e. in an existing psql, started by pg regress) otherwise.

Andres
--
Sent from my Android device with K-9 Mail. Please excuse my brevity.

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#22Michael Paquier
michael.paquier@gmail.com
In reply to: Andres Freund (#21)
Re: Is it time to kill support for very old servers?

On Mon, Sep 18, 2017 at 7:54 PM, Andres Freund <andres@anarazel.de> wrote:

It seems to me that you are looking more for a connection parameter
here.

I'm not seeing a meaningful distinction here? Env vars and connection parameters are handled using the same framework in libpq. And using the env var in the test would be better, because you'd only set one value - hard to do within our non TAP tests (i.e. in an existing psql, started by pg regress) otherwise.

Or both? I don't really understand why an environment variable is
better than a connection string. For the TAP tests, you could just set
the base of the connection string once and you are done as well. See
the SSL tests for example.
--
Michael

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#23Andres Freund
andres@anarazel.de
In reply to: Michael Paquier (#22)
Re: Is it time to kill support for very old servers?

On September 18, 2017 4:08:21 AM PDT, Michael Paquier <michael.paquier@gmail.com> wrote:

On Mon, Sep 18, 2017 at 7:54 PM, Andres Freund <andres@anarazel.de>
wrote:

It seems to me that you are looking more for a connection parameter
here.

I'm not seeing a meaningful distinction here? Env vars and connection

parameters are handled using the same framework in libpq. And using
the env var in the test would be better, because you'd only set one
value - hard to do within our non TAP tests (i.e. in an existing psql,
started by pg regress) otherwise.

Or both? I don't really understand why an environment variable is
better than a connection string. For the TAP tests, you could just set
the base of the connection string once and you are done as well. See
the SSL tests for example.

Did you read what I wrote?
--
Sent from my Android device with K-9 Mail. Please excuse my brevity.

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#24Michael Paquier
michael.paquier@gmail.com
In reply to: Andres Freund (#23)
Re: Is it time to kill support for very old servers?

On Mon, Sep 18, 2017 at 8:09 PM, Andres Freund <andres@anarazel.de> wrote:

On September 18, 2017 4:08:21 AM PDT, Michael Paquier <michael.paquier@gmail.com> wrote:

On Mon, Sep 18, 2017 at 7:54 PM, Andres Freund <andres@anarazel.de>
wrote:

It seems to me that you are looking more for a connection parameter
here.

I'm not seeing a meaningful distinction here? Env vars and connection

parameters are handled using the same framework in libpq. And using
the env var in the test would be better, because you'd only set one
value - hard to do within our non TAP tests (i.e. in an existing psql,
started by pg regress) otherwise.

Or both? I don't really understand why an environment variable is
better than a connection string. For the TAP tests, you could just set
the base of the connection string once and you are done as well. See
the SSL tests for example.

Did you read what I wrote?

Sorry, I missed the "non" with "TAP" tests. Having a connection
parameter would still be low-cost in maintenance, so if you add that
at the same time I won't complain.
--
Michael

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#25Andres Freund
andres@anarazel.de
In reply to: Michael Paquier (#24)
Re: Is it time to kill support for very old servers?

On September 18, 2017 4:15:31 AM PDT, Michael Paquier <michael.paquier@gmail.com> wrote:

On Mon, Sep 18, 2017 at 8:09 PM, Andres Freund <andres@anarazel.de>
wrote:

On September 18, 2017 4:08:21 AM PDT, Michael Paquier

<michael.paquier@gmail.com> wrote:

On Mon, Sep 18, 2017 at 7:54 PM, Andres Freund <andres@anarazel.de>
wrote:

It seems to me that you are looking more for a connection parameter
here.

I'm not seeing a meaningful distinction here? Env vars and

connection

parameters are handled using the same framework in libpq. And using
the env var in the test would be better, because you'd only set one
value - hard to do within our non TAP tests (i.e. in an existing

psql,

started by pg regress) otherwise.

Or both? I don't really understand why an environment variable is
better than a connection string. For the TAP tests, you could just

set

the base of the connection string once and you are done as well. See
the SSL tests for example.

Did you read what I wrote?

Sorry, I missed the "non" with "TAP" tests. Having a connection
parameter would still be low-cost in maintenance, so if you add that
at the same time I won't complain.

Private:

And now you missed the "same infrastructure" part.
--
Sent from my Android device with K-9 Mail. Please excuse my brevity.

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#26Michael Paquier
michael.paquier@gmail.com
In reply to: Andres Freund (#25)
Re: Is it time to kill support for very old servers?

On Mon, Sep 18, 2017 at 8:17 PM, Andres Freund <andres@anarazel.de> wrote:

And now you missed the "same infrastructure" part.

I am sort of aware of that per the list of parameters at the top
fe-connect.c, thanks for the reminer :)
--
Michael

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#27Robert Haas
robertmhaas@gmail.com
In reply to: Andres Freund (#25)
Re: Is it time to kill support for very old servers?

On Mon, Sep 18, 2017 at 7:17 AM, Andres Freund <andres@anarazel.de> wrote:

Private:

Not so much.

--
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#28Joshua D. Drake
jd@commandprompt.com
In reply to: Robert Haas (#27)
Re: Is it time to kill support for very old servers?

On 09/18/2017 04:54 AM, Robert Haas wrote:

On Mon, Sep 18, 2017 at 7:17 AM, Andres Freund <andres@anarazel.de> wrote:

Private:

Not so much.

Well, as much as the Internet is actually private:

https://ilccyberreport.files.wordpress.com/2013/06/nsa11.jpg

JD

;)

--
Command Prompt, Inc. || http://the.postgres.company/ || @cmdpromptinc

PostgreSQL Centered full stack support, consulting and development.
Advocate: @amplifypostgres || Learn: https://pgconf.us
***** Unless otherwise stated, opinions are my own. *****

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#29Andres Freund
andres@anarazel.de
In reply to: Andres Freund (#19)
2 attachment(s)
Re: Is it time to kill support for very old servers?

On 2017-09-18 02:53:03 -0700, Andres Freund wrote:

On 2017-09-13 23:39:21 -0400, Tom Lane wrote:

The real problem in this area, to my mind, is that we're not testing that
code --- either end of it --- in any systematic way. If it's broken it
could take us quite a while to notice.

Independent of the thrust of my question - why aren't we adding a
'force-v2' option to libpq? A test that basically does something like
postgres[22923][1]=# \setenv PGFORCEV2 1
postgres[22923][1]=# \c
You are now connected to database "postgres" as user "andres".
postgres[22924][1]=>
seems easy enough to add, in fact I tested the above.

And the protocol coverage of the v2 protocol seems small enough that a
single not too large file ought to cover most if it quite easily.

Here's what I roughly was thinking of. I don't quite like the name, and
the way the version is specified for libpq (basically just the "raw"
integer). Not sure if others have an opinion on that. I personally
would lean towards not documenting this option...

There's a few things that I couldn't find easy ways to test:
- the v2 specific binary protocol - I don't quite see how we could test
that without writing C
- version error checks - pg_regress/psql errors out in non-interactive
mode if a connection fails to be established. This we could verify
with a s simple tap test.

Coverage of the relevant files is a good bit higher afterwards. Although
our libpq coverage is generally pretty damn awful.

Regards,

Andres

Attachments:

0001-Add-ability-to-force-libpq-to-negotiate-a-specific-v.patchtext/x-diff; charset=us-asciiDownload
From d4b9fb485110a5a27d9f85eff23a8ffca550eaf2 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Wed, 20 Sep 2017 01:12:32 -0700
Subject: [PATCH 1/3] Add ability to force libpq to negotiate a specific
 version of the protocol.

Author: Andres Freund
Discussion: https://postgr.es/m/20170918095303.g766pdnvviqlewph@alap3.anarazel.de
---
 src/interfaces/libpq/fe-connect.c | 13 ++++++++++++-
 src/interfaces/libpq/libpq-int.h  |  3 +++
 2 files changed, 15 insertions(+), 1 deletion(-)

diff --git a/src/interfaces/libpq/fe-connect.c b/src/interfaces/libpq/fe-connect.c
index c580d91135..a9dd14d48b 100644
--- a/src/interfaces/libpq/fe-connect.c
+++ b/src/interfaces/libpq/fe-connect.c
@@ -323,6 +323,10 @@ static const internalPQconninfoOption PQconninfoOptions[] = {
 		"Target-Session-Attrs", "", 11, /* sizeof("read-write") = 11 */
 	offsetof(struct pg_conn, target_session_attrs)},
 
+	{"forced_protocol_version", "PGFORCEPROTOCOLVERSION", NULL, NULL,
+	 "Forced-version", "D", sizeof("Forced-version"),
+	offsetof(struct pg_conn, forced_protocol_version)},
+
 	/* Terminating entry --- MUST BE LAST */
 	{NULL, NULL, NULL, NULL,
 	NULL, NULL, 0}
@@ -1803,7 +1807,14 @@ connectDBStart(PGconn *conn)
 	 */
 	conn->whichhost = 0;
 	conn->addr_cur = conn->connhost[0].addrlist;
-	conn->pversion = PG_PROTOCOL(3, 0);
+	if (conn->forced_protocol_version != NULL)
+	{
+		conn->pversion = atoi(conn->forced_protocol_version);
+	}
+	else
+	{
+		conn->pversion = PG_PROTOCOL(3, 0);
+	}
 	conn->send_appname = true;
 	conn->status = CONNECTION_NEEDED;
 
diff --git a/src/interfaces/libpq/libpq-int.h b/src/interfaces/libpq/libpq-int.h
index 42913604e3..7bfc09ec71 100644
--- a/src/interfaces/libpq/libpq-int.h
+++ b/src/interfaces/libpq/libpq-int.h
@@ -364,6 +364,9 @@ struct pg_conn
 	/* Type of connection to make.  Possible values: any, read-write. */
 	char	   *target_session_attrs;
 
+	char	   *forced_protocol_version; /* for testing: force protocol to a
+										  * specific version */
+
 	/* Optional file to write trace info to */
 	FILE	   *Pfdebug;
 
-- 
2.14.1.536.g6867272d5b.dirty

0002-Add-minimal-v2-protocol-regression-tests.patchtext/x-diff; charset=us-asciiDownload
From da43188afcf150213212c6c419c5c87b003feb65 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Wed, 20 Sep 2017 01:10:17 -0700
Subject: [PATCH 2/3] Add minimal v2 protocol regression tests.

Author: Andres Freund
Discussion: https://postgr.es/m/20170918095303.g766pdnvviqlewph@alap3.anarazel.de
---
 src/test/regress/expected/protocol.out | 252 +++++++++++++++++++++++++++++++++
 src/test/regress/parallel_schedule     |   2 +-
 src/test/regress/serial_schedule       |   1 +
 src/test/regress/sql/protocol.sql      | 124 ++++++++++++++++
 4 files changed, 378 insertions(+), 1 deletion(-)
 create mode 100644 src/test/regress/expected/protocol.out
 create mode 100644 src/test/regress/sql/protocol.sql

diff --git a/src/test/regress/expected/protocol.out b/src/test/regress/expected/protocol.out
new file mode 100644
index 0000000000..75e183ba78
--- /dev/null
+++ b/src/test/regress/expected/protocol.out
@@ -0,0 +1,252 @@
+\set ON_ERROR_STOP 0
+-- Function that returns the protocol version, as required for the protocol
+CREATE OR REPLACE FUNCTION pg_protocol(major int, minor int)
+RETURNS int
+LANGUAGE SQL
+IMMUTABLE
+AS $$
+    SELECT $1 << 16 | $2;
+$$;
+--
+-- first a few error checks about acceptance of various protocol versions
+--
+-- Can't execute failing tests these via psql -f / pg_regress, as they
+-- exit after a connection failure, therefore those are commented out.
+--
+-- -- too old protocol version
+-- SELECT pg_protocol(major => 1, minor => 0) \gset
+-- \setenv PGFORCEPROTOCOLVERSION :pg_protocol
+-- \c
+--
+-- -- check too low major, with high minor
+-- SELECT pg_protocol(major => 1, minor => 30) \gset
+-- \setenv PGFORCEPROTOCOLVERSION :pg_protocol
+-- \c
+--
+-- check 2.0 protocol, the earliest accepted
+SELECT pg_protocol(major => 2, minor => 0) \gset
+\setenv PGFORCEPROTOCOLVERSION :pg_protocol
+\c
+-- check 2.10 protocol, an unknown minor
+SELECT pg_protocol(major => 2, minor => 10) \gset
+\setenv PGFORCEPROTOCOLVERSION :pg_protocol
+\c
+-- check 3.0 protocol, the default version
+SELECT pg_protocol(major => 3, minor => 0) \gset
+\setenv PGFORCEPROTOCOLVERSION :pg_protocol
+\c
+-- -- check 3.10 protocol, an unknown minor, will error out
+-- SELECT pg_protocol(major => 3, minor => 10) \gset
+-- \setenv PGFORCEPROTOCOLVERSION :pg_protocol
+-- \c
+--
+-- ensure some coverage for v2 protocol, which is otherwise untested
+--
+SELECT pg_protocol(major => 2, minor => 0) \gset
+\setenv PGFORCEPROTOCOLVERSION :pg_protocol
+\c
+-- check that NOTICEs in the middle of a statement work
+CREATE OR REPLACE FUNCTION pg_temp.raise_notice(p_text text)
+RETURNS text
+LANGUAGE plpgsql AS $$
+BEGIN
+    RAISE NOTICE '%', p_text;
+    RETURN p_text;
+END$$;
+-- check that NOTICE in the middle of a normal statement works
+SELECT d, COALESCE(d, pg_temp.raise_notice('isnull'))
+FROM (VALUES ('notnull'), (NULL), ('notnullagain')) AS d(d);
+NOTICE:  isnull
+      d       |   coalesce   
+--------------+--------------
+ notnull      | notnull
+              | isnull
+ notnullagain | notnullagain
+(3 rows)
+
+-- check that NOTICE in the middle of a COPY works
+CREATE TEMPORARY TABLE bleat_on_null(d text CHECK(COALESCE(d, pg_temp.raise_notice('isnull')) IS NOT NULL));
+\copy bleat_on_null from stdin
+NOTICE:  isnull
+NOTICE:  isnull
+-- while at it, also test COPY OUT
+\copy bleat_on_null TO stdout
+notnull
+\N
+\N
+notnullagain
+COPY BLEAT_ON_NULL TO stdout;
+notnull
+\N
+\N
+notnullagain
+-- no columns
+SELECT;
+--
+(1 row)
+
+-- anonymous columns
+SELECT 1;
+ ?column? 
+----------
+        1
+(1 row)
+
+-- many columns with NULLs (for NULL bitmap)
+SELECT 1 c1, 2 c2, 3 c3, NULL::int c4, 5 c5, 6 c6, 7 c7, 8 c8, NULL::text c9, 10 c10;
+ c1 | c2 | c3 | c4 | c5 | c6 | c7 | c8 | c9 | c10 
+----+----+----+----+----+----+----+----+----+-----
+  1 |  2 |  3 |    |  5 |  6 |  7 |  8 |    |  10
+(1 row)
+
+-- send two sql queries in one protocol message
+SELECT 1\;SELECT 2;
+ ?column? 
+----------
+        2
+(1 row)
+
+-- a few more rows
+SELECT a, b
+FROM generate_series(1, 10) a, generate_series(1, 10) b;
+ a  | b  
+----+----
+  1 |  1
+  1 |  2
+  1 |  3
+  1 |  4
+  1 |  5
+  1 |  6
+  1 |  7
+  1 |  8
+  1 |  9
+  1 | 10
+  2 |  1
+  2 |  2
+  2 |  3
+  2 |  4
+  2 |  5
+  2 |  6
+  2 |  7
+  2 |  8
+  2 |  9
+  2 | 10
+  3 |  1
+  3 |  2
+  3 |  3
+  3 |  4
+  3 |  5
+  3 |  6
+  3 |  7
+  3 |  8
+  3 |  9
+  3 | 10
+  4 |  1
+  4 |  2
+  4 |  3
+  4 |  4
+  4 |  5
+  4 |  6
+  4 |  7
+  4 |  8
+  4 |  9
+  4 | 10
+  5 |  1
+  5 |  2
+  5 |  3
+  5 |  4
+  5 |  5
+  5 |  6
+  5 |  7
+  5 |  8
+  5 |  9
+  5 | 10
+  6 |  1
+  6 |  2
+  6 |  3
+  6 |  4
+  6 |  5
+  6 |  6
+  6 |  7
+  6 |  8
+  6 |  9
+  6 | 10
+  7 |  1
+  7 |  2
+  7 |  3
+  7 |  4
+  7 |  5
+  7 |  6
+  7 |  7
+  7 |  8
+  7 |  9
+  7 | 10
+  8 |  1
+  8 |  2
+  8 |  3
+  8 |  4
+  8 |  5
+  8 |  6
+  8 |  7
+  8 |  8
+  8 |  9
+  8 | 10
+  9 |  1
+  9 |  2
+  9 |  3
+  9 |  4
+  9 |  5
+  9 |  6
+  9 |  7
+  9 |  8
+  9 |  9
+  9 | 10
+ 10 |  1
+ 10 |  2
+ 10 |  3
+ 10 |  4
+ 10 |  5
+ 10 |  6
+ 10 |  7
+ 10 |  8
+ 10 |  9
+ 10 | 10
+(100 rows)
+
+-- check error responses
+SELECT "nonexistant-column";
+ERROR:  column "nonexistant-column" does not exist at character 8
+DO $$
+BEGIN
+    RAISE 'I am an error, what is your name?';
+END;
+$$;
+ERROR:  I am an error, what is your name?
+-- minimal largeobject test, also verifies PQfn()
+BEGIN;
+SELECT lo_creat(1) AS lo_oid \gset
+SELECT lo_open(:lo_oid, CAST(x'20000' | x'40000' AS integer)) as fd \gset
+SELECT lowrite(:fd, 'just some text');
+ lowrite 
+---------
+      14
+(1 row)
+
+SELECT loread(:fd, '100');
+ loread 
+--------
+ \x
+(1 row)
+
+SELECT lo_lseek(:fd, 0, 2);
+ lo_lseek 
+----------
+       14
+(1 row)
+
+COMMIT;
+\lo_unlink :lo_oid
+--
+-- Cleanup
+--
+DROP FUNCTION pg_protocol(int, int);
diff --git a/src/test/regress/parallel_schedule b/src/test/regress/parallel_schedule
index 2fd3f2b1b1..5db1a89b30 100644
--- a/src/test/regress/parallel_schedule
+++ b/src/test/regress/parallel_schedule
@@ -89,7 +89,7 @@ test: brin gin gist spgist privileges init_privs security_label collate matview
 # ----------
 # Another group of parallel tests
 # ----------
-test: alter_generic alter_operator misc psql async dbsize misc_functions sysviews tsrf tidscan stats_ext
+test: alter_generic alter_operator misc psql async dbsize misc_functions sysviews tsrf tidscan stats_ext protocol
 
 # rules cannot run concurrently with any test that creates a view
 test: rules psql_crosstab amutils
diff --git a/src/test/regress/serial_schedule b/src/test/regress/serial_schedule
index 76b0de30a7..0452943162 100644
--- a/src/test/regress/serial_schedule
+++ b/src/test/regress/serial_schedule
@@ -131,6 +131,7 @@ test: sysviews
 test: tsrf
 test: tidscan
 test: stats_ext
+test: protocol
 test: rules
 test: psql_crosstab
 test: select_parallel
diff --git a/src/test/regress/sql/protocol.sql b/src/test/regress/sql/protocol.sql
new file mode 100644
index 0000000000..e2f71dba25
--- /dev/null
+++ b/src/test/regress/sql/protocol.sql
@@ -0,0 +1,124 @@
+\set ON_ERROR_STOP 0
+
+-- Function that returns the protocol version, as required for the protocol
+CREATE OR REPLACE FUNCTION pg_protocol(major int, minor int)
+RETURNS int
+LANGUAGE SQL
+IMMUTABLE
+AS $$
+    SELECT $1 << 16 | $2;
+$$;
+
+--
+-- first a few error checks about acceptance of various protocol versions
+--
+-- Can't execute failing tests these via psql -f / pg_regress, as they
+-- exit after a connection failure, therefore those are commented out.
+--
+
+-- -- too old protocol version
+-- SELECT pg_protocol(major => 1, minor => 0) \gset
+-- \setenv PGFORCEPROTOCOLVERSION :pg_protocol
+-- \c
+--
+-- -- check too low major, with high minor
+-- SELECT pg_protocol(major => 1, minor => 30) \gset
+-- \setenv PGFORCEPROTOCOLVERSION :pg_protocol
+-- \c
+--
+
+-- check 2.0 protocol, the earliest accepted
+SELECT pg_protocol(major => 2, minor => 0) \gset
+\setenv PGFORCEPROTOCOLVERSION :pg_protocol
+\c
+
+-- check 2.10 protocol, an unknown minor
+SELECT pg_protocol(major => 2, minor => 10) \gset
+\setenv PGFORCEPROTOCOLVERSION :pg_protocol
+\c
+
+-- check 3.0 protocol, the default version
+SELECT pg_protocol(major => 3, minor => 0) \gset
+\setenv PGFORCEPROTOCOLVERSION :pg_protocol
+\c
+
+-- -- check 3.10 protocol, an unknown minor, will error out
+-- SELECT pg_protocol(major => 3, minor => 10) \gset
+-- \setenv PGFORCEPROTOCOLVERSION :pg_protocol
+-- \c
+
+
+--
+-- ensure some coverage for v2 protocol, which is otherwise untested
+--
+
+SELECT pg_protocol(major => 2, minor => 0) \gset
+\setenv PGFORCEPROTOCOLVERSION :pg_protocol
+\c
+
+
+-- check that NOTICEs in the middle of a statement work
+CREATE OR REPLACE FUNCTION pg_temp.raise_notice(p_text text)
+RETURNS text
+LANGUAGE plpgsql AS $$
+BEGIN
+    RAISE NOTICE '%', p_text;
+    RETURN p_text;
+END$$;
+
+-- check that NOTICE in the middle of a normal statement works
+SELECT d, COALESCE(d, pg_temp.raise_notice('isnull'))
+FROM (VALUES ('notnull'), (NULL), ('notnullagain')) AS d(d);
+
+-- check that NOTICE in the middle of a COPY works
+CREATE TEMPORARY TABLE bleat_on_null(d text CHECK(COALESCE(d, pg_temp.raise_notice('isnull')) IS NOT NULL));
+\copy bleat_on_null from stdin
+notnull
+\N
+\N
+notnullagain
+\.
+-- while at it, also test COPY OUT
+\copy bleat_on_null TO stdout
+COPY BLEAT_ON_NULL TO stdout;
+
+-- no columns
+SELECT;
+
+-- anonymous columns
+SELECT 1;
+
+-- many columns with NULLs (for NULL bitmap)
+SELECT 1 c1, 2 c2, 3 c3, NULL::int c4, 5 c5, 6 c6, 7 c7, 8 c8, NULL::text c9, 10 c10;
+
+-- send two sql queries in one protocol message
+SELECT 1\;SELECT 2;
+
+-- a few more rows
+SELECT a, b
+FROM generate_series(1, 10) a, generate_series(1, 10) b;
+
+-- check error responses
+SELECT "nonexistant-column";
+
+DO $$
+BEGIN
+    RAISE 'I am an error, what is your name?';
+END;
+$$;
+
+
+-- minimal largeobject test, also verifies PQfn()
+BEGIN;
+SELECT lo_creat(1) AS lo_oid \gset
+SELECT lo_open(:lo_oid, CAST(x'20000' | x'40000' AS integer)) as fd \gset
+SELECT lowrite(:fd, 'just some text');
+SELECT loread(:fd, '100');
+SELECT lo_lseek(:fd, 0, 2);
+COMMIT;
+\lo_unlink :lo_oid
+
+--
+-- Cleanup
+--
+DROP FUNCTION pg_protocol(int, int);
-- 
2.14.1.536.g6867272d5b.dirty

#30Andres Freund
andres@anarazel.de
In reply to: Andres Freund (#29)
Re: Is it time to kill support for very old servers?

On 2017-09-20 01:32:36 -0700, Andres Freund wrote:

On 2017-09-18 02:53:03 -0700, Andres Freund wrote:

On 2017-09-13 23:39:21 -0400, Tom Lane wrote:

The real problem in this area, to my mind, is that we're not testing that
code --- either end of it --- in any systematic way. If it's broken it
could take us quite a while to notice.

Independent of the thrust of my question - why aren't we adding a
'force-v2' option to libpq? A test that basically does something like
postgres[22923][1]=# \setenv PGFORCEV2 1
postgres[22923][1]=# \c
You are now connected to database "postgres" as user "andres".
postgres[22924][1]=>
seems easy enough to add, in fact I tested the above.

And the protocol coverage of the v2 protocol seems small enough that a
single not too large file ought to cover most if it quite easily.

Here's what I roughly was thinking of. I don't quite like the name, and
the way the version is specified for libpq (basically just the "raw"
integer). Not sure if others have an opinion on that. I personally
would lean towards not documenting this option...

There's a few things that I couldn't find easy ways to test:
- the v2 specific binary protocol - I don't quite see how we could test
that without writing C
- version error checks - pg_regress/psql errors out in non-interactive
mode if a connection fails to be established. This we could verify
with a s simple tap test.

Coverage of the relevant files is a good bit higher afterwards. Although
our libpq coverage is generally pretty damn awful.

Any opinions on this? Obviously this needs some cleanup, but I'd like to
know whether we've concensus on adding a connection option for this goal
before investing more time into this.

A nearby thread [1]/messages/by-id/20170914063418.sckdzgjfrsbekae4@alap3.anarazel.de whacks around some the v2 code, which triggered me
to look into this. I obviously can just use thiese patches to test those
patches during development, but it seems better to keep coverage.

Thanks,

Andres

[1]: /messages/by-id/20170914063418.sckdzgjfrsbekae4@alap3.anarazel.de

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#31Michael Paquier
michael.paquier@gmail.com
In reply to: Andres Freund (#30)
Re: Is it time to kill support for very old servers?

On Wed, Oct 11, 2017 at 9:39 AM, Andres Freund <andres@anarazel.de> wrote:

On 2017-09-20 01:32:36 -0700, Andres Freund wrote:

Coverage of the relevant files is a good bit higher afterwards. Although
our libpq coverage is generally pretty damn awful.

Any opinions on this? Obviously this needs some cleanup, but I'd like to
know whether we've concensus on adding a connection option for this goal
before investing more time into this.

A nearby thread [1] whacks around some the v2 code, which triggered me
to look into this. I obviously can just use thiese patches to test those
patches during development, but it seems better to keep coverage.

FWIW, I think that moving forward with such a possibility is a good
thing, including having a connection parameter. This would pay in the
long term if a new protocol version is added. 0001 should document the
new parameter.

+   if (conn->forced_protocol_version != NULL)
+   {
+       conn->pversion = atoi(conn->forced_protocol_version);
+   }
This should check for strlen > 0 as well.
-- 
Michael

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#32Andres Freund
andres@anarazel.de
In reply to: Michael Paquier (#31)
Re: Is it time to kill support for very old servers?

Hi,

On 2017-10-11 10:09:34 +0900, Michael Paquier wrote:

On Wed, Oct 11, 2017 at 9:39 AM, Andres Freund <andres@anarazel.de> wrote:

On 2017-09-20 01:32:36 -0700, Andres Freund wrote:

Coverage of the relevant files is a good bit higher afterwards. Although
our libpq coverage is generally pretty damn awful.

Any opinions on this? Obviously this needs some cleanup, but I'd like to
know whether we've concensus on adding a connection option for this goal
before investing more time into this.

A nearby thread [1] whacks around some the v2 code, which triggered me
to look into this. I obviously can just use thiese patches to test those
patches during development, but it seems better to keep coverage.

FWIW, I think that moving forward with such a possibility is a good
thing, including having a connection parameter. This would pay in the
long term if a new protocol version is added.

0001 should document the new parameter.

I'm actually inclined not to, and keep this as a undocumented debugging
option. Limiting the use of this option to people willing to read the
code seems like a good idea to me.

+   if (conn->forced_protocol_version != NULL)
+   {
+       conn->pversion = atoi(conn->forced_protocol_version);
+   }
This should check for strlen > 0 as well.

Why? Note that we don't do elsehwere in fe-connect.c.

Greetings,

Andres Freund

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#33Michael Paquier
michael.paquier@gmail.com
In reply to: Andres Freund (#32)
Re: Is it time to kill support for very old servers?

On Wed, Oct 11, 2017 at 10:14 AM, Andres Freund <andres@anarazel.de> wrote:

Hi,

On 2017-10-11 10:09:34 +0900, Michael Paquier wrote:

On Wed, Oct 11, 2017 at 9:39 AM, Andres Freund <andres@anarazel.de> wrote:

On 2017-09-20 01:32:36 -0700, Andres Freund wrote:

Coverage of the relevant files is a good bit higher afterwards. Although
our libpq coverage is generally pretty damn awful.

Any opinions on this? Obviously this needs some cleanup, but I'd like to
know whether we've concensus on adding a connection option for this goal
before investing more time into this.

A nearby thread [1] whacks around some the v2 code, which triggered me
to look into this. I obviously can just use thiese patches to test those
patches during development, but it seems better to keep coverage.

FWIW, I think that moving forward with such a possibility is a good
thing, including having a connection parameter. This would pay in the
long term if a new protocol version is added.

0001 should document the new parameter.

I'm actually inclined not to, and keep this as a undocumented debugging
option. Limiting the use of this option to people willing to read the
code seems like a good idea to me.

It seems important to me to document things present. There is a
section in the docs listing developer-only parameters for runtime
configuration, why not separating "Parameter Key Words" into two
sections then? One for the main parameters and one for developer-only
parameters.

+   if (conn->forced_protocol_version != NULL)
+   {
+       conn->pversion = atoi(conn->forced_protocol_version);
+   }
This should check for strlen > 0 as well.

Why? Note that we don't do elsehwere in fe-connect.c.

Because it seems to me that the default value of the parameter should
be an empty string instead of D. Feels more consistent with the
others.
--
Michael

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#34Andres Freund
andres@anarazel.de
In reply to: Michael Paquier (#33)
Re: Is it time to kill support for very old servers?

Hi,

On 2017-10-11 10:40:11 +0900, Michael Paquier wrote:

+   if (conn->forced_protocol_version != NULL)
+   {
+       conn->pversion = atoi(conn->forced_protocol_version);
+   }
This should check for strlen > 0 as well.

Why? Note that we don't do elsehwere in fe-connect.c.

Because it seems to me that the default value of the parameter should
be an empty string instead of D. Feels more consistent with the
others.

I'm not following. The "D" is in the 'dispchar' field, not the value
field, no? The default value is NULL?

Greetings,

Andres Freund

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#35Michael Paquier
michael.paquier@gmail.com
In reply to: Andres Freund (#34)
Re: Is it time to kill support for very old servers?

On Wed, Oct 11, 2017 at 10:46 AM, Andres Freund <andres@anarazel.de> wrote:

I'm not following. The "D" is in the 'dispchar' field, not the value
field, no? The default value is NULL?

Oops, yes. I misread the code. Other debug options are not documented,
so fine for me to not provide any documentation then.
--
Michael

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#36Robert Haas
robertmhaas@gmail.com
In reply to: Andres Freund (#32)
Re: Is it time to kill support for very old servers?

On Tue, Oct 10, 2017 at 9:14 PM, Andres Freund <andres@anarazel.de> wrote:

I'm actually inclined not to, and keep this as a undocumented debugging
option. Limiting the use of this option to people willing to read the
code seems like a good idea to me.

-1. I use the documentation to find things, even though I am a
developer, and I don't think hiding things from users is a good idea
anyway. We can say that we recommend against using the option and
that it's just for testing, but it should be documented anyway.

--
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#37Michael Paquier
michael.paquier@gmail.com
In reply to: Robert Haas (#36)
Re: Is it time to kill support for very old servers?

On Wed, Oct 11, 2017 at 10:28 PM, Robert Haas <robertmhaas@gmail.com> wrote:

On Tue, Oct 10, 2017 at 9:14 PM, Andres Freund <andres@anarazel.de> wrote:

I'm actually inclined not to, and keep this as a undocumented debugging
option. Limiting the use of this option to people willing to read the
code seems like a good idea to me.

-1. I use the documentation to find things, even though I am a
developer, and I don't think hiding things from users is a good idea
anyway. We can say that we recommend against using the option and
that it's just for testing, but it should be documented anyway.

You would be disappointed with the current state of things then.
fe-connect.c lists a couple of debug options:
- authtype, which is not used anywhere, still kept to not reject
connection strings using it. I can get that this is not documented.
- tty, same argument as authtype.
- replication, which is still available, and that I have for example
used a couple of times for debugging the replication parser (psql can
work directly with some replication commands as you know). But this is
not documented.

FWIW, I would like to see things properly documented as well. And
please note that I am fine to write such a patch as well.
--
Michael

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#38Peter Eisentraut
peter.eisentraut@2ndquadrant.com
In reply to: Andres Freund (#29)
Re: Is it time to kill support for very old servers?

On 9/20/17 04:32, Andres Freund wrote:

Here's what I roughly was thinking of. I don't quite like the name, and
the way the version is specified for libpq (basically just the "raw"
integer).

"forced_protocol_version" reads wrong to me. I think
"force_protocol_version" might be better. Other than that, no issues
with this concept.

--
Peter Eisentraut http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#39Andres Freund
andres@anarazel.de
In reply to: Peter Eisentraut (#38)
Re: Is it time to kill support for very old servers?

On 2017-10-16 16:59:59 -0400, Peter Eisentraut wrote:

On 9/20/17 04:32, Andres Freund wrote:

Here's what I roughly was thinking of. I don't quite like the name, and
the way the version is specified for libpq (basically just the "raw"
integer).

"forced_protocol_version" reads wrong to me. I think
"force_protocol_version" might be better. Other than that, no issues
with this concept.

Yea, I agree. I've read through the patch since, and it struck me as
odd. Not sure how I came up with it...

Greetings,

Andres Freund

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#40Michael Paquier
michael.paquier@gmail.com
In reply to: Andres Freund (#39)
Re: Is it time to kill support for very old servers?

On Mon, Oct 16, 2017 at 10:08 PM, Andres Freund <andres@anarazel.de> wrote:

On 2017-10-16 16:59:59 -0400, Peter Eisentraut wrote:

On 9/20/17 04:32, Andres Freund wrote:

Here's what I roughly was thinking of. I don't quite like the name, and
the way the version is specified for libpq (basically just the "raw"
integer).

"forced_protocol_version" reads wrong to me. I think
"force_protocol_version" might be better. Other than that, no issues
with this concept.

Yea, I agree. I've read through the patch since, and it struck me as
odd. Not sure how I came up with it...

Andres, could you update the patch?
--
Michael

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#41Michael Paquier
michael.paquier@gmail.com
In reply to: Michael Paquier (#40)
Re: [HACKERS] Is it time to kill support for very old servers?

On Fri, Nov 3, 2017 at 9:30 PM, Michael Paquier
<michael.paquier@gmail.com> wrote:

On Mon, Oct 16, 2017 at 10:08 PM, Andres Freund <andres@anarazel.de> wrote:

On 2017-10-16 16:59:59 -0400, Peter Eisentraut wrote:

On 9/20/17 04:32, Andres Freund wrote:

Here's what I roughly was thinking of. I don't quite like the name, and
the way the version is specified for libpq (basically just the "raw"
integer).

"forced_protocol_version" reads wrong to me. I think
"force_protocol_version" might be better. Other than that, no issues
with this concept.

Yea, I agree. I've read through the patch since, and it struck me as
odd. Not sure how I came up with it...

Andres, could you update the patch?

Seeing no activity for three weeks and as we are close to the end of
the CF, I am marking this one as returned with feedback.
--
Michael