Skip to content

Commit 1413cc9

Browse files
committed
fixed issue #4899 , druid SchemaRepository support quota
1 parent 04c11ec commit 1413cc9

File tree

3 files changed

+93
-2
lines changed

3 files changed

+93
-2
lines changed

parse/src/main/java/com/alibaba/otter/canal/parse/inbound/mysql/tsdb/MemoryTableMeta.java

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@
66
import java.util.Map;
77
import java.util.concurrent.ConcurrentHashMap;
88

9+
import com.alibaba.druid.DbType;
10+
import com.alibaba.druid.sql.SQLUtils;
11+
import com.alibaba.druid.sql.visitor.SQLASTOutputVisitor;
12+
import com.alibaba.druid.sql.visitor.VisitorFeature;
913
import org.apache.commons.lang.StringUtils;
1014
import org.slf4j.Logger;
1115
import org.slf4j.LoggerFactory;
@@ -149,7 +153,14 @@ public Map<String, String> snapshot() {
149153
StringBuilder data = new StringBuilder(4 * 1024);
150154
for (String table : schema.showTables()) {
151155
SchemaObject schemaObject = schema.findTable(table);
152-
schemaObject.getStatement().output(data);
156+
// fixed issue #4899
157+
// snapshot输出的DDL语句未正确处理mysql keyword
158+
// 导致canal重启回滚时会出现ddl解析失败的问题
159+
// schemaObject.getStatement().output(data);
160+
SQLASTOutputVisitor visitor = SQLUtils.createOutputVisitor(data, DbType.mysql);
161+
visitor.config(VisitorFeature.OutputNameQuote, true);
162+
schemaObject.getStatement().accept(visitor);
163+
153164
data.append("; \n");
154165
}
155166
schemaDdls.put(schema.getName(), data.toString());

parse/src/test/java/com/alibaba/otter/canal/parse/inbound/mysql/tsdb/FastsqlSchemaTest.java

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,13 @@
33
import org.junit.Assert;
44
import org.junit.Test;
55

6+
import com.alibaba.druid.DbType;
7+
import com.alibaba.druid.sql.SQLUtils;
8+
import com.alibaba.druid.sql.repository.Schema;
69
import com.alibaba.druid.sql.repository.SchemaObject;
710
import com.alibaba.druid.sql.repository.SchemaRepository;
11+
import com.alibaba.druid.sql.visitor.SQLASTOutputVisitor;
12+
import com.alibaba.druid.sql.visitor.VisitorFeature;
813
import com.alibaba.druid.util.JdbcConstants;
914

1015
public class FastsqlSchemaTest {
@@ -184,5 +189,80 @@ public void test_polardb_x() throws Throwable {
184189
repository.console(sql4);
185190
table = repository.findTable("test4");
186191
Assert.assertTrue(table != null);
192+
193+
String sql5 = "CREATE TABLE `test5` (\n" + "\t`Id` varchar(32) NOT NULL COMMENT '',\n"
194+
+ "\t`ExitId` varchar(32) NOT NULL COMMENT '',\n"
195+
+ "\t`CreateTime` datetime NOT NULL COMMENT '创建时间',\n"
196+
+ "\t`archive_date` datetime NOT NULL DEFAULT '2099-01-01 00:00:00',\n"
197+
+ "\tPRIMARY KEY (`Id`, `archive_date`),\n"
198+
+ "\tGLOBAL INDEX `g_i_id` (`id`) COVERING (`ExitId`) \n" + "\t\tPARTITION BY KEY(`Id`)\n"
199+
+ "\t\tPARTITIONS 16,\n" + "\tKEY `ExitId` USING BTREE (`ExitId`),\n"
200+
+ "\tKEY `CreateTime` (`CreateTime`),\n" + "\tKEY `i_id_ExitId` USING BTREE (`Id`, `ExitId`),\n"
201+
+ "\tKEY `auto_shard_key_ExitId_id` USING BTREE (`ExitId`, `Id`)\n"
202+
+ ") ENGINE = InnoDB DEFAULT CHARSET = utf8\n" + "PARTITION BY KEY(`ExitId`,`Id`)\n"
203+
+ "PARTITIONS 16\n" + "LOCAL PARTITION BY RANGE (archive_date)\n" + "INTERVAL 1 MONTH\n"
204+
+ "EXPIRE AFTER 27\n" + "PRE ALLOCATE 2\n" + "PIVOTDATE NOW()";
205+
repository.console(sql5);
206+
table = repository.findTable("test5");
207+
Assert.assertTrue(table != null);
187208
}
209+
210+
@Test
211+
public void test_escapse_sql() {
212+
SchemaRepository repository = new SchemaRepository(JdbcConstants.MYSQL);
213+
repository.setDefaultSchema("test");
214+
String sql = "CREATE TABLE test1 (\n" + "\tid int(11) NOT NULL AUTO_INCREMENT,\n"
215+
+ "\tcluster_id int(11) NOT NULL COMMENT '集群id',\n"
216+
+ "\tcomponent_id int(11) NOT NULL COMMENT '组件id',\n"
217+
+ "\tcomponent_type_code tinyint(1) NOT NULL COMMENT '组件类型',\n"
218+
+ "\ttype varchar(128) COLLATE utf8_bin NOT NULL COMMENT '配置类型',\n"
219+
+ "\trequired tinyint(1) NOT NULL COMMENT 'true/false',\n"
220+
+ "\t`key` varchar(256) COLLATE utf8_bin NOT NULL COMMENT '配置键',\n"
221+
+ "\t`value` text COLLATE utf8_bin COMMENT '默认配置项',\n"
222+
+ "\t`values` varchar(512) COLLATE utf8_bin DEFAULT NULL COMMENT '可配置项',\n"
223+
+ "\tdependencyKey varchar(256) COLLATE utf8_bin DEFAULT NULL COMMENT '依赖键',\n"
224+
+ "\tdependencyValue varchar(256) COLLATE utf8_bin DEFAULT NULL COMMENT '依赖值',\n"
225+
+ "\t`desc` varchar(512) COLLATE utf8_bin DEFAULT NULL COMMENT '描述',\n"
226+
+ "\tgmt_create datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',\n"
227+
+ "\tgmt_modified datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',\n"
228+
+ "\tis_deleted tinyint(1) NOT NULL DEFAULT '0' COMMENT '0正常 1逻辑删除',\n" + "\tPRIMARY KEY (id),\n"
229+
+ "\tKEY index_cluster_id (cluster_id),\n" + "\tKEY index_componentId (component_id)\n"
230+
+ ") ENGINE = InnoDB AUTO_INCREMENT = 1140 CHARSET = utf8 COLLATE = utf8_bin;";
231+
repository.console(sql);
232+
SchemaObject table = repository.findTable("test1");
233+
Assert.assertTrue(table != null);
234+
// 应用到新的schema
235+
Schema schema = repository.findSchema("test");
236+
StringBuilder data = new StringBuilder(4 * 1024);
237+
for (String tableIn : schema.showTables()) {
238+
SchemaObject schemaObject = schema.findTable(tableIn);
239+
240+
SQLASTOutputVisitor visitor = SQLUtils.createOutputVisitor(data, DbType.mysql);
241+
visitor.config(VisitorFeature.OutputNameQuote, true);
242+
243+
schemaObject.getStatement().accept(visitor);
244+
data.append("; \n");
245+
}
246+
247+
repository.setDefaultSchema("test_new");
248+
repository.console(data.toString());
249+
table = repository.findTable("test1");
250+
Assert.assertTrue(table != null);
251+
252+
// 打印新的schema的内容
253+
schema = repository.findSchema("test_new");
254+
data = new StringBuilder(4 * 1024);
255+
for (String tableIn : schema.showTables()) {
256+
SchemaObject schemaObject = schema.findTable(tableIn);
257+
258+
SQLASTOutputVisitor visitor = SQLUtils.createOutputVisitor(data, DbType.mysql);
259+
visitor.config(VisitorFeature.OutputNameQuote, true);
260+
261+
schemaObject.getStatement().accept(visitor);
262+
data.append("; \n");
263+
}
264+
265+
System.out.println(data.toString());
266+
}
267+
188268
}

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -326,7 +326,7 @@
326326
<dependency>
327327
<groupId>com.alibaba</groupId>
328328
<artifactId>druid</artifactId>
329-
<version>1.2.17</version>
329+
<version>1.2.21</version>
330330
</dependency>
331331
<dependency>
332332
<groupId>com.lmax</groupId>

0 commit comments

Comments
 (0)