Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
apache
Shardingsphere
提交
b0f79f0e
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 搜索 >>
提交
b0f79f0e
编写于
7月 15, 2017
作者:
T
terrymanu
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fixed # 292
上级
ef14a227
变更
6
隐藏空白更改
内联
并排
Showing
6 changed file
with
43 addition
and
24 deletion
+43
-24
RELEASE-NOTES.md
RELEASE-NOTES.md
+6
-0
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/SQLParser.java
...ngdang/ddframe/rdb/sharding/parsing/parser/SQLParser.java
+5
-1
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/context/limit/Limit.java
...rame/rdb/sharding/parsing/parser/context/limit/Limit.java
+7
-4
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/dialect/sqlserver/SQLServerParser.java
...ing/parsing/parser/dialect/sqlserver/SQLServerParser.java
+9
-5
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/rewrite/SQLRewriteEngine.java
...ngdang/ddframe/rdb/sharding/rewrite/SQLRewriteEngine.java
+13
-13
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/routing/router/ParsingSQLRouter.java
...ddframe/rdb/sharding/routing/router/ParsingSQLRouter.java
+3
-1
未找到文件。
RELEASE-NOTES.md
浏览文件 @
b0f79f0e
...
...
@@ -8,6 +8,12 @@ next = "/00-overview/contribution/"
+++
## 1.5.0.M3
### 缺陷修正
1.
[
ISSUE #292
](
https://github.com/dangdangdotcom/sharding-jdbc/issues/292
)
内存方式处理GROUP BY语句如有分页信息则需改写
## 1.5.0.M2
### 功能提升
...
...
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/SQLParser.java
浏览文件 @
b0f79f0e
...
...
@@ -39,6 +39,7 @@ import com.dangdang.ddframe.rdb.sharding.parsing.parser.expression.SQLTextExpres
import
com.dangdang.ddframe.rdb.sharding.parsing.parser.statement.SQLStatement
;
import
com.dangdang.ddframe.rdb.sharding.parsing.parser.statement.select.SelectStatement
;
import
com.dangdang.ddframe.rdb.sharding.parsing.parser.token.OffsetToken
;
import
com.dangdang.ddframe.rdb.sharding.parsing.parser.token.RowCountToken
;
import
com.dangdang.ddframe.rdb.sharding.parsing.parser.token.TableToken
;
import
com.dangdang.ddframe.rdb.sharding.util.SQLUtil
;
import
com.google.common.base.Optional
;
...
...
@@ -350,7 +351,10 @@ public class SQLParser extends AbstractParser {
}
if
(
Symbol
.
LT
==
symbol
||
Symbol
.
LT_EQ
==
symbol
)
{
if
(
sqlExpression
instanceof
SQLNumberExpression
)
{
selectStatement
.
getLimit
().
setRowCount
(
new
LimitValue
(((
SQLNumberExpression
)
sqlExpression
).
getNumber
().
intValue
(),
-
1
));
int
rowCount
=
((
SQLNumberExpression
)
sqlExpression
).
getNumber
().
intValue
();
selectStatement
.
getLimit
().
setRowCount
(
new
LimitValue
(
rowCount
,
-
1
));
selectStatement
.
getSqlTokens
().
add
(
new
RowCountToken
(
getLexer
().
getCurrentToken
().
getEndPosition
()
-
String
.
valueOf
(
rowCount
).
length
()
-
getLexer
().
getCurrentToken
().
getLiterals
().
length
(),
rowCount
));
}
else
if
(
sqlExpression
instanceof
SQLPlaceholderExpression
)
{
selectStatement
.
getLimit
().
setRowCount
(
new
LimitValue
(-
1
,
((
SQLPlaceholderExpression
)
sqlExpression
).
getIndex
()));
}
...
...
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/context/limit/Limit.java
浏览文件 @
b0f79f0e
...
...
@@ -68,11 +68,12 @@ public final class Limit {
*
* @param parameters 参数
* @param isRewrite 是否重写参数
* @param isFetchAll 是否获取所有数据
*/
public
void
processParameters
(
final
List
<
Object
>
parameters
,
final
boolean
isRewrite
)
{
public
void
processParameters
(
final
List
<
Object
>
parameters
,
final
boolean
isRewrite
,
final
boolean
isFetchAll
)
{
fill
(
parameters
);
if
(
isRewrite
)
{
rewrite
(
parameters
);
rewrite
(
parameters
,
isFetchAll
);
}
}
...
...
@@ -92,10 +93,12 @@ public final class Limit {
}
}
private
void
rewrite
(
final
List
<
Object
>
parameters
)
{
private
void
rewrite
(
final
List
<
Object
>
parameters
,
final
boolean
isFetchAll
)
{
int
rewriteOffset
=
0
;
int
rewriteRowCount
;
if
(
rowCountRewriteFlag
)
{
if
(
isFetchAll
)
{
rewriteRowCount
=
Integer
.
MAX_VALUE
;
}
else
if
(
rowCountRewriteFlag
)
{
rewriteRowCount
=
null
==
rowCount
?
-
1
:
getOffsetValue
()
+
rowCount
.
getValue
();
}
else
{
rewriteRowCount
=
rowCount
.
getValue
();
...
...
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/dialect/sqlserver/SQLServerParser.java
浏览文件 @
b0f79f0e
...
...
@@ -33,6 +33,7 @@ import com.dangdang.ddframe.rdb.sharding.parsing.parser.expression.SQLExpression
import
com.dangdang.ddframe.rdb.sharding.parsing.parser.expression.SQLNumberExpression
;
import
com.dangdang.ddframe.rdb.sharding.parsing.parser.expression.SQLPlaceholderExpression
;
import
com.dangdang.ddframe.rdb.sharding.parsing.parser.statement.select.SelectStatement
;
import
com.dangdang.ddframe.rdb.sharding.parsing.parser.token.RowCountToken
;
import
com.google.common.base.Optional
;
/**
...
...
@@ -68,11 +69,14 @@ public final class SQLServerParser extends SQLParser {
skipIfEqual
(
Symbol
.
LEFT_PAREN
);
SQLExpression
sqlExpression
=
parseExpression
();
skipIfEqual
(
Symbol
.
RIGHT_PAREN
);
LimitValue
rowCount
;
LimitValue
rowCount
Value
;
if
(
sqlExpression
instanceof
SQLNumberExpression
)
{
rowCount
=
new
LimitValue
(((
SQLNumberExpression
)
sqlExpression
).
getNumber
().
intValue
(),
-
1
);
int
rowCount
=
((
SQLNumberExpression
)
sqlExpression
).
getNumber
().
intValue
();
rowCountValue
=
new
LimitValue
(
rowCount
,
-
1
);
selectStatement
.
getSqlTokens
().
add
(
new
RowCountToken
(
getLexer
().
getCurrentToken
().
getEndPosition
()
-
String
.
valueOf
(
rowCount
).
length
()
-
getLexer
().
getCurrentToken
().
getLiterals
().
length
(),
rowCount
));
}
else
if
(
sqlExpression
instanceof
SQLPlaceholderExpression
)
{
rowCount
=
new
LimitValue
(-
1
,
((
SQLPlaceholderExpression
)
sqlExpression
).
getIndex
());
rowCount
Value
=
new
LimitValue
(-
1
,
((
SQLPlaceholderExpression
)
sqlExpression
).
getIndex
());
}
else
{
throw
new
SQLParsingException
(
getLexer
());
}
...
...
@@ -81,10 +85,10 @@ public final class SQLServerParser extends SQLParser {
}
if
(
null
==
selectStatement
.
getLimit
())
{
Limit
limit
=
new
Limit
(
false
);
limit
.
setRowCount
(
rowCount
);
limit
.
setRowCount
(
rowCount
Value
);
selectStatement
.
setLimit
(
limit
);
}
else
{
selectStatement
.
getLimit
().
setRowCount
(
rowCount
);
selectStatement
.
getLimit
().
setRowCount
(
rowCount
Value
);
}
}
}
...
...
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/rewrite/SQLRewriteEngine.java
浏览文件 @
b0f79f0e
...
...
@@ -32,7 +32,6 @@ import com.dangdang.ddframe.rdb.sharding.routing.type.TableUnit;
import
com.dangdang.ddframe.rdb.sharding.routing.type.complex.CartesianTableReference
;
import
com.google.common.base.Optional
;
import
java.util.Collection
;
import
java.util.Collections
;
import
java.util.Comparator
;
import
java.util.HashMap
;
...
...
@@ -53,20 +52,13 @@ public final class SQLRewriteEngine {
private
final
List
<
SQLToken
>
sqlTokens
=
new
LinkedList
<>();
private
final
Collection
<
String
>
tableNames
;
private
final
Limit
limit
;
private
final
SQLStatement
sqlStatement
;
public
SQLRewriteEngine
(
final
ShardingRule
shardingRule
,
final
String
originalSQL
,
final
SQLStatement
sqlStatement
)
{
this
.
shardingRule
=
shardingRule
;
this
.
originalSQL
=
originalSQL
;
this
.
sqlStatement
=
sqlStatement
;
sqlTokens
.
addAll
(
sqlStatement
.
getSqlTokens
());
tableNames
=
sqlStatement
.
getTables
().
getTableNames
();
if
(
sqlStatement
instanceof
SelectStatement
)
{
limit
=
((
SelectStatement
)
sqlStatement
).
getLimit
();
}
else
{
limit
=
null
;
}
}
/**
...
...
@@ -112,7 +104,7 @@ public final class SQLRewriteEngine {
}
private
void
appendTableToken
(
final
SQLBuilder
sqlBuilder
,
final
TableToken
tableToken
,
final
int
count
,
final
List
<
SQLToken
>
sqlTokens
)
{
String
tableName
=
tableNames
.
contains
(
tableToken
.
getTableName
())
?
tableToken
.
getTableName
()
:
tableToken
.
getOriginalLiterals
();
String
tableName
=
sqlStatement
.
getTables
().
getTableNames
()
.
contains
(
tableToken
.
getTableName
())
?
tableToken
.
getTableName
()
:
tableToken
.
getOriginalLiterals
();
sqlBuilder
.
appendTable
(
tableName
);
int
beginPosition
=
tableToken
.
getBeginPosition
()
+
tableToken
.
getOriginalLiterals
().
length
();
int
endPosition
=
sqlTokens
.
size
()
-
1
==
count
?
originalSQL
.
length
()
:
sqlTokens
.
get
(
count
+
1
).
getBeginPosition
();
...
...
@@ -130,7 +122,15 @@ public final class SQLRewriteEngine {
}
private
void
appendLimitRowCount
(
final
SQLBuilder
sqlBuilder
,
final
RowCountToken
rowCountToken
,
final
int
count
,
final
List
<
SQLToken
>
sqlTokens
,
final
boolean
isRewrite
)
{
sqlBuilder
.
appendLiterals
(
isRewrite
?
String
.
valueOf
(
rowCountToken
.
getRowCount
()
+
limit
.
getOffsetValue
())
:
String
.
valueOf
(
rowCountToken
.
getRowCount
()));
SelectStatement
selectStatement
=
(
SelectStatement
)
sqlStatement
;
Limit
limit
=
selectStatement
.
getLimit
();
if
(!
isRewrite
)
{
sqlBuilder
.
appendLiterals
(
String
.
valueOf
(
rowCountToken
.
getRowCount
()));
}
else
if
((!
selectStatement
.
getGroupByItems
().
isEmpty
()
||
!
selectStatement
.
getAggregationSelectItems
().
isEmpty
())
&&
!
selectStatement
.
isSameGroupByAndOrderByItems
())
{
sqlBuilder
.
appendLiterals
(
String
.
valueOf
(
Integer
.
MAX_VALUE
));
}
else
{
sqlBuilder
.
appendLiterals
(
String
.
valueOf
(
limit
.
isRowCountRewriteFlag
()
?
rowCountToken
.
getRowCount
()
+
limit
.
getOffsetValue
()
:
rowCountToken
.
getRowCount
()));
}
int
beginPosition
=
rowCountToken
.
getBeginPosition
()
+
String
.
valueOf
(
rowCountToken
.
getRowCount
()).
length
();
int
endPosition
=
sqlTokens
.
size
()
-
1
==
count
?
originalSQL
.
length
()
:
sqlTokens
.
get
(
count
+
1
).
getBeginPosition
();
sqlBuilder
.
appendLiterals
(
originalSQL
.
substring
(
beginPosition
,
endPosition
));
...
...
@@ -189,7 +189,7 @@ public final class SQLRewriteEngine {
private
Map
<
String
,
String
>
getBindingTableTokens
(
final
TableUnit
tableUnit
,
final
BindingTableRule
bindingTableRule
)
{
Map
<
String
,
String
>
result
=
new
HashMap
<>();
for
(
String
eachTable
:
tableNames
)
{
for
(
String
eachTable
:
sqlStatement
.
getTables
().
getTableNames
()
)
{
if
(!
eachTable
.
equalsIgnoreCase
(
tableUnit
.
getLogicTableName
())
&&
bindingTableRule
.
hasLogicTable
(
eachTable
))
{
result
.
put
(
eachTable
,
bindingTableRule
.
getBindingActualTable
(
tableUnit
.
getDataSourceName
(),
eachTable
,
tableUnit
.
getActualTableName
()));
}
...
...
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/routing/router/ParsingSQLRouter.java
浏览文件 @
b0f79f0e
...
...
@@ -88,7 +88,9 @@ public final class ParsingSQLRouter implements SQLRouter {
SQLRewriteEngine
rewriteEngine
=
new
SQLRewriteEngine
(
shardingRule
,
logicSQL
,
sqlStatement
);
boolean
isSingleRouting
=
routingResult
.
isSingleRouting
();
if
(
sqlStatement
instanceof
SelectStatement
&&
null
!=
((
SelectStatement
)
sqlStatement
).
getLimit
())
{
((
SelectStatement
)
sqlStatement
).
getLimit
().
processParameters
(
parameters
,
!
isSingleRouting
);
SelectStatement
selectStatement
=
(
SelectStatement
)
sqlStatement
;
boolean
isNeedFetchAll
=
(!
selectStatement
.
getGroupByItems
().
isEmpty
()
||
!
selectStatement
.
getAggregationSelectItems
().
isEmpty
())
&&
!
selectStatement
.
isSameGroupByAndOrderByItems
();
selectStatement
.
getLimit
().
processParameters
(
parameters
,
!
isSingleRouting
,
isNeedFetchAll
);
}
SQLBuilder
sqlBuilder
=
rewriteEngine
.
rewrite
(!
isSingleRouting
);
if
(
routingResult
instanceof
CartesianRoutingResult
)
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录