Teach libpq to decode server version correctly from future servers.
authorTom Lane <[email protected]>
Fri, 5 Aug 2016 22:58:12 +0000 (18:58 -0400)
committerTom Lane <[email protected]>
Fri, 5 Aug 2016 22:58:28 +0000 (18:58 -0400)
Beginning with the next development cycle, PG servers will report two-part
not three-part version numbers.  Fix libpq so that it will compute the
correct numeric representation of such server versions for reporting by
PQserverVersion().  It's desirable to get this into the field and
back-patched ASAP, so that older clients are more likely to understand the
new server version numbering by the time any such servers are in the wild.

(The results with an old client would probably not be catastrophic anyway
for a released server; for example "10.1" would be interpreted as 100100
which would be wrong in detail but would not likely cause an old client to
misbehave badly.  But "10devel" or "10beta1" would result in sversion==0
which at best would result in disabling all use of modern features.)

Extracted from a patch by Peter Eisentraut; comments added by me

Patch: <802ec140-635d-ad86-5fdf-d3af0e260c22@2ndquadrant.com>

src/interfaces/libpq/fe-exec.c

index 0309689a2f858cb93e3718c7a8ccd9fc5790e058..8ecf26b98a3e9a67c5538565dac13629bbf516f5 100644 (file)
@@ -981,14 +981,31 @@ pqSaveParameterStatus(PGconn *conn, const char *name, const char *value)
 
                cnt = sscanf(value, "%d.%d.%d", &vmaj, &vmin, &vrev);
 
-               if (cnt < 2)
-                       conn->sversion = 0; /* unknown */
-               else
+               if (cnt == 3)
                {
-                       if (cnt == 2)
-                               vrev = 0;
+                       /* old style, e.g. 9.6.1 */
                        conn->sversion = (100 * vmaj + vmin) * 100 + vrev;
                }
+               else if (cnt == 2)
+               {
+                       if (vmaj >= 10)
+                       {
+                               /* new style, e.g. 10.1 */
+                               conn->sversion = 100 * 100 * vmaj + vmin;
+                       }
+                       else
+                       {
+                               /* old style without minor version, e.g. 9.6devel */
+                               conn->sversion = (100 * vmaj + vmin) * 100;
+                       }
+               }
+               else if (cnt == 1)
+               {
+                       /* new style without minor version, e.g. 10devel */
+                       conn->sversion = 100 * 100 * vmaj;
+               }
+               else
+                       conn->sversion = 0; /* unknown */
        }
 }