Skip to content

Commit c83e2e6

Browse files
authored
Fixed json serialization (#15)
1 parent c3f6191 commit c83e2e6

File tree

2 files changed

+58
-1
lines changed

2 files changed

+58
-1
lines changed

mysql_ch_replicator/pymysqlreplication/packet.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -347,7 +347,7 @@ def read_binary_json(self, size, is_partial):
347347
# handle NULL value
348348
return None
349349
data = self.read(length)
350-
return cpp_mysql_to_json(data)
350+
return cpp_mysql_to_json(data).decode('utf-8')
351351

352352
#
353353
# if is_partial:

test_mysql_ch_replicator.py

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
import shutil
33
import time
44
import subprocess
5+
import json
56

67
from mysql_ch_replicator import config
78
from mysql_ch_replicator import mysql_api
@@ -646,3 +647,59 @@ def test_numeric_types_and_limits():
646647
assert_wait(lambda: len(ch.select(TEST_TABLE_NAME, 'test6=4294967290')) == 1)
647648
assert_wait(lambda: len(ch.select(TEST_TABLE_NAME, 'test6=4294967280')) == 1)
648649
assert_wait(lambda: len(ch.select(TEST_TABLE_NAME, 'test7=18446744073709551586')) == 2)
650+
651+
652+
def test_json():
653+
cfg = config.Settings()
654+
cfg.load(CONFIG_FILE)
655+
656+
mysql = mysql_api.MySQLApi(
657+
database=None,
658+
mysql_settings=cfg.mysql,
659+
)
660+
661+
ch = clickhouse_api.ClickhouseApi(
662+
database=TEST_DB_NAME,
663+
clickhouse_settings=cfg.clickhouse,
664+
)
665+
666+
prepare_env(cfg, mysql, ch)
667+
668+
mysql.execute("SET sql_mode = 'ALLOW_INVALID_DATES';")
669+
670+
mysql.execute(f'''
671+
CREATE TABLE {TEST_TABLE_NAME} (
672+
`id` int unsigned NOT NULL AUTO_INCREMENT,
673+
name varchar(255),
674+
data json,
675+
PRIMARY KEY (id)
676+
);
677+
''')
678+
679+
mysql.execute(
680+
f"INSERT INTO {TEST_TABLE_NAME} (name, data) VALUES " +
681+
"""('Ivan', '{"a": "b", "c": [1,2,3]}');""",
682+
commit=True,
683+
)
684+
685+
binlog_replicator_runner = BinlogReplicatorRunner()
686+
binlog_replicator_runner.run()
687+
db_replicator_runner = DbReplicatorRunner(TEST_DB_NAME)
688+
db_replicator_runner.run()
689+
690+
assert_wait(lambda: TEST_DB_NAME in ch.get_databases())
691+
692+
ch.execute_command(f'USE {TEST_DB_NAME}')
693+
694+
assert_wait(lambda: TEST_TABLE_NAME in ch.get_tables())
695+
assert_wait(lambda: len(ch.select(TEST_TABLE_NAME)) == 1)
696+
697+
mysql.execute(
698+
f"INSERT INTO {TEST_TABLE_NAME} (name, data) VALUES " +
699+
"""('Peter', '{"b": "b", "c": [3,2,1]}');""",
700+
commit=True,
701+
)
702+
assert_wait(lambda: len(ch.select(TEST_TABLE_NAME)) == 2)
703+
704+
assert json.loads(ch.select(TEST_TABLE_NAME, "name='Ivan'")[0]['data'])['c'] == [1, 2, 3]
705+
assert json.loads(ch.select(TEST_TABLE_NAME, "name='Peter'")[0]['data'])['c'] == [3, 2, 1]

0 commit comments

Comments
 (0)