Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
apache
Shardingsphere
提交
b07e8d6e
Shardingsphere
项目概览
apache
/
Shardingsphere
通知
56
Star
3
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
Shardingsphere
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
b07e8d6e
编写于
9月 27, 2018
作者:
C
codefairy08
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Move visitor logic to VisitorUtils
上级
eb5dce13
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
190 addition
and
199 deletion
+190
-199
sharding-jdbc-ddl-parser/src/main/antlr4/io/shardingsphere/parser/antlr/mysql/MySQLAlterTable.g4
...4/io/shardingsphere/parser/antlr/mysql/MySQLAlterTable.g4
+5
-1
sharding-jdbc-ddl-parser/src/main/java/io/shardingsphere/core/parsing/antler/utils/VisitorUtils.java
...hardingsphere/core/parsing/antler/utils/VisitorUtils.java
+178
-0
sharding-jdbc-ddl-parser/src/main/java/io/shardingsphere/core/parsing/antler/visitor/mysql/MySQLAlterTableVisitor.java
.../parsing/antler/visitor/mysql/MySQLAlterTableVisitor.java
+3
-80
sharding-jdbc-ddl-parser/src/main/java/io/shardingsphere/core/parsing/antler/visitor/oracle/OracleAlterTableVisitor.java
...arsing/antler/visitor/oracle/OracleAlterTableVisitor.java
+4
-118
未找到文件。
sharding-jdbc-ddl-parser/src/main/antlr4/io/shardingsphere/parser/antlr/mysql/MySQLAlterTable.g4
浏览文件 @
b07e8d6e
...
...
@@ -13,7 +13,7 @@ alterSpecification:
(tableOptions)
| ADD COLUMN? (singleColumn | multiColumn)
| ADD indexDefinition
|
ADD constraintDefinition
|
addConstraint
| algorithmOption
| ALTER COLUMN? columnName (SET DEFAULT | DROP DEFAULT)
| changeColumn
...
...
@@ -49,6 +49,10 @@ alterSpecification:
| UPGRADE PARTITIONING
;
addConstraint:
ADD constraintDefinition
;
changeColumn:
changeColumnOp columnName columnDefinition (FIRST|AFTER columnName)?
;
...
...
sharding-jdbc-ddl-parser/src/main/java/io/shardingsphere/core/parsing/antler/utils/VisitorUtils.java
浏览文件 @
b07e8d6e
...
...
@@ -310,6 +310,25 @@ public class VisitorUtils {
statement
.
setDropPrimaryKey
(
true
);
}
}
/**
* visit drop primary key.
*
* @param statement
* statement parse result
* @param ddlRootNode
* DDL root node of syntax tree
*/
public
static
void
visitOracleDropPrimaryKey
(
final
AlterTableStatement
statement
,
final
ParseTree
ddlRootNode
)
{
ParseTree
dropPrimaryKeyCtx
=
TreeUtils
.
getFirstChildByRuleName
(
ddlRootNode
,
"dropConstraintClause"
);
if
(
null
!=
dropPrimaryKeyCtx
)
{
ParseTree
primaryKeyCtx
=
TreeUtils
.
getFirstChildByRuleName
(
dropPrimaryKeyCtx
,
"primaryKey"
);
if
(
null
!=
primaryKeyCtx
)
{
statement
.
setDropPrimaryKey
(
true
);
}
}
}
/**
* Parse drop column.
...
...
@@ -407,4 +426,163 @@ public class VisitorUtils {
return
new
ColumnDefinition
(
columnNameNode
.
getText
(),
typeName
,
length
,
primaryKey
);
}
/**
* Visit alter table rename column nodes.
*
* @param statement
* statement parse result
* @param rootNode
* Root node of syntax tree
*/
public
static
void
visitRenameColumn
(
final
AlterTableStatement
statement
,
final
ParseTree
rootNode
)
{
ParserRuleContext
modifyColumnCtx
=
(
ParserRuleContext
)
TreeUtils
.
getFirstChildByRuleName
(
rootNode
,
"renameColumn"
);
if
(
null
==
modifyColumnCtx
)
{
return
;
}
List
<
ParseTree
>
columnNodes
=
TreeUtils
.
getAllDescendantByRuleName
(
modifyColumnCtx
,
"columnName"
);
if
(
null
==
columnNodes
||
columnNodes
.
size
()
!=
2
)
{
return
;
}
String
oldName
=
columnNodes
.
get
(
0
).
getText
();
String
newName
=
columnNodes
.
get
(
1
).
getText
();
ColumnDefinition
oldDefinition
=
statement
.
getUpdateColumns
().
remove
(
oldName
);
if
(
null
!=
oldDefinition
)
{
oldDefinition
.
setName
(
newName
);
}
else
{
oldDefinition
=
new
ColumnDefinition
(
newName
,
null
,
null
,
false
);
}
statement
.
getUpdateColumns
().
put
(
newName
,
oldDefinition
);
}
/**
* Parse alter table change column node.
*
* @param statement
* statement parse result
* @param rootNode
* root node of syntax tree
*/
public
static
void
visitChangeColumn
(
final
AlterTableStatement
statement
,
final
ParseTree
rootNode
)
{
ParserRuleContext
changeColumnCtx
=
(
ParserRuleContext
)
TreeUtils
.
getFirstChildByRuleName
(
rootNode
,
"changeColumn"
);
if
(
null
==
changeColumnCtx
)
{
return
;
}
ParserRuleContext
oldColumnCtx
=
(
ParserRuleContext
)
TreeUtils
.
getFirstChildByRuleName
(
changeColumnCtx
,
"columnName"
);
if
(
null
==
oldColumnCtx
)
{
return
;
}
ParserRuleContext
columnDefinitionCtx
=
(
ParserRuleContext
)
TreeUtils
.
getFirstChildByRuleName
(
changeColumnCtx
,
"columnDefinition"
);
if
(
null
==
columnDefinitionCtx
)
{
return
;
}
ColumnDefinition
column
=
VisitorUtils
.
parseColumnDefinition
(
columnDefinitionCtx
);
if
(
null
!=
column
)
{
statement
.
getUpdateColumns
().
remove
(
oldColumnCtx
.
getText
());
statement
.
getUpdateColumns
().
put
(
column
.
getName
(),
column
);
}
}
/**
* Visit alter table modify column nodes.
*
* @param statement
* statement parse result
* @param rootNode
* Root node of syntax tree
* @param ruleName
* primary key node name
*/
public
static
void
visitAddPrimaryKey
(
final
AlterTableStatement
statement
,
final
ParseTree
rootNode
,
String
ruleName
)
{
ParserRuleContext
modifyColumnCtx
=
(
ParserRuleContext
)
TreeUtils
.
getFirstChildByRuleName
(
rootNode
,
ruleName
);
if
(
null
==
modifyColumnCtx
)
{
return
;
}
ParseTree
primaryKeyCtx
=
TreeUtils
.
getFirstChildByRuleName
(
modifyColumnCtx
,
"primaryKey"
);
if
(
null
==
primaryKeyCtx
)
{
return
;
}
List
<
ParseTree
>
columnNodes
=
TreeUtils
.
getAllDescendantByRuleName
(
modifyColumnCtx
,
"columnName"
);
if
(
null
==
columnNodes
)
{
return
;
}
for
(
final
ParseTree
each
:
columnNodes
)
{
String
columnName
=
each
.
getText
();
ColumnDefinition
updateColumn
=
statement
.
getUpdateColumns
().
get
(
columnName
);
if
(
null
==
updateColumn
)
{
updateColumn
=
new
ColumnDefinition
(
columnName
,
null
,
null
,
true
);
statement
.
getUpdateColumns
().
put
(
columnName
,
updateColumn
);
}
else
{
updateColumn
.
setPrimaryKey
(
true
);
}
statement
.
getUpdateColumns
().
put
(
columnName
,
new
ColumnDefinition
(
columnName
,
null
,
null
,
true
));
}
}
/**
* Visit alter table modify column nodes.
*
* @param statement
* statement parse result
* @param rootNode
* Root node of syntax tree
*/
public
static
void
visitModifyColumn
(
final
AlterTableStatement
statement
,
final
ParseTree
rootNode
)
{
List
<
ParseTree
>
modifyColumnCtxs
=
TreeUtils
.
getAllDescendantByRuleName
(
rootNode
,
"modifyColumn"
);
if
(
null
==
modifyColumnCtxs
)
{
return
;
}
for
(
ParseTree
each
:
modifyColumnCtxs
)
{
// it`s not columndefinition, but can call this method
ColumnDefinition
column
=
VisitorUtils
.
parseColumnDefinition
(
each
);
if
(
null
!=
column
)
{
statement
.
getUpdateColumns
().
put
(
column
.
getName
(),
column
);
}
}
}
/**
* Visit alter table modify column nodes.
*
* @param statement
* statement parse result
* @param rootNode
* Root node of syntax tree
*/
public
static
void
visitOracleModifyColumn
(
final
AlterTableStatement
statement
,
final
ParseTree
rootNode
)
{
ParserRuleContext
modifyColumnCtx
=
(
ParserRuleContext
)
TreeUtils
.
getFirstChildByRuleName
(
rootNode
,
"modifyColumn"
);
if
(
null
==
modifyColumnCtx
)
{
return
;
}
List
<
ParseTree
>
columnNodes
=
TreeUtils
.
getAllDescendantByRuleName
(
modifyColumnCtx
,
"modifyColProperties"
);
if
(
null
==
columnNodes
)
{
return
;
}
for
(
final
ParseTree
each
:
columnNodes
)
{
// it`s not columndefinition, but can call this method
ColumnDefinition
column
=
VisitorUtils
.
parseColumnDefinition
(
each
);
if
(
null
!=
column
)
{
statement
.
getUpdateColumns
().
put
(
column
.
getName
(),
column
);
}
}
}
}
sharding-jdbc-ddl-parser/src/main/java/io/shardingsphere/core/parsing/antler/visitor/mysql/MySQLAlterTableVisitor.java
浏览文件 @
b07e8d6e
package
io.shardingsphere.core.parsing.antler.visitor.mysql
;
import
java.util.List
;
import
org.antlr.v4.runtime.ParserRuleContext
;
import
org.antlr.v4.runtime.tree.ParseTree
;
import
io.shardingsphere.core.parsing.antler.sql.ddl.AlterTableStatement
;
import
io.shardingsphere.core.parsing.antler.sql.ddl.ColumnDefinition
;
import
io.shardingsphere.core.parsing.antler.utils.TreeUtils
;
import
io.shardingsphere.core.parsing.antler.utils.VisitorUtils
;
import
io.shardingsphere.core.parsing.antler.visitor.AlterTableVisitor
;
...
...
@@ -17,50 +14,16 @@ public class MySQLAlterTableVisitor extends AlterTableVisitor {
protected
void
visitPrivateTree
(
AlterTableStatement
statement
,
ParseTree
rootNode
)
{
visitAddIndex
(
statement
,
rootNode
);
visitDropIndex
(
statement
,
rootNode
);
visitAddPrimaryKey
(
statement
,
rootNode
);
VisitorUtils
.
visitAddPrimaryKey
(
statement
,
rootNode
,
"addConstraint"
);
visitChangeColumn
(
statement
,
rootNode
);
VisitorUtils
.
visitChangeColumn
(
statement
,
rootNode
);
VisitorUtils
.
parseModifyColumn
(
statement
,
rootNode
);
VisitorUtils
.
parseRenameIndex
(
statement
,
rootNode
);
VisitorUtils
.
parseAddPrimaryKey
(
statement
,
rootNode
);
VisitorUtils
.
parseDropPrimaryKey
(
statement
,
rootNode
);
}
/**
* Parse alter table change column node.
*
* @param statement
* statement parse result
* @param rootNode
* root node of syntax tree
*/
public
static
void
visitChangeColumn
(
final
AlterTableStatement
statement
,
final
ParseTree
rootNode
)
{
ParserRuleContext
changeColumnCtx
=
(
ParserRuleContext
)
TreeUtils
.
getFirstChildByRuleName
(
rootNode
,
"changeColumn"
);
if
(
null
==
changeColumnCtx
)
{
return
;
}
ParserRuleContext
oldColumnCtx
=
(
ParserRuleContext
)
TreeUtils
.
getFirstChildByRuleName
(
changeColumnCtx
,
"columnName"
);
if
(
null
==
oldColumnCtx
)
{
return
;
}
ParserRuleContext
columnDefinitionCtx
=
(
ParserRuleContext
)
TreeUtils
.
getFirstChildByRuleName
(
changeColumnCtx
,
"columnDefinition"
);
if
(
null
==
columnDefinitionCtx
)
{
return
;
}
ColumnDefinition
column
=
VisitorUtils
.
parseColumnDefinition
(
columnDefinitionCtx
);
if
(
null
!=
column
)
{
statement
.
getUpdateColumns
().
remove
(
oldColumnCtx
.
getText
());
statement
.
getUpdateColumns
().
put
(
column
.
getName
(),
column
);
}
}
/**
* Visit add index node.
...
...
@@ -108,44 +71,4 @@ public class MySQLAlterTableVisitor extends AlterTableVisitor {
indexNameNode
.
getText
(),
statement
.
getTables
().
getSingleTableName
()));
}
}
/**
* Visit add primary key.
*
* @param statement
* statement parse result
* @param ancestorNode
* ancestor of index node
* @return indexName node
*/
protected
void
visitAddPrimaryKey
(
final
AlterTableStatement
statement
,
final
ParseTree
ancestorNode
)
{
ParserRuleContext
constraintDefinitionNode
=
(
ParserRuleContext
)
TreeUtils
.
getFirstChildByRuleName
(
ancestorNode
,
"constraintDefinition"
);
if
(
null
==
constraintDefinitionNode
)
{
return
;
}
ParserRuleContext
primaryKeyOptionNode
=
(
ParserRuleContext
)
TreeUtils
.
getFirstChildByRuleName
(
ancestorNode
,
"primaryKeyOption"
);
if
(
null
==
primaryKeyOptionNode
)
{
return
;
}
List
<
ParseTree
>
keyPartNodes
=
TreeUtils
.
getAllDescendantByRuleName
(
ancestorNode
,
"keyPart"
);
if
(
null
==
keyPartNodes
)
{
return
;
}
for
(
final
ParseTree
each
:
keyPartNodes
)
{
String
columnName
=
each
.
getChild
(
0
).
getText
();
ColumnDefinition
updateColumn
=
statement
.
getUpdateColumns
().
get
(
columnName
);
if
(
null
==
updateColumn
)
{
updateColumn
=
new
ColumnDefinition
(
columnName
,
null
,
null
,
true
);
statement
.
getUpdateColumns
().
put
(
columnName
,
updateColumn
);
}
else
{
updateColumn
.
setPrimaryKey
(
true
);
}
}
}
}
sharding-jdbc-ddl-parser/src/main/java/io/shardingsphere/core/parsing/antler/visitor/oracle/OracleAlterTableVisitor.java
浏览文件 @
b07e8d6e
package
io.shardingsphere.core.parsing.antler.visitor.oracle
;
import
java.util.List
;
import
org.antlr.v4.runtime.ParserRuleContext
;
import
org.antlr.v4.runtime.tree.ParseTree
;
import
io.shardingsphere.core.parsing.antler.sql.ddl.AlterTableStatement
;
import
io.shardingsphere.core.parsing.antler.sql.ddl.ColumnDefinition
;
import
io.shardingsphere.core.parsing.antler.utils.TreeUtils
;
import
io.shardingsphere.core.parsing.antler.utils.VisitorUtils
;
import
io.shardingsphere.core.parsing.antler.visitor.AlterTableVisitor
;
public
class
OracleAlterTableVisitor
extends
AlterTableVisitor
{
@Override
protected
void
visitPrivateTree
(
AlterTableStatement
statement
,
ParseTree
rootNode
)
{
visitModifyColumn
(
statement
,
rootNode
);
visitRenameColumn
(
statement
,
rootNode
);
visitAddPrimaryKey
(
statement
,
rootNode
);
visitDropPrimaryKey
(
statement
,
rootNode
);
}
/**
* Visit alter table modify column nodes.
*
* @param statement
* statement parse result
* @param rootNode
* Root node of syntax tree
*/
protected
void
visitModifyColumn
(
final
AlterTableStatement
statement
,
final
ParseTree
rootNode
)
{
ParserRuleContext
modifyColumnCtx
=
(
ParserRuleContext
)
TreeUtils
.
getFirstChildByRuleName
(
rootNode
,
"modifyColumn"
);
if
(
null
==
modifyColumnCtx
)
{
return
;
}
List
<
ParseTree
>
columnNodes
=
TreeUtils
.
getAllDescendantByRuleName
(
modifyColumnCtx
,
"modifyColProperties"
);
if
(
null
==
columnNodes
)
{
return
;
}
for
(
final
ParseTree
each
:
columnNodes
)
{
// it`s not columndefinition, but can call this method
ColumnDefinition
column
=
VisitorUtils
.
parseColumnDefinition
(
each
);
if
(
null
!=
column
)
{
statement
.
getAddColumns
().
add
(
column
);
}
}
}
/**
* Visit alter table rename column nodes.
*
* @param statement
* statement parse result
* @param rootNode
* Root node of syntax tree
*/
protected
void
visitRenameColumn
(
final
AlterTableStatement
statement
,
final
ParseTree
rootNode
)
{
ParserRuleContext
modifyColumnCtx
=
(
ParserRuleContext
)
TreeUtils
.
getFirstChildByRuleName
(
rootNode
,
"renameColumn"
);
if
(
null
==
modifyColumnCtx
)
{
return
;
}
List
<
ParseTree
>
columnNodes
=
TreeUtils
.
getAllDescendantByRuleName
(
modifyColumnCtx
,
"columnName"
);
if
(
null
==
columnNodes
||
columnNodes
.
size
()
!=
2
)
{
return
;
}
String
oldName
=
columnNodes
.
get
(
0
).
getText
();
String
newName
=
columnNodes
.
get
(
1
).
getText
();
ColumnDefinition
oldDefinition
=
statement
.
getUpdateColumns
().
remove
(
oldName
);
if
(
null
!=
oldDefinition
)
{
oldDefinition
.
setName
(
newName
);
}
else
{
oldDefinition
=
new
ColumnDefinition
(
newName
,
null
,
null
,
false
);
}
statement
.
getUpdateColumns
().
put
(
newName
,
oldDefinition
);
}
/**
* Visit alter table modify column nodes.
*
* @param statement
* statement parse result
* @param rootNode
* Root node of syntax tree
*/
protected
void
visitAddPrimaryKey
(
final
AlterTableStatement
statement
,
final
ParseTree
rootNode
)
{
ParserRuleContext
modifyColumnCtx
=
(
ParserRuleContext
)
TreeUtils
.
getFirstChildByRuleName
(
rootNode
,
"addConstraintClause"
);
if
(
null
==
modifyColumnCtx
)
{
return
;
}
ParseTree
primaryKeyCtx
=
TreeUtils
.
getFirstChildByRuleName
(
modifyColumnCtx
,
"primaryKey"
);
if
(
null
==
primaryKeyCtx
)
{
return
;
}
List
<
ParseTree
>
columnNodes
=
TreeUtils
.
getAllDescendantByRuleName
(
modifyColumnCtx
,
"columnName"
);
if
(
null
==
columnNodes
)
{
return
;
}
for
(
final
ParseTree
each
:
columnNodes
)
{
String
columnName
=
each
.
getText
();
statement
.
getUpdateColumns
().
put
(
columnName
,
new
ColumnDefinition
(
columnName
,
null
,
null
,
true
));
}
}
/**
* Parse drop primary key.
*
* @param statement
* statement parse result
* @param ddlRootNode
* DDL root node of syntax tree
*/
protected
void
visitDropPrimaryKey
(
final
AlterTableStatement
statement
,
final
ParseTree
ddlRootNode
)
{
ParseTree
dropPrimaryKeyCtx
=
TreeUtils
.
getFirstChildByRuleName
(
ddlRootNode
,
"dropConstraintClause"
);
if
(
null
!=
dropPrimaryKeyCtx
)
{
ParseTree
primaryKeyCtx
=
TreeUtils
.
getFirstChildByRuleName
(
dropPrimaryKeyCtx
,
"primaryKey"
);
if
(
null
!=
primaryKeyCtx
)
{
statement
.
setDropPrimaryKey
(
true
);
}
}
VisitorUtils
.
visitOracleModifyColumn
(
statement
,
rootNode
);
VisitorUtils
.
visitRenameColumn
(
statement
,
rootNode
);
VisitorUtils
.
visitAddPrimaryKey
(
statement
,
rootNode
,
"addConstraintClause"
);
VisitorUtils
.
visitOracleDropPrimaryKey
(
statement
,
rootNode
);
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录