Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
apache
Shardingsphere
提交
fb076861
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 搜索 >>
提交
fb076861
编写于
8月 10, 2017
作者:
T
terrymanu
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fixed #323
上级
289a585f
变更
7
隐藏空白更改
内联
并排
Showing
7 changed file
with
47 addition
and
35 deletion
+47
-35
RELEASE-NOTES.md
RELEASE-NOTES.md
+1
-0
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/SQLParser.java
...ngdang/ddframe/rdb/sharding/parsing/parser/SQLParser.java
+7
-5
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/dialect/mysql/MySQLInsertParser.java
...rding/parsing/parser/dialect/mysql/MySQLInsertParser.java
+1
-1
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/dialect/oracle/OracleSelectParser.java
...ing/parsing/parser/dialect/oracle/OracleSelectParser.java
+2
-2
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/expression/SQLIgnoreExpression.java
...arding/parsing/parser/expression/SQLIgnoreExpression.java
+8
-1
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
+13
-11
sharding-jdbc-core/src/test/resources/parser/select_group_by.xml
...g-jdbc-core/src/test/resources/parser/select_group_by.xml
+15
-15
未找到文件。
RELEASE-NOTES.md
浏览文件 @
fb076861
...
...
@@ -11,6 +11,7 @@
1.
[
ISSUE #313
](
https://github.com/dangdangdotcom/sharding-jdbc/issues/313
)
支持
<>
操作符
1.
[
ISSUE #317
](
https://github.com/dangdangdotcom/sharding-jdbc/issues/317
)
分页Limit参数问题
1.
[
ISSUE #320
](
https://github.com/dangdangdotcom/sharding-jdbc/issues/320
)
GROUP BY + LIMIT的SQL改写错误
1.
[
ISSUE #323
](
https://github.com/dangdangdotcom/sharding-jdbc/issues/323
)
解析ORDER BY + 聚合表达式错误
## 1.5.0
...
...
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/SQLParser.java
浏览文件 @
fb076861
...
...
@@ -88,22 +88,24 @@ public class SQLParser extends AbstractParser {
// TODO 完善Expression解析的各种场景
public
final
SQLExpression
parseExpression
()
{
String
literals
=
getLexer
().
getCurrentToken
().
getLiterals
();
final
int
beginPosition
=
getLexer
().
getCurrentToken
().
getEndPosition
()
-
literals
.
length
();
final
SQLExpression
expression
=
getExpression
(
literals
);
if
(
skipIfEqual
(
Literals
.
IDENTIFIER
))
{
if
(
skipIfEqual
(
Symbol
.
DOT
))
{
String
property
=
getLexer
().
getCurrentToken
().
getLiterals
();
getLexer
().
nextToken
();
return
skipIfCompositeExpression
()
?
new
SQLIgnoreExpression
()
:
new
SQLPropertyExpression
(
new
SQLIdentifierExpression
(
literals
),
property
);
return
skipIfCompositeExpression
()
?
new
SQLIgnoreExpression
(
getLexer
().
getInput
().
substring
(
beginPosition
,
getLexer
().
getCurrentToken
().
getEndPosition
()))
:
new
SQLPropertyExpression
(
new
SQLIdentifierExpression
(
literals
),
property
);
}
if
(
equalAny
(
Symbol
.
LEFT_PAREN
))
{
skipParentheses
();
skipRestCompositeExpression
();
return
new
SQLIgnoreExpression
();
return
new
SQLIgnoreExpression
(
getLexer
().
getInput
().
substring
(
beginPosition
,
getLexer
().
getCurrentToken
().
getEndPosition
())
);
}
return
skipIfCompositeExpression
()
?
new
SQLIgnoreExpression
()
:
expression
;
return
skipIfCompositeExpression
()
?
new
SQLIgnoreExpression
(
getLexer
().
getInput
().
substring
(
beginPosition
,
getLexer
().
getCurrentToken
().
getEndPosition
())
)
:
expression
;
}
getLexer
().
nextToken
();
return
skipIfCompositeExpression
()
?
new
SQLIgnoreExpression
()
:
expression
;
return
skipIfCompositeExpression
()
?
new
SQLIgnoreExpression
(
getLexer
().
getInput
().
substring
(
beginPosition
,
getLexer
().
getCurrentToken
().
getEndPosition
())
)
:
expression
;
}
private
SQLExpression
getExpression
(
final
String
literals
)
{
...
...
@@ -126,7 +128,7 @@ public class SQLParser extends AbstractParser {
if
(
equalAny
(
Literals
.
IDENTIFIER
))
{
return
new
SQLIdentifierExpression
(
SQLUtil
.
getExactlyValue
(
literals
));
}
return
new
SQLIgnoreExpression
();
return
new
SQLIgnoreExpression
(
literals
);
}
private
boolean
skipIfCompositeExpression
()
{
...
...
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/dialect/mysql/MySQLInsertParser.java
浏览文件 @
fb076861
...
...
@@ -68,7 +68,7 @@ public final class MySQLInsertParser extends AbstractInsertParser {
}
else
if
(
getSqlParser
().
equalAny
(
Literals
.
CHARS
))
{
sqlExpression
=
new
SQLTextExpression
(
getSqlParser
().
getLexer
().
getCurrentToken
().
getLiterals
());
}
else
if
(
getSqlParser
().
equalAny
(
DefaultKeyword
.
NULL
))
{
sqlExpression
=
new
SQLIgnoreExpression
();
sqlExpression
=
new
SQLIgnoreExpression
(
DefaultKeyword
.
NULL
.
name
()
);
}
else
if
(
getSqlParser
().
equalAny
(
Symbol
.
QUESTION
))
{
sqlExpression
=
new
SQLPlaceholderExpression
(
getSqlParser
().
getParametersIndex
());
getSqlParser
().
increaseParametersIndex
();
...
...
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/dialect/oracle/OracleSelectParser.java
浏览文件 @
fb076861
...
...
@@ -282,8 +282,8 @@ public class OracleSelectParser extends AbstractSelectParser {
}
@Override
protected
O
ptional
<
OrderItem
>
parseSelectOrderByItem
()
{
O
ptional
<
OrderItem
>
result
=
super
.
parseSelectOrderByItem
();
protected
O
rderItem
parseSelectOrderByItem
()
{
O
rderItem
result
=
super
.
parseSelectOrderByItem
();
skipAfterOrderByItem
();
return
result
;
}
...
...
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/expression/SQLIgnoreExpression.java
浏览文件 @
fb076861
...
...
@@ -17,10 +17,17 @@
package
com.dangdang.ddframe.rdb.sharding.parsing.parser.expression
;
import
lombok.Getter
;
import
lombok.RequiredArgsConstructor
;
/**
* 分片中无需关注的SQL表达式.
*
* @author zhangliang
*/
public
class
SQLIgnoreExpression
implements
SQLExpression
{
@RequiredArgsConstructor
@Getter
public
final
class
SQLIgnoreExpression
implements
SQLExpression
{
private
final
String
expression
;
}
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/statement/dql/select/AbstractSelectParser.java
浏览文件 @
fb076861
...
...
@@ -31,9 +31,11 @@ import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.selectitem.Aggre
import
com.dangdang.ddframe.rdb.sharding.parsing.parser.context.selectitem.CommonSelectItem
;
import
com.dangdang.ddframe.rdb.sharding.parsing.parser.context.selectitem.SelectItem
;
import
com.dangdang.ddframe.rdb.sharding.parsing.parser.context.table.Table
;
import
com.dangdang.ddframe.rdb.sharding.parsing.parser.exception.SQLParsingException
;
import
com.dangdang.ddframe.rdb.sharding.parsing.parser.exception.SQLParsingUnsupportedException
;
import
com.dangdang.ddframe.rdb.sharding.parsing.parser.expression.SQLExpression
;
import
com.dangdang.ddframe.rdb.sharding.parsing.parser.expression.SQLIdentifierExpression
;
import
com.dangdang.ddframe.rdb.sharding.parsing.parser.expression.SQLIgnoreExpression
;
import
com.dangdang.ddframe.rdb.sharding.parsing.parser.expression.SQLNumberExpression
;
import
com.dangdang.ddframe.rdb.sharding.parsing.parser.expression.SQLPropertyExpression
;
import
com.dangdang.ddframe.rdb.sharding.parsing.parser.statement.SQLStatementParser
;
...
...
@@ -221,16 +223,16 @@ public abstract class AbstractSelectParser implements SQLStatementParser {
sqlParser
.
skipIfEqual
(
DefaultKeyword
.
SIBLINGS
);
sqlParser
.
accept
(
DefaultKeyword
.
BY
);
do
{
O
ptional
<
OrderItem
>
orderItem
=
parseSelectOrderByItem
();
if
(
orderItem
.
isPresent
()
&&
!
isInSubQuery
)
{
result
.
add
(
orderItem
.
get
()
);
O
rderItem
orderItem
=
parseSelectOrderByItem
();
if
(!
isInSubQuery
)
{
result
.
add
(
orderItem
);
}
}
while
(
sqlParser
.
skipIfEqual
(
Symbol
.
COMMA
));
selectStatement
.
getOrderByItems
().
addAll
(
result
);
}
protected
O
ptional
<
OrderItem
>
parseSelectOrderByItem
()
{
protected
O
rderItem
parseSelectOrderByItem
()
{
SQLExpression
sqlExpression
=
sqlParser
.
parseExpression
(
selectStatement
);
OrderType
orderByType
=
OrderType
.
ASC
;
if
(
sqlParser
.
skipIfEqual
(
DefaultKeyword
.
ASC
))
{
...
...
@@ -238,20 +240,20 @@ public abstract class AbstractSelectParser implements SQLStatementParser {
}
else
if
(
sqlParser
.
skipIfEqual
(
DefaultKeyword
.
DESC
))
{
orderByType
=
OrderType
.
DESC
;
}
OrderItem
result
;
if
(
sqlExpression
instanceof
SQLNumberExpression
)
{
re
sult
=
new
OrderItem
(((
SQLNumberExpression
)
sqlExpression
).
getNumber
().
intValue
(),
orderByType
);
re
turn
new
OrderItem
(((
SQLNumberExpression
)
sqlExpression
).
getNumber
().
intValue
(),
orderByType
);
}
else
if
(
sqlExpression
instanceof
SQLIdentifierExpression
)
{
re
sult
=
new
OrderItem
(
re
turn
new
OrderItem
(
SQLUtil
.
getExactlyValue
(((
SQLIdentifierExpression
)
sqlExpression
).
getName
()),
orderByType
,
getAlias
(
SQLUtil
.
getExactlyValue
(((
SQLIdentifierExpression
)
sqlExpression
).
getName
())));
}
else
if
(
sqlExpression
instanceof
SQLPropertyExpression
)
{
SQLPropertyExpression
sqlPropertyExpression
=
(
SQLPropertyExpression
)
sqlExpression
;
re
sult
=
new
OrderItem
(
SQLUtil
.
getExactlyValue
(
sqlPropertyExpression
.
getOwner
().
getName
()),
SQLUtil
.
getExactlyValue
(
sqlPropertyExpression
.
getName
()),
orderByType
,
re
turn
new
OrderItem
(
SQLUtil
.
getExactlyValue
(
sqlPropertyExpression
.
getOwner
().
getName
()),
SQLUtil
.
getExactlyValue
(
sqlPropertyExpression
.
getName
()),
orderByType
,
getAlias
(
SQLUtil
.
getExactlyValue
(
sqlPropertyExpression
.
getOwner
().
getName
())
+
"."
+
SQLUtil
.
getExactlyValue
(
sqlPropertyExpression
.
getName
())));
}
else
{
return
Optional
.
absent
();
}
else
if
(
sqlExpression
instanceof
SQLIgnoreExpression
)
{
SQLIgnoreExpression
sqlIgnoreExpression
=
(
SQLIgnoreExpression
)
sqlExpression
;
return
new
OrderItem
(
sqlIgnoreExpression
.
getExpression
(),
orderByType
,
getAlias
(
sqlIgnoreExpression
.
getExpression
()));
}
return
Optional
.
of
(
result
);
throw
new
SQLParsingException
(
sqlParser
.
getLexer
()
);
}
protected
void
parseGroupBy
()
{
...
...
sharding-jdbc-core/src/test/resources/parser/select_group_by.xml
浏览文件 @
fb076861
...
...
@@ -149,19 +149,19 @@
</order-by-columns>
<limit
row-count-index=
"0"
row-count=
"5"
/>
</assert>
<
!--<assert id="assertSelectWithGroupByAndOrderByAndLimit" parameters="5">--
>
<
!--<tables>--
>
<
!--<table name="t_order" />--
>
<
!--</tables>--
>
<
!--<aggregation-select-items>--
>
<
!--<aggregation-select-item inner-expression="(order_id)" aggregation-type="SUM"/>--
>
<
!--</aggregation-select-items>--
>
<
!--<group-by-columns>--
>
<
!--<group-by-column name="user_id" order-by-type="ASC" />--
>
<
!--</group-by-columns>--
>
<
!--<order-by-columns>--
>
<
!--<order-by-column name="order_id" order-by-type="ASC" />--
>
<
!--</order-by-columns>--
>
<
!--<limit row-count-index="0" row-count="5" />--
>
<
!--</assert>--
>
<
assert
id=
"assertSelectWithGroupByAndOrderByAndLimit"
parameters=
"5"
>
<
tables
>
<
table
name=
"t_order"
/
>
<
/tables
>
<
aggregation-select-items
>
<
aggregation-select-item
inner-expression=
"(order_id)"
aggregation-type=
"SUM"
/
>
<
/aggregation-select-items
>
<
group-by-columns
>
<
group-by-column
name=
"user_id"
order-by-type=
"ASC"
/
>
<
/group-by-columns
>
<
order-by-columns
>
<
order-by-column
name=
"SUM(order_id)"
order-by-type=
"ASC"
/
>
<
/order-by-columns
>
<
limit
row-count-index=
"0"
row-count=
"5"
/
>
<
/assert
>
</asserts>
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录