diff --git a/parse/src/main/java/com/alibaba/otter/canal/parse/inbound/mysql/tsdb/MemoryTableMeta.java b/parse/src/main/java/com/alibaba/otter/canal/parse/inbound/mysql/tsdb/MemoryTableMeta.java index 3fd4d112..6f838b49 100644 --- a/parse/src/main/java/com/alibaba/otter/canal/parse/inbound/mysql/tsdb/MemoryTableMeta.java +++ b/parse/src/main/java/com/alibaba/otter/canal/parse/inbound/mysql/tsdb/MemoryTableMeta.java @@ -81,7 +81,8 @@ public class MemoryTableMeta implements TableMetaTSDB { && !StringUtils.startsWithIgnoreCase(StringUtils.trim(ddl), "alter user") && !StringUtils.startsWithIgnoreCase(StringUtils.trim(ddl), "drop user") && !StringUtils.startsWithIgnoreCase(StringUtils.trim(ddl), "create database")) { - repository.console(ddl); + String sql = trimSimpleComment(ddl); + repository.console(sql); } } catch (Throwable e) { logger.warn("parse faield : " + ddl, e); @@ -97,6 +98,38 @@ public class MemoryTableMeta implements TableMetaTSDB { return true; } + /** + * 过滤简单的行与块注释(--或# 开始的行 /*开始与*\/结束的块) + * + * @param sql + * @return + */ + private String trimSimpleComment(String sql) { + String[] sqls = sql.split("\n"); + if (sqls.length == 1) return sql; + + boolean isCommentBlock = false; + StringBuilder sb = new StringBuilder(sql.length()); + for (String psql : sqls) { + if (psql.startsWith("--") || psql.startsWith("#")) { + continue; + } else if (psql.trim().length() == 0) { + sb.append("\n"); + } + if (!isCommentBlock && !psql.trim().startsWith("/*") && !psql.trim().endsWith("*/")) { + sb.append(psql).append("\n"); + continue; + } + if (!isCommentBlock && psql.trim().startsWith("/*")) { + isCommentBlock = true; + } + if (isCommentBlock && psql.trim().endsWith("*/")) { + isCommentBlock = false; + } + } + return sb.toString(); + } + @Override public TableMeta find(String schema, String table) { List keys = Arrays.asList(schema, table);