Skip to content

Commit 5df27de

Browse files
Fix parsing server version string for non-final releases (devel, beta etc.)
It seems broken from the beginning: d4a66cb Detect numbers by both sides of a string in the last part (they are not split[1][2] by '.'). [1] 9.4beta2 https://git.postgresql.org/pg/commitdiff/c85374626f680902c207285b986ac38a134535eb [2] 10devel https://git.postgresql.org/pg/commitdiff/ca9112a424ff68ec4f2ef67b47122f7d61412964
1 parent 5808c37 commit 5df27de

File tree

2 files changed

+41
-4
lines changed

2 files changed

+41
-4
lines changed

asyncpg/serverversion.py

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,23 @@ def split_server_version_string(version_string):
1616
parts = version_string.strip().split('.')
1717
if not parts[-1].isdigit():
1818
# release level specified
19-
level = parts[-1].rstrip('0123456789').lower()
20-
serial = parts[-1][level:]
21-
versions = [int(p) for p in parts[:-1]][:3]
19+
lastitem = parts[-1]
20+
levelpart = lastitem.rstrip('0123456789').lower()
21+
if levelpart != lastitem:
22+
serial = int(lastitem[len(levelpart):])
23+
else:
24+
serial = 0
25+
26+
level = levelpart.lstrip('0123456789')
27+
if level != levelpart:
28+
parts[-1] = levelpart[:-len(level)]
29+
else:
30+
parts[-1] = 0
2231
else:
2332
level = 'final'
2433
serial = 0
25-
versions = [int(p) for p in parts][:3]
2634

35+
versions = [int(p) for p in parts][:3]
2736
if len(versions) < 3:
2837
versions += [0] * (3 - len(versions))
2938

tests/test_connect.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import asyncpg
1515
from asyncpg import _testbase as tb
1616
from asyncpg.connection import _parse_connect_params
17+
from asyncpg.serverversion import split_server_version_string
1718

1819
_system = platform.uname().system
1920

@@ -25,6 +26,33 @@ async def test_get_settings_01(self):
2526
self.con.get_settings().client_encoding,
2627
'UTF8')
2728

29+
async def test_server_version_01(self):
30+
version = self.con.get_server_version()
31+
version_num = await self.con.fetchval("SELECT current_setting($1)",
32+
'server_version_num', column=0)
33+
ver_maj = int(version_num[:-4])
34+
ver_min = int(version_num[-4:-2])
35+
ver_fix = int(version_num[-2:])
36+
37+
self.assertEqual(version[:3], (ver_maj, ver_min, ver_fix))
38+
39+
def test_server_version_02(self):
40+
versions = [
41+
("9.2", (9, 2, 0, 'final', 0),),
42+
("9.2.1", (9, 2, 1, 'final', 0),),
43+
("9.4beta1", (9, 4, 0, 'beta', 1),),
44+
("10devel", (10, 0, 0, 'devel', 0),),
45+
("10beta2", (10, 0, 0, 'beta', 2),),
46+
47+
# Despite the fact after version 10 Postgre's second number
48+
# means "micro", it is parsed "as is" to be
49+
# less confusing in comparisons.
50+
("10.1", (10, 1, 0, 'final', 0),),
51+
]
52+
for version, expected in versions:
53+
result = split_server_version_string(version)
54+
self.assertEqual(expected, result)
55+
2856

2957
class TestAuthentication(tb.ConnectedTestCase):
3058
def setUp(self):

0 commit comments

Comments
 (0)