From a7a70bfbd68a508ceb7828be4721309188eea0c2 Mon Sep 17 00:00:00 2001 From: Filipp Ozinov Date: Wed, 20 Nov 2024 23:17:56 +0400 Subject: [PATCH] Support for bit(1) type, #31 --- mysql_ch_replicator/converter.py | 2 ++ test_mysql_ch_replicator.py | 53 ++++++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+) diff --git a/mysql_ch_replicator/converter.py b/mysql_ch_replicator/converter.py index 8a6d638..95eb5c7 100644 --- a/mysql_ch_replicator/converter.py +++ b/mysql_ch_replicator/converter.py @@ -89,6 +89,8 @@ def convert_type(self, mysql_type, parameters): return 'Date32' if mysql_type == 'tinyint(1)': return 'Bool' + if mysql_type == 'bit(1)': + return 'Bool' if mysql_type == 'bool': return 'Bool' if 'smallint' in mysql_type: diff --git a/test_mysql_ch_replicator.py b/test_mysql_ch_replicator.py index ac871af..da31971 100644 --- a/test_mysql_ch_replicator.py +++ b/test_mysql_ch_replicator.py @@ -694,6 +694,59 @@ def test_numeric_types_and_limits(): assert_wait(lambda: len(ch.select(TEST_TABLE_NAME, 'test7=18446744073709551586')) == 2) +def test_different_types_2(): + cfg = config.Settings() + cfg.load(CONFIG_FILE) + + mysql = mysql_api.MySQLApi( + database=None, + mysql_settings=cfg.mysql, + ) + + ch = clickhouse_api.ClickhouseApi( + database=TEST_DB_NAME, + clickhouse_settings=cfg.clickhouse, + ) + + prepare_env(cfg, mysql, ch) + + mysql.execute("SET sql_mode = 'ALLOW_INVALID_DATES';") + + mysql.execute(f''' +CREATE TABLE {TEST_TABLE_NAME} ( + `id` int unsigned NOT NULL AUTO_INCREMENT, + test1 bit(1), + PRIMARY KEY (id) +); + ''') + + mysql.execute( + f"INSERT INTO {TEST_TABLE_NAME} (test1) VALUES " + f"(0);", + commit=True, + ) + + binlog_replicator_runner = BinlogReplicatorRunner() + binlog_replicator_runner.run() + db_replicator_runner = DbReplicatorRunner(TEST_DB_NAME) + db_replicator_runner.run() + + assert_wait(lambda: TEST_DB_NAME in ch.get_databases()) + + ch.execute_command(f'USE {TEST_DB_NAME}') + + assert_wait(lambda: TEST_TABLE_NAME in ch.get_tables()) + assert_wait(lambda: len(ch.select(TEST_TABLE_NAME)) == 1) + + mysql.execute( + f"INSERT INTO {TEST_TABLE_NAME} (test1) VALUES " + f"(1);", + commit=True, + ) + assert_wait(lambda: len(ch.select(TEST_TABLE_NAME)) == 2) + assert_wait(lambda: len(ch.select(TEST_TABLE_NAME, 'test1=True')) == 1) + + def test_json(): cfg = config.Settings() cfg.load(CONFIG_FILE)