@@ -1091,6 +1091,138 @@ void testTransformWildcardSuffixWithSchemaEvolution() throws Exception {
10911091 "DataChangeEvent{tableId=%s.TABLEALPHA, before=[], after=[3010 <- id, Beginning, 3010, 10, 10, 97, Lemon], op=INSERT, meta=()}" );
10921092 }
10931093
1094+ private static final String [] UNICODE_STRINGS = {
1095+ "ascii test!?" ,
1096+ "大五" ,
1097+ "测试数据" ,
1098+ "ひびぴ" ,
1099+ "죠주쥬" ,
1100+ "ÀÆÉ" ,
1101+ "ÓÔŐÖ" ,
1102+ "αβγδε" ,
1103+ "בבקשה" ,
1104+ "твой" ,
1105+ "ภาษาไทย" ,
1106+ "piedzimst brīvi"
1107+ };
1108+
1109+ @ Test
1110+ void testTransformWithUnicodeLiterals () throws Exception {
1111+ StringBuilder projectionExpression = new StringBuilder ("\\ *," );
1112+ for (int i = 0 ; i < UNICODE_STRINGS .length ; i ++) {
1113+ projectionExpression
1114+ .append ('\'' )
1115+ .append (UNICODE_STRINGS [i ])
1116+ .append ('\'' )
1117+ .append (" AS col_" )
1118+ .append (i )
1119+ .append ("," );
1120+ }
1121+ projectionExpression .deleteCharAt (projectionExpression .length () - 1 );
1122+
1123+ String pipelineJob =
1124+ String .format (
1125+ "source:\n "
1126+ + " type: mysql\n "
1127+ + " hostname: %s\n "
1128+ + " port: 3306\n "
1129+ + " username: %s\n "
1130+ + " password: %s\n "
1131+ + " tables: %s.TABLEALPHA\n "
1132+ + " server-id: 5400-5404\n "
1133+ + " server-time-zone: UTC\n "
1134+ + "sink:\n "
1135+ + " type: values\n "
1136+ + "transform:\n "
1137+ + " - source-table: %s.\\ .*\n "
1138+ + " projection: %s\n "
1139+ + " filter: ID > 1008\n "
1140+ + "pipeline:\n "
1141+ + " parallelism: %d\n "
1142+ + " schema.change.behavior: evolve" ,
1143+ INTER_CONTAINER_MYSQL_ALIAS ,
1144+ MYSQL_TEST_USER ,
1145+ MYSQL_TEST_PASSWORD ,
1146+ transformTestDatabase .getDatabaseName (),
1147+ transformTestDatabase .getDatabaseName (),
1148+ projectionExpression ,
1149+ parallelism );
1150+ submitPipelineJob (pipelineJob );
1151+ waitUntilJobRunning (Duration .ofSeconds (30 ));
1152+ LOG .info ("Pipeline job is running" );
1153+
1154+ validateResult (
1155+ dbNameFormatter ,
1156+ "CreateTableEvent{tableId=%s.TABLEALPHA, schema=columns={`ID` INT NOT NULL,`VERSION` VARCHAR(17),`PRICEALPHA` INT,`AGEALPHA` INT,`NAMEALPHA` VARCHAR(128),`col_0` STRING,`col_1` STRING,`col_2` STRING,`col_3` STRING,`col_4` STRING,`col_5` STRING,`col_6` STRING,`col_7` STRING,`col_8` STRING,`col_9` STRING,`col_10` STRING,`col_11` STRING}, primaryKeys=ID, options=()}" ,
1157+ "DataChangeEvent{tableId=%s.TABLEALPHA, before=[], after=[1010, 10, 99, 19, Carol, ascii test!?, 大五, 测试数据, ひびぴ, 죠주쥬, ÀÆÉ, ÓÔŐÖ, αβγδε, בבקשה, твой, ภาษาไทย, piedzimst brīvi], op=INSERT, meta=()}" ,
1158+ "DataChangeEvent{tableId=%s.TABLEALPHA, before=[], after=[1009, 8.1, 0, 18, Bob, ascii test!?, 大五, 测试数据, ひびぴ, 죠주쥬, ÀÆÉ, ÓÔŐÖ, αβγδε, בבקשה, твой, ภาษาไทย, piedzimst brīvi], op=INSERT, meta=()}" ,
1159+ "DataChangeEvent{tableId=%s.TABLEALPHA, before=[], after=[1011, 11, 59, 20, Dave, ascii test!?, 大五, 测试数据, ひびぴ, 죠주쥬, ÀÆÉ, ÓÔŐÖ, αβγδε, בבקשה, твой, ภาษาไทย, piedzimst brīvi], op=INSERT, meta=()}" );
1160+
1161+ LOG .info ("Begin incremental reading stage." );
1162+ // generate binlogs
1163+ String mysqlJdbcUrl =
1164+ String .format (
1165+ "jdbc:mysql://%s:%s/%s" ,
1166+ MYSQL .getHost (),
1167+ MYSQL .getDatabasePort (),
1168+ transformTestDatabase .getDatabaseName ());
1169+ try (Connection conn =
1170+ DriverManager .getConnection (
1171+ mysqlJdbcUrl , MYSQL_TEST_USER , MYSQL_TEST_PASSWORD );
1172+ Statement stat = conn .createStatement ()) {
1173+ stat .execute ("UPDATE TABLEALPHA SET VERSION='100' WHERE id=1009;" );
1174+ stat .execute ("INSERT INTO TABLEALPHA VALUES (3007, '7', 79, 16, 'IINA');" );
1175+ stat .execute ("DELETE FROM TABLEBETA WHERE id=2011;" );
1176+ } catch (SQLException e ) {
1177+ LOG .error ("Update table for CDC failed." , e );
1178+ throw e ;
1179+ }
1180+
1181+ validateResult (
1182+ dbNameFormatter ,
1183+ "DataChangeEvent{tableId=%s.TABLEALPHA, before=[1009, 8.1, 0, 18, Bob, ascii test!?, 大五, 测试数据, ひびぴ, 죠주쥬, ÀÆÉ, ÓÔŐÖ, αβγδε, בבקשה, твой, ภาษาไทย, piedzimst brīvi], after=[1009, 100, 0, 18, Bob, ascii test!?, 大五, 测试数据, ひびぴ, 죠주쥬, ÀÆÉ, ÓÔŐÖ, αβγδε, בבקשה, твой, ภาษาไทย, piedzimst brīvi], op=UPDATE, meta=()}" ,
1184+ "DataChangeEvent{tableId=%s.TABLEALPHA, before=[], after=[3007, 7, 79, 16, IINA, ascii test!?, 大五, 测试数据, ひびぴ, 죠주쥬, ÀÆÉ, ÓÔŐÖ, αβγδε, בבקשה, твой, ภาษาไทย, piedzimst brīvi], op=INSERT, meta=()}" );
1185+
1186+ LOG .info ("Start schema evolution." );
1187+ try (Connection conn =
1188+ DriverManager .getConnection (
1189+ mysqlJdbcUrl , MYSQL_TEST_USER , MYSQL_TEST_PASSWORD );
1190+ Statement stmt = conn .createStatement ()) {
1191+
1192+ // triggers AddColumnEvent
1193+ stmt .execute ("ALTER TABLE TABLEALPHA ADD COLUMN CODENAME TINYINT AFTER VERSION;" );
1194+ stmt .execute ("ALTER TABLE TABLEALPHA ADD COLUMN FIRST VARCHAR(17) FIRST;" );
1195+ stmt .execute ("INSERT INTO TABLEALPHA VALUES ('First', 3008, '8', 8, 80, 17, 'Jazz');" );
1196+
1197+ // triggers AlterColumnTypeEvent and RenameColumnEvent
1198+ stmt .execute ("ALTER TABLE TABLEALPHA CHANGE COLUMN CODENAME CODE_NAME DOUBLE;" );
1199+
1200+ // triggers RenameColumnEvent
1201+ stmt .execute ("ALTER TABLE TABLEALPHA RENAME COLUMN CODE_NAME TO CODE_NAME_EX;" );
1202+ stmt .execute ("INSERT INTO TABLEALPHA VALUES ('1st', 3009, '9', 9, 90, 18, 'Keka');" );
1203+
1204+ // triggers DropColumnEvent
1205+ stmt .execute ("ALTER TABLE TABLEALPHA DROP COLUMN CODE_NAME_EX" );
1206+ stmt .execute (
1207+ "INSERT INTO TABLEALPHA VALUES ('Beginning', 3010, '10', 10, 97, 'Lemon');" );
1208+ } catch (SQLException e ) {
1209+ LOG .error ("Update table for CDC failed." , e );
1210+ throw e ;
1211+ }
1212+
1213+ validateResult (
1214+ dbNameFormatter ,
1215+ "AddColumnEvent{tableId=%s.TABLEALPHA, addedColumns=[ColumnWithPosition{column=`CODENAME` TINYINT, position=AFTER, existedColumnName=VERSION}]}" ,
1216+ "AddColumnEvent{tableId=%s.TABLEALPHA, addedColumns=[ColumnWithPosition{column=`FIRST` VARCHAR(17), position=BEFORE, existedColumnName=ID}]}" ,
1217+ "DataChangeEvent{tableId=%s.TABLEALPHA, before=[], after=[First, 3008, 8, 8, 80, 17, Jazz, ascii test!?, 大五, 测试数据, ひびぴ, 죠주쥬, ÀÆÉ, ÓÔŐÖ, αβγδε, בבקשה, твой, ภาษาไทย, piedzimst brīvi], op=INSERT, meta=()}" ,
1218+ "AlterColumnTypeEvent{tableId=%s.TABLEALPHA, typeMapping={CODENAME=DOUBLE}, oldTypeMapping={CODENAME=TINYINT}}" ,
1219+ "RenameColumnEvent{tableId=%s.TABLEALPHA, nameMapping={CODENAME=CODE_NAME}}" ,
1220+ "RenameColumnEvent{tableId=%s.TABLEALPHA, nameMapping={CODE_NAME=CODE_NAME_EX}}" ,
1221+ "DataChangeEvent{tableId=%s.TABLEALPHA, before=[], after=[1st, 3009, 9, 9.0, 90, 18, Keka, ascii test!?, 大五, 测试数据, ひびぴ, 죠주쥬, ÀÆÉ, ÓÔŐÖ, αβγδε, בבקשה, твой, ภาษาไทย, piedzimst brīvi], op=INSERT, meta=()}" ,
1222+ "DropColumnEvent{tableId=%s.TABLEALPHA, droppedColumnNames=[CODE_NAME_EX]}" ,
1223+ "DataChangeEvent{tableId=%s.TABLEALPHA, before=[], after=[Beginning, 3010, 10, 10, 97, Lemon, ascii test!?, 大五, 测试数据, ひびぴ, 죠주쥬, ÀÆÉ, ÓÔŐÖ, αβγδε, בבקשה, твой, ภาษาไทย, piedzimst brīvi], op=INSERT, meta=()}" );
1224+ }
1225+
10941226 private void validateEventsWithPattern (String ... patterns ) throws Exception {
10951227 for (String pattern : patterns ) {
10961228 waitUntilSpecificEventWithPattern (
0 commit comments