From 21abbbfe4754ea56a05fa8adab291f6d5a964d83 Mon Sep 17 00:00:00 2001 From: agapple Date: Tue, 5 May 2015 10:52:56 +0800 Subject: [PATCH] fixed issue #116 , process create index bug --- .../canal/parse/inbound/mysql/dbsync/SimpleDdlParser.java | 6 +++--- .../canal/parse/inbound/mysql/SimpleDdlParserTest.java | 7 +++---- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/parse/src/main/java/com/alibaba/otter/canal/parse/inbound/mysql/dbsync/SimpleDdlParser.java b/parse/src/main/java/com/alibaba/otter/canal/parse/inbound/mysql/dbsync/SimpleDdlParser.java index 379aceab..bb902ef2 100644 --- a/parse/src/main/java/com/alibaba/otter/canal/parse/inbound/mysql/dbsync/SimpleDdlParser.java +++ b/parse/src/main/java/com/alibaba/otter/canal/parse/inbound/mysql/dbsync/SimpleDdlParser.java @@ -27,7 +27,7 @@ public class SimpleDdlParser { public static final String DROP_PATTERN = "^\\s*DROP\\s*(TEMPORARY)?\\s*TABLE\\s*(.*)$"; public static final String ALERT_PATTERN = "^\\s*ALTER\\s*(IGNORE)?\\s*TABLE\\s*(.*)$"; public static final String TRUNCATE_PATTERN = "^\\s*TRUNCATE\\s*(TABLE)?\\s*(.*)$"; - public static final String TABLE_PATTERN = "^(IF\\s*NOT\\s*EXISTS\\s*)?(IF\\s*EXISTS\\s*)?(`?.+?`?[;\\(\\s]+?)?.*$"; // 采用非贪婪模式 + public static final String TABLE_PATTERN = "^(IF\\s*NOT\\s*EXISTS\\s*)?(IF\\s*EXISTS\\s*)?(`?.+?`?[;\\(\\s]+?)?.*$"; // 采用非贪婪模式 public static final String INSERT_PATTERN = "^\\s*(INSERT|MERGE|REPLACE)(.*)$"; public static final String UPDATE_PATTERN = "^\\s*UPDATE(.*)$"; public static final String DELETE_PATTERN = "^\\s*DELETE(.*)$"; @@ -42,7 +42,7 @@ public class SimpleDdlParser { * http://dev.mysql.com/doc/refman/5.6/en/create-index.html * */ - public static final String CREATE_INDEX_PATTERN = "^\\s*CREATE\\s*.*?\\s*INDEX\\s*(.*?)\\s*ON\\s*(.*?)$"; + public static final String CREATE_INDEX_PATTERN = "^\\s*CREATE\\s*(UNIQUE)?(FULLTEXT)?(SPATIAL)?\\s*INDEX\\s*(.*?)\\s*ON\\s*(.*?)$"; public static final String DROP_INDEX_PATTERN = "^\\s*DROP\\s*INDEX\\s*(.*?)\\s*ON\\s*(.*?)$"; public static DdlResult parse(String queryString, String schmeaName) { @@ -77,7 +77,7 @@ public class SimpleDdlParser { return result; } - result = parseDdl(queryString, schmeaName, CREATE_INDEX_PATTERN, 2); + result = parseDdl(queryString, schmeaName, CREATE_INDEX_PATTERN, 5); if (result != null) { result.setType(EventType.CINDEX); return result; diff --git a/parse/src/test/java/com/alibaba/otter/canal/parse/inbound/mysql/SimpleDdlParserTest.java b/parse/src/test/java/com/alibaba/otter/canal/parse/inbound/mysql/SimpleDdlParserTest.java index 32f636a4..c198d267 100644 --- a/parse/src/test/java/com/alibaba/otter/canal/parse/inbound/mysql/SimpleDdlParserTest.java +++ b/parse/src/test/java/com/alibaba/otter/canal/parse/inbound/mysql/SimpleDdlParserTest.java @@ -5,6 +5,7 @@ import org.junit.Test; import com.alibaba.otter.canal.parse.inbound.mysql.dbsync.SimpleDdlParser; import com.alibaba.otter.canal.parse.inbound.mysql.dbsync.SimpleDdlParser.DdlResult; +import com.alibaba.otter.canal.protocol.CanalEntry.EventType; public class SimpleDdlParserTest { @@ -52,11 +53,9 @@ public class SimpleDdlParserTest { Assert.assertEquals("bak591", result.getSchemaName()); Assert.assertEquals("j_order_log_back_201309", result.getTableName()); - queryString = "CREATE TABLE `bak591`.`cm_settle_incash` ( `batch_id` bigint(20) NOT NULL DEFAULT '0.00'"; + queryString = "CREATE DEFINER=sco*erce@% PROCEDURE SC_CPN_CODES_SAVE_ACTION(IN cosmosPassportId CHAR(32), IN orderId CHAR(32), IN codeIds TEXT) BEGIN SET @orderId = orderId; SET @timeNow = NOW(); START TRANSACTION; DELETE FROMsc_ord_couponWHEREORDER_ID= @orderId; SET @i=1; SET @numbers = FN_GET_ELEMENTS_COUNT(codeIds, '|'); WHILE @i <= @numbers DO SET @codeId = FN_FIND_ELEMENT_BYINDEX(codeIds, '|', @i); SET @orderCodeId = UUID32(); INSERT INTOsc_ord_coupon(ID,CREATE_BY,CREATE_TIME,UPDATE_BY,UPDATE_TIME,ORDER_ID,CODE_ID`) VALUES(@orderCodeId, cosmosPassportId, @timeNow, cosmosPassportId, @timeNow, @orderId, @codeId); SET @i = @i + 1; END WHILE; COMMIT; END"; result = SimpleDdlParser.parse(queryString, "bak"); - Assert.assertNotNull(result); - Assert.assertEquals("bak591", result.getSchemaName()); - Assert.assertEquals("cm_settle_incash", result.getTableName()); + Assert.assertEquals(EventType.QUERY, result.getType()); } @Test