Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
apache
Shardingsphere
提交
adbb9504
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,发现更多精彩内容 >>
提交
adbb9504
编写于
9月 26, 2018
作者:
C
codefairy08
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Add sqlserver mysql alter table visitor
上级
e8a7a054
变更
5
隐藏空白更改
内联
并排
Showing
5 changed file
with
253 addition
and
11 deletion
+253
-11
sharding-jdbc-ddl-parser/src/main/antlr4/io/shardingsphere/parser/antlr/mysql/MySQLAlterTable.g4
...4/io/shardingsphere/parser/antlr/mysql/MySQLAlterTable.g4
+1
-1
sharding-jdbc-ddl-parser/src/main/java/io/shardingsphere/core/parsing/antler/VisitorManager.java
...io/shardingsphere/core/parsing/antler/VisitorManager.java
+9
-3
sharding-jdbc-ddl-parser/src/main/java/io/shardingsphere/core/parsing/antler/visitor/AlterTableVisitor.java
...sphere/core/parsing/antler/visitor/AlterTableVisitor.java
+25
-7
sharding-jdbc-ddl-parser/src/main/java/io/shardingsphere/core/parsing/antler/visitor/mysql/MySQLAlterTableVisitor.java
.../parsing/antler/visitor/mysql/MySQLAlterTableVisitor.java
+115
-0
sharding-jdbc-ddl-parser/src/main/java/io/shardingsphere/core/parsing/antler/visitor/sqlserver/SQLServerAlterTableVisitor.java
.../antler/visitor/sqlserver/SQLServerAlterTableVisitor.java
+103
-0
未找到文件。
sharding-jdbc-ddl-parser/src/main/antlr4/io/shardingsphere/parser/antlr/mysql/MySQLAlterTable.g4
浏览文件 @
adbb9504
...
@@ -28,7 +28,7 @@ alterSpecification:
...
@@ -28,7 +28,7 @@ alterSpecification:
| FORCE
| FORCE
| lockOption
| lockOption
| modifyColumn
| modifyColumn
| (ORDER BY columnName (COMMA columnName)*
)+
| (ORDER BY columnName (COMMA columnName)*)+
| renameIndex
| renameIndex
| renameTable
| renameTable
| (WITHOUT|WITH) VALIDATION
| (WITHOUT|WITH) VALIDATION
...
...
sharding-jdbc-ddl-parser/src/main/java/io/shardingsphere/core/parsing/antler/VisitorManager.java
浏览文件 @
adbb9504
...
@@ -4,10 +4,13 @@ import java.util.HashMap;
...
@@ -4,10 +4,13 @@ import java.util.HashMap;
import
java.util.Map
;
import
java.util.Map
;
import
io.shardingsphere.core.constant.DatabaseType
;
import
io.shardingsphere.core.constant.DatabaseType
;
import
io.shardingsphere.core.parsing.antler.visitor.AlterTableVisitor
;
import
io.shardingsphere.core.parsing.antler.visitor.CreateTableVisitor
;
import
io.shardingsphere.core.parsing.antler.visitor.CreateTableVisitor
;
import
io.shardingsphere.core.parsing.antler.visitor.OnlyTableVisitor
;
import
io.shardingsphere.core.parsing.antler.visitor.OnlyTableVisitor
;
import
io.shardingsphere.core.parsing.antler.visitor.SQLVisitor
;
import
io.shardingsphere.core.parsing.antler.visitor.SQLVisitor
;
import
io.shardingsphere.core.parsing.antler.visitor.mysql.MySQLAlterTableVisitor
;
import
io.shardingsphere.core.parsing.antler.visitor.oracle.OracleAlterTableVisitor
;
import
io.shardingsphere.core.parsing.antler.visitor.postgre.PostgreAlterTableVisitor
;
import
io.shardingsphere.core.parsing.antler.visitor.sqlserver.SQLServerAlterTableVisitor
;
public
class
VisitorManager
{
public
class
VisitorManager
{
private
Map
<
String
,
SQLVisitor
>
visitors
=
new
HashMap
<
String
,
SQLVisitor
>();
private
Map
<
String
,
SQLVisitor
>
visitors
=
new
HashMap
<
String
,
SQLVisitor
>();
...
@@ -15,7 +18,10 @@ public class VisitorManager {
...
@@ -15,7 +18,10 @@ public class VisitorManager {
private
VisitorManager
()
{
private
VisitorManager
()
{
visitors
.
put
(
"CreateTable"
,
new
CreateTableVisitor
());
visitors
.
put
(
"CreateTable"
,
new
CreateTableVisitor
());
visitors
.
put
(
"AlterTable"
,
new
AlterTableVisitor
());
visitors
.
put
(
DatabaseType
.
MySQL
+
"AlterTable"
,
new
MySQLAlterTableVisitor
());
visitors
.
put
(
DatabaseType
.
PostgreSQL
+
"AlterTable"
,
new
PostgreAlterTableVisitor
());
visitors
.
put
(
DatabaseType
.
Oracle
+
"AlterTable"
,
new
OracleAlterTableVisitor
());
visitors
.
put
(
DatabaseType
.
SQLServer
+
"AlterTable"
,
new
SQLServerAlterTableVisitor
());
visitors
.
put
(
"DropTable"
,
new
OnlyTableVisitor
());
visitors
.
put
(
"DropTable"
,
new
OnlyTableVisitor
());
visitors
.
put
(
"TruncateTable"
,
new
OnlyTableVisitor
());
visitors
.
put
(
"TruncateTable"
,
new
OnlyTableVisitor
());
}
}
...
@@ -32,7 +38,7 @@ public class VisitorManager {
...
@@ -32,7 +38,7 @@ public class VisitorManager {
* @return
* @return
*/
*/
public
SQLVisitor
getVisitor
(
final
DatabaseType
dbType
,
final
String
commandName
)
{
public
SQLVisitor
getVisitor
(
final
DatabaseType
dbType
,
final
String
commandName
)
{
String
key
=
dbType
.
name
()
+
"-"
+
commandName
;
String
key
=
dbType
.
name
()
+
commandName
;
SQLVisitor
visitor
=
visitors
.
get
(
key
);
SQLVisitor
visitor
=
visitors
.
get
(
key
);
if
(
visitor
!=
null
)
{
if
(
visitor
!=
null
)
{
return
visitor
;
return
visitor
;
...
...
sharding-jdbc-ddl-parser/src/main/java/io/shardingsphere/core/parsing/antler/visitor/AlterTableVisitor.java
浏览文件 @
adbb9504
package
io.shardingsphere.core.parsing.antler.visitor
;
package
io.shardingsphere.core.parsing.antler.visitor
;
import
org.antlr.v4.runtime.ParserRuleContext
;
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.utils.VisitorUtils
;
import
io.shardingsphere.core.parsing.parser.sql.SQLStatement
;
import
io.shardingsphere.core.parsing.parser.sql.SQLStatement
;
public
class
AlterTableVisitor
extends
AbstractSQLVisitor
{
public
abstract
class
AlterTableVisitor
extends
AbstractSQLVisitor
{
@Override
@Override
protected
SQLStatement
newStatement
()
{
protected
SQLStatement
newStatement
()
{
// TODO Auto-generated method stub
return
new
AlterTableStatement
();
return
null
;
}
}
@Override
@Override
protected
void
visit
(
final
ParserRuleContext
rootNode
,
final
SQLStatement
statement
)
{
protected
final
void
visit
(
final
ParserRuleContext
rootNode
,
final
SQLStatement
statement
)
{
// TODO Auto-generated method stub
AlterTableStatement
alterStatement
=
(
AlterTableStatement
)
statement
;
VisitorUtils
.
parseTable
(
statement
,
rootNode
);
if
(
VisitorUtils
.
parseRenameTable
(
alterStatement
,
rootNode
))
{
return
;
}
VisitorUtils
.
parseAddColumn
(
alterStatement
,
rootNode
);
VisitorUtils
.
visitDropColumn
(
alterStatement
,
rootNode
);
visitPrivateTree
(
alterStatement
,
rootNode
);
}
}
/**
* Visit private ast nodes.
*
* @param statement
* statement parse result
* @param rootNode
* Root node of syntax tree
*/
protected
abstract
void
visitPrivateTree
(
final
AlterTableStatement
statement
,
final
ParseTree
rootNode
);
}
}
sharding-jdbc-ddl-parser/src/main/java/io/shardingsphere/core/parsing/antler/visitor/mysql/MySQLAlterTableVisitor.java
0 → 100644
浏览文件 @
adbb9504
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
;
import
io.shardingsphere.core.parsing.parser.token.IndexToken
;
public
class
MySQLAlterTableVisitor
extends
AlterTableVisitor
{
@Override
protected
void
visitPrivateTree
(
AlterTableStatement
statement
,
ParseTree
rootNode
)
{
visitAddIndex
(
statement
,
rootNode
);
visitDropIndex
(
statement
,
rootNode
);
visitAddPrimaryKey
(
statement
,
rootNode
);
VisitorUtils
.
parseModifyColumn
(
statement
,
rootNode
);
VisitorUtils
.
parseRenameIndex
(
statement
,
rootNode
);
VisitorUtils
.
parseAddPrimaryKey
(
statement
,
rootNode
);
VisitorUtils
.
parseDropPrimaryKey
(
statement
,
rootNode
);
}
/**
* Visit add index node.
*
* @param statement
* statement parse result
* @param ancestorNode
* ancestor of index node
* @return indexName node
*/
protected
void
visitAddIndex
(
final
AlterTableStatement
statement
,
final
ParseTree
rootNode
)
{
ParserRuleContext
indexDefOptionNode
=
(
ParserRuleContext
)
TreeUtils
.
getFirstChildByRuleName
(
rootNode
,
"indexDefOption"
);
if
(
null
!=
indexDefOptionNode
)
{
ParserRuleContext
indexNameNode
=
(
ParserRuleContext
)
TreeUtils
.
getFirstChildByRuleName
(
indexDefOptionNode
,
"indexName"
);
if
(
null
!=
indexNameNode
)
{
statement
.
getSqlTokens
().
add
(
new
IndexToken
(
indexNameNode
.
getStart
().
getStartIndex
(),
indexNameNode
.
getText
(),
statement
.
getTables
().
getSingleTableName
()));
}
}
}
/**
* Visit drop index node.
*
* @param statement
* statement parse result
* @param ancestorNode
* ancestor of index node
* @return indexName node
*/
protected
void
visitDropIndex
(
final
AlterTableStatement
statement
,
final
ParseTree
ancestorNode
)
{
ParserRuleContext
dropIndexDefNode
=
(
ParserRuleContext
)
TreeUtils
.
getFirstChildByRuleName
(
ancestorNode
,
"dropIndexDef"
);
if
(
null
==
dropIndexDefNode
)
{
return
;
}
ParserRuleContext
indexNameNode
=
(
ParserRuleContext
)
dropIndexDefNode
.
getChild
(
dropIndexDefNode
.
getChildCount
()
-
1
);
if
(
null
!=
indexNameNode
)
{
statement
.
getSqlTokens
().
add
(
new
IndexToken
(
indexNameNode
.
getStart
().
getStartIndex
(),
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/sqlserver/SQLServerAlterTableVisitor.java
0 → 100644
浏览文件 @
adbb9504
package
io.shardingsphere.core.parsing.antler.visitor.sqlserver
;
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.visitor.AlterTableVisitor
;
import
io.shardingsphere.core.parsing.parser.token.IndexToken
;
public
class
SQLServerAlterTableVisitor
extends
AlterTableVisitor
{
protected
void
visitPrivateTree
(
final
AlterTableStatement
statement
,
final
ParseTree
rootNode
)
{
visitAddIndex
(
statement
,
rootNode
);
visitDropIndex
(
statement
,
rootNode
);
visitAddPrimaryKey
(
statement
,
rootNode
);
//drop primary key need use drop constraint
}
/**
* Visit add index node.
*
* @param statement
* statement parse result
* @param ancestorNode
* ancestor of index node
* @return indexName node
*/
protected
void
visitAddIndex
(
final
AlterTableStatement
statement
,
final
ParseTree
ancestorNode
)
{
ParserRuleContext
indexDefOptionNode
=
(
ParserRuleContext
)
TreeUtils
.
getFirstChildByRuleName
(
ancestorNode
,
"addColumn"
);
if
(
null
!=
indexDefOptionNode
)
{
ParserRuleContext
indexNameNode
=
(
ParserRuleContext
)
TreeUtils
.
getFirstChildByRuleName
(
indexDefOptionNode
,
"indexName"
);
if
(
null
!=
indexNameNode
)
{
statement
.
getSqlTokens
().
add
(
new
IndexToken
(
indexNameNode
.
getStart
().
getStartIndex
(),
indexNameNode
.
getText
(),
statement
.
getTables
().
getSingleTableName
()));
}
}
}
/**
* Visit drop index node.
*
* @param statement
* statement parse result
* @param ancestorNode
* ancestor of index node
* @return indexName node
*/
protected
void
visitDropIndex
(
final
AlterTableStatement
statement
,
final
ParseTree
ancestorNode
)
{
ParserRuleContext
indexDefOptionNode
=
(
ParserRuleContext
)
TreeUtils
.
getFirstChildByRuleName
(
ancestorNode
,
"alterDropIndex"
);
if
(
null
!=
indexDefOptionNode
)
{
ParserRuleContext
indexNameNode
=
(
ParserRuleContext
)
TreeUtils
.
getFirstChildByRuleName
(
indexDefOptionNode
,
"indexName"
);
if
(
null
!=
indexNameNode
)
{
statement
.
getSqlTokens
().
add
(
new
IndexToken
(
indexNameNode
.
getStart
().
getStartIndex
(),
indexNameNode
.
getText
(),
statement
.
getTables
().
getSingleTableName
()));
}
}
}
/**
* Visit drop index node.
*
* @param statement
* statement parse result
* @param ancestorNode
* ancestor of index node
* @return indexName node
*/
protected
void
visitAddPrimaryKey
(
final
AlterTableStatement
statement
,
final
ParseTree
ancestorNode
)
{
ParserRuleContext
addColumnCtx
=
(
ParserRuleContext
)
TreeUtils
.
getFirstChildByRuleName
(
ancestorNode
,
"addColumn"
);
if
(
null
==
addColumnCtx
)
{
return
;
}
List
<
ParseTree
>
alterColumnAddOptionCtxs
=
TreeUtils
.
getAllDescendantByRuleName
(
addColumnCtx
,
"alterColumnAddOption"
);
if
(
null
==
alterColumnAddOptionCtxs
)
{
return
;
}
for
(
ParseTree
each
:
alterColumnAddOptionCtxs
)
{
ParserRuleContext
primaryKeyNode
=
(
ParserRuleContext
)
TreeUtils
.
getFirstChildByRuleName
(
each
,
"primaryKey"
);
if
(
null
==
primaryKeyNode
)
{
continue
;
}
List
<
ParseTree
>
columnNameCtxs
=
TreeUtils
.
getAllDescendantByRuleName
(
each
,
"columnName"
);
for
(
ParseTree
columnNameCtx
:
columnNameCtxs
)
{
statement
.
getUpdateColumns
().
put
(
columnNameCtx
.
getText
(),
new
ColumnDefinition
(
columnNameCtx
.
getText
(),
null
,
null
,
true
));
}
}
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录