1313from mysql_ch_replicator import config
1414from mysql_ch_replicator import mysql_api
1515from mysql_ch_replicator import clickhouse_api
16- from mysql_ch_replicator .binlog_replicator import State as BinlogState , FileReader , EventType
16+ from mysql_ch_replicator .binlog_replicator import State as BinlogState , FileReader , EventType , BinlogReplicator
1717from mysql_ch_replicator .db_replicator import State as DbReplicatorState , DbReplicator
1818from mysql_ch_replicator .converter import MysqlToClickhouseConverter
1919
@@ -69,14 +69,16 @@ def prepare_env(
6969 cfg : config .Settings ,
7070 mysql : mysql_api .MySQLApi ,
7171 ch : clickhouse_api .ClickhouseApi ,
72- db_name : str = TEST_DB_NAME
72+ db_name : str = TEST_DB_NAME ,
73+ set_mysql_db : bool = True
7374):
7475 if os .path .exists (cfg .binlog_replicator .data_dir ):
7576 shutil .rmtree (cfg .binlog_replicator .data_dir )
7677 os .mkdir (cfg .binlog_replicator .data_dir )
7778 mysql .drop_database (db_name )
7879 mysql .create_database (db_name )
79- mysql .set_database (db_name )
80+ if set_mysql_db :
81+ mysql .set_database (db_name )
8082 ch .drop_database (db_name )
8183 assert_wait (lambda : db_name not in ch .get_databases ())
8284
@@ -784,7 +786,7 @@ def _get_last_insert_name():
784786 f"INSERT INTO `{ TEST_TABLE_NAME } ` (name, age) "
785787 f"VALUES ('TEST_VALUE_{ i } _{ base_value } ', { i } );" , commit = i % 20 == 0 ,
786788 )
787-
789+ #`replication-test_db`
788790 mysql .execute (f"INSERT INTO `{ TEST_TABLE_NAME } ` (name, age) VALUES ('TEST_VALUE_FINAL', 0);" , commit = True )
789791
790792 print ("running db_replicator" )
@@ -823,12 +825,12 @@ def test_different_types_1():
823825 clickhouse_settings = cfg .clickhouse ,
824826 )
825827
826- prepare_env (cfg , mysql , ch )
828+ prepare_env (cfg , mysql , ch , set_mysql_db = False )
827829
828830 mysql .execute ("SET sql_mode = 'ALLOW_INVALID_DATES';" )
829831
830832 mysql .execute (f'''
831- CREATE TABLE `{ TEST_TABLE_NAME } ` (
833+ CREATE TABLE `{ TEST_DB_NAME } `.` { TEST_TABLE_NAME } ` (
832834 `id` int unsigned NOT NULL AUTO_INCREMENT,
833835 name varchar(255),
834836 `employee` int unsigned NOT NULL,
@@ -866,7 +868,7 @@ def test_different_types_1():
866868 ''' )
867869
868870 mysql .execute (
869- f"INSERT INTO `{ TEST_TABLE_NAME } ` (name, modified_date) VALUES ('Ivan', '0000-00-00 00:00:00');" ,
871+ f"INSERT INTO `{ TEST_DB_NAME } `.` { TEST_TABLE_NAME } ` (name, modified_date) VALUES ('Ivan', '0000-00-00 00:00:00');" ,
870872 commit = True ,
871873 )
872874
@@ -883,15 +885,30 @@ def test_different_types_1():
883885 assert_wait (lambda : len (ch .select (TEST_TABLE_NAME )) == 1 )
884886
885887 mysql .execute (
886- f"INSERT INTO `{ TEST_TABLE_NAME } ` (name, modified_date) VALUES ('Alex', '0000-00-00 00:00:00');" ,
888+ f"INSERT INTO `{ TEST_DB_NAME } `.` { TEST_TABLE_NAME } ` (name, modified_date) VALUES ('Alex', '0000-00-00 00:00:00');" ,
887889 commit = True ,
888890 )
889891 mysql .execute (
890- f"INSERT INTO `{ TEST_TABLE_NAME } ` (name, modified_date) VALUES ('Givi', '2023-01-08 03:11:09');" ,
892+ f"INSERT INTO `{ TEST_DB_NAME } `.` { TEST_TABLE_NAME } ` (name, modified_date) VALUES ('Givi', '2023-01-08 03:11:09');" ,
891893 commit = True ,
892894 )
893895 assert_wait (lambda : len (ch .select (TEST_TABLE_NAME )) == 3 )
894896
897+ mysql .execute (f'''
898+ CREATE TABLE `{ TEST_DB_NAME } `.`{ TEST_TABLE_NAME_2 } ` (
899+ `id` int unsigned NOT NULL AUTO_INCREMENT,
900+ name varchar(255),
901+ PRIMARY KEY (id)
902+ );
903+ ''' )
904+
905+ mysql .execute (
906+ f"INSERT INTO `{ TEST_DB_NAME } `.`{ TEST_TABLE_NAME_2 } ` (name) VALUES ('Ivan');" ,
907+ commit = True ,
908+ )
909+
910+ assert_wait (lambda : TEST_TABLE_NAME_2 in ch .get_tables ())
911+
895912 db_replicator_runner .stop ()
896913 binlog_replicator_runner .stop ()
897914
@@ -1535,3 +1552,42 @@ def test_alter_tokens_split():
15351552 print ("Match? " , result == expected )
15361553 print ("-" * 60 )
15371554 assert result == expected
1555+
1556+
1557+ @pytest .mark .parametrize ("query,expected" , [
1558+ ("CREATE TABLE `mydb`.`mytable` (id INT)" , "mydb" ),
1559+ ("CREATE TABLE mydb.mytable (id INT)" , "mydb" ),
1560+ ("ALTER TABLE `mydb`.mytable ADD COLUMN name VARCHAR(50)" , "mydb" ),
1561+ ("CREATE TABLE IF NOT EXISTS mydb.mytable (id INT)" , "mydb" ),
1562+ ("CREATE TABLE mytable (id INT)" , "" ),
1563+ (" CREATE TABLE `mydb` . `mytable` \n ( id INT )" , "mydb" ),
1564+ ('ALTER TABLE "testdb"."tablename" ADD COLUMN flag BOOLEAN' , "testdb" ),
1565+ ("create table mydb.mytable (id int)" , "mydb" ),
1566+ ("DROP DATABASE mydb" , "" ),
1567+ ("CREATE TABLE mydbmytable (id int)" , "" ), # missing dot between DB and table
1568+ ("""
1569+ CREATE TABLE IF NOT EXISTS
1570+ `multidb`
1571+ .
1572+ `multitable`
1573+ (
1574+ id INT,
1575+ name VARCHAR(100)
1576+ )
1577+ """ , "multidb" ),
1578+ ("""
1579+ ALTER TABLE
1580+ `justtable`
1581+ ADD COLUMN age INT;
1582+ """ , "" ),
1583+ ("""
1584+ CREATE TABLE `replication-test_db`.`test_table_2` (
1585+ `id` int unsigned NOT NULL AUTO_INCREMENT,
1586+ name varchar(255),
1587+ PRIMARY KEY (id)
1588+ )
1589+ """ , "replication-test_db" ),
1590+ ("BEGIN" , "" ),
1591+ ])
1592+ def test_parse_db_name_from_query (query , expected ):
1593+ assert BinlogReplicator ._try_parse_db_name_from_query (query ) == expected
0 commit comments