|
2 | 2 | import shutil |
3 | 3 | import time |
4 | 4 | import subprocess |
| 5 | +import json |
5 | 6 |
|
6 | 7 | from mysql_ch_replicator import config |
7 | 8 | from mysql_ch_replicator import mysql_api |
@@ -646,3 +647,59 @@ def test_numeric_types_and_limits(): |
646 | 647 | assert_wait(lambda: len(ch.select(TEST_TABLE_NAME, 'test6=4294967290')) == 1) |
647 | 648 | assert_wait(lambda: len(ch.select(TEST_TABLE_NAME, 'test6=4294967280')) == 1) |
648 | 649 | 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