Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
lijianghuflute
canal
提交
f664af1a
canal
项目概览
lijianghuflute
/
canal
与 Fork 源项目一致
从无法访问的项目Fork
通知
3
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
canal
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
f664af1a
编写于
2月 28, 2019
作者:
A
agapple
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fixed issue #1546 , support drop database
上级
5e2eabb3
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
274 addition
and
4 deletion
+274
-4
parse/src/main/java/com/alibaba/otter/canal/parse/inbound/mysql/ddl/DruidDdlParser.java
...a/otter/canal/parse/inbound/mysql/ddl/DruidDdlParser.java
+5
-4
parse/src/test/java/com/alibaba/otter/canal/parse/inbound/mysql/DruidDdlParserTest.java
...a/otter/canal/parse/inbound/mysql/DruidDdlParserTest.java
+269
-0
未找到文件。
parse/src/main/java/com/alibaba/otter/canal/parse/inbound/mysql/ddl/DruidDdlParser.java
浏览文件 @
f664af1a
...
...
@@ -163,16 +163,17 @@ public class DruidDdlParser {
ddlResult
.
setType
(
EventType
.
DELETE
);
ddlResults
.
add
(
ddlResult
);
}
else
if
(
statement
instanceof
SQLCreateDatabaseStatement
)
{
SQLCreateDatabaseStatement
create
=
(
SQLCreateDatabaseStatement
)
statement
;
DdlResult
ddlResult
=
new
DdlResult
();
ddlResult
.
setType
(
EventType
.
QUERY
);
// 只设置schema
processName
(
ddlResult
,
schmeaName
,
null
,
false
);
processName
(
ddlResult
,
create
.
getDatabaseName
(),
null
,
false
);
ddlResults
.
add
(
ddlResult
);
}
else
if
(
statement
instanceof
SQLDropDatabaseStatement
)
{
SQLDropDatabaseStatement
drop
=
(
SQLDropDatabaseStatement
)
statement
;
DdlResult
ddlResult
=
new
DdlResult
();
ddlResult
.
setType
(
EventType
.
QUERY
);
// 只设置schema
processName
(
ddlResult
,
schmeaName
,
null
,
false
);
processName
(
ddlResult
,
drop
.
getDatabaseName
(),
null
,
false
);
ddlResults
.
add
(
ddlResult
);
}
}
...
...
parse/src/test/java/com/alibaba/otter/canal/parse/inbound/mysql/DruidDdlParserTest.java
0 → 100644
浏览文件 @
f664af1a
package
com.alibaba.otter.canal.parse.inbound.mysql
;
import
org.junit.Assert
;
import
org.junit.Test
;
import
com.alibaba.otter.canal.parse.inbound.mysql.ddl.DdlResult
;
import
com.alibaba.otter.canal.parse.inbound.mysql.ddl.DruidDdlParser
;
import
com.alibaba.otter.canal.parse.inbound.mysql.ddl.SimpleDdlParser
;
import
com.alibaba.otter.canal.protocol.CanalEntry.EventType
;
public
class
DruidDdlParserTest
{
@Test
public
void
testCreate
()
{
String
queryString
=
"CREATE TABLE retl_mark ( `ID` int(11) )"
;
DdlResult
result
=
DruidDdlParser
.
parse
(
queryString
,
"retl"
).
get
(
0
);
Assert
.
assertNotNull
(
result
);
Assert
.
assertEquals
(
"retl"
,
result
.
getSchemaName
());
Assert
.
assertEquals
(
"retl_mark"
,
result
.
getTableName
());
queryString
=
"CREATE TABLE IF NOT EXISTS retl.retl_mark ( `ID` int(11) )"
;
result
=
DruidDdlParser
.
parse
(
queryString
,
"retl"
).
get
(
0
);
Assert
.
assertNotNull
(
result
);
Assert
.
assertEquals
(
"retl"
,
result
.
getSchemaName
());
Assert
.
assertEquals
(
"retl_mark"
,
result
.
getTableName
());
queryString
=
"CREATE TABLE IF NOT EXISTS `retl_mark` ( `ID` int(11) )"
;
result
=
DruidDdlParser
.
parse
(
queryString
,
"retl"
).
get
(
0
);
Assert
.
assertNotNull
(
result
);
Assert
.
assertEquals
(
"retl"
,
result
.
getSchemaName
());
Assert
.
assertEquals
(
"retl_mark"
,
result
.
getTableName
());
queryString
=
"CREATE TABLE `retl`.`retl_mark` (\n `ID` int(10) unsigned NOT NULL )"
;
result
=
DruidDdlParser
.
parse
(
queryString
,
"retl"
).
get
(
0
);
Assert
.
assertNotNull
(
result
);
Assert
.
assertEquals
(
"retl"
,
result
.
getSchemaName
());
Assert
.
assertEquals
(
"retl_mark"
,
result
.
getTableName
());
queryString
=
"CREATE TABLE `retl`.`retl_mark`(\n `ID` int(10) unsigned NOT NULL )"
;
result
=
SimpleDdlParser
.
parse
(
queryString
,
"retl"
);
Assert
.
assertNotNull
(
result
);
Assert
.
assertEquals
(
"retl"
,
result
.
getSchemaName
());
Assert
.
assertEquals
(
"retl_mark"
,
result
.
getTableName
());
queryString
=
"CREATE table `bak591`.`j_order_log_back_201309` like j_order_log"
;
result
=
DruidDdlParser
.
parse
(
queryString
,
"bak"
).
get
(
0
);
Assert
.
assertNotNull
(
result
);
Assert
.
assertEquals
(
"bak591"
,
result
.
getSchemaName
());
Assert
.
assertEquals
(
"j_order_log_back_201309"
,
result
.
getTableName
());
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
=
DruidDdlParser
.
parse
(
queryString
,
"bak"
).
get
(
0
);
Assert
.
assertEquals
(
EventType
.
QUERY
,
result
.
getType
());
queryString
=
"CREATE TABLE performance_schema.cond_instances(`ID` int(10) unsigned NOT NULL ) "
;
result
=
DruidDdlParser
.
parse
(
queryString
,
"retl"
).
get
(
0
);
Assert
.
assertNotNull
(
result
);
Assert
.
assertEquals
(
"performance_schema"
,
result
.
getSchemaName
());
Assert
.
assertEquals
(
"cond_instances"
,
result
.
getTableName
());
}
@Test
public
void
testDrop
()
{
String
queryString
=
"DROP TABLE retl_mark"
;
DdlResult
result
=
DruidDdlParser
.
parse
(
queryString
,
"retl"
).
get
(
0
);
Assert
.
assertNotNull
(
result
);
Assert
.
assertEquals
(
"retl"
,
result
.
getSchemaName
());
Assert
.
assertEquals
(
"retl_mark"
,
result
.
getTableName
());
queryString
=
"DROP TABLE IF EXISTS test.retl_mark;"
;
result
=
DruidDdlParser
.
parse
(
queryString
,
"retl"
).
get
(
0
);
Assert
.
assertNotNull
(
result
);
Assert
.
assertEquals
(
"test"
,
result
.
getSchemaName
());
Assert
.
assertEquals
(
"retl_mark"
,
result
.
getTableName
());
queryString
=
"DROP TABLE IF EXISTS \n \"test\".`retl_mark`;"
;
result
=
DruidDdlParser
.
parse
(
queryString
,
"retl"
).
get
(
0
);
Assert
.
assertNotNull
(
result
);
Assert
.
assertEquals
(
"test"
,
result
.
getSchemaName
());
Assert
.
assertEquals
(
"retl_mark"
,
result
.
getTableName
());
queryString
=
"DROP TABLE IF EXISTS \n retl.retl_mark , retl_test"
;
result
=
DruidDdlParser
.
parse
(
queryString
,
"test"
).
get
(
0
);
Assert
.
assertNotNull
(
result
);
Assert
.
assertEquals
(
"retl"
,
result
.
getSchemaName
());
Assert
.
assertEquals
(
"retl_mark"
,
result
.
getTableName
());
result
=
DruidDdlParser
.
parse
(
queryString
,
"test"
).
get
(
1
);
Assert
.
assertNotNull
(
result
);
Assert
.
assertEquals
(
"test"
,
result
.
getSchemaName
());
Assert
.
assertEquals
(
"retl_test"
,
result
.
getTableName
());
queryString
=
"DROP /*!40005 TEMPORARY */ TABLE IF EXISTS `temp_bond_keys`.`temp_bond_key_id`;"
;
result
=
DruidDdlParser
.
parse
(
queryString
,
"retl"
).
get
(
0
);
Assert
.
assertNotNull
(
result
);
Assert
.
assertEquals
(
"temp_bond_keys"
,
result
.
getSchemaName
());
Assert
.
assertEquals
(
"temp_bond_key_id"
,
result
.
getTableName
());
}
@Test
public
void
testAlert
()
{
String
queryString
=
"alter table retl_mark drop index emp_name"
;
DdlResult
result
=
DruidDdlParser
.
parse
(
queryString
,
"retl"
).
get
(
0
);
Assert
.
assertNotNull
(
result
);
Assert
.
assertEquals
(
"retl_mark"
,
result
.
getTableName
());
queryString
=
"alter table retl.retl_mark drop index emp_name"
;
result
=
DruidDdlParser
.
parse
(
queryString
,
"retl"
).
get
(
0
);
Assert
.
assertNotNull
(
result
);
Assert
.
assertEquals
(
"retl_mark"
,
result
.
getTableName
());
queryString
=
"alter table \n retl.`retl_mark` drop index emp_name;"
;
result
=
DruidDdlParser
.
parse
(
queryString
,
"retl"
).
get
(
0
);
Assert
.
assertNotNull
(
result
);
Assert
.
assertEquals
(
"retl_mark"
,
result
.
getTableName
());
queryString
=
"alter table retl.retl_mark drop index emp_name , add index emp_name(id)"
;
result
=
DruidDdlParser
.
parse
(
queryString
,
"retl"
).
get
(
0
);
Assert
.
assertNotNull
(
result
);
Assert
.
assertEquals
(
"retl_mark"
,
result
.
getTableName
());
Assert
.
assertEquals
(
EventType
.
DINDEX
,
result
.
getType
());
result
=
DruidDdlParser
.
parse
(
queryString
,
"retl"
).
get
(
1
);
Assert
.
assertNotNull
(
result
);
Assert
.
assertEquals
(
"retl_mark"
,
result
.
getTableName
());
Assert
.
assertEquals
(
EventType
.
CINDEX
,
result
.
getType
());
}
@Test
public
void
testTruncate
()
{
String
queryString
=
"truncate table retl_mark"
;
DdlResult
result
=
DruidDdlParser
.
parse
(
queryString
,
"retl"
).
get
(
0
);
Assert
.
assertNotNull
(
result
);
Assert
.
assertEquals
(
"retl_mark"
,
result
.
getTableName
());
queryString
=
"truncate table retl.retl_mark"
;
result
=
DruidDdlParser
.
parse
(
queryString
,
"retl"
).
get
(
0
);
Assert
.
assertNotNull
(
result
);
Assert
.
assertEquals
(
"retl_mark"
,
result
.
getTableName
());
queryString
=
"truncate \n retl.`retl_mark` "
;
result
=
DruidDdlParser
.
parse
(
queryString
,
"retl"
).
get
(
0
);
Assert
.
assertNotNull
(
result
);
Assert
.
assertEquals
(
"retl_mark"
,
result
.
getTableName
());
queryString
=
"truncate \n retl.retl_mark , retl_test "
;
result
=
DruidDdlParser
.
parse
(
queryString
,
"retl"
).
get
(
0
);
Assert
.
assertNotNull
(
result
);
Assert
.
assertEquals
(
"retl_mark"
,
result
.
getTableName
());
result
=
DruidDdlParser
.
parse
(
queryString
,
"retl"
).
get
(
1
);
Assert
.
assertNotNull
(
result
);
Assert
.
assertEquals
(
"retl_test"
,
result
.
getTableName
());
}
@Test
public
void
testRename
()
{
String
queryString
=
"rename table retl_mark to retl_mark2"
;
DdlResult
result
=
DruidDdlParser
.
parse
(
queryString
,
"retl"
).
get
(
0
);
Assert
.
assertNotNull
(
result
);
Assert
.
assertEquals
(
"retl"
,
result
.
getOriSchemaName
());
Assert
.
assertEquals
(
"retl"
,
result
.
getSchemaName
());
Assert
.
assertEquals
(
"retl_mark"
,
result
.
getOriTableName
());
Assert
.
assertEquals
(
"retl_mark2"
,
result
.
getTableName
());
queryString
=
"rename table retl.retl_mark to retl2.retl_mark2"
;
result
=
DruidDdlParser
.
parse
(
queryString
,
"retl"
).
get
(
0
);
Assert
.
assertNotNull
(
result
);
Assert
.
assertEquals
(
"retl"
,
result
.
getOriSchemaName
());
Assert
.
assertEquals
(
"retl2"
,
result
.
getSchemaName
());
Assert
.
assertEquals
(
"retl_mark"
,
result
.
getOriTableName
());
Assert
.
assertEquals
(
"retl_mark2"
,
result
.
getTableName
());
queryString
=
"rename \n table \n `retl`.`retl_mark` to `retl2`.`retl_mark2`;"
;
result
=
DruidDdlParser
.
parse
(
queryString
,
"retl"
).
get
(
0
);
Assert
.
assertNotNull
(
result
);
Assert
.
assertEquals
(
"retl"
,
result
.
getOriSchemaName
());
Assert
.
assertEquals
(
"retl2"
,
result
.
getSchemaName
());
Assert
.
assertEquals
(
"retl_mark"
,
result
.
getOriTableName
());
Assert
.
assertEquals
(
"retl_mark2"
,
result
.
getTableName
());
queryString
=
"rename \n table \n `retl`.`retl_mark` to `retl2`.`retl_mark2` , `retl1`.`retl_mark1` to `retl3`.`retl_mark3`;"
;
result
=
DruidDdlParser
.
parse
(
queryString
,
"retl"
).
get
(
0
);
Assert
.
assertNotNull
(
result
);
Assert
.
assertEquals
(
"retl"
,
result
.
getOriSchemaName
());
Assert
.
assertEquals
(
"retl2"
,
result
.
getSchemaName
());
Assert
.
assertEquals
(
"retl_mark"
,
result
.
getOriTableName
());
Assert
.
assertEquals
(
"retl_mark2"
,
result
.
getTableName
());
result
=
DruidDdlParser
.
parse
(
queryString
,
"retl"
).
get
(
1
);
Assert
.
assertNotNull
(
result
);
Assert
.
assertEquals
(
"retl1"
,
result
.
getOriSchemaName
());
Assert
.
assertEquals
(
"retl3"
,
result
.
getSchemaName
());
Assert
.
assertEquals
(
"retl_mark1"
,
result
.
getOriTableName
());
Assert
.
assertEquals
(
"retl_mark3"
,
result
.
getTableName
());
// 正则匹配test case
queryString
=
"rename table totl_mark to totl_mark2"
;
result
=
DruidDdlParser
.
parse
(
queryString
,
"retl"
).
get
(
0
);
Assert
.
assertNotNull
(
result
);
Assert
.
assertEquals
(
"retl"
,
result
.
getOriSchemaName
());
Assert
.
assertEquals
(
"retl"
,
result
.
getSchemaName
());
Assert
.
assertEquals
(
"totl_mark"
,
result
.
getOriTableName
());
Assert
.
assertEquals
(
"totl_mark2"
,
result
.
getTableName
());
queryString
=
"rename table totl.retl_mark to totl2.retl_mark2"
;
result
=
DruidDdlParser
.
parse
(
queryString
,
"retl"
).
get
(
0
);
Assert
.
assertNotNull
(
result
);
Assert
.
assertEquals
(
"totl"
,
result
.
getOriSchemaName
());
Assert
.
assertEquals
(
"totl2"
,
result
.
getSchemaName
());
Assert
.
assertEquals
(
"retl_mark"
,
result
.
getOriTableName
());
Assert
.
assertEquals
(
"retl_mark2"
,
result
.
getTableName
());
queryString
=
"rename \n table \n `totl`.`retl_mark` to `totl2`.`retl_mark2`;"
;
result
=
DruidDdlParser
.
parse
(
queryString
,
"retl"
).
get
(
0
);
Assert
.
assertNotNull
(
result
);
Assert
.
assertEquals
(
"totl"
,
result
.
getOriSchemaName
());
Assert
.
assertEquals
(
"totl2"
,
result
.
getSchemaName
());
Assert
.
assertEquals
(
"retl_mark"
,
result
.
getOriTableName
());
Assert
.
assertEquals
(
"retl_mark2"
,
result
.
getTableName
());
queryString
=
"rename \n table \n `totl`.`retl_mark` to `totl2`.`retl_mark2` , `totl1`.`retl_mark1` to `totl3`.`retl_mark3`;"
;
result
=
DruidDdlParser
.
parse
(
queryString
,
"retl"
).
get
(
0
);
Assert
.
assertNotNull
(
result
);
Assert
.
assertEquals
(
"totl"
,
result
.
getOriSchemaName
());
Assert
.
assertEquals
(
"totl2"
,
result
.
getSchemaName
());
Assert
.
assertEquals
(
"retl_mark"
,
result
.
getOriTableName
());
Assert
.
assertEquals
(
"retl_mark2"
,
result
.
getTableName
());
result
=
DruidDdlParser
.
parse
(
queryString
,
"retl"
).
get
(
1
);
Assert
.
assertNotNull
(
result
);
Assert
.
assertEquals
(
"totl1"
,
result
.
getOriSchemaName
());
Assert
.
assertEquals
(
"totl3"
,
result
.
getSchemaName
());
Assert
.
assertEquals
(
"retl_mark1"
,
result
.
getOriTableName
());
Assert
.
assertEquals
(
"retl_mark3"
,
result
.
getTableName
());
}
@Test
public
void
testIndex
()
{
String
queryString
=
"CREATE UNIQUE INDEX index_1 ON retl_mark(id,x)"
;
DdlResult
result
=
DruidDdlParser
.
parse
(
queryString
,
"retl"
).
get
(
0
);
Assert
.
assertNotNull
(
result
);
Assert
.
assertEquals
(
"retl"
,
result
.
getSchemaName
());
Assert
.
assertEquals
(
"retl_mark"
,
result
.
getTableName
());
queryString
=
"create index idx_qca_cid_mcid on q_contract_account (contract_id,main_contract_id)"
;
result
=
DruidDdlParser
.
parse
(
queryString
,
"retl"
).
get
(
0
);
Assert
.
assertNotNull
(
result
);
Assert
.
assertEquals
(
"retl"
,
result
.
getSchemaName
());
Assert
.
assertEquals
(
"q_contract_account"
,
result
.
getTableName
());
queryString
=
"DROP INDEX index_str ON retl_mark"
;
result
=
DruidDdlParser
.
parse
(
queryString
,
"retl"
).
get
(
0
);
Assert
.
assertNotNull
(
result
);
Assert
.
assertEquals
(
"retl"
,
result
.
getSchemaName
());
Assert
.
assertEquals
(
"retl_mark"
,
result
.
getTableName
());
}
@Test
public
void
testDb
()
{
String
queryString
=
"create database db1"
;
DdlResult
result
=
DruidDdlParser
.
parse
(
queryString
,
"db0"
).
get
(
0
);
Assert
.
assertNotNull
(
result
);
Assert
.
assertEquals
(
"db1"
,
result
.
getSchemaName
());
queryString
=
"drop database db1"
;
result
=
DruidDdlParser
.
parse
(
queryString
,
"retl"
).
get
(
0
);
Assert
.
assertNotNull
(
result
);
Assert
.
assertEquals
(
"db1"
,
result
.
getSchemaName
());
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录