Skip to content

Commit bed09cb

Browse files
authored
Merge branch 'julien-duponchelle:main' into feature/format-description-event
2 parents 5570ebd + bedcad7 commit bed09cb

File tree

2 files changed

+48
-7
lines changed

2 files changed

+48
-7
lines changed

pymysqlreplication/row_event.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1004,14 +1004,17 @@ def _parsed_column_charset_by_default_charset(
10041004
column_type_detect_function,
10051005
):
10061006
column_charset = []
1007+
position = 0
10071008
for i in range(self.column_count):
10081009
column_type = self.columns[i].type
10091010
if not column_type_detect_function(column_type, dbms=self.dbms):
10101011
continue
1011-
elif i not in column_charset_collation.keys():
1012-
column_charset.append(default_charset_collation)
10131012
else:
1014-
column_charset.append(column_charset_collation[i])
1013+
if position not in column_charset_collation.keys():
1014+
column_charset.append(default_charset_collation)
1015+
else:
1016+
column_charset.append(column_charset_collation[position])
1017+
position += 1
10151018

10161019
return column_charset
10171020

pymysqlreplication/tests/test_basic.py

Lines changed: 42 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -420,6 +420,44 @@ def test_minimal_image_update_row_event(self):
420420
self.assertEqual(event.rows[0]["after_values"]["id"], None)
421421
self.assertEqual(event.rows[0]["after_values"]["data"], "World")
422422

423+
def test_default_charset_parsing(self):
424+
"""
425+
Here, we want the database to include the binary charset into
426+
the DEFAULT_CHARSET optional metadata block.
427+
Also, we are adding an int field and two text fields to force
428+
a difference in the index of the blob column in the table
429+
and in the list of columns that have charset.
430+
"""
431+
query = """CREATE TABLE test (
432+
id INT NOT NULL AUTO_INCREMENT,
433+
text1 VARCHAR(255) NOT NULL,
434+
text2 VARCHAR(255) NOT NULL,
435+
data LONGBLOB NOT NULL,
436+
PRIMARY KEY (id)
437+
) DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;"""
438+
self.execute(query)
439+
query = "INSERT INTO test (text1, text2, data) VALUES(%s, %s, %s)"
440+
self.execute_with_args(query, ("text", "text", b"data"))
441+
self.execute("COMMIT")
442+
443+
self.assertIsInstance(self.stream.fetchone(), RotateEvent)
444+
self.assertIsInstance(self.stream.fetchone(), FormatDescriptionEvent)
445+
# QueryEvent for the Create Table
446+
self.assertIsInstance(self.stream.fetchone(), QueryEvent)
447+
# QueryEvent for the BEGIN
448+
self.assertIsInstance(self.stream.fetchone(), QueryEvent)
449+
450+
event = self.stream.fetchone()
451+
self.assertIsInstance(event, TableMapEvent)
452+
if event.table_map[event.table_id].column_name_flag:
453+
columns = {c.name: c for c in event.columns}
454+
assert columns["text1"].character_set_name == "utf8"
455+
assert columns["text1"].collation_name.startswith("utf8")
456+
assert columns["text2"].character_set_name == "utf8"
457+
assert columns["text2"].collation_name.startswith("utf8")
458+
assert columns["data"].character_set_name == "binary"
459+
assert columns["data"].collation_name == "binary"
460+
423461
def test_log_pos(self):
424462
query = "CREATE TABLE test (id INT NOT NULL AUTO_INCREMENT, data VARCHAR (50) NOT NULL, PRIMARY KEY (id))"
425463
self.execute(query)
@@ -1909,7 +1947,7 @@ def setUp(self):
19091947
def test_json_partial_update(self):
19101948
create_query = "CREATE TABLE test_json_v2 (id INT, c JSON,PRIMARY KEY (id)) ;"
19111949
column_add_query = "ALTER TABLE test_json_v2 ADD COLUMN d JSON DEFAULT NULL, ADD COLUMN e JSON DEFAULT NULL;"
1912-
insert_query = """INSERT INTO test_json_v2 VALUES
1950+
insert_query = """INSERT INTO test_json_v2 VALUES
19131951
(101
19141952
,'{"a":"aaaaaaaaaaaaa", "c":"ccccccccccccccc", "ab":["abababababababa", "babababababab"]}'
19151953
,'{"a":"aaaaaaaaaaaaa", "c":"ccccccccccccccc", "ab":["abababababababa", "babababababab"]}'
@@ -1946,7 +1984,7 @@ def test_json_partial_update_column_value_none(self):
19461984
drop_table_if_exists_query = "DROP TABLE IF EXISTS test_json_v2;"
19471985
create_query = "CREATE TABLE test_json_v2 (id INT, c JSON,PRIMARY KEY (id)) ;"
19481986
column_add_query = "ALTER TABLE test_json_v2 ADD COLUMN d JSON DEFAULT NULL, ADD COLUMN e JSON DEFAULT NULL;"
1949-
insert_query = """INSERT INTO test_json_v2 VALUES
1987+
insert_query = """INSERT INTO test_json_v2 VALUES
19501988
(101
19511989
,'{"a":"aaaaaaaaaaaaa", "c":"ccccccccccccccc", "ab":["abababababababa", "babababababab"]}'
19521990
,'{"a":"aaaaaaaaaaaaa", "c":"ccccccccccccccc", "ab":["abababababababa", "babababababab"]}'
@@ -1984,7 +2022,7 @@ def test_json_partial_update_json_remove(self):
19842022
drop_table_if_exists_query = "DROP TABLE IF EXISTS test_json_v2;"
19852023
create_query = "CREATE TABLE test_json_v2 (id INT, c JSON,PRIMARY KEY (id)) ;"
19862024
column_add_query = "ALTER TABLE test_json_v2 ADD COLUMN d JSON DEFAULT NULL, ADD COLUMN e JSON DEFAULT NULL;"
1987-
insert_query = """INSERT INTO test_json_v2 VALUES
2025+
insert_query = """INSERT INTO test_json_v2 VALUES
19882026
(101
19892027
,'{"a":"aaaaaaaaaaaaa", "c":"ccccccccccccccc", "ab":["abababababababa", "babababababab"]}'
19902028
,'{"a":"aaaaaaaaaaaaa", "c":"ccccccccccccccc", "ab":["abababababababa", "babababababab"]}'
@@ -2024,7 +2062,7 @@ def test_json_partial_update_two_column(self):
20242062
drop_table_if_exists_query = "DROP TABLE IF EXISTS test_json_v2;"
20252063
create_query = "CREATE TABLE test_json_v2 (id INT, c JSON,PRIMARY KEY (id)) ;"
20262064
column_add_query = "ALTER TABLE test_json_v2 ADD COLUMN d JSON DEFAULT NULL, ADD COLUMN e JSON DEFAULT NULL;"
2027-
insert_query = """INSERT INTO test_json_v2 VALUES
2065+
insert_query = """INSERT INTO test_json_v2 VALUES
20282066
(101
20292067
,'{"a":"aaaaaaaaaaaaa", "c":"ccccccccccccccc", "ab":["abababababababa", "babababababab"]}'
20302068
,'{"a":"aaaaaaaaaaaaa", "c":"ccccccccccccccc", "ab":["abababababababa", "babababababab"]}'

0 commit comments

Comments
 (0)