From 21a708f8f5b500ad427677be2643ef5710c341a7 Mon Sep 17 00:00:00 2001 From: n-someya Date: Wed, 30 Oct 2019 17:40:56 +0900 Subject: [PATCH 1/2] Fix BUG96280 --- lib/mysql/connector/protocol.py | 11 ++++++++++- tests/test_protocol.py | 12 +++++++++--- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/lib/mysql/connector/protocol.py b/lib/mysql/connector/protocol.py index 9e70c92..b61e7f9 100644 --- a/lib/mysql/connector/protocol.py +++ b/lib/mysql/connector/protocol.py @@ -475,9 +475,18 @@ def _parse_binary_values(self, fields, packet, charset='utf-8'): elif field[1] == FieldType.TIME: (packet, value) = self._parse_binary_time(packet, field) values.append(value) + elif field[1] in (FieldType.BLOB, FieldType.TINY_BLOB, + FieldType.MEDIUM_BLOB, FieldType.LONG_BLOB): + ## Fix + # - BUG96280 + (packet, value) = utils.read_lc_string(packet) + values.append(value) else: (packet, value) = utils.read_lc_string(packet) - values.append(value.decode(charset)) + try: + values.append(value.decode(charset)) + except UnicodeDecodeError: + values.append(value) return tuple(values) diff --git a/tests/test_protocol.py b/tests/test_protocol.py index 7ef2e90..2af5642 100644 --- a/tests/test_protocol.py +++ b/tests/test_protocol.py @@ -402,12 +402,16 @@ def test__parse_binary_values(self): ('aDate', 10, None, None, None, None, 1, 128), ('aDateTime', 12, None, None, None, None, 1, 128), ('aTime', 11, None, None, None, None, 1, 128), - ('aNull', 6, None, None, None, None, 1, 128)] + ('aNull', 6, None, None, None, None, 1, 128), + ('aBlob', 252, None, None, None, None, 1, 144), + ('aVarBinary', 253, None, None, None, None, 1, 128)] packet = bytearray(b'\x00\x01\x03\x61\x62\x63\x04\x33\x2e\x31\x34\x08' b'\x2d\x33\x2e\x31\x34\x31\x35\x39\x04\xd3\x07' b'\x01\x1f\x07\xb9\x07\x06\x0e\x15\x21\x0e\x0c' - b'\x00\x0a\x00\x00\x00\x10\x0f\x1e\x70\x82\x03\x00') + b'\x00\x0a\x00\x00\x00\x10\x0f\x1e\x70\x82\x03\x00' + b'\x05\xaa\xbb\xcc\xdd\xff' + b'\x05\xaa\xbb\xcc\xdd\xff') # float/double are returned as DECIMAL by MySQL exp = ('abc', @@ -416,7 +420,9 @@ def test__parse_binary_values(self): datetime.date(2003, 1, 31), datetime.datetime(1977, 6, 14, 21, 33, 14), datetime.timedelta(10, 58530, 230000), - None) + None, + bytearray(b'\xaa\xbb\xcc\xdd\xff'), + bytearray(b'\xaa\xbb\xcc\xdd\xff')) res = self._protocol._parse_binary_values(fields, packet) self.assertEqual(exp, res) From 3a520c1ce14f3932f65bf6840c15a75be484555e Mon Sep 17 00:00:00 2001 From: n-someya Date: Sun, 10 Nov 2019 00:06:46 +0900 Subject: [PATCH 2/2] Fix review comment TEXT BLOB are same filedtype. --- lib/mysql/connector/protocol.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/lib/mysql/connector/protocol.py b/lib/mysql/connector/protocol.py index b61e7f9..6db30ae 100644 --- a/lib/mysql/connector/protocol.py +++ b/lib/mysql/connector/protocol.py @@ -475,14 +475,10 @@ def _parse_binary_values(self, fields, packet, charset='utf-8'): elif field[1] == FieldType.TIME: (packet, value) = self._parse_binary_time(packet, field) values.append(value) - elif field[1] in (FieldType.BLOB, FieldType.TINY_BLOB, - FieldType.MEDIUM_BLOB, FieldType.LONG_BLOB): - ## Fix - # - BUG96280 - (packet, value) = utils.read_lc_string(packet) - values.append(value) else: (packet, value) = utils.read_lc_string(packet) + ## Fix + # - BUG96280 try: values.append(value.decode(charset)) except UnicodeDecodeError: