Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
apache
Shardingsphere
提交
b92d77a3
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,体验更适合开发者的 AI 搜索 >>
提交
b92d77a3
编写于
8月 21, 2017
作者:
T
terrymanu
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
refactor parametersIndex from AbstractParser to SQLStatement
上级
0b509a99
变更
13
隐藏空白更改
内联
并排
Showing
13 changed file
with
126 addition
and
109 deletion
+126
-109
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/SQLParsingEngine.java
...ngdang/ddframe/rdb/sharding/parsing/SQLParsingEngine.java
+3
-1
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/AbstractParser.java
...g/ddframe/rdb/sharding/parsing/parser/AbstractParser.java
+4
-13
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/AbstractSQLParser.java
...dframe/rdb/sharding/parsing/parser/AbstractSQLParser.java
+17
-22
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/dialect/mysql/MySQLInsertParser.java
...rding/parsing/parser/dialect/mysql/MySQLInsertParser.java
+2
-2
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/dialect/mysql/MySQLSelectParser.java
...rding/parsing/parser/dialect/mysql/MySQLSelectParser.java
+5
-5
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/dialect/oracle/OracleSelectParser.java
...ing/parsing/parser/dialect/oracle/OracleSelectParser.java
+33
-33
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/dialect/sqlserver/SQLServerSelectParser.java
...rsing/parser/dialect/sqlserver/SQLServerSelectParser.java
+5
-5
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/statement/AbstractSQLStatement.java
...arding/parsing/parser/statement/AbstractSQLStatement.java
+9
-0
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/statement/SQLStatement.java
...e/rdb/sharding/parsing/parser/statement/SQLStatement.java
+21
-0
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/statement/dml/insert/AbstractInsertParser.java
...ing/parser/statement/dml/insert/AbstractInsertParser.java
+4
-4
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/statement/dml/update/AbstractUpdateParser.java
...ing/parser/statement/dml/update/AbstractUpdateParser.java
+3
-3
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/statement/dql/select/AbstractSelectParser.java
...ing/parser/statement/dql/select/AbstractSelectParser.java
+9
-21
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/statement/dql/select/SelectStatement.java
.../parsing/parser/statement/dql/select/SelectStatement.java
+11
-0
未找到文件。
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/SQLParsingEngine.java
浏览文件 @
b92d77a3
...
...
@@ -36,6 +36,7 @@ import com.dangdang.ddframe.rdb.sharding.parsing.parser.statement.dml.insert.Ins
import
com.dangdang.ddframe.rdb.sharding.parsing.parser.statement.dql.select.SelectParserFactory
;
import
com.dangdang.ddframe.rdb.sharding.parsing.parser.statement.ddl.truncate.TruncateParserFactory
;
import
com.dangdang.ddframe.rdb.sharding.parsing.parser.statement.dml.update.UpdateParserFactory
;
import
com.dangdang.ddframe.rdb.sharding.parsing.parser.statement.dql.select.SelectStatement
;
import
lombok.RequiredArgsConstructor
;
/**
...
...
@@ -116,7 +117,8 @@ public final class SQLParsingEngine {
do
{
sqlParser
.
skipUntil
(
DefaultKeyword
.
AS
);
sqlParser
.
accept
(
DefaultKeyword
.
AS
);
sqlParser
.
skipParentheses
();
// TODO with 中包含 ? 无法获取
sqlParser
.
skipParentheses
(
new
SelectStatement
());
}
while
(
sqlParser
.
skipIfEqual
(
Symbol
.
COMMA
));
}
}
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/AbstractParser.java
浏览文件 @
b92d77a3
...
...
@@ -22,6 +22,7 @@ import com.dangdang.ddframe.rdb.sharding.parsing.lexer.token.Assist;
import
com.dangdang.ddframe.rdb.sharding.parsing.lexer.token.Symbol
;
import
com.dangdang.ddframe.rdb.sharding.parsing.lexer.token.TokenType
;
import
com.dangdang.ddframe.rdb.sharding.parsing.parser.exception.SQLParsingException
;
import
com.dangdang.ddframe.rdb.sharding.parsing.parser.statement.SQLStatement
;
import
com.google.common.collect.Sets
;
import
lombok.Getter
;
import
lombok.RequiredArgsConstructor
;
...
...
@@ -41,23 +42,13 @@ public abstract class AbstractParser {
private
final
Lexer
lexer
;
private
int
parametersIndex
;
/**
* 增加索引偏移量.
*
* @return 增加后的索引偏移量
*/
public
int
increaseParametersIndex
()
{
return
++
parametersIndex
;
}
/**
* 跳过小括号内所有的词法标记.
*
* @param sqlStatement SQL语句对象
* @return 小括号内所有的词法标记
*/
public
final
String
skipParentheses
()
{
public
final
String
skipParentheses
(
final
SQLStatement
sqlStatement
)
{
StringBuilder
result
=
new
StringBuilder
(
""
);
int
count
=
0
;
if
(
Symbol
.
LEFT_PAREN
==
lexer
.
getCurrentToken
().
getType
())
{
...
...
@@ -66,7 +57,7 @@ public abstract class AbstractParser {
lexer
.
nextToken
();
while
(
true
)
{
if
(
equalAny
(
Symbol
.
QUESTION
))
{
increaseParametersIndex
();
sqlStatement
.
increaseParametersIndex
();
}
if
(
Assist
.
END
==
lexer
.
getCurrentToken
().
getType
()
||
(
Symbol
.
RIGHT_PAREN
==
lexer
.
getCurrentToken
().
getType
()
&&
0
==
count
))
{
break
;
...
...
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/AbstractSQLParser.java
浏览文件 @
b92d77a3
...
...
@@ -69,43 +69,38 @@ public abstract class AbstractSQLParser extends AbstractParser {
*/
public
final
SQLExpression
parseExpression
(
final
SQLStatement
sqlStatement
)
{
int
beginPosition
=
getLexer
().
getCurrentToken
().
getEndPosition
();
SQLExpression
result
=
parseExpression
(
);
SQLExpression
result
=
parseExpression
Internal
(
sqlStatement
);
if
(
result
instanceof
SQLPropertyExpression
)
{
setTableToken
(
sqlStatement
,
beginPosition
,
(
SQLPropertyExpression
)
result
);
}
return
result
;
}
/**
* 解析表达式.
*
* @return 表达式
*/
// TODO 完善Expression解析的各种场景
p
ublic
final
SQLExpression
parseExpression
(
)
{
p
rivate
SQLExpression
parseExpressionInternal
(
final
SQLStatement
sqlStatement
)
{
String
literals
=
getLexer
().
getCurrentToken
().
getLiterals
();
final
int
beginPosition
=
getLexer
().
getCurrentToken
().
getEndPosition
()
-
literals
.
length
();
final
SQLExpression
expression
=
getExpression
(
literals
);
final
SQLExpression
expression
=
getExpression
(
literals
,
sqlStatement
);
getLexer
().
nextToken
();
if
(
skipIfEqual
(
Symbol
.
DOT
))
{
String
property
=
getLexer
().
getCurrentToken
().
getLiterals
();
getLexer
().
nextToken
();
return
skipIfCompositeExpression
()
?
new
SQLIgnoreExpression
(
getLexer
().
getInput
().
substring
(
beginPosition
,
getLexer
().
getCurrentToken
().
getEndPosition
()))
return
skipIfCompositeExpression
(
sqlStatement
)
?
new
SQLIgnoreExpression
(
getLexer
().
getInput
().
substring
(
beginPosition
,
getLexer
().
getCurrentToken
().
getEndPosition
()))
:
new
SQLPropertyExpression
(
new
SQLIdentifierExpression
(
literals
),
property
);
}
if
(
equalAny
(
Symbol
.
LEFT_PAREN
))
{
skipParentheses
();
skipRestCompositeExpression
();
skipParentheses
(
sqlStatement
);
skipRestCompositeExpression
(
sqlStatement
);
return
new
SQLIgnoreExpression
(
getLexer
().
getInput
().
substring
(
beginPosition
,
getLexer
().
getCurrentToken
().
getEndPosition
()
-
getLexer
().
getCurrentToken
().
getLiterals
().
length
()).
trim
());
}
return
skipIfCompositeExpression
()
?
new
SQLIgnoreExpression
(
getLexer
().
getInput
().
substring
(
beginPosition
,
getLexer
().
getCurrentToken
().
getEndPosition
()))
:
expression
;
return
skipIfCompositeExpression
(
sqlStatement
)
?
new
SQLIgnoreExpression
(
getLexer
().
getInput
().
substring
(
beginPosition
,
getLexer
().
getCurrentToken
().
getEndPosition
()))
:
expression
;
}
private
SQLExpression
getExpression
(
final
String
literals
)
{
private
SQLExpression
getExpression
(
final
String
literals
,
final
SQLStatement
sqlStatement
)
{
if
(
equalAny
(
Symbol
.
QUESTION
))
{
increaseParametersIndex
();
return
new
SQLPlaceholderExpression
(
getParametersIndex
()
-
1
);
sqlStatement
.
increaseParametersIndex
();
return
new
SQLPlaceholderExpression
(
sqlStatement
.
getParametersIndex
()
-
1
);
}
if
(
equalAny
(
Literals
.
CHARS
))
{
return
new
SQLTextExpression
(
literals
);
...
...
@@ -125,28 +120,28 @@ public abstract class AbstractSQLParser extends AbstractParser {
return
new
SQLIgnoreExpression
(
literals
);
}
private
boolean
skipIfCompositeExpression
()
{
private
boolean
skipIfCompositeExpression
(
final
SQLStatement
sqlStatement
)
{
if
(
equalAny
(
Symbol
.
PLUS
,
Symbol
.
SUB
,
Symbol
.
STAR
,
Symbol
.
SLASH
,
Symbol
.
PERCENT
,
Symbol
.
AMP
,
Symbol
.
BAR
,
Symbol
.
DOUBLE_AMP
,
Symbol
.
DOUBLE_BAR
,
Symbol
.
CARET
,
Symbol
.
DOT
,
Symbol
.
LEFT_PAREN
))
{
skipParentheses
();
skipRestCompositeExpression
();
skipParentheses
(
sqlStatement
);
skipRestCompositeExpression
(
sqlStatement
);
return
true
;
}
return
false
;
}
private
void
skipRestCompositeExpression
()
{
private
void
skipRestCompositeExpression
(
final
SQLStatement
sqlStatement
)
{
while
(
skipIfEqual
(
Symbol
.
PLUS
,
Symbol
.
SUB
,
Symbol
.
STAR
,
Symbol
.
SLASH
,
Symbol
.
PERCENT
,
Symbol
.
AMP
,
Symbol
.
BAR
,
Symbol
.
DOUBLE_AMP
,
Symbol
.
DOUBLE_BAR
,
Symbol
.
CARET
,
Symbol
.
DOT
))
{
if
(
equalAny
(
Symbol
.
QUESTION
))
{
increaseParametersIndex
();
sqlStatement
.
increaseParametersIndex
();
}
getLexer
().
nextToken
();
skipParentheses
();
skipParentheses
(
sqlStatement
);
}
}
private
void
setTableToken
(
final
SQLStatement
sqlStatement
,
final
int
beginPosition
,
final
SQLPropertyExpression
propertyExpr
)
{
String
owner
=
propertyExpr
.
getOwner
().
getName
();
if
(
!
sqlStatement
.
getTables
().
isEmpty
()
&&
sqlStatement
.
getTables
().
getSingleTableName
().
equalsIgnoreCase
(
SQLUtil
.
getExactlyValue
(
owner
)))
{
if
(
sqlStatement
.
getTables
().
getTableNames
().
contains
(
SQLUtil
.
getExactlyValue
(
propertyExpr
.
getOwner
().
getName
()
)))
{
sqlStatement
.
getSqlTokens
().
add
(
new
TableToken
(
beginPosition
-
owner
.
length
(),
owner
));
}
}
...
...
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/dialect/mysql/MySQLInsertParser.java
浏览文件 @
b92d77a3
...
...
@@ -67,8 +67,8 @@ public final class MySQLInsertParser extends AbstractInsertParser {
}
else
if
(
getSqlParser
().
equalAny
(
DefaultKeyword
.
NULL
))
{
sqlExpression
=
new
SQLIgnoreExpression
(
DefaultKeyword
.
NULL
.
name
());
}
else
if
(
getSqlParser
().
equalAny
(
Symbol
.
QUESTION
))
{
sqlExpression
=
new
SQLPlaceholderExpression
(
getSqlParser
()
.
getParametersIndex
());
getSqlParser
()
.
increaseParametersIndex
();
sqlExpression
=
new
SQLPlaceholderExpression
(
insertStatement
.
getParametersIndex
());
insertStatement
.
increaseParametersIndex
();
}
else
{
throw
new
UnsupportedOperationException
(
""
);
}
...
...
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/dialect/mysql/MySQLSelectParser.java
浏览文件 @
b92d77a3
...
...
@@ -169,20 +169,20 @@ public final class MySQLSelectParser extends AbstractSelectParser {
}
if
(
getSqlParser
().
equalAny
(
DefaultKeyword
.
USE
))
{
getSqlParser
().
getLexer
().
nextToken
();
skipIndexHint
();
skipIndexHint
(
selectStatement
);
}
if
(
getSqlParser
().
equalAny
(
OracleKeyword
.
IGNORE
))
{
getSqlParser
().
getLexer
().
nextToken
();
skipIndexHint
();
skipIndexHint
(
selectStatement
);
}
if
(
getSqlParser
().
equalAny
(
OracleKeyword
.
FORCE
))
{
getSqlParser
().
getLexer
().
nextToken
();
skipIndexHint
();
skipIndexHint
(
selectStatement
);
}
super
.
parseJoinTable
(
selectStatement
);
}
private
void
skipIndexHint
()
{
private
void
skipIndexHint
(
final
SelectStatement
selectStatement
)
{
if
(
getSqlParser
().
equalAny
(
DefaultKeyword
.
INDEX
))
{
getSqlParser
().
getLexer
().
nextToken
();
}
else
{
...
...
@@ -200,7 +200,7 @@ public final class MySQLSelectParser extends AbstractSelectParser {
getSqlParser
().
accept
(
DefaultKeyword
.
BY
);
}
}
getSqlParser
().
skipParentheses
();
getSqlParser
().
skipParentheses
(
selectStatement
);
}
@Override
...
...
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/dialect/oracle/OracleSelectParser.java
浏览文件 @
b92d77a3
...
...
@@ -52,9 +52,9 @@ public final class OracleSelectParser extends AbstractSelectParser {
skipHierarchicalQueryClause
(
selectStatement
);
parseGroupBy
(
selectStatement
);
parseHaving
();
skipModelClause
();
skipModelClause
(
selectStatement
);
parseOrderBy
(
selectStatement
);
skipFor
();
skipFor
(
selectStatement
);
parseRest
();
}
...
...
@@ -84,7 +84,7 @@ public final class OracleSelectParser extends AbstractSelectParser {
getSqlParser
().
parseComparisonCondition
(
getShardingRule
(),
selectStatement
,
Collections
.<
SelectItem
>
emptyList
());
}
private
void
skipModelClause
()
{
private
void
skipModelClause
(
final
SelectStatement
selectStatement
)
{
if
(!
getSqlParser
().
skipIfEqual
(
OracleKeyword
.
MODEL
))
{
return
;
}
...
...
@@ -96,11 +96,11 @@ public final class OracleSelectParser extends AbstractSelectParser {
while
(
getSqlParser
().
skipIfEqual
(
OracleKeyword
.
REFERENCE
))
{
getSqlParser
().
getLexer
().
nextToken
();
getSqlParser
().
accept
(
DefaultKeyword
.
ON
);
getSqlParser
().
skipParentheses
();
getSqlParser
().
skipParentheses
(
selectStatement
);
skipModelColumnClause
();
skipCellReferenceOptions
();
}
skipMainModelClause
();
skipMainModelClause
(
selectStatement
);
}
private
void
skipCellReferenceOptions
()
{
...
...
@@ -115,21 +115,21 @@ public final class OracleSelectParser extends AbstractSelectParser {
}
}
private
void
skipMainModelClause
()
{
private
void
skipMainModelClause
(
final
SelectStatement
selectStatement
)
{
if
(
getSqlParser
().
skipIfEqual
(
OracleKeyword
.
MAIN
))
{
getSqlParser
().
getLexer
().
nextToken
();
}
skipQueryPartitionClause
();
skipQueryPartitionClause
(
selectStatement
);
getSqlParser
().
accept
(
OracleKeyword
.
DIMENSION
);
getSqlParser
().
accept
(
DefaultKeyword
.
BY
);
getSqlParser
().
skipParentheses
();
getSqlParser
().
skipParentheses
(
selectStatement
);
getSqlParser
().
accept
(
OracleKeyword
.
MEASURES
);
getSqlParser
().
skipParentheses
();
getSqlParser
().
skipParentheses
(
selectStatement
);
skipCellReferenceOptions
();
skipModelRulesClause
();
skipModelRulesClause
(
selectStatement
);
}
private
void
skipModelRulesClause
()
{
private
void
skipModelRulesClause
(
final
SelectStatement
selectStatement
)
{
if
(
getSqlParser
().
skipIfEqual
(
OracleKeyword
.
RULES
))
{
getSqlParser
().
skipIfEqual
(
DefaultKeyword
.
UPDATE
);
getSqlParser
().
skipIfEqual
(
OracleKeyword
.
UPSERT
);
...
...
@@ -140,15 +140,15 @@ public final class OracleSelectParser extends AbstractSelectParser {
}
}
if
(
getSqlParser
().
skipIfEqual
(
DefaultKeyword
.
ITERATE
))
{
getSqlParser
().
skipParentheses
();
getSqlParser
().
skipParentheses
(
selectStatement
);
if
(
getSqlParser
().
skipIfEqual
(
DefaultKeyword
.
UNTIL
))
{
getSqlParser
().
skipParentheses
();
getSqlParser
().
skipParentheses
(
selectStatement
);
}
}
getSqlParser
().
skipParentheses
();
getSqlParser
().
skipParentheses
(
selectStatement
);
}
private
void
skipQueryPartitionClause
()
{
private
void
skipQueryPartitionClause
(
final
SelectStatement
selectStatement
)
{
if
(!
getSqlParser
().
skipIfEqual
(
OracleKeyword
.
PARTITION
))
{
return
;
}
...
...
@@ -156,21 +156,21 @@ public final class OracleSelectParser extends AbstractSelectParser {
if
(!
getSqlParser
().
equalAny
(
Symbol
.
LEFT_PAREN
))
{
throw
new
UnsupportedOperationException
(
"Cannot support PARTITION BY without ()"
);
}
getSqlParser
().
skipParentheses
();
getSqlParser
().
skipParentheses
(
selectStatement
);
}
private
void
skipModelColumnClause
()
{
throw
new
SQLParsingUnsupportedException
(
getSqlParser
().
getLexer
().
getCurrentToken
().
getType
());
}
private
void
skipFor
()
{
private
void
skipFor
(
final
SelectStatement
selectStatement
)
{
if
(!
getSqlParser
().
skipIfEqual
(
DefaultKeyword
.
FOR
))
{
return
;
}
getSqlParser
().
accept
(
DefaultKeyword
.
UPDATE
);
if
(
getSqlParser
().
skipIfEqual
(
DefaultKeyword
.
OF
))
{
do
{
getSqlParser
().
parseExpression
();
getSqlParser
().
parseExpression
(
selectStatement
);
}
while
(
getSqlParser
().
skipIfEqual
(
Symbol
.
COMMA
));
}
if
(
getSqlParser
().
equalAny
(
OracleKeyword
.
NOWAIT
,
OracleKeyword
.
WAIT
))
{
...
...
@@ -189,40 +189,40 @@ public final class OracleSelectParser extends AbstractSelectParser {
skipFlashbackQueryClause
();
}
else
{
parseQueryTableExpression
(
selectStatement
);
skipPivotClause
();
skipPivotClause
(
selectStatement
);
skipFlashbackQueryClause
();
}
}
private
void
parseQueryTableExpression
(
final
SelectStatement
selectStatement
)
{
parseTableFactorInternal
(
selectStatement
);
parseSample
();
skipPartition
();
parseSample
(
selectStatement
);
skipPartition
(
selectStatement
);
}
private
void
parseSample
()
{
private
void
parseSample
(
final
SelectStatement
selectStatement
)
{
if
(!
getSqlParser
().
skipIfEqual
(
OracleKeyword
.
SAMPLE
))
{
return
;
}
getSqlParser
().
skipIfEqual
(
OracleKeyword
.
BLOCK
);
getSqlParser
().
skipParentheses
();
getSqlParser
().
skipParentheses
(
selectStatement
);
if
(
getSqlParser
().
skipIfEqual
(
OracleKeyword
.
SEED
))
{
getSqlParser
().
skipParentheses
();
getSqlParser
().
skipParentheses
(
selectStatement
);
}
}
private
void
skipPartition
()
{
skipPartition
(
OracleKeyword
.
PARTITION
);
skipPartition
(
OracleKeyword
.
SUBPARTITION
);
private
void
skipPartition
(
final
SelectStatement
selectStatement
)
{
skipPartition
(
selectStatement
,
OracleKeyword
.
PARTITION
);
skipPartition
(
selectStatement
,
OracleKeyword
.
SUBPARTITION
);
}
private
void
skipPartition
(
final
OracleKeyword
keyword
)
{
private
void
skipPartition
(
final
SelectStatement
selectStatement
,
final
OracleKeyword
keyword
)
{
if
(!
getSqlParser
().
skipIfEqual
(
keyword
))
{
return
;
}
getSqlParser
().
skipParentheses
();
getSqlParser
().
skipParentheses
(
selectStatement
);
if
(
getSqlParser
().
skipIfEqual
(
DefaultKeyword
.
FOR
))
{
getSqlParser
().
skipParentheses
();
getSqlParser
().
skipParentheses
(
selectStatement
);
}
}
...
...
@@ -241,17 +241,17 @@ public final class OracleSelectParser extends AbstractSelectParser {
&&
(
getSqlParser
().
skipIfEqual
(
OracleKeyword
.
SCN
)
||
getSqlParser
().
skipIfEqual
(
OracleKeyword
.
TIMESTAMP
));
}
private
void
skipPivotClause
()
{
private
void
skipPivotClause
(
final
SelectStatement
selectStatement
)
{
if
(
getSqlParser
().
skipIfEqual
(
OracleKeyword
.
PIVOT
))
{
getSqlParser
().
skipIfEqual
(
OracleKeyword
.
XML
);
getSqlParser
().
skipParentheses
();
getSqlParser
().
skipParentheses
(
selectStatement
);
}
else
if
(
getSqlParser
().
skipIfEqual
(
OracleKeyword
.
UNPIVOT
))
{
if
(
getSqlParser
().
skipIfEqual
(
OracleKeyword
.
INCLUDE
))
{
getSqlParser
().
accept
(
OracleKeyword
.
NULLS
);
}
else
if
(
getSqlParser
().
skipIfEqual
(
OracleKeyword
.
EXCLUDE
))
{
getSqlParser
().
accept
(
OracleKeyword
.
NULLS
);
}
getSqlParser
().
skipParentheses
();
getSqlParser
().
skipParentheses
(
selectStatement
);
}
}
...
...
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/dialect/sqlserver/SQLServerSelectParser.java
浏览文件 @
b92d77a3
...
...
@@ -70,7 +70,7 @@ public final class SQLServerSelectParser extends AbstractSelectParser {
if
(!
getSqlParser
().
skipIfEqual
(
Symbol
.
LEFT_PAREN
))
{
beginPosition
=
getSqlParser
().
getLexer
().
getCurrentToken
().
getEndPosition
()
-
getSqlParser
().
getLexer
().
getCurrentToken
().
getLiterals
().
length
();
}
SQLExpression
sqlExpression
=
getSqlParser
().
parseExpression
();
SQLExpression
sqlExpression
=
getSqlParser
().
parseExpression
(
selectStatement
);
getSqlParser
().
skipIfEqual
(
Symbol
.
RIGHT_PAREN
);
LimitValue
rowCountValue
;
if
(
sqlExpression
instanceof
SQLNumberExpression
)
{
...
...
@@ -105,7 +105,7 @@ public final class SQLServerSelectParser extends AbstractSelectParser {
offsetValue
=
Integer
.
parseInt
(
getSqlParser
().
getLexer
().
getCurrentToken
().
getLiterals
());
}
else
if
(
getSqlParser
().
equalAny
(
Symbol
.
QUESTION
))
{
offsetIndex
=
getParametersIndex
();
getSqlParser
()
.
increaseParametersIndex
();
selectStatement
.
increaseParametersIndex
();
}
else
{
throw
new
SQLParsingException
(
getSqlParser
().
getLexer
());
}
...
...
@@ -120,7 +120,7 @@ public final class SQLServerSelectParser extends AbstractSelectParser {
rowCountValue
=
Integer
.
parseInt
(
getSqlParser
().
getLexer
().
getCurrentToken
().
getLiterals
());
}
else
if
(
getSqlParser
().
equalAny
(
Symbol
.
QUESTION
))
{
rowCountIndex
=
getParametersIndex
();
getSqlParser
()
.
increaseParametersIndex
();
selectStatement
.
increaseParametersIndex
();
}
else
{
throw
new
SQLParsingException
(
getSqlParser
().
getLexer
());
}
...
...
@@ -167,7 +167,7 @@ public final class SQLServerSelectParser extends AbstractSelectParser {
@Override
protected
SelectItem
parseRowNumberSelectItem
(
final
SelectStatement
selectStatement
)
{
getSqlParser
().
skipParentheses
();
getSqlParser
().
skipParentheses
(
selectStatement
);
getSqlParser
().
accept
(
DefaultKeyword
.
OVER
);
getSqlParser
().
accept
(
Symbol
.
LEFT_PAREN
);
if
(
getSqlParser
().
equalAny
(
SQLServerKeyword
.
PARTITION
))
{
...
...
@@ -181,7 +181,7 @@ public final class SQLServerSelectParser extends AbstractSelectParser {
@Override
protected
void
parseJoinTable
(
final
SelectStatement
selectStatement
)
{
if
(
getSqlParser
().
skipIfEqual
(
DefaultKeyword
.
WITH
))
{
getSqlParser
().
skipParentheses
();
getSqlParser
().
skipParentheses
(
selectStatement
);
}
super
.
parseJoinTable
(
selectStatement
);
}
...
...
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/statement/AbstractSQLStatement.java
浏览文件 @
b92d77a3
...
...
@@ -23,6 +23,7 @@ import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.table.Tables;
import
com.dangdang.ddframe.rdb.sharding.parsing.parser.token.SQLToken
;
import
lombok.Getter
;
import
lombok.RequiredArgsConstructor
;
import
lombok.Setter
;
import
lombok.ToString
;
import
java.util.LinkedList
;
...
...
@@ -35,6 +36,7 @@ import java.util.List;
*/
@RequiredArgsConstructor
@Getter
@Setter
@ToString
public
abstract
class
AbstractSQLStatement
implements
SQLStatement
{
...
...
@@ -46,8 +48,15 @@ public abstract class AbstractSQLStatement implements SQLStatement {
private
final
List
<
SQLToken
>
sqlTokens
=
new
LinkedList
<>();
private
int
parametersIndex
;
@Override
public
final
SQLType
getType
()
{
return
type
;
}
@Override
public
int
increaseParametersIndex
()
{
return
++
parametersIndex
;
}
}
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/statement/SQLStatement.java
浏览文件 @
b92d77a3
...
...
@@ -58,4 +58,25 @@ public interface SQLStatement {
* @return SQL标记集合
*/
List
<
SQLToken
>
getSqlTokens
();
/**
* 获取索引偏移量.
*
* @return 索引偏移量
*/
int
getParametersIndex
();
/**
* 设置索引偏移量.
*
* @param parametersIndex 索引偏移量
*/
void
setParametersIndex
(
int
parametersIndex
);
/**
* 增加索引偏移量.
*
* @return 增加后的索引偏移量
*/
int
increaseParametersIndex
();
}
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/statement/dml/insert/AbstractInsertParser.java
浏览文件 @
b92d77a3
...
...
@@ -102,18 +102,18 @@ public abstract class AbstractInsertParser implements SQLStatementParser {
sqlParser
.
skipUntil
(
DefaultKeyword
.
INTO
);
sqlParser
.
getLexer
().
nextToken
();
sqlParser
.
parseSingleTable
(
insertStatement
);
skipBetweenTableAndValues
();
skipBetweenTableAndValues
(
insertStatement
);
}
protected
Keyword
[]
getUnsupportedKeywordsBeforeInto
()
{
return
new
Keyword
[
0
];
}
private
void
skipBetweenTableAndValues
()
{
private
void
skipBetweenTableAndValues
(
final
InsertStatement
insertStatement
)
{
while
(
sqlParser
.
skipIfEqual
(
getSkippedKeywordsBetweenTableAndValues
()))
{
sqlParser
.
getLexer
().
nextToken
();
if
(
sqlParser
.
equalAny
(
Symbol
.
LEFT_PAREN
))
{
sqlParser
.
skipParentheses
();
sqlParser
.
skipParentheses
(
insertStatement
);
}
}
}
...
...
@@ -152,7 +152,7 @@ public abstract class AbstractInsertParser implements SQLStatementParser {
sqlParser
.
accept
(
Symbol
.
LEFT_PAREN
);
List
<
SQLExpression
>
sqlExpressions
=
new
LinkedList
<>();
do
{
sqlExpressions
.
add
(
sqlParser
.
parseExpression
());
sqlExpressions
.
add
(
sqlParser
.
parseExpression
(
insertStatement
));
}
while
(
sqlParser
.
skipIfEqual
(
Symbol
.
COMMA
));
valuesListLastPosition
=
sqlParser
.
getLexer
().
getCurrentToken
().
getEndPosition
()
-
sqlParser
.
getLexer
().
getCurrentToken
().
getLiterals
().
length
();
int
count
=
0
;
...
...
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/statement/dml/update/AbstractUpdateParser.java
浏览文件 @
b92d77a3
...
...
@@ -57,7 +57,7 @@ public abstract class AbstractUpdateParser implements SQLStatementParser {
sqlParser
.
parseSingleTable
(
result
);
parseSetItems
(
result
);
sqlParser
.
skipUntil
(
DefaultKeyword
.
WHERE
);
sqlParser
.
setParametersIndex
(
parametersIndex
);
result
.
setParametersIndex
(
parametersIndex
);
sqlParser
.
parseWhere
(
shardingRule
,
result
);
return
result
;
}
...
...
@@ -85,7 +85,7 @@ public abstract class AbstractUpdateParser implements SQLStatementParser {
private
void
parseSetColumn
(
final
DMLStatement
updateStatement
)
{
if
(
sqlParser
.
equalAny
(
Symbol
.
LEFT_PAREN
))
{
sqlParser
.
skipParentheses
();
sqlParser
.
skipParentheses
(
updateStatement
);
return
;
}
int
beginPosition
=
sqlParser
.
getLexer
().
getCurrentToken
().
getEndPosition
();
...
...
@@ -101,6 +101,6 @@ public abstract class AbstractUpdateParser implements SQLStatementParser {
private
void
parseSetValue
(
final
DMLStatement
updateStatement
)
{
sqlParser
.
parseExpression
(
updateStatement
);
parametersIndex
=
sqlParser
.
getParametersIndex
();
parametersIndex
=
updateStatement
.
getParametersIndex
();
}
}
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/statement/dql/select/AbstractSelectParser.java
浏览文件 @
b92d77a3
...
...
@@ -132,7 +132,7 @@ public abstract class AbstractSelectParser implements SQLStatementParser {
selectStatement
.
setContainStar
(
true
);
result
=
parseStarSelectItem
();
}
else
if
(
isAggregationSelectItem
())
{
result
=
parseAggregationSelectItem
();
result
=
parseAggregationSelectItem
(
selectStatement
);
parseRestSelectItem
(
selectStatement
);
}
else
{
result
=
new
CommonSelectItem
(
SQLUtil
.
getExactlyValue
(
parseCommonSelectItem
(
selectStatement
)
+
parseRestSelectItem
(
selectStatement
)),
sqlParser
.
parseAlias
());
...
...
@@ -166,10 +166,10 @@ public abstract class AbstractSelectParser implements SQLStatementParser {
return
sqlParser
.
equalAny
(
DefaultKeyword
.
MAX
,
DefaultKeyword
.
MIN
,
DefaultKeyword
.
SUM
,
DefaultKeyword
.
AVG
,
DefaultKeyword
.
COUNT
);
}
private
SelectItem
parseAggregationSelectItem
()
{
private
SelectItem
parseAggregationSelectItem
(
final
SelectStatement
selectStatement
)
{
AggregationType
aggregationType
=
AggregationType
.
valueOf
(
sqlParser
.
getLexer
().
getCurrentToken
().
getLiterals
().
toUpperCase
());
sqlParser
.
getLexer
().
nextToken
();
return
new
AggregationSelectItem
(
aggregationType
,
sqlParser
.
skipParentheses
(),
sqlParser
.
parseAlias
());
return
new
AggregationSelectItem
(
aggregationType
,
sqlParser
.
skipParentheses
(
selectStatement
),
sqlParser
.
parseAlias
());
}
private
String
parseCommonSelectItem
(
final
SelectStatement
selectStatement
)
{
...
...
@@ -179,7 +179,7 @@ public abstract class AbstractSelectParser implements SQLStatementParser {
result
.
append
(
literals
);
sqlParser
.
getLexer
().
nextToken
();
if
(
sqlParser
.
equalAny
(
Symbol
.
LEFT_PAREN
))
{
result
.
append
(
sqlParser
.
skipParentheses
());
result
.
append
(
sqlParser
.
skipParentheses
(
selectStatement
));
}
else
if
(
sqlParser
.
equalAny
(
Symbol
.
DOT
))
{
String
tableName
=
SQLUtil
.
getExactlyValue
(
literals
);
if
(
shardingRule
.
tryFindTableRule
(
tableName
).
isPresent
()
||
shardingRule
.
findBindingTableRule
(
tableName
).
isPresent
())
{
...
...
@@ -250,32 +250,20 @@ public abstract class AbstractSelectParser implements SQLStatementParser {
parseTable
(
selectStatement
);
if
(
sqlParser
.
skipIfEqual
(
DefaultKeyword
.
ON
))
{
do
{
parseTableCondit
ion
(
selectStatement
);
sqlParser
.
parseExpress
ion
(
selectStatement
);
sqlParser
.
accept
(
Symbol
.
EQ
);
parseTableCondit
ion
(
selectStatement
);
sqlParser
.
parseExpress
ion
(
selectStatement
);
}
while
(
sqlParser
.
skipIfEqual
(
DefaultKeyword
.
AND
));
}
else
if
(
sqlParser
.
skipIfEqual
(
DefaultKeyword
.
USING
))
{
sqlParser
.
skipParentheses
();
sqlParser
.
skipParentheses
(
selectStatement
);
}
parseJoinTable
(
selectStatement
);
}
}
private
void
parseTableCondition
(
final
SelectStatement
selectStatement
)
{
int
startPosition
=
sqlParser
.
getLexer
().
getCurrentToken
().
getEndPosition
()
-
sqlParser
.
getLexer
().
getCurrentToken
().
getLiterals
().
length
();
SQLExpression
sqlExpression
=
sqlParser
.
parseExpression
();
if
(!(
sqlExpression
instanceof
SQLPropertyExpression
))
{
return
;
}
SQLPropertyExpression
sqlPropertyExpression
=
(
SQLPropertyExpression
)
sqlExpression
;
if
(
selectStatement
.
getTables
().
getTableNames
().
contains
(
SQLUtil
.
getExactlyValue
(
sqlPropertyExpression
.
getOwner
().
getName
())))
{
selectStatement
.
getSqlTokens
().
add
(
new
TableToken
(
startPosition
,
sqlPropertyExpression
.
getOwner
().
getName
()));
}
}
protected
final
void
parseWhere
(
final
SelectStatement
selectStatement
)
{
sqlParser
.
parseWhere
(
shardingRule
,
selectStatement
,
items
);
parametersIndex
=
s
qlParser
.
getParametersIndex
();
parametersIndex
=
s
electStatement
.
getParametersIndex
();
}
protected
final
void
parseGroupBy
(
final
SelectStatement
selectStatement
)
{
...
...
@@ -284,7 +272,7 @@ public abstract class AbstractSelectParser implements SQLStatementParser {
}
sqlParser
.
accept
(
DefaultKeyword
.
BY
);
while
(
true
)
{
addGroupByItem
(
sqlParser
.
parseExpression
(),
selectStatement
);
addGroupByItem
(
sqlParser
.
parseExpression
(
selectStatement
),
selectStatement
);
if
(!
sqlParser
.
equalAny
(
Symbol
.
COMMA
))
{
break
;
}
...
...
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/statement/dql/select/SelectStatement.java
浏览文件 @
b92d77a3
...
...
@@ -62,6 +62,7 @@ public final class SelectStatement extends DQLStatement {
private
Limit
limit
;
@Getter
(
AccessLevel
.
NONE
)
@Setter
(
AccessLevel
.
NONE
)
private
SelectStatement
subQueryStatement
;
/**
...
...
@@ -126,6 +127,16 @@ public final class SelectStatement extends DQLStatement {
}
}
/**
* 设置子查询的Select SQL语句对象.
*
* @param subQueryStatement 子查询的Select SQL语句对象
*/
public
void
setSubQueryStatement
(
final
SelectStatement
subQueryStatement
)
{
this
.
subQueryStatement
=
subQueryStatement
;
setParametersIndex
(
subQueryStatement
.
getParametersIndex
());
}
/**
* 判断是否包含子查询.
*
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录