diff --git a/.github/workflows/pytest.yml b/.github/workflows/pytest.yml index 23a24e34..1d2d77db 100644 --- a/.github/workflows/pytest.yml +++ b/.github/workflows/pytest.yml @@ -1,5 +1,5 @@ name: PyTest -on: [push, pull_request] +on: [ push, pull_request ] env: PYTEST_SKIP_OPTION: "not test_no_trailing_rotate_event and not test_end_log_pos and not test_query_event_latin1" jobs: @@ -8,10 +8,10 @@ jobs: fail-fast: false matrix: include: - - {name: 'CPython 3.7', python: '3.7'} - - {name: 'CPython 3.11', python: '3.11'} - - {name: 'Pypy 3.7', python: 'pypy-3.7'} - - {name: 'Pypy 3.9', python: 'pypy-3.9'} + - { name: 'CPython 3.7', python: '3.7' } + - { name: 'CPython 3.11', python: '3.11' } + - { name: 'Pypy 3.7', python: 'pypy-3.7' } + - { name: 'Pypy 3.9', python: 'pypy-3.9' } name: ${{ matrix.name }} runs-on: ubuntu-latest timeout-minutes: 3 @@ -46,14 +46,6 @@ jobs: pip install . pip install pytest - - name: Run tests for mysql-5 - working-directory: pymysqlreplication/tests - run: pytest -k "$PYTEST_SKIP_OPTION" --db=mysql-5 - - - name: Run tests for mysql-5-ctl - working-directory: pymysqlreplication/tests - run: pytest -k "$PYTEST_SKIP_OPTION" --db=mysql-5-ctl - - name: Run tests for mysql-8 working-directory: pymysqlreplication/tests run: pytest -k "$PYTEST_SKIP_OPTION" --db=mysql-8 diff --git a/docker-compose-test.yml b/docker-compose-test.yml index 7495cba6..c9ac44ef 100644 --- a/docker-compose-test.yml +++ b/docker-compose-test.yml @@ -21,22 +21,6 @@ x-mariadb: &mariadb --binlog-format=row services: - percona-5.7-ctl: - <<: *mysql - image: percona:5.7 - ports: - - "3307:3306" - networks: - - default - - percona-5.7: - <<: *mysql - image: percona:5.7 - ports: - - "3306:3306" - networks: - - default - percona-8.0: <<: *mysql image: percona:8.0 @@ -67,9 +51,6 @@ services: dockerfile: test.Dockerfile args: BASE_IMAGE: python:3.11-alpine - MYSQL_5_7: percona-5.7 - MYSQL_5_7_CTL: percona-5.7-ctl - MYSQL_5_7_CTL_PORT: 3306 MYSQL_8_0: percona-8.0 MYSQL_8_0_PORT: 3306 MARIADB_10_6: mariadb-10.6 @@ -83,7 +64,7 @@ services: while : do - if mysql -h percona-5.7 --user=root --execute "SELECT version();" 2>&1 >/dev/null && mysql -h percona-5.7-ctl --user=root --execute "SELECT version();" 2>&1 >/dev/null && mysql -h percona-8.0 --user=root --execute "SELECT version();" 2>&1 >/dev/null; then + if mysql -h percona-8.0 --user=root --execute "SELECT version();" 2>&1 >/dev/null; then break fi sleep 1 @@ -96,8 +77,6 @@ services: networks: - default depends_on: - - percona-5.7 - - percona-5.7-ctl - percona-8.0 networks: diff --git a/docker-compose.yml b/docker-compose.yml index 102ff631..3cb48a0a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -21,23 +21,17 @@ x-mariadb: &mariadb --binlog-format=row services: - percona-5.7: + percona-8.0: <<: *mysql - image: percona:5.7 + image: percona:8.0 ports: - "3306:3306" - percona-5.7-ctl: - <<: *mysql - image: percona:5.7 - ports: - - "3307:3306" - - percona-8.0: + percona-8.0-ctl: <<: *mysql image: percona:8.0 ports: - - "3309:3306" + - "3307:3306" mariadb-10.6: <<: *mariadb diff --git a/pymysqlreplication/binlogstream.py b/pymysqlreplication/binlogstream.py index 94c70550..a70babb6 100644 --- a/pymysqlreplication/binlogstream.py +++ b/pymysqlreplication/binlogstream.py @@ -312,7 +312,7 @@ def __checksum_enabled(self): if result is None: return False - var, value = result[:2] + _, value = result[:2] if value == "NONE": return False return True @@ -587,7 +587,7 @@ def fetchone(self): else: pkt = self._stream_connection._read_packet() except pymysql.OperationalError as error: - code, message = error.args + code, _ = error.args if code in MYSQL_EXPECTED_ERROR_CODES: self._stream_connection.close() self.__connected_stream = False diff --git a/pymysqlreplication/bitmap.py b/pymysqlreplication/bitmap.py index b02da8a1..804968d7 100644 --- a/pymysqlreplication/bitmap.py +++ b/pymysqlreplication/bitmap.py @@ -1,261 +1,23 @@ +# fmt: off bitCountInByte = [ - 0, - 1, - 1, - 2, - 1, - 2, - 2, - 3, - 1, - 2, - 2, - 3, - 2, - 3, - 3, - 4, - 1, - 2, - 2, - 3, - 2, - 3, - 3, - 4, - 2, - 3, - 3, - 4, - 3, - 4, - 4, - 5, - 1, - 2, - 2, - 3, - 2, - 3, - 3, - 4, - 2, - 3, - 3, - 4, - 3, - 4, - 4, - 5, - 2, - 3, - 3, - 4, - 3, - 4, - 4, - 5, - 3, - 4, - 4, - 5, - 4, - 5, - 5, - 6, - 1, - 2, - 2, - 3, - 2, - 3, - 3, - 4, - 2, - 3, - 3, - 4, - 3, - 4, - 4, - 5, - 2, - 3, - 3, - 4, - 3, - 4, - 4, - 5, - 3, - 4, - 4, - 5, - 4, - 5, - 5, - 6, - 2, - 3, - 3, - 4, - 3, - 4, - 4, - 5, - 3, - 4, - 4, - 5, - 4, - 5, - 5, - 6, - 3, - 4, - 4, - 5, - 4, - 5, - 5, - 6, - 4, - 5, - 5, - 6, - 5, - 6, - 6, - 7, - 1, - 2, - 2, - 3, - 2, - 3, - 3, - 4, - 2, - 3, - 3, - 4, - 3, - 4, - 4, - 5, - 2, - 3, - 3, - 4, - 3, - 4, - 4, - 5, - 3, - 4, - 4, - 5, - 4, - 5, - 5, - 6, - 2, - 3, - 3, - 4, - 3, - 4, - 4, - 5, - 3, - 4, - 4, - 5, - 4, - 5, - 5, - 6, - 3, - 4, - 4, - 5, - 4, - 5, - 5, - 6, - 4, - 5, - 5, - 6, - 5, - 6, - 6, - 7, - 2, - 3, - 3, - 4, - 3, - 4, - 4, - 5, - 3, - 4, - 4, - 5, - 4, - 5, - 5, - 6, - 3, - 4, - 4, - 5, - 4, - 5, - 5, - 6, - 4, - 5, - 5, - 6, - 5, - 6, - 6, - 7, - 3, - 4, - 4, - 5, - 4, - 5, - 5, - 6, - 4, - 5, - 5, - 6, - 5, - 6, - 6, - 7, - 4, - 5, - 5, - 6, - 5, - 6, - 6, - 7, - 5, - 6, - 6, - 7, - 6, - 7, - 7, - 8, + 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, + 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, + 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8, ] +# fmt: on # Calculate total bit counts in a bitmap diff --git a/pymysqlreplication/event.py b/pymysqlreplication/event.py index 668c929f..a8b95425 100644 --- a/pymysqlreplication/event.py +++ b/pymysqlreplication/event.py @@ -98,9 +98,8 @@ def __init__(self, from_packet, event_size, table_map, ctl_connection, **kwargs) self.gno = struct.unpack("= (5, 7): - self.last_committed = struct.unpack("= 5.6: - return True - return False - - def isMySQL57(self): - version = float(self.getMySQLVersion().rsplit(".", 1)[0]) - return version == 5.7 - def isMySQL80AndMore(self): version = float(self.getMySQLVersion().rsplit(".", 1)[0]) return version >= 8.0 @@ -84,6 +73,13 @@ def isMySQL8014AndMore(self): return True return version == 8.0 and version_detail >= 14 + def isMySQL8016AndMore(self): + version = float(self.getMySQLVersion().rsplit(".", 1)[0]) + version_detail = int(self.getMySQLVersion().rsplit(".", 1)[1]) + if version > 8.0: + return True + return version == 8.0 and version_detail >= 16 + def isMariaDB(self): if self.__is_mariaDB is None: self.__is_mariaDB = ( @@ -91,12 +87,6 @@ def isMariaDB(self): ) return self.__is_mariaDB - @property - def supportsGTID(self): - if not self.isMySQL56AndMore(): - return False - return self.execute("SELECT @@global.gtid_mode ").fetchone()[0] == "ON" - def connect_conn_control(self, db): if self.conn_control is not None: self.conn_control.close() @@ -126,12 +116,6 @@ def resetBinLog(self): self.database, server_id=1024, ignored_events=self.ignoredEvents() ) - def set_sql_mode(self): - """set sql_mode to test with same sql_mode (mysql 5.7 sql_mode default is changed)""" - version = float(self.getMySQLVersion().rsplit(".", 1)[0]) - if version == 5.7: - self.execute("SET @@sql_mode='NO_ENGINE_SUBSTITUTION'") - def bin_log_format(self): query = "SELECT @@binlog_format" cursor = self.execute(query) diff --git a/pymysqlreplication/tests/benchmark.py b/pymysqlreplication/tests/benchmark.py index 3cd47bd9..c109985c 100644 --- a/pymysqlreplication/tests/benchmark.py +++ b/pymysqlreplication/tests/benchmark.py @@ -25,12 +25,12 @@ def consume_events(): only_events=[UpdateRowsEvent], only_tables=["test"], ) - start = time.clock() + start = time.perf_counter() i = 0.0 for binlogevent in stream: i += 1.0 if i % 1000 == 0: - print(f"{i / (time.clock()- start)} event by seconds ({i} total)") + print(f"{i / (time.perf_counter()- start)} event by seconds ({i} total)") stream.close() diff --git a/pymysqlreplication/tests/binlogfilereader.py b/pymysqlreplication/tests/binlogfilereader.py index 9eed60d3..ddfe49e6 100644 --- a/pymysqlreplication/tests/binlogfilereader.py +++ b/pymysqlreplication/tests/binlogfilereader.py @@ -72,8 +72,7 @@ def _read_event(self): event = SimpleBinLogEvent(header) event.set_pos(event_pos) if event.event_size < headerlength: - messagefmt = "Event size {0} is too small" - message = messagefmt.format(event.event_size) + message = f"Event size {event.event_size} is too small" raise EventSizeTooSmallError(message) else: body = self._file.read(event.event_size - headerlength) @@ -89,8 +88,7 @@ def _read_magic(self): if magic == self._expected_magic: self._pos += len(magic) else: - messagefmt = "Magic bytes {0!r} did not match expected {1!r}" - message = messagefmt.format(magic, self._expected_magic) + message = f"Magic bytes {magic!r} did not match expected {self._expected_magic!r}" raise BadMagicBytesError(message) def __iter__(self): diff --git a/pymysqlreplication/tests/config.json b/pymysqlreplication/tests/config.json index 5bfd93a4..db18c31c 100644 --- a/pymysqlreplication/tests/config.json +++ b/pymysqlreplication/tests/config.json @@ -1,5 +1,5 @@ { - "mysql-5": { + "mysql-8": { "host": "localhost", "user": "root", "passwd": "", @@ -8,7 +8,7 @@ "charset": "utf8", "db": "pymysqlreplication_test" }, - "mysql-5-ctl": { + "mysql-8-ctl": { "host": "localhost", "user": "root", "passwd": "", @@ -25,14 +25,5 @@ "use_unicode": true, "charset": "utf8", "db": "pymysqlreplication_test" - }, - "mysql-8": { - "host": "localhost", - "user": "root", - "passwd": "", - "port": 3309, - "use_unicode": true, - "charset": "utf8", - "db": "pymysqlreplication_test" } } diff --git a/pymysqlreplication/tests/conftest.py b/pymysqlreplication/tests/conftest.py index 8e1b55b7..153bfa56 100644 --- a/pymysqlreplication/tests/conftest.py +++ b/pymysqlreplication/tests/conftest.py @@ -2,7 +2,7 @@ def pytest_addoption(parser): - parser.addoption("--db", action="store", default="mysql-5") + parser.addoption("--db", action="store", default="mysql-8") @pytest.fixture diff --git a/pymysqlreplication/tests/test_basic.py b/pymysqlreplication/tests/test_basic.py index 80bfe657..cc38f835 100644 --- a/pymysqlreplication/tests/test_basic.py +++ b/pymysqlreplication/tests/test_basic.py @@ -246,10 +246,8 @@ def test_write_row_event(self): self.assertIsInstance(self.stream.fetchone(), TableMapEvent) event = self.stream.fetchone() - if self.isMySQL56AndMore(): - self.assertEqual(event.event_type, WRITE_ROWS_EVENT_V2) - else: - self.assertEqual(event.event_type, WRITE_ROWS_EVENT_V1) + + self.assertEqual(event.event_type, WRITE_ROWS_EVENT_V2) self.assertIsInstance(event, WriteRowsEvent) self.assertEqual(event.schema, "pymysqlreplication_test") self.assertEqual(event.table, "test") @@ -279,10 +277,8 @@ def test_delete_row_event(self): self.assertIsInstance(self.stream.fetchone(), TableMapEvent) event = self.stream.fetchone() - if self.isMySQL56AndMore(): - self.assertEqual(event.event_type, DELETE_ROWS_EVENT_V2) - else: - self.assertEqual(event.event_type, DELETE_ROWS_EVENT_V1) + + self.assertEqual(event.event_type, DELETE_ROWS_EVENT_V2) self.assertIsInstance(event, DeleteRowsEvent) if event.table_map[event.table_id].column_name_flag: self.assertEqual(event.rows[0]["values"]["id"], 1) @@ -309,10 +305,8 @@ def test_update_row_event(self): self.assertIsInstance(self.stream.fetchone(), TableMapEvent) event = self.stream.fetchone() - if self.isMySQL56AndMore(): - self.assertEqual(event.event_type, UPDATE_ROWS_EVENT_V2) - else: - self.assertEqual(event.event_type, UPDATE_ROWS_EVENT_V1) + + self.assertEqual(event.event_type, UPDATE_ROWS_EVENT_V2) self.assertIsInstance(event, UpdateRowsEvent) if event.table_map[event.table_id].column_name_flag: self.assertEqual(event.rows[0]["before_values"]["id"], 1) @@ -339,10 +333,8 @@ def test_minimal_image_write_row_event(self): self.assertIsInstance(self.stream.fetchone(), TableMapEvent) event = self.stream.fetchone() - if self.isMySQL56AndMore(): - self.assertEqual(event.event_type, WRITE_ROWS_EVENT_V2) - else: - self.assertEqual(event.event_type, WRITE_ROWS_EVENT_V1) + + self.assertEqual(event.event_type, WRITE_ROWS_EVENT_V2) self.assertIsInstance(event, WriteRowsEvent) self.assertEqual(event.schema, "pymysqlreplication_test") self.assertEqual(event.table, "test") @@ -373,10 +365,8 @@ def test_minimal_image_delete_row_event(self): self.assertIsInstance(self.stream.fetchone(), TableMapEvent) event = self.stream.fetchone() - if self.isMySQL56AndMore(): - self.assertEqual(event.event_type, DELETE_ROWS_EVENT_V2) - else: - self.assertEqual(event.event_type, DELETE_ROWS_EVENT_V1) + + self.assertEqual(event.event_type, DELETE_ROWS_EVENT_V2) self.assertIsInstance(event, DeleteRowsEvent) if event.table_map[event.table_id].column_name_flag: self.assertEqual(event.rows[0]["values"]["id"], 1) @@ -404,10 +394,8 @@ def test_minimal_image_update_row_event(self): self.assertIsInstance(self.stream.fetchone(), TableMapEvent) event = self.stream.fetchone() - if self.isMySQL56AndMore(): - self.assertEqual(event.event_type, UPDATE_ROWS_EVENT_V2) - else: - self.assertEqual(event.event_type, UPDATE_ROWS_EVENT_V1) + + self.assertEqual(event.event_type, UPDATE_ROWS_EVENT_V2) self.assertIsInstance(event, UpdateRowsEvent) if event.table_map[event.table_id].column_name_flag: self.assertEqual(event.rows[0]["before_values"]["id"], 1) @@ -650,10 +638,8 @@ def test_insert_multiple_row_event(self): self.assertIsInstance(self.stream.fetchone(), TableMapEvent) event = self.stream.fetchone() - if self.isMySQL56AndMore(): - self.assertEqual(event.event_type, WRITE_ROWS_EVENT_V2) - else: - self.assertEqual(event.event_type, WRITE_ROWS_EVENT_V1) + + self.assertEqual(event.event_type, WRITE_ROWS_EVENT_V2) self.assertIsInstance(event, WriteRowsEvent) self.assertEqual(len(event.rows), 2) if event.table_map[event.table_id].column_name_flag: @@ -685,10 +671,8 @@ def test_update_multiple_row_event(self): self.assertIsInstance(self.stream.fetchone(), TableMapEvent) event = self.stream.fetchone() - if self.isMySQL56AndMore(): - self.assertEqual(event.event_type, UPDATE_ROWS_EVENT_V2) - else: - self.assertEqual(event.event_type, UPDATE_ROWS_EVENT_V1) + + self.assertEqual(event.event_type, UPDATE_ROWS_EVENT_V2) self.assertIsInstance(event, UpdateRowsEvent) self.assertEqual(len(event.rows), 2) if event.table_map[event.table_id].column_name_flag: @@ -725,10 +709,7 @@ def test_delete_multiple_row_event(self): self.assertIsInstance(self.stream.fetchone(), TableMapEvent) event = self.stream.fetchone() - if self.isMySQL56AndMore(): - self.assertEqual(event.event_type, DELETE_ROWS_EVENT_V2) - else: - self.assertEqual(event.event_type, DELETE_ROWS_EVENT_V1) + self.assertEqual(event.event_type, DELETE_ROWS_EVENT_V2) self.assertIsInstance(event, DeleteRowsEvent) self.assertEqual(len(event.rows), 2) if event.table_map[event.table_id].column_name_flag: @@ -851,10 +832,6 @@ def test_separate_ctl_settings_no_error(self): class TestGtidBinLogStreamReader(base.PyMySQLReplicationTestCase): def setUp(self): super().setUp() - if not self.supportsGTID: - raise unittest.SkipTest( - "database does not support GTID, skipping GTID tests" - ) def test_read_query_event(self): query = "CREATE TABLE test (id INT NOT NULL, data VARCHAR (50) NOT NULL, PRIMARY KEY (id))" @@ -1484,6 +1461,7 @@ def test_query_event_latin1(self): assert "ÖÆÛ".encode("latin-1") == b"\xd6\xc6\xdb" event = self.stream.fetchone() + assert event.query.startswith("CREATE TABLE test") assert event.query == r"CREATE TABLE test_latin1_\xd6\xc6\xdb (a INT)" diff --git a/pymysqlreplication/tests/test_data_type.py b/pymysqlreplication/tests/test_data_type.py index cece10c3..9c91dbad 100644 --- a/pymysqlreplication/tests/test_data_type.py +++ b/pymysqlreplication/tests/test_data_type.py @@ -1,5 +1,4 @@ import copy -import platform import json from pymysqlreplication import BinLogStreamReader import unittest @@ -51,10 +50,8 @@ def create_and_insert_value(self, create_query, insert_query): self.assertIsInstance(self.stream.fetchone(), TableMapEvent) event = self.stream.fetchone() - if self.isMySQL56AndMore(): - self.assertEqual(event.event_type, WRITE_ROWS_EVENT_V2) - else: - self.assertEqual(event.event_type, WRITE_ROWS_EVENT_V1) + + self.assertEqual(event.event_type, WRITE_ROWS_EVENT_V2) self.assertIsInstance(event, WriteRowsEvent) return event @@ -287,55 +284,6 @@ def test_timestamp(self): datetime.datetime(1984, 12, 3, 12, 33, 7), ) - def test_timestamp_mysql56(self): - if not self.isMySQL56AndMore(): - self.skipTest("Not supported in this version of MySQL") - self.set_sql_mode() - create_query = """CREATE TABLE test (test0 TIMESTAMP(0), - test1 TIMESTAMP(1), - test2 TIMESTAMP(2), - test3 TIMESTAMP(3), - test4 TIMESTAMP(4), - test5 TIMESTAMP(5), - test6 TIMESTAMP(6));""" - insert_query = """INSERT INTO test VALUES('1984-12-03 12:33:07', - '1984-12-03 12:33:07.1', - '1984-12-03 12:33:07.12', - '1984-12-03 12:33:07.123', - '1984-12-03 12:33:07.1234', - '1984-12-03 12:33:07.12345', - '1984-12-03 12:33:07.123456')""" - event = self.create_and_insert_value(create_query, insert_query) - if event.table_map[event.table_id].column_name_flag: - self.assertEqual( - event.rows[0]["values"]["test0"], - datetime.datetime(1984, 12, 3, 12, 33, 7), - ) - self.assertEqual( - event.rows[0]["values"]["test1"], - datetime.datetime(1984, 12, 3, 12, 33, 7, 100000), - ) - self.assertEqual( - event.rows[0]["values"]["test2"], - datetime.datetime(1984, 12, 3, 12, 33, 7, 120000), - ) - self.assertEqual( - event.rows[0]["values"]["test3"], - datetime.datetime(1984, 12, 3, 12, 33, 7, 123000), - ) - self.assertEqual( - event.rows[0]["values"]["test4"], - datetime.datetime(1984, 12, 3, 12, 33, 7, 123400), - ) - self.assertEqual( - event.rows[0]["values"]["test5"], - datetime.datetime(1984, 12, 3, 12, 33, 7, 123450), - ) - self.assertEqual( - event.rows[0]["values"]["test6"], - datetime.datetime(1984, 12, 3, 12, 33, 7, 123456), - ) - def test_longlong(self): create_query = "CREATE TABLE test (id BIGINT UNSIGNED NOT NULL, test BIGINT)" insert_query = ( @@ -375,32 +323,6 @@ def test_zero_date(self): self.assertEqual(event.rows[0]["values"]["test"], None) self.assertEqual(event.rows[0]["values"]["test2"], None) - def test_zero_month(self): - if not self.isMySQL57(): - self.skipTest( - "Not supported in this version of MySQL 8" - ) # pymysql.err.OperationalError - self.set_sql_mode() - create_query = "CREATE TABLE test (id INTEGER, test DATE, test2 DATE);" - insert_query = "INSERT INTO test (id, test2) VALUES(1, '2015-00-21')" - event = self.create_and_insert_value(create_query, insert_query) - if event.table_map[event.table_id].column_name_flag: - self.assertEqual(event.rows[0]["values"]["test"], None) - self.assertEqual(event.rows[0]["values"]["test2"], None) - - def test_zero_day(self): - if not self.isMySQL57(): - self.skipTest( - "Not supported in this version of MySQL 8" - ) # pymysql.err.OperationalError - self.set_sql_mode() - create_query = "CREATE TABLE test (id INTEGER, test DATE, test2 DATE);" - insert_query = "INSERT INTO test (id, test2) VALUES(1, '2015-05-00')" - event = self.create_and_insert_value(create_query, insert_query) - if event.table_map[event.table_id].column_name_flag: - self.assertEqual(event.rows[0]["values"]["test"], None) - self.assertEqual(event.rows[0]["values"]["test2"], None) - def test_time(self): create_query = "CREATE TABLE test (test1 TIME, test2 TIME);" insert_query = "INSERT INTO test VALUES('838:59:59', '-838:59:59')" @@ -420,8 +342,6 @@ def test_time(self): ) def test_time2(self): - if not self.isMySQL56AndMore(): - self.skipTest("Not supported in this version of MySQL") create_query = "CREATE TABLE test (test1 TIME(6), test2 TIME(6));" insert_query = """ INSERT INTO test VALUES('838:59:59.000000', '-838:59:59.000000'); @@ -460,38 +380,7 @@ def test_datetime(self): datetime.datetime(1984, 12, 3, 12, 33, 7), ) - def test_zero_datetime(self): - if not self.isMySQL57(): - self.skipTest( - "Not supported in this version of MySQL 8" - ) # pymysql.err.OperationalError Invalid default value for 'test' - self.set_sql_mode() - create_query = ( - "CREATE TABLE test (id INTEGER, test DATETIME NOT NULL DEFAULT 0);" - ) - insert_query = "INSERT INTO test (id) VALUES(1)" - event = self.create_and_insert_value(create_query, insert_query) - if event.table_map[event.table_id].column_name_flag: - self.assertEqual(event.rows[0]["values"]["test"], None) - - def test_broken_datetime(self): - if not self.isMySQL57(): - self.skipTest( - "Not supported in this version of MySQL 8" - ) # pymysql.err.OperationalError Incorrect datetime value: '2013-00-00 00:00:00' for column 'test' - self.set_sql_mode() - create_query = "CREATE TABLE test (test DATETIME NOT NULL);" - insert_query = "INSERT INTO test VALUES('2013-00-00 00:00:00')" - event = self.create_and_insert_value(create_query, insert_query) - if event.table_map[event.table_id].column_name_flag: - self.assertEqual(event.rows[0]["values"]["test"], None) - def test_year(self): - if self.isMySQL57(): - # https://dev.mysql.com/doc/refman/5.7/en/migrating-to-year4.html - self.skipTest( - "YEAR(2) is unsupported in mysql 5.7" - ) # pymysql.err.OperationalError: (1818, 'Supports only YEAR or YEAR(4) column.') create_query = "CREATE TABLE test (a YEAR(4), b YEAR)" insert_query = "INSERT INTO test VALUES(1984, 1984)" event = self.create_and_insert_value(create_query, insert_query) @@ -776,10 +665,7 @@ def test_encoding_latin1(self): db["charset"] = "latin1" self.connect_conn_control(db) - if platform.python_version_tuple()[0] == "2": - string = unichr(233) - else: - string = "\u00e9" + string = "\u00e9" create_query = ( "CREATE TABLE test (test CHAR(12)) CHARACTER SET latin1 COLLATE latin1_bin;" @@ -790,10 +676,7 @@ def test_encoding_latin1(self): self.assertEqual(event.rows[0]["values"]["test"], string) def test_encoding_utf8(self): - if platform.python_version_tuple()[0] == "2": - string = unichr(0x20AC) - else: - string = "\u20ac" + string = "\u20ac" create_query = ( "CREATE TABLE test (test CHAR(12)) CHARACTER SET utf8 COLLATE utf8_bin;" @@ -805,7 +688,7 @@ def test_encoding_utf8(self): self.assertMultiLineEqual(event.rows[0]["values"]["test"], string) def test_partition_id(self): - if not self.isMySQL80AndMore(): + if not self.isMySQL8016AndMore(): self.skipTest("Not supported in this version of MySQL") create_query = "CREATE TABLE test (id INTEGER) \ PARTITION BY RANGE (id) ( \ @@ -962,15 +845,14 @@ def create_and_insert_value(self, create_query, insert_query): self.assertIsInstance(self.stream.fetchone(), TableMapEvent) event = self.stream.fetchone() - if self.isMySQL56AndMore(): - self.assertEqual(event.event_type, WRITE_ROWS_EVENT_V2) - else: - self.assertEqual(event.event_type, WRITE_ROWS_EVENT_V1) + + self.assertEqual(event.event_type, WRITE_ROWS_EVENT_V2) + self.assertIsInstance(event, WriteRowsEvent) return event def test_partition_id(self): - if not self.isMySQL80AndMore(): + if not self.isMySQL8016AndMore(): self.skipTest("Not supported in this version of MySQL") create_query = "CREATE TABLE test (id INTEGER) \ PARTITION BY RANGE (id) ( \