Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
apache
Shardingsphere
提交
cfac63c1
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,发现更多精彩内容 >>
提交
cfac63c1
编写于
3月 15, 2017
作者:
T
terrymanu
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
add base parser
上级
a121fcd7
变更
23
隐藏空白更改
内联
并排
Showing
23 changed file
with
409 addition
and
375 deletion
+409
-375
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parser/sql/dialect/mysql/parser/MySQLDeleteParser.java
...ng/parser/sql/dialect/mysql/parser/MySQLDeleteParser.java
+2
-2
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parser/sql/dialect/mysql/parser/MySQLExprParser.java
...ding/parser/sql/dialect/mysql/parser/MySQLExprParser.java
+9
-9
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parser/sql/dialect/mysql/parser/MySQLInsertParser.java
...ng/parser/sql/dialect/mysql/parser/MySQLInsertParser.java
+9
-9
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parser/sql/dialect/mysql/parser/MySQLSelectParser.java
...ng/parser/sql/dialect/mysql/parser/MySQLSelectParser.java
+21
-21
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parser/sql/dialect/mysql/parser/MySQLUpdateParser.java
...ng/parser/sql/dialect/mysql/parser/MySQLUpdateParser.java
+1
-1
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parser/sql/dialect/oracle/parser/OracleDeleteParser.java
.../parser/sql/dialect/oracle/parser/OracleDeleteParser.java
+2
-2
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parser/sql/dialect/oracle/parser/OracleExprParser.java
...ng/parser/sql/dialect/oracle/parser/OracleExprParser.java
+3
-3
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parser/sql/dialect/oracle/parser/OracleSelectParser.java
.../parser/sql/dialect/oracle/parser/OracleSelectParser.java
+75
-75
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parser/sql/dialect/oracle/parser/OracleUpdateParser.java
.../parser/sql/dialect/oracle/parser/OracleUpdateParser.java
+1
-1
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parser/sql/dialect/postgresql/parser/PostgreSQLDeleteParser.java
...sql/dialect/postgresql/parser/PostgreSQLDeleteParser.java
+2
-2
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parser/sql/dialect/postgresql/parser/PostgreSQLSelectParser.java
...sql/dialect/postgresql/parser/PostgreSQLSelectParser.java
+18
-18
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parser/sql/dialect/postgresql/parser/PostgreSQLUpdateParser.java
...sql/dialect/postgresql/parser/PostgreSQLUpdateParser.java
+1
-1
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parser/sql/dialect/sqlserver/parser/SQLServerDeleteParser.java
...r/sql/dialect/sqlserver/parser/SQLServerDeleteParser.java
+1
-1
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parser/sql/dialect/sqlserver/parser/SQLServerExprParser.java
...ser/sql/dialect/sqlserver/parser/SQLServerExprParser.java
+6
-6
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parser/sql/dialect/sqlserver/parser/SQLServerSelectParser.java
...r/sql/dialect/sqlserver/parser/SQLServerSelectParser.java
+12
-12
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parser/sql/lexer/Lexer.java
...dangdang/ddframe/rdb/sharding/parser/sql/lexer/Lexer.java
+0
-60
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parser/sql/parser/AbstractDeleteParser.java
.../rdb/sharding/parser/sql/parser/AbstractDeleteParser.java
+1
-1
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parser/sql/parser/AbstractInsertParser.java
.../rdb/sharding/parser/sql/parser/AbstractInsertParser.java
+9
-9
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parser/sql/parser/AbstractSelectParser.java
.../rdb/sharding/parser/sql/parser/AbstractSelectParser.java
+21
-21
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parser/sql/parser/AbstractUpdateParser.java
.../rdb/sharding/parser/sql/parser/AbstractUpdateParser.java
+6
-6
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parser/sql/parser/Parser.java
...ngdang/ddframe/rdb/sharding/parser/sql/parser/Parser.java
+126
-0
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parser/sql/parser/SQLExprParser.java
...ddframe/rdb/sharding/parser/sql/parser/SQLExprParser.java
+74
-106
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parser/sql/parser/SQLStatementParser.java
...me/rdb/sharding/parser/sql/parser/SQLStatementParser.java
+9
-9
未找到文件。
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parser/sql/dialect/mysql/parser/MySQLDeleteParser.java
浏览文件 @
cfac63c1
...
...
@@ -35,9 +35,9 @@ public final class MySQLDeleteParser extends AbstractDeleteParser {
@Override
protected
void
skipBetweenDeleteAndTable
()
{
while
(
getExprParser
().
getLexer
().
equal
(
MySQLKeyword
.
LOW_PRIORITY
)
||
getExprParser
().
getLexer
().
equal
(
MySQLKeyword
.
QUICK
)
||
getExprParser
().
getLex
er
().
equal
(
MySQLKeyword
.
IGNORE
))
{
while
(
getExprParser
().
equal
(
MySQLKeyword
.
LOW_PRIORITY
)
||
getExprParser
().
equal
(
MySQLKeyword
.
QUICK
)
||
getExprPars
er
().
equal
(
MySQLKeyword
.
IGNORE
))
{
getExprParser
().
getLexer
().
nextToken
();
}
getExprParser
().
getLexer
().
skipIfEqual
(
DefaultKeyword
.
FROM
);
getExprParser
().
skipIfEqual
(
DefaultKeyword
.
FROM
);
}
}
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parser/sql/dialect/mysql/parser/MySQLExprParser.java
浏览文件 @
cfac63c1
...
...
@@ -40,15 +40,15 @@ public class MySQLExprParser extends SQLExprParser {
}
public
LimitContext
parseLimit
(
final
int
parametersIndex
,
final
SelectSQLContext
sqlContext
)
{
getLexer
().
skipIfEqual
(
MySQLKeyword
.
LIMIT
);
skipIfEqual
(
MySQLKeyword
.
LIMIT
);
int
valueIndex
=
-
1
;
int
valueBeginPosition
=
getLexer
().
getToken
().
getEndPosition
();
int
value
;
boolean
isParameterForValue
=
false
;
if
(
getLexer
().
equal
(
Literals
.
INT
))
{
if
(
equal
(
Literals
.
INT
))
{
value
=
Integer
.
parseInt
(
getLexer
().
getToken
().
getLiterals
());
valueBeginPosition
=
valueBeginPosition
-
(
value
+
""
).
length
();
}
else
if
(
getLexer
().
equal
(
Symbol
.
QUESTION
))
{
}
else
if
(
equal
(
Symbol
.
QUESTION
))
{
valueIndex
=
parametersIndex
;
value
=
(
int
)
getParameters
().
get
(
valueIndex
);
valueBeginPosition
--;
...
...
@@ -57,10 +57,10 @@ public class MySQLExprParser extends SQLExprParser {
throw
new
ParserException
(
getLexer
());
}
getLexer
().
nextToken
();
if
(
getLexer
().
skipIfEqual
(
Symbol
.
COMMA
))
{
if
(
skipIfEqual
(
Symbol
.
COMMA
))
{
return
getLimitContextWithComma
(
parametersIndex
,
sqlContext
,
valueIndex
,
valueBeginPosition
,
value
,
isParameterForValue
);
}
if
(
getLexer
().
skipIfEqual
(
MySQLKeyword
.
OFFSET
))
{
if
(
skipIfEqual
(
MySQLKeyword
.
OFFSET
))
{
return
getLimitContextWithOffset
(
parametersIndex
,
sqlContext
,
valueIndex
,
valueBeginPosition
,
value
,
isParameterForValue
);
}
if
(!
isParameterForValue
)
{
...
...
@@ -77,10 +77,10 @@ public class MySQLExprParser extends SQLExprParser {
int
rowCount
;
int
rowCountIndex
=
-
1
;
boolean
isParameterForRowCount
=
false
;
if
(
getLexer
().
equal
(
Literals
.
INT
))
{
if
(
equal
(
Literals
.
INT
))
{
rowCount
=
Integer
.
parseInt
(
getLexer
().
getToken
().
getLiterals
());
rowCountBeginPosition
=
rowCountBeginPosition
-
(
rowCount
+
""
).
length
();
}
else
if
(
getLexer
().
equal
(
Symbol
.
QUESTION
))
{
}
else
if
(
equal
(
Symbol
.
QUESTION
))
{
rowCountIndex
=
-
1
==
valueIndex
?
parametersIndex
:
valueIndex
+
1
;
rowCount
=
(
int
)
getParameters
().
get
(
rowCountIndex
);
rowCountBeginPosition
--;
...
...
@@ -106,10 +106,10 @@ public class MySQLExprParser extends SQLExprParser {
int
offset
;
int
offsetIndex
=
-
1
;
boolean
isParameterForOffset
=
false
;
if
(
getLexer
().
equal
(
Literals
.
INT
))
{
if
(
equal
(
Literals
.
INT
))
{
offset
=
Integer
.
parseInt
(
getLexer
().
getToken
().
getLiterals
());
offsetBeginPosition
=
offsetBeginPosition
-
(
offset
+
""
).
length
();
}
else
if
(
getLexer
().
equal
(
Symbol
.
QUESTION
))
{
}
else
if
(
equal
(
Symbol
.
QUESTION
))
{
offsetIndex
=
-
1
==
valueIndex
?
parametersIndex
:
valueIndex
+
1
;
offset
=
(
int
)
getParameters
().
get
(
offsetIndex
);
offsetBeginPosition
--;
...
...
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parser/sql/dialect/mysql/parser/MySQLInsertParser.java
浏览文件 @
cfac63c1
...
...
@@ -62,29 +62,29 @@ public final class MySQLInsertParser extends AbstractInsertParser {
getExprParser
().
getLexer
().
nextToken
();
Condition
.
Column
column
=
getColumn
(
autoIncrementColumns
);
getExprParser
().
getLexer
().
nextToken
();
getExprParser
().
getLexer
().
accept
(
Symbol
.
EQ
);
getExprParser
().
accept
(
Symbol
.
EQ
);
SQLExpr
sqlExpr
;
if
(
getExprParser
().
getLexer
().
equal
(
Literals
.
INT
))
{
if
(
getExprParser
().
equal
(
Literals
.
INT
))
{
sqlExpr
=
new
SQLNumberExpr
(
Integer
.
parseInt
(
getExprParser
().
getLexer
().
getToken
().
getLiterals
()));
}
else
if
(
getExprParser
().
getLexer
().
equal
(
Literals
.
FLOAT
))
{
}
else
if
(
getExprParser
().
equal
(
Literals
.
FLOAT
))
{
sqlExpr
=
new
SQLNumberExpr
(
Double
.
parseDouble
(
getExprParser
().
getLexer
().
getToken
().
getLiterals
()));
}
else
if
(
getExprParser
().
getLexer
().
equal
(
Literals
.
CHARS
))
{
}
else
if
(
getExprParser
().
equal
(
Literals
.
CHARS
))
{
sqlExpr
=
new
SQLCharExpr
(
getExprParser
().
getLexer
().
getToken
().
getLiterals
());
}
else
if
(
getExprParser
().
getLexer
().
equal
(
DefaultKeyword
.
NULL
))
{
}
else
if
(
getExprParser
().
equal
(
DefaultKeyword
.
NULL
))
{
sqlExpr
=
new
SQLIgnoreExpr
();
}
else
if
(
getExprParser
().
getLexer
().
equal
(
Symbol
.
QUESTION
))
{
}
else
if
(
getExprParser
().
equal
(
Symbol
.
QUESTION
))
{
sqlExpr
=
new
SQLPlaceholderExpr
(
getExprParser
().
getParametersIndex
(),
getExprParser
().
getParameters
().
get
(
getExprParser
().
getParametersIndex
()));
getExprParser
().
setParametersIndex
(
getExprParser
().
getParametersIndex
()
+
1
);
}
else
{
throw
new
UnsupportedOperationException
(
""
);
}
getExprParser
().
getLexer
().
nextToken
();
if
(
getExprParser
().
getLexer
().
equal
(
Symbol
.
COMMA
,
DefaultKeyword
.
ON
,
Assist
.
EOF
))
{
if
(
getExprParser
().
equal
(
Symbol
.
COMMA
,
DefaultKeyword
.
ON
,
Assist
.
EOF
))
{
parseContext
.
addCondition
(
column
.
getColumnName
(),
column
.
getTableName
(),
Condition
.
BinaryOperator
.
EQUAL
,
sqlExpr
);
}
else
{
getExprParser
().
getLexer
().
skipUntil
(
Symbol
.
COMMA
,
DefaultKeyword
.
ON
);
getExprParser
().
skipUntil
(
Symbol
.
COMMA
,
DefaultKeyword
.
ON
);
}
}
while
(
getExprParser
().
getLexer
().
equal
(
Symbol
.
COMMA
));
}
while
(
getExprParser
().
equal
(
Symbol
.
COMMA
));
getSqlContext
().
getConditionContexts
().
add
(
parseContext
.
getCurrentConditionContext
());
}
...
...
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parser/sql/dialect/mysql/parser/MySQLSelectParser.java
浏览文件 @
cfac63c1
...
...
@@ -33,14 +33,14 @@ public class MySQLSelectParser extends AbstractSelectParser {
@Override
public
void
query
()
{
if
(
getExprParser
().
getLexer
().
equal
(
DefaultKeyword
.
SELECT
))
{
if
(
getExprParser
().
equal
(
DefaultKeyword
.
SELECT
))
{
getExprParser
().
getLexer
().
nextToken
();
parseDistinct
();
while
(
getExprParser
().
getLexer
().
equal
(
MySQLKeyword
.
HIGH_PRIORITY
)
||
getExprParser
().
getLex
er
().
equal
(
DefaultKeyword
.
STRAIGHT_JOIN
)
||
getExprParser
().
getLexer
().
equal
(
MySQLKeyword
.
SQL_SMALL_RESULT
)
||
getExprParser
().
getLexer
().
equal
(
MySQLKeyword
.
SQL_BIG_RESULT
)
||
getExprParser
().
getLex
er
().
equal
(
MySQLKeyword
.
SQL_BUFFER_RESULT
)
||
getExprParser
().
getLexer
().
equal
(
MySQLKeyword
.
SQL_CACHE
)
||
getExprParser
().
getLexer
().
equal
(
MySQLKeyword
.
SQL_NO_CACHE
)
||
getExprParser
().
getLex
er
().
equal
(
MySQLKeyword
.
SQL_CALC_FOUND_ROWS
))
{
while
(
getExprParser
().
equal
(
MySQLKeyword
.
HIGH_PRIORITY
)
||
getExprPars
er
().
equal
(
DefaultKeyword
.
STRAIGHT_JOIN
)
||
getExprParser
().
equal
(
MySQLKeyword
.
SQL_SMALL_RESULT
)
||
getExprParser
().
equal
(
MySQLKeyword
.
SQL_BIG_RESULT
)
||
getExprPars
er
().
equal
(
MySQLKeyword
.
SQL_BUFFER_RESULT
)
||
getExprParser
().
equal
(
MySQLKeyword
.
SQL_CACHE
)
||
getExprParser
().
equal
(
MySQLKeyword
.
SQL_NO_CACHE
)
||
getExprPars
er
().
equal
(
MySQLKeyword
.
SQL_CALC_FOUND_ROWS
))
{
getExprParser
().
getLexer
().
nextToken
();
}
parseSelectList
();
...
...
@@ -50,35 +50,35 @@ public class MySQLSelectParser extends AbstractSelectParser {
parseWhere
();
parseGroupBy
();
getSqlContext
().
getOrderByContexts
().
addAll
(
getExprParser
().
parseOrderBy
(
getSqlContext
()));
if
(
getExprParser
().
getLexer
().
equal
(
MySQLKeyword
.
LIMIT
))
{
if
(
getExprParser
().
equal
(
MySQLKeyword
.
LIMIT
))
{
getSqlContext
().
setLimitContext
(((
MySQLExprParser
)
getExprParser
()).
parseLimit
(
getParametersIndex
(),
getSqlContext
()));
}
if
(
getExprParser
().
getLexer
().
equal
(
DefaultKeyword
.
PROCEDURE
))
{
if
(
getExprParser
().
equal
(
DefaultKeyword
.
PROCEDURE
))
{
throw
new
ParserUnsupportedException
(
getExprParser
().
getLexer
().
getToken
().
getType
());
}
queryRest
();
}
private
void
skipToFrom
()
{
while
(!
getExprParser
().
getLexer
().
equal
(
DefaultKeyword
.
FROM
)
&&
!
getExprParser
().
getLex
er
().
equal
(
Assist
.
EOF
))
{
while
(!
getExprParser
().
equal
(
DefaultKeyword
.
FROM
)
&&
!
getExprPars
er
().
equal
(
Assist
.
EOF
))
{
getExprParser
().
getLexer
().
nextToken
();
}
}
@Override
protected
void
parseJoinTable
()
{
if
(
getExprParser
().
getLexer
().
equal
(
DefaultKeyword
.
USING
))
{
if
(
getExprParser
().
equal
(
DefaultKeyword
.
USING
))
{
return
;
}
if
(
getExprParser
().
getLexer
().
equal
(
DefaultKeyword
.
USE
))
{
if
(
getExprParser
().
equal
(
DefaultKeyword
.
USE
))
{
getExprParser
().
getLexer
().
nextToken
();
parseIndexHint
();
}
if
(
getExprParser
().
getLexer
().
equal
(
OracleKeyword
.
IGNORE
))
{
if
(
getExprParser
().
equal
(
OracleKeyword
.
IGNORE
))
{
getExprParser
().
getLexer
().
nextToken
();
parseIndexHint
();
}
if
(
getExprParser
().
getLexer
().
equal
(
OracleKeyword
.
FORCE
))
{
if
(
getExprParser
().
equal
(
OracleKeyword
.
FORCE
))
{
getExprParser
().
getLexer
().
nextToken
();
parseIndexHint
();
}
...
...
@@ -86,21 +86,21 @@ public class MySQLSelectParser extends AbstractSelectParser {
}
private
void
parseIndexHint
()
{
if
(
getExprParser
().
getLexer
().
equal
(
DefaultKeyword
.
INDEX
))
{
if
(
getExprParser
().
equal
(
DefaultKeyword
.
INDEX
))
{
getExprParser
().
getLexer
().
nextToken
();
}
else
{
getExprParser
().
getLexer
().
accept
(
DefaultKeyword
.
KEY
);
getExprParser
().
accept
(
DefaultKeyword
.
KEY
);
}
if
(
getExprParser
().
getLexer
().
equal
(
DefaultKeyword
.
FOR
))
{
if
(
getExprParser
().
equal
(
DefaultKeyword
.
FOR
))
{
getExprParser
().
getLexer
().
nextToken
();
if
(
getExprParser
().
getLexer
().
equal
(
DefaultKeyword
.
JOIN
))
{
if
(
getExprParser
().
equal
(
DefaultKeyword
.
JOIN
))
{
getExprParser
().
getLexer
().
nextToken
();
}
else
if
(
getExprParser
().
getLexer
().
equal
(
DefaultKeyword
.
ORDER
))
{
}
else
if
(
getExprParser
().
equal
(
DefaultKeyword
.
ORDER
))
{
getExprParser
().
getLexer
().
nextToken
();
getExprParser
().
getLexer
().
accept
(
DefaultKeyword
.
BY
);
getExprParser
().
accept
(
DefaultKeyword
.
BY
);
}
else
{
getExprParser
().
getLexer
().
accept
(
DefaultKeyword
.
GROUP
);
getExprParser
().
getLexer
().
accept
(
DefaultKeyword
.
BY
);
getExprParser
().
accept
(
DefaultKeyword
.
GROUP
);
getExprParser
().
accept
(
DefaultKeyword
.
BY
);
}
}
getExprParser
().
skipParentheses
();
...
...
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parser/sql/dialect/mysql/parser/MySQLUpdateParser.java
浏览文件 @
cfac63c1
...
...
@@ -34,7 +34,7 @@ public final class MySQLUpdateParser extends AbstractUpdateParser {
@Override
protected
void
skipBetweenUpdateAndTable
()
{
while
(
getExprParser
().
getLexer
().
equal
(
MySQLKeyword
.
LOW_PRIORITY
)
||
getExprParser
().
getLex
er
().
equal
(
MySQLKeyword
.
IGNORE
))
{
while
(
getExprParser
().
equal
(
MySQLKeyword
.
LOW_PRIORITY
)
||
getExprPars
er
().
equal
(
MySQLKeyword
.
IGNORE
))
{
getExprParser
().
getLexer
().
nextToken
();
}
}
...
...
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parser/sql/dialect/oracle/parser/OracleDeleteParser.java
浏览文件 @
cfac63c1
...
...
@@ -30,7 +30,7 @@ public class OracleDeleteParser extends AbstractDeleteParser {
@Override
protected
void
skipBetweenDeleteAndTable
()
{
getExprParser
().
getLexer
().
skipIfEqual
(
DefaultKeyword
.
FROM
);
getExprParser
().
getLexer
().
skipIfEqual
(
OracleKeyword
.
ONLY
);
getExprParser
().
skipIfEqual
(
DefaultKeyword
.
FROM
);
getExprParser
().
skipIfEqual
(
OracleKeyword
.
ONLY
);
}
}
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parser/sql/dialect/oracle/parser/OracleExprParser.java
浏览文件 @
cfac63c1
...
...
@@ -37,7 +37,7 @@ public class OracleExprParser extends SQLExprParser {
@Override
protected
Optional
<
String
>
as
()
{
if
(
getLexer
().
equal
(
OracleKeyword
.
CONNECT
))
{
if
(
equal
(
OracleKeyword
.
CONNECT
))
{
return
null
;
}
return
super
.
as
();
...
...
@@ -46,9 +46,9 @@ public class OracleExprParser extends SQLExprParser {
@Override
public
OrderByContext
parseSelectOrderByItem
(
final
SQLContext
sqlContext
)
{
OrderByContext
result
=
super
.
parseSelectOrderByItem
(
sqlContext
);
if
(
getLexer
().
skipIfEqual
(
OracleKeyword
.
NULLS
))
{
if
(
skipIfEqual
(
OracleKeyword
.
NULLS
))
{
getLexer
().
nextToken
();
if
(!
getLexer
().
skipIfEqual
(
OracleKeyword
.
FIRST
,
OracleKeyword
.
LAST
))
{
if
(!
skipIfEqual
(
OracleKeyword
.
FIRST
,
OracleKeyword
.
LAST
))
{
throw
new
ParserUnsupportedException
(
getLexer
().
getToken
().
getType
());
}
}
...
...
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parser/sql/dialect/oracle/parser/OracleSelectParser.java
浏览文件 @
cfac63c1
...
...
@@ -36,7 +36,7 @@ public class OracleSelectParser extends AbstractSelectParser {
@Override
protected
void
customizedSelect
()
{
if
(
getExprParser
().
getLexer
().
equal
(
DefaultKeyword
.
FOR
))
{
if
(
getExprParser
().
equal
(
DefaultKeyword
.
FOR
))
{
skipForUpdate
();
}
if
(
getSqlContext
().
getOrderByContexts
().
isEmpty
())
{
...
...
@@ -46,7 +46,7 @@ public class OracleSelectParser extends AbstractSelectParser {
@Override
public
void
query
()
{
if
(
getExprParser
().
getLexer
().
equal
(
DefaultKeyword
.
SELECT
))
{
if
(
getExprParser
().
equal
(
DefaultKeyword
.
SELECT
))
{
getExprParser
().
getLexer
().
nextToken
();
parseDistinct
();
parseSelectList
();
...
...
@@ -61,7 +61,7 @@ public class OracleSelectParser extends AbstractSelectParser {
}
private
void
skipInto
()
{
if
(
getExprParser
().
getLexer
().
equal
(
DefaultKeyword
.
INTO
))
{
if
(
getExprParser
().
equal
(
DefaultKeyword
.
INTO
))
{
throw
new
ParserUnsupportedException
(
getExprParser
().
getLexer
().
getToken
().
getType
());
}
}
...
...
@@ -74,35 +74,35 @@ public class OracleSelectParser extends AbstractSelectParser {
}
private
void
skipStart
()
{
if
(
getExprParser
().
getLexer
().
skipIfEqual
(
OracleKeyword
.
START
))
{
getExprParser
().
getLexer
().
accept
(
DefaultKeyword
.
WITH
);
if
(
getExprParser
().
skipIfEqual
(
OracleKeyword
.
START
))
{
getExprParser
().
accept
(
DefaultKeyword
.
WITH
);
getExprParser
().
parseComparisonCondition
(
getSqlContext
(),
new
ParseContext
(
0
));
}
}
private
void
skipConnect
()
{
if
(
getExprParser
().
getLexer
().
skipIfEqual
(
OracleKeyword
.
CONNECT
))
{
getExprParser
().
getLexer
().
accept
(
DefaultKeyword
.
BY
);
getExprParser
().
getLexer
().
skipIfEqual
(
OracleKeyword
.
PRIOR
);
if
(
getExprParser
().
getLexer
().
skipIfEqual
(
OracleKeyword
.
NOCYCLE
))
{
getExprParser
().
getLexer
().
skipIfEqual
(
OracleKeyword
.
PRIOR
);
if
(
getExprParser
().
skipIfEqual
(
OracleKeyword
.
CONNECT
))
{
getExprParser
().
accept
(
DefaultKeyword
.
BY
);
getExprParser
().
skipIfEqual
(
OracleKeyword
.
PRIOR
);
if
(
getExprParser
().
skipIfEqual
(
OracleKeyword
.
NOCYCLE
))
{
getExprParser
().
skipIfEqual
(
OracleKeyword
.
PRIOR
);
}
getExprParser
().
parseComparisonCondition
(
getSqlContext
(),
new
ParseContext
(
1
));
}
}
private
void
skipModelClause
()
{
if
(!
getExprParser
().
getLexer
().
skipIfEqual
(
OracleKeyword
.
MODEL
))
{
if
(!
getExprParser
().
skipIfEqual
(
OracleKeyword
.
MODEL
))
{
return
;
}
skipCellReferenceOptions
();
getExprParser
().
getLexer
().
skipIfEqual
(
OracleKeyword
.
RETURN
);
getExprParser
().
getLexer
().
skipIfEqual
(
DefaultKeyword
.
ALL
);
getExprParser
().
getLexer
().
skipIfEqual
(
OracleKeyword
.
UPDATED
);
getExprParser
().
getLexer
().
skipIfEqual
(
OracleKeyword
.
ROWS
);
while
(
getExprParser
().
getLexer
().
skipIfEqual
(
OracleKeyword
.
REFERENCE
))
{
getExprParser
().
skipIfEqual
(
OracleKeyword
.
RETURN
);
getExprParser
().
skipIfEqual
(
DefaultKeyword
.
ALL
);
getExprParser
().
skipIfEqual
(
OracleKeyword
.
UPDATED
);
getExprParser
().
skipIfEqual
(
OracleKeyword
.
ROWS
);
while
(
getExprParser
().
skipIfEqual
(
OracleKeyword
.
REFERENCE
))
{
getExprParser
().
getLexer
().
nextToken
();
getExprParser
().
getLexer
().
accept
(
DefaultKeyword
.
ON
);
getExprParser
().
accept
(
DefaultKeyword
.
ON
);
getExprParser
().
skipParentheses
();
skipModelColumnClause
();
skipCellReferenceOptions
();
...
...
@@ -111,44 +111,44 @@ public class OracleSelectParser extends AbstractSelectParser {
}
private
void
skipCellReferenceOptions
()
{
if
(
getExprParser
().
getLexer
().
skipIfEqual
(
OracleKeyword
.
IGNORE
))
{
getExprParser
().
getLexer
().
accept
(
OracleKeyword
.
NAV
);
}
else
if
(
getExprParser
().
getLexer
().
skipIfEqual
(
OracleKeyword
.
KEEP
))
{
getExprParser
().
getLexer
().
accept
(
OracleKeyword
.
NAV
);
if
(
getExprParser
().
skipIfEqual
(
OracleKeyword
.
IGNORE
))
{
getExprParser
().
accept
(
OracleKeyword
.
NAV
);
}
else
if
(
getExprParser
().
skipIfEqual
(
OracleKeyword
.
KEEP
))
{
getExprParser
().
accept
(
OracleKeyword
.
NAV
);
}
if
(
getExprParser
().
getLexer
().
skipIfEqual
(
DefaultKeyword
.
UNIQUE
))
{
getExprParser
().
getLexer
().
skipIfEqual
(
OracleKeyword
.
DIMENSION
,
OracleKeyword
.
SINGLE
);
getExprParser
().
getLexer
().
skipIfEqual
(
OracleKeyword
.
REFERENCE
);
if
(
getExprParser
().
skipIfEqual
(
DefaultKeyword
.
UNIQUE
))
{
getExprParser
().
skipIfEqual
(
OracleKeyword
.
DIMENSION
,
OracleKeyword
.
SINGLE
);
getExprParser
().
skipIfEqual
(
OracleKeyword
.
REFERENCE
);
}
}
private
void
skipMainModelClause
()
{
if
(
getExprParser
().
getLexer
().
skipIfEqual
(
OracleKeyword
.
MAIN
))
{
if
(
getExprParser
().
skipIfEqual
(
OracleKeyword
.
MAIN
))
{
getExprParser
().
getLexer
().
nextToken
();
}
skipQueryPartitionClause
();
getExprParser
().
getLexer
().
accept
(
OracleKeyword
.
DIMENSION
);
getExprParser
().
getLexer
().
accept
(
DefaultKeyword
.
BY
);
getExprParser
().
accept
(
OracleKeyword
.
DIMENSION
);
getExprParser
().
accept
(
DefaultKeyword
.
BY
);
getExprParser
().
skipParentheses
();
getExprParser
().
getLexer
().
accept
(
OracleKeyword
.
MEASURES
);
getExprParser
().
accept
(
OracleKeyword
.
MEASURES
);
getExprParser
().
skipParentheses
();
skipCellReferenceOptions
();
skipModelRulesClause
();
}
private
void
skipModelRulesClause
()
{
if
(
getExprParser
().
getLexer
().
skipIfEqual
(
OracleKeyword
.
RULES
))
{
getExprParser
().
getLexer
().
skipIfEqual
(
DefaultKeyword
.
UPDATE
);
getExprParser
().
getLexer
().
skipIfEqual
(
OracleKeyword
.
UPSERT
);
if
(
getExprParser
().
getLexer
().
skipIfEqual
(
OracleKeyword
.
AUTOMATIC
))
{
getExprParser
().
getLexer
().
accept
(
DefaultKeyword
.
ORDER
);
}
else
if
(
getExprParser
().
getLexer
().
skipIfEqual
(
OracleKeyword
.
SEQUENTIAL
))
{
getExprParser
().
getLexer
().
accept
(
DefaultKeyword
.
ORDER
);
if
(
getExprParser
().
skipIfEqual
(
OracleKeyword
.
RULES
))
{
getExprParser
().
skipIfEqual
(
DefaultKeyword
.
UPDATE
);
getExprParser
().
skipIfEqual
(
OracleKeyword
.
UPSERT
);
if
(
getExprParser
().
skipIfEqual
(
OracleKeyword
.
AUTOMATIC
))
{
getExprParser
().
accept
(
DefaultKeyword
.
ORDER
);
}
else
if
(
getExprParser
().
skipIfEqual
(
OracleKeyword
.
SEQUENTIAL
))
{
getExprParser
().
accept
(
DefaultKeyword
.
ORDER
);
}
}
if
(
getExprParser
().
getLexer
().
skipIfEqual
(
DefaultKeyword
.
ITERATE
))
{
if
(
getExprParser
().
skipIfEqual
(
DefaultKeyword
.
ITERATE
))
{
getExprParser
().
skipParentheses
();
if
(
getExprParser
().
getLexer
().
skipIfEqual
(
DefaultKeyword
.
UNTIL
))
{
if
(
getExprParser
().
skipIfEqual
(
DefaultKeyword
.
UNTIL
))
{
getExprParser
().
skipParentheses
();
}
}
...
...
@@ -156,9 +156,9 @@ public class OracleSelectParser extends AbstractSelectParser {
}
private
void
skipQueryPartitionClause
()
{
if
(
getExprParser
().
getLexer
().
skipIfEqual
(
OracleKeyword
.
PARTITION
))
{
getExprParser
().
getLexer
().
accept
(
DefaultKeyword
.
BY
);
if
(
getExprParser
().
getLexer
().
equal
(
Symbol
.
LEFT_PAREN
))
{
if
(
getExprParser
().
skipIfEqual
(
OracleKeyword
.
PARTITION
))
{
getExprParser
().
accept
(
DefaultKeyword
.
BY
);
if
(
getExprParser
().
equal
(
Symbol
.
LEFT_PAREN
))
{
getExprParser
().
skipParentheses
();
}
else
{
throw
new
UnsupportedOperationException
(
"Cannot support PARTITION BY without ()"
);
...
...
@@ -173,33 +173,33 @@ public class OracleSelectParser extends AbstractSelectParser {
@Override
protected
void
parseGroupBy
()
{
// TODO
// if (getExprParser().
getLexer().
equal(DefaultKeyword.GROUP)) {
// if (getExprParser().equal(DefaultKeyword.GROUP)) {
// getExprParser().getLexer().nextToken();
// getExprParser().
getLexer().
accept(DefaultKeyword.BY);
// getExprParser().accept(DefaultKeyword.BY);
// while (true) {
// if (getExprParser().getLexer().identifierEquals("GROUPING")) {
// throw new UnsupportedOperationException("Cannot support GROUPING SETS");
// }
// addGroupByItem(getExprParser().expr());
// if (!getExprParser().
getLexer().
equal(Symbol.COMMA)) {
// if (!getExprParser().equal(Symbol.COMMA)) {
// break;
// }
// getExprParser().getLexer().nextToken();
// }
// if (getExprParser().
getLexer().
skipIfEqual(Token.HAVING)) {
// if (getExprParser().skipIfEqual(Token.HAVING)) {
// getExprParser().expr();
// }
// } else if (getExprParser().
getLexer().
skipIfEqual(Token.HAVING)) {
// } else if (getExprParser().skipIfEqual(Token.HAVING)) {
// SQLSelectGroupByClause groupBy = new SQLSelectGroupByClause();
// groupBy.setHaving(getExprParser().expr());
// if (getExprParser().
getLexer().
skipIfEqual(DefaultKeyword.GROUP)) {
// getExprParser().
getLexer().
accept(DefaultKeyword.BY);
// if (getExprParser().skipIfEqual(DefaultKeyword.GROUP)) {
// getExprParser().accept(DefaultKeyword.BY);
// while (true) {
// if (getExprParser().getLexer().identifierEquals("GROUPING")) {
// throw new UnsupportedOperationException("Cannot support GROUPING SETS");
// }
// addGroupByItem(getExprParser().expr());
// if (!getExprParser().
getLexer().
equal(Symbol.COMMA)) {
// if (!getExprParser().equal(Symbol.COMMA)) {
// break;
// }
// getExprParser().getLexer().nextToken();
...
...
@@ -210,16 +210,16 @@ public class OracleSelectParser extends AbstractSelectParser {
@Override
public
final
List
<
TableContext
>
parseTable
()
{
if
(
getExprParser
().
getLexer
().
equal
(
Symbol
.
LEFT_PAREN
))
{
if
(
getExprParser
().
equal
(
Symbol
.
LEFT_PAREN
))
{
throw
new
UnsupportedOperationException
(
"Cannot support subquery"
);
}
if
(
getExprParser
().
getLexer
().
equal
(
DefaultKeyword
.
SELECT
))
{
if
(
getExprParser
().
equal
(
DefaultKeyword
.
SELECT
))
{
throw
new
ParserUnsupportedException
(
getExprParser
().
getLexer
().
getToken
().
getType
());
}
if
(
getExprParser
().
getLexer
().
skipIfEqual
(
OracleKeyword
.
ONLY
))
{
getExprParser
().
getLexer
().
skipIfEqual
(
Symbol
.
LEFT_PAREN
);
if
(
getExprParser
().
skipIfEqual
(
OracleKeyword
.
ONLY
))
{
getExprParser
().
skipIfEqual
(
Symbol
.
LEFT_PAREN
);
parseQueryTableExpression
();
getExprParser
().
getLexer
().
skipIfEqual
(
Symbol
.
RIGHT_PAREN
);
getExprParser
().
skipIfEqual
(
Symbol
.
RIGHT_PAREN
);
skipFlashbackQueryClause
();
}
else
{
parseQueryTableExpression
();
...
...
@@ -237,10 +237,10 @@ public class OracleSelectParser extends AbstractSelectParser {
}
private
void
parseSample
()
{
if
(
getExprParser
().
getLexer
().
skipIfEqual
(
OracleKeyword
.
SAMPLE
))
{
getExprParser
().
getLexer
().
skipIfEqual
(
OracleKeyword
.
BLOCK
);
if
(
getExprParser
().
skipIfEqual
(
OracleKeyword
.
SAMPLE
))
{
getExprParser
().
skipIfEqual
(
OracleKeyword
.
BLOCK
);
getExprParser
().
skipParentheses
();
if
(
getExprParser
().
getLexer
().
skipIfEqual
(
OracleKeyword
.
SEED
))
{
if
(
getExprParser
().
skipIfEqual
(
OracleKeyword
.
SEED
))
{
getExprParser
().
skipParentheses
();
}
}
...
...
@@ -252,34 +252,34 @@ public class OracleSelectParser extends AbstractSelectParser {
}
private
void
skipPartition
(
final
OracleKeyword
keyword
)
{
if
(
getExprParser
().
getLexer
().
skipIfEqual
(
keyword
))
{
if
(
getExprParser
().
skipIfEqual
(
keyword
))
{
getExprParser
().
skipParentheses
();
if
(
getExprParser
().
getLexer
().
skipIfEqual
(
DefaultKeyword
.
FOR
))
{
if
(
getExprParser
().
skipIfEqual
(
DefaultKeyword
.
FOR
))
{
getExprParser
().
skipParentheses
();
}
}
}
private
void
skipPivotClause
()
{
if
(
getExprParser
().
getLexer
().
skipIfEqual
(
OracleKeyword
.
PIVOT
))
{
getExprParser
().
getLexer
().
skipIfEqual
(
OracleKeyword
.
XML
);
if
(
getExprParser
().
skipIfEqual
(
OracleKeyword
.
PIVOT
))
{
getExprParser
().
skipIfEqual
(
OracleKeyword
.
XML
);
getExprParser
().
skipParentheses
();
}
else
if
(
getExprParser
().
getLexer
().
skipIfEqual
(
OracleKeyword
.
UNPIVOT
))
{
if
(
getExprParser
().
getLexer
().
skipIfEqual
(
OracleKeyword
.
INCLUDE
))
{
getExprParser
().
getLexer
().
accept
(
OracleKeyword
.
NULLS
);
}
else
if
(
getExprParser
().
getLexer
().
skipIfEqual
(
OracleKeyword
.
EXCLUDE
))
{
getExprParser
().
getLexer
().
accept
(
OracleKeyword
.
NULLS
);
}
else
if
(
getExprParser
().
skipIfEqual
(
OracleKeyword
.
UNPIVOT
))
{
if
(
getExprParser
().
skipIfEqual
(
OracleKeyword
.
INCLUDE
))
{
getExprParser
().
accept
(
OracleKeyword
.
NULLS
);
}
else
if
(
getExprParser
().
skipIfEqual
(
OracleKeyword
.
EXCLUDE
))
{
getExprParser
().
accept
(
OracleKeyword
.
NULLS
);
}
getExprParser
().
skipParentheses
();
}
}
private
void
skipFlashbackQueryClause
()
{
if
(
getExprParser
().
getLexer
().
equal
(
OracleKeyword
.
VERSIONS
))
{
if
(
getExprParser
().
equal
(
OracleKeyword
.
VERSIONS
))
{
throw
new
UnsupportedOperationException
(
"Cannot support Flashback Query"
);
}
else
if
(
getExprParser
().
getLexer
().
skipIfEqual
(
DefaultKeyword
.
AS
))
{
if
(
getExprParser
().
getLexer
().
skipIfEqual
(
OracleKeyword
.
OF
))
{
if
(
getExprParser
().
getLexer
().
skipIfEqual
(
OracleKeyword
.
SCN
)
||
getExprParser
().
getLex
er
().
skipIfEqual
(
OracleKeyword
.
TIMESTAMP
))
{
}
else
if
(
getExprParser
().
skipIfEqual
(
DefaultKeyword
.
AS
))
{
if
(
getExprParser
().
skipIfEqual
(
OracleKeyword
.
OF
))
{
if
(
getExprParser
().
skipIfEqual
(
OracleKeyword
.
SCN
)
||
getExprPars
er
().
skipIfEqual
(
OracleKeyword
.
TIMESTAMP
))
{
throw
new
UnsupportedOperationException
(
"Cannot support Flashback Query"
);
}
}
...
...
@@ -288,16 +288,16 @@ public class OracleSelectParser extends AbstractSelectParser {
private
void
skipForUpdate
()
{
getExprParser
().
getLexer
().
nextToken
();
getExprParser
().
getLexer
().
accept
(
DefaultKeyword
.
UPDATE
);
if
(
getExprParser
().
getLexer
().
skipIfEqual
(
OracleKeyword
.
OF
))
{
getExprParser
().
accept
(
DefaultKeyword
.
UPDATE
);
if
(
getExprParser
().
skipIfEqual
(
OracleKeyword
.
OF
))
{
do
{
getExprParser
().
parseExpr
();
}
while
(
getExprParser
().
getLexer
().
skipIfEqual
(
Symbol
.
COMMA
));
}
while
(
getExprParser
().
skipIfEqual
(
Symbol
.
COMMA
));
}
if
(
getExprParser
().
getLexer
().
equal
(
OracleKeyword
.
NOWAIT
,
OracleKeyword
.
WAIT
))
{
if
(
getExprParser
().
equal
(
OracleKeyword
.
NOWAIT
,
OracleKeyword
.
WAIT
))
{
getExprParser
().
getLexer
().
nextToken
();
}
else
if
(
getExprParser
().
getLexer
().
skipIfEqual
(
OracleKeyword
.
SKIP
))
{
getExprParser
().
getLexer
().
accept
(
OracleKeyword
.
LOCKED
);
}
else
if
(
getExprParser
().
skipIfEqual
(
OracleKeyword
.
SKIP
))
{
getExprParser
().
accept
(
OracleKeyword
.
LOCKED
);
}
}
}
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parser/sql/dialect/oracle/parser/OracleUpdateParser.java
浏览文件 @
cfac63c1
...
...
@@ -29,6 +29,6 @@ public class OracleUpdateParser extends AbstractUpdateParser {
@Override
protected
void
skipBetweenUpdateAndTable
()
{
getExprParser
().
getLexer
().
skipIfEqual
(
OracleKeyword
.
ONLY
);
getExprParser
().
skipIfEqual
(
OracleKeyword
.
ONLY
);
}
}
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parser/sql/dialect/postgresql/parser/PostgreSQLDeleteParser.java
浏览文件 @
cfac63c1
...
...
@@ -35,7 +35,7 @@ public final class PostgreSQLDeleteParser extends AbstractDeleteParser {
@Override
protected
void
skipBetweenDeleteAndTable
()
{
getExprParser
().
getLexer
().
skipIfEqual
(
DefaultKeyword
.
FROM
);
getExprParser
().
getLexer
().
skipIfEqual
(
PostgreSQLKeyword
.
ONLY
);
getExprParser
().
skipIfEqual
(
DefaultKeyword
.
FROM
);
getExprParser
().
skipIfEqual
(
PostgreSQLKeyword
.
ONLY
);
}
}
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parser/sql/dialect/postgresql/parser/PostgreSQLSelectParser.java
浏览文件 @
cfac63c1
...
...
@@ -35,12 +35,12 @@ public class PostgreSQLSelectParser extends AbstractSelectParser {
@Override
public
void
query
()
{
if
(
getExprParser
().
getLexer
().
skipIfEqual
(
DefaultKeyword
.
SELECT
))
{
if
(
getExprParser
().
skipIfEqual
(
DefaultKeyword
.
SELECT
))
{
parseDistinct
();
parseSelectList
();
if
(
getExprParser
().
getLexer
().
skipIfEqual
(
DefaultKeyword
.
INTO
))
{
getExprParser
().
getLexer
().
skipIfEqual
(
PostgreSQLKeyword
.
TEMPORARY
,
PostgreSQLKeyword
.
TEMP
,
PostgreSQLKeyword
.
UNLOGGED
);
getExprParser
().
getLexer
().
skipIfEqual
(
DefaultKeyword
.
TABLE
);
if
(
getExprParser
().
skipIfEqual
(
DefaultKeyword
.
INTO
))
{
getExprParser
().
skipIfEqual
(
PostgreSQLKeyword
.
TEMPORARY
,
PostgreSQLKeyword
.
TEMP
,
PostgreSQLKeyword
.
UNLOGGED
);
getExprParser
().
skipIfEqual
(
DefaultKeyword
.
TABLE
);
// TODO
// getExprParser().name();
}
...
...
@@ -48,20 +48,20 @@ public class PostgreSQLSelectParser extends AbstractSelectParser {
parseFrom
();
parseWhere
();
parseGroupBy
();
if
(
getExprParser
().
getLexer
().
equal
(
PostgreSQLKeyword
.
WINDOW
))
{
if
(
getExprParser
().
equal
(
PostgreSQLKeyword
.
WINDOW
))
{
throw
new
ParserUnsupportedException
(
PostgreSQLKeyword
.
WINDOW
);
}
getSqlContext
().
getOrderByContexts
().
addAll
(
getExprParser
().
parseOrderBy
(
getSqlContext
()));
parseLimit
();
if
(
getExprParser
().
getLexer
().
skipIfEqual
(
DefaultKeyword
.
FETCH
))
{
if
(
getExprParser
().
skipIfEqual
(
DefaultKeyword
.
FETCH
))
{
throw
new
ParserUnsupportedException
(
DefaultKeyword
.
FETCH
);
}
if
(
getExprParser
().
getLexer
().
skipIfEqual
(
DefaultKeyword
.
FOR
))
{
getExprParser
().
getLexer
().
skipIfEqual
(
DefaultKeyword
.
UPDATE
,
PostgreSQLKeyword
.
SHARE
);
if
(
getExprParser
().
getLexer
().
equal
(
PostgreSQLKeyword
.
OF
))
{
if
(
getExprParser
().
skipIfEqual
(
DefaultKeyword
.
FOR
))
{
getExprParser
().
skipIfEqual
(
DefaultKeyword
.
UPDATE
,
PostgreSQLKeyword
.
SHARE
);
if
(
getExprParser
().
equal
(
PostgreSQLKeyword
.
OF
))
{
throw
new
ParserUnsupportedException
(
PostgreSQLKeyword
.
OF
);
}
getExprParser
().
getLexer
().
skipIfEqual
(
PostgreSQLKeyword
.
NOWAIT
);
getExprParser
().
skipIfEqual
(
PostgreSQLKeyword
.
NOWAIT
);
}
queryRest
();
}
...
...
@@ -69,31 +69,31 @@ public class PostgreSQLSelectParser extends AbstractSelectParser {
// TODO 解析和改写limit
private
void
parseLimit
()
{
while
(
true
)
{
if
(
getExprParser
().
getLexer
().
equal
(
PostgreSQLKeyword
.
LIMIT
))
{
if
(
getExprParser
().
equal
(
PostgreSQLKeyword
.
LIMIT
))
{
getExprParser
().
getLexer
().
nextToken
();
if
(
getExprParser
().
getLexer
().
equal
(
DefaultKeyword
.
ALL
))
{
if
(
getExprParser
().
equal
(
DefaultKeyword
.
ALL
))
{
new
SQLIdentifierExpr
(
"ALL"
);
getExprParser
().
getLexer
().
nextToken
();
}
else
{
// rowCount
if
(
getExprParser
().
getLexer
().
equal
(
Literals
.
INT
))
{
}
else
if
(
getExprParser
().
getLexer
().
equal
(
Symbol
.
QUESTION
))
{
if
(
getExprParser
().
equal
(
Literals
.
INT
))
{
}
else
if
(
getExprParser
().
equal
(
Symbol
.
QUESTION
))
{
}
else
{
throw
new
ParserException
(
getExprParser
().
getLexer
());
}
getExprParser
().
getLexer
().
nextToken
();
}
}
else
if
(
getExprParser
().
getLexer
().
equal
(
PostgreSQLKeyword
.
OFFSET
))
{
}
else
if
(
getExprParser
().
equal
(
PostgreSQLKeyword
.
OFFSET
))
{
getExprParser
().
getLexer
().
nextToken
();
// offset
if
(
getExprParser
().
getLexer
().
equal
(
Literals
.
INT
))
{
}
else
if
(
getExprParser
().
getLexer
().
equal
(
Symbol
.
QUESTION
))
{
if
(
getExprParser
().
equal
(
Literals
.
INT
))
{
}
else
if
(
getExprParser
().
equal
(
Symbol
.
QUESTION
))
{
}
else
{
throw
new
ParserException
(
getExprParser
().
getLexer
());
}
getExprParser
().
getLexer
().
nextToken
();
getExprParser
().
getLexer
().
skipIfEqual
(
PostgreSQLKeyword
.
ROW
,
PostgreSQLKeyword
.
ROWS
);
getExprParser
().
skipIfEqual
(
PostgreSQLKeyword
.
ROW
,
PostgreSQLKeyword
.
ROWS
);
}
else
{
break
;
}
...
...
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parser/sql/dialect/postgresql/parser/PostgreSQLUpdateParser.java
浏览文件 @
cfac63c1
...
...
@@ -34,6 +34,6 @@ public final class PostgreSQLUpdateParser extends AbstractUpdateParser {
@Override
protected
void
skipBetweenUpdateAndTable
()
{
getExprParser
().
getLexer
().
skipIfEqual
(
PostgreSQLKeyword
.
ONLY
);
getExprParser
().
skipIfEqual
(
PostgreSQLKeyword
.
ONLY
);
}
}
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parser/sql/dialect/sqlserver/parser/SQLServerDeleteParser.java
浏览文件 @
cfac63c1
...
...
@@ -36,6 +36,6 @@ public final class SQLServerDeleteParser extends AbstractDeleteParser {
protected
void
skipBetweenDeleteAndTable
()
{
((
SQLServerExprParser
)
getExprParser
()).
parseTop
();
((
SQLServerExprParser
)
getExprParser
()).
skipOutput
();
getExprParser
().
getLexer
().
skipIfEqual
(
DefaultKeyword
.
FROM
);
getExprParser
().
skipIfEqual
(
DefaultKeyword
.
FROM
);
}
}
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parser/sql/dialect/sqlserver/parser/SQLServerExprParser.java
浏览文件 @
cfac63c1
...
...
@@ -68,7 +68,7 @@ public class SQLServerExprParser extends SQLExprParser {
}
protected
void
skipOutput
()
{
if
(
getLexer
().
equal
(
SQLServerKeyword
.
OUTPUT
))
{
if
(
equal
(
SQLServerKeyword
.
OUTPUT
))
{
throw
new
ParserUnsupportedException
(
SQLServerKeyword
.
OUTPUT
);
}
}
...
...
@@ -77,9 +77,9 @@ public class SQLServerExprParser extends SQLExprParser {
getLexer
().
nextToken
();
int
offset
;
int
offsetIndex
=
-
1
;
if
(
getLexer
().
equal
(
Literals
.
INT
))
{
if
(
equal
(
Literals
.
INT
))
{
offset
=
Integer
.
parseInt
(
getLexer
().
getToken
().
getLiterals
());
}
else
if
(
getLexer
().
equal
(
Symbol
.
QUESTION
))
{
}
else
if
(
equal
(
Symbol
.
QUESTION
))
{
offsetIndex
=
getParametersIndex
();
offset
=
(
int
)
getParameters
().
get
(
offsetIndex
);
setParametersIndex
(
offsetIndex
+
1
);
...
...
@@ -88,14 +88,14 @@ public class SQLServerExprParser extends SQLExprParser {
}
getLexer
().
nextToken
();
LimitContext
limitContext
;
if
(
getLexer
().
skipIfEqual
(
DefaultKeyword
.
FETCH
))
{
if
(
skipIfEqual
(
DefaultKeyword
.
FETCH
))
{
getLexer
().
nextToken
();
int
rowCount
;
int
rowCountIndex
=
-
1
;
getLexer
().
nextToken
();
if
(
getLexer
().
equal
(
Literals
.
INT
))
{
if
(
equal
(
Literals
.
INT
))
{
rowCount
=
Integer
.
parseInt
(
getLexer
().
getToken
().
getLiterals
());
}
else
if
(
getLexer
().
equal
(
Symbol
.
QUESTION
))
{
}
else
if
(
equal
(
Symbol
.
QUESTION
))
{
rowCountIndex
=
getParametersIndex
();
rowCount
=
(
int
)
getParameters
().
get
(
rowCountIndex
);
setParametersIndex
(
rowCountIndex
+
1
);
...
...
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parser/sql/dialect/sqlserver/parser/SQLServerSelectParser.java
浏览文件 @
cfac63c1
...
...
@@ -32,25 +32,25 @@ public class SQLServerSelectParser extends AbstractSelectParser {
@Override
protected
void
customizedSelect
()
{
if
(
getExprParser
().
getLexer
().
equal
(
DefaultKeyword
.
FOR
))
{
if
(
getExprParser
().
equal
(
DefaultKeyword
.
FOR
))
{
parseFor
();
}
if
(
getExprParser
().
getLexer
().
equal
(
SQLServerKeyword
.
OFFSET
))
{
if
(
getExprParser
().
equal
(
SQLServerKeyword
.
OFFSET
))
{
((
SQLServerExprParser
)
getExprParser
()).
parseOffset
(
getSqlContext
());
}
}
@Override
public
void
query
()
{
if
(
getExprParser
().
getLexer
().
skipIfEqual
(
DefaultKeyword
.
SELECT
))
{
if
(
getExprParser
().
skipIfEqual
(
DefaultKeyword
.
SELECT
))
{
parseDistinct
();
if
(
getExprParser
().
getLexer
().
equal
(
SQLServerKeyword
.
TOP
))
{
if
(
getExprParser
().
equal
(
SQLServerKeyword
.
TOP
))
{
// TODO save topContext
((
SQLServerExprParser
)
getExprParser
()).
parseTop
();
}
parseSelectList
();
}
if
(
getExprParser
().
getLexer
().
equal
(
DefaultKeyword
.
INTO
))
{
if
(
getExprParser
().
equal
(
DefaultKeyword
.
INTO
))
{
throw
new
ParserUnsupportedException
(
getExprParser
().
getLexer
().
getToken
().
getType
());
}
parseFrom
();
...
...
@@ -61,7 +61,7 @@ public class SQLServerSelectParser extends AbstractSelectParser {
@Override
protected
void
parseJoinTable
()
{
if
(
getExprParser
().
getLexer
().
skipIfEqual
(
DefaultKeyword
.
WITH
))
{
if
(
getExprParser
().
skipIfEqual
(
DefaultKeyword
.
WITH
))
{
getExprParser
().
skipParentheses
();
}
super
.
parseJoinTable
();
...
...
@@ -69,18 +69,18 @@ public class SQLServerSelectParser extends AbstractSelectParser {
private
void
parseFor
()
{
getExprParser
().
getLexer
().
nextToken
();
if
(
getExprParser
().
getLexer
().
equal
(
SQLServerKeyword
.
BROWSE
))
{
if
(
getExprParser
().
equal
(
SQLServerKeyword
.
BROWSE
))
{
getExprParser
().
getLexer
().
nextToken
();
}
else
if
(
getExprParser
().
getLexer
().
skipIfEqual
(
SQLServerKeyword
.
XML
))
{
}
else
if
(
getExprParser
().
skipIfEqual
(
SQLServerKeyword
.
XML
))
{
while
(
true
)
{
if
(
getExprParser
().
getLexer
().
equal
(
SQLServerKeyword
.
AUTO
,
SQLServerKeyword
.
TYPE
,
SQLServerKeyword
.
XMLSCHEMA
))
{
if
(
getExprParser
().
equal
(
SQLServerKeyword
.
AUTO
,
SQLServerKeyword
.
TYPE
,
SQLServerKeyword
.
XMLSCHEMA
))
{
getExprParser
().
getLexer
().
nextToken
();
}
else
if
(
getExprParser
().
getLexer
().
skipIfEqual
(
SQLServerKeyword
.
ELEMENTS
))
{
getExprParser
().
getLexer
().
skipIfEqual
(
SQLServerKeyword
.
XSINIL
);
}
else
if
(
getExprParser
().
skipIfEqual
(
SQLServerKeyword
.
ELEMENTS
))
{
getExprParser
().
skipIfEqual
(
SQLServerKeyword
.
XSINIL
);
}
else
{
break
;
}
if
(
getExprParser
().
getLexer
().
equal
(
Symbol
.
COMMA
))
{
if
(
getExprParser
().
equal
(
Symbol
.
COMMA
))
{
getExprParser
().
getLexer
().
nextToken
();
}
else
{
break
;
...
...
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parser/sql/lexer/Lexer.java
浏览文件 @
cfac63c1
...
...
@@ -17,13 +17,9 @@
package
com.dangdang.ddframe.rdb.sharding.parser.sql.lexer
;
import
com.dangdang.ddframe.rdb.sharding.parser.sql.parser.ParserException
;
import
com.google.common.collect.Sets
;
import
lombok.Getter
;
import
lombok.RequiredArgsConstructor
;
import
java.util.Set
;
/**
* 词法解析器.
*
...
...
@@ -148,60 +144,4 @@ public class Lexer {
protected
final
char
currentCharAt
(
final
int
offset
)
{
return
position
+
offset
>=
input
.
length
()
?
(
char
)
CharTypes
.
EOI
:
input
.
charAt
(
position
+
offset
);
}
/**
* 断言当前标记类型与传入值相等并跳过.
*
* @param tokenType 待判断的标记类型
*/
public
final
void
accept
(
final
TokenType
tokenType
)
{
if
(
token
.
getType
()
!=
tokenType
)
{
throw
new
ParserException
(
this
,
tokenType
);
}
nextToken
();
}
/**
* 判断当前语言标记是否和其中一个传入的标记相等.
*
* @param tokenTypes 待判断的标记类型
* @return 是否有相等的标记类型
*/
public
final
boolean
equal
(
final
TokenType
...
tokenTypes
)
{
for
(
TokenType
each
:
tokenTypes
)
{
if
(
each
==
token
.
getType
())
{
return
true
;
}
}
return
false
;
}
/**
* 如果当前语言符号等于传入值, 则跳过.
*
* @param tokenTypes 待跳过的语言符号
* @return 是否跳过(或可理解为是否相等)
*/
public
final
boolean
skipIfEqual
(
final
TokenType
...
tokenTypes
)
{
for
(
TokenType
each
:
tokenTypes
)
{
if
(
equal
(
each
))
{
nextToken
();
return
true
;
}
}
return
false
;
}
/**
* 直接跳转至传入的语言符号.
*
* @param tokenTypes 跳转至的语言符号
*/
public
final
void
skipUntil
(
final
TokenType
...
tokenTypes
)
{
Set
<
TokenType
>
tokenTypeSet
=
Sets
.
newHashSet
(
tokenTypes
);
tokenTypeSet
.
add
(
Assist
.
EOF
);
while
(!
tokenTypeSet
.
contains
(
token
.
getType
()))
{
nextToken
();
}
}
}
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parser/sql/parser/AbstractDeleteParser.java
浏览文件 @
cfac63c1
...
...
@@ -52,7 +52,7 @@ public abstract class AbstractDeleteParser {
exprParser
.
getLexer
().
nextToken
();
skipBetweenDeleteAndTable
();
exprParser
.
parseSingleTable
(
sqlContext
);
exprParser
.
getLexer
().
skipUntil
(
DefaultKeyword
.
WHERE
);
exprParser
.
skipUntil
(
DefaultKeyword
.
WHERE
);
Optional
<
ConditionContext
>
conditionContext
=
exprParser
.
parseWhere
(
sqlContext
);
if
(
conditionContext
.
isPresent
())
{
sqlContext
.
getConditionContexts
().
add
(
conditionContext
.
get
());
...
...
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parser/sql/parser/AbstractInsertParser.java
浏览文件 @
cfac63c1
...
...
@@ -73,7 +73,7 @@ public abstract class AbstractInsertParser {
exprParser
.
getLexer
().
nextToken
();
parseInto
();
Collection
<
Condition
.
Column
>
columns
=
parseColumns
();
if
(
exprParser
.
getLexer
().
equal
(
DefaultKeyword
.
SELECT
,
Symbol
.
LEFT_PAREN
))
{
if
(
exprParser
.
equal
(
DefaultKeyword
.
SELECT
,
Symbol
.
LEFT_PAREN
))
{
throw
new
UnsupportedOperationException
(
"Cannot support subquery"
);
}
if
(
getValuesKeywords
().
contains
(
exprParser
.
getLexer
().
getToken
().
getType
()))
{
...
...
@@ -92,7 +92,7 @@ public abstract class AbstractInsertParser {
if
(
getUnsupportedKeywords
().
contains
(
exprParser
.
getLexer
().
getToken
().
getType
()))
{
throw
new
ParserUnsupportedException
(
exprParser
.
getLexer
().
getToken
().
getType
());
}
exprParser
.
getLexer
().
skipUntil
(
DefaultKeyword
.
INTO
);
exprParser
.
skipUntil
(
DefaultKeyword
.
INTO
);
exprParser
.
getLexer
().
nextToken
();
exprParser
.
parseSingleTable
(
sqlContext
);
skipBetweenTableAndValues
();
...
...
@@ -101,7 +101,7 @@ public abstract class AbstractInsertParser {
private
void
skipBetweenTableAndValues
()
{
while
(
getSkippedTokensBetweenTableAndValues
().
contains
(
exprParser
.
getLexer
().
getToken
().
getType
()))
{
exprParser
.
getLexer
().
nextToken
();
if
(
exprParser
.
getLexer
().
equal
(
Symbol
.
LEFT_PAREN
))
{
if
(
exprParser
.
equal
(
Symbol
.
LEFT_PAREN
))
{
exprParser
.
skipParentheses
();
}
}
...
...
@@ -114,12 +114,12 @@ public abstract class AbstractInsertParser {
private
Collection
<
Condition
.
Column
>
parseColumns
()
{
Collection
<
Condition
.
Column
>
result
=
new
LinkedList
<>();
Collection
<
String
>
autoIncrementColumns
=
shardingRule
.
getAutoIncrementColumns
(
sqlContext
.
getTables
().
get
(
0
).
getName
());
if
(
exprParser
.
getLexer
().
equal
(
Symbol
.
LEFT_PAREN
))
{
if
(
exprParser
.
equal
(
Symbol
.
LEFT_PAREN
))
{
do
{
exprParser
.
getLexer
().
nextToken
();
result
.
add
(
getColumn
(
autoIncrementColumns
));
exprParser
.
getLexer
().
nextToken
();
}
while
(!
exprParser
.
getLexer
().
equal
(
Symbol
.
RIGHT_PAREN
)
&&
!
exprParser
.
getLexer
()
.
equal
(
Assist
.
EOF
));
}
while
(!
exprParser
.
equal
(
Symbol
.
RIGHT_PAREN
)
&&
!
exprParser
.
equal
(
Assist
.
EOF
));
ItemsToken
itemsToken
=
new
ItemsToken
(
exprParser
.
getLexer
().
getToken
().
getEndPosition
()
-
exprParser
.
getLexer
().
getToken
().
getLiterals
().
length
());
for
(
String
each
:
autoIncrementColumns
)
{
itemsToken
.
getItems
().
add
(
each
);
...
...
@@ -153,11 +153,11 @@ public abstract class AbstractInsertParser {
throw
new
UnsupportedOperationException
(
"Cannot support multiple insert"
);
}
exprParser
.
getLexer
().
nextToken
();
exprParser
.
getLexer
().
accept
(
Symbol
.
LEFT_PAREN
);
exprParser
.
accept
(
Symbol
.
LEFT_PAREN
);
List
<
SQLExpr
>
sqlExprs
=
new
LinkedList
<>();
do
{
sqlExprs
.
add
(
exprParser
.
parseExpr
());
}
while
(
exprParser
.
getLexer
().
skipIfEqual
(
Symbol
.
COMMA
));
}
while
(
exprParser
.
skipIfEqual
(
Symbol
.
COMMA
));
ItemsToken
itemsToken
=
new
ItemsToken
(
exprParser
.
getLexer
().
getToken
().
getEndPosition
()
-
exprParser
.
getLexer
().
getToken
().
getLiterals
().
length
());
int
count
=
0
;
for
(
Condition
.
Column
each
:
columns
)
{
...
...
@@ -180,10 +180,10 @@ public abstract class AbstractInsertParser {
if
(!
itemsToken
.
getItems
().
isEmpty
())
{
sqlContext
.
getSqlTokens
().
add
(
itemsToken
);
}
exprParser
.
getLexer
().
accept
(
Symbol
.
RIGHT_PAREN
);
exprParser
.
accept
(
Symbol
.
RIGHT_PAREN
);
parsed
=
true
;
}
while
(
exprParser
.
getLexer
().
equal
(
Symbol
.
COMMA
));
while
(
exprParser
.
equal
(
Symbol
.
COMMA
));
sqlContext
.
getConditionContexts
().
add
(
parseContext
.
getCurrentConditionContext
());
}
...
...
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parser/sql/parser/AbstractSelectParser.java
浏览文件 @
cfac63c1
...
...
@@ -69,7 +69,7 @@ public abstract class AbstractSelectParser {
}
protected
void
query
()
{
getExprParser
().
getLexer
().
accept
(
DefaultKeyword
.
SELECT
);
getExprParser
().
accept
(
DefaultKeyword
.
SELECT
);
parseDistinct
();
parseSelectList
();
parseFrom
();
...
...
@@ -79,14 +79,14 @@ public abstract class AbstractSelectParser {
}
protected
final
void
parseDistinct
()
{
if
(
getExprParser
().
getLexer
().
equal
(
DefaultKeyword
.
DISTINCT
,
DefaultKeyword
.
DISTINCTROW
,
DefaultKeyword
.
UNION
))
{
if
(
getExprParser
().
equal
(
DefaultKeyword
.
DISTINCT
,
DefaultKeyword
.
DISTINCTROW
,
DefaultKeyword
.
UNION
))
{
sqlContext
.
setDistinct
(
true
);
getExprParser
().
getLexer
().
nextToken
();
if
(
hasDistinctOn
()
&&
getExprParser
().
getLexer
().
equal
(
DefaultKeyword
.
ON
))
{
if
(
hasDistinctOn
()
&&
getExprParser
().
equal
(
DefaultKeyword
.
ON
))
{
getExprParser
().
getLexer
().
nextToken
();
getExprParser
().
skipParentheses
();
}
}
else
if
(
getExprParser
().
getLexer
().
equal
(
DefaultKeyword
.
ALL
))
{
}
else
if
(
getExprParser
().
equal
(
DefaultKeyword
.
ALL
))
{
getExprParser
().
getLexer
().
nextToken
();
}
}
...
...
@@ -104,12 +104,12 @@ public abstract class AbstractSelectParser {
sqlContext
.
setContainStar
(
true
);
}
index
++;
}
while
(
getExprParser
().
getLexer
().
skipIfEqual
(
Symbol
.
COMMA
));
}
while
(
getExprParser
().
skipIfEqual
(
Symbol
.
COMMA
));
sqlContext
.
setSelectListLastPosition
(
getExprParser
().
getLexer
().
getToken
().
getEndPosition
()
-
getExprParser
().
getLexer
().
getToken
().
getLiterals
().
length
());
}
protected
void
queryRest
()
{
if
(
getExprParser
().
getLexer
().
equal
(
DefaultKeyword
.
UNION
,
DefaultKeyword
.
EXCEPT
,
DefaultKeyword
.
INTERSECT
,
DefaultKeyword
.
MINUS
))
{
if
(
getExprParser
().
equal
(
DefaultKeyword
.
UNION
,
DefaultKeyword
.
EXCEPT
,
DefaultKeyword
.
INTERSECT
,
DefaultKeyword
.
MINUS
))
{
throw
new
ParserUnsupportedException
(
getExprParser
().
getLexer
().
getToken
().
getType
());
}
}
...
...
@@ -126,31 +126,31 @@ public abstract class AbstractSelectParser {
}
protected
void
parseGroupBy
()
{
if
(
getExprParser
().
getLexer
().
skipIfEqual
(
DefaultKeyword
.
GROUP
))
{
getExprParser
().
getLexer
().
accept
(
DefaultKeyword
.
BY
);
if
(
getExprParser
().
skipIfEqual
(
DefaultKeyword
.
GROUP
))
{
getExprParser
().
accept
(
DefaultKeyword
.
BY
);
while
(
true
)
{
addGroupByItem
(
exprParser
.
parseExpr
(
sqlContext
));
if
(!
getExprParser
().
getLexer
().
equal
(
Symbol
.
COMMA
))
{
if
(!
getExprParser
().
equal
(
Symbol
.
COMMA
))
{
break
;
}
getExprParser
().
getLexer
().
nextToken
();
}
while
(
getExprParser
().
getLexer
().
equal
(
DefaultKeyword
.
WITH
)
||
getExprParser
().
getLexer
().
getToken
().
getLiterals
().
equalsIgnoreCase
(
"ROLLUP"
))
{
while
(
getExprParser
().
equal
(
DefaultKeyword
.
WITH
)
||
getExprParser
().
getLexer
().
getToken
().
getLiterals
().
equalsIgnoreCase
(
"ROLLUP"
))
{
getExprParser
().
getLexer
().
nextToken
();
}
if
(
getExprParser
().
getLexer
().
skipIfEqual
(
DefaultKeyword
.
HAVING
))
{
if
(
getExprParser
().
skipIfEqual
(
DefaultKeyword
.
HAVING
))
{
exprParser
.
parseExpr
(
sqlContext
);
}
}
else
if
(
getExprParser
().
getLexer
().
skipIfEqual
(
DefaultKeyword
.
HAVING
))
{
}
else
if
(
getExprParser
().
skipIfEqual
(
DefaultKeyword
.
HAVING
))
{
exprParser
.
parseExpr
(
sqlContext
);
}
}
protected
final
void
addGroupByItem
(
final
SQLExpr
sqlExpr
)
{
OrderByColumn
.
OrderByType
orderByType
=
OrderByColumn
.
OrderByType
.
ASC
;
if
(
getExprParser
().
getLexer
().
equal
(
DefaultKeyword
.
ASC
))
{
if
(
getExprParser
().
equal
(
DefaultKeyword
.
ASC
))
{
getExprParser
().
getLexer
().
nextToken
();
}
else
if
(
getExprParser
().
getLexer
().
skipIfEqual
(
DefaultKeyword
.
DESC
))
{
}
else
if
(
getExprParser
().
skipIfEqual
(
DefaultKeyword
.
DESC
))
{
orderByType
=
OrderByColumn
.
OrderByType
.
DESC
;
}
if
(
sqlExpr
instanceof
SQLPropertyExpr
)
{
...
...
@@ -163,13 +163,13 @@ public abstract class AbstractSelectParser {
}
public
final
void
parseFrom
()
{
if
(
getExprParser
().
getLexer
().
skipIfEqual
(
DefaultKeyword
.
FROM
))
{
if
(
getExprParser
().
skipIfEqual
(
DefaultKeyword
.
FROM
))
{
parseTable
();
}
}
public
List
<
TableContext
>
parseTable
()
{
if
(
getExprParser
().
getLexer
().
equal
(
Symbol
.
LEFT_PAREN
))
{
if
(
getExprParser
().
equal
(
Symbol
.
LEFT_PAREN
))
{
throw
new
UnsupportedOperationException
(
"Cannot support subquery"
);
}
parseTableFactor
();
...
...
@@ -181,7 +181,7 @@ public abstract class AbstractSelectParser {
int
beginPosition
=
getExprParser
().
getLexer
().
getToken
().
getEndPosition
()
-
getExprParser
().
getLexer
().
getToken
().
getLiterals
().
length
();
String
literals
=
getExprParser
().
getLexer
().
getToken
().
getLiterals
();
getExprParser
().
getLexer
().
nextToken
();
if
(
getExprParser
().
getLexer
().
skipIfEqual
(
Symbol
.
DOT
))
{
if
(
getExprParser
().
skipIfEqual
(
Symbol
.
DOT
))
{
getExprParser
().
getLexer
().
nextToken
();
getExprParser
().
as
();
return
;
...
...
@@ -194,13 +194,13 @@ public abstract class AbstractSelectParser {
protected
void
parseJoinTable
()
{
if
(
getExprParser
().
isJoin
())
{
parseTable
();
if
(
getExprParser
().
getLexer
().
skipIfEqual
(
DefaultKeyword
.
ON
))
{
if
(
getExprParser
().
skipIfEqual
(
DefaultKeyword
.
ON
))
{
do
{
parseTableCondition
(
getExprParser
().
getLexer
().
getToken
().
getEndPosition
());
getExprParser
().
getLexer
().
accept
(
Symbol
.
EQ
);
getExprParser
().
accept
(
Symbol
.
EQ
);
parseTableCondition
(
getExprParser
().
getLexer
().
getToken
().
getEndPosition
()
-
getExprParser
().
getLexer
().
getToken
().
getLiterals
().
length
());
}
while
(
getExprParser
().
getLexer
().
skipIfEqual
(
DefaultKeyword
.
AND
));
}
else
if
(
getExprParser
().
getLexer
().
skipIfEqual
(
DefaultKeyword
.
USING
))
{
}
while
(
getExprParser
().
skipIfEqual
(
DefaultKeyword
.
AND
));
}
else
if
(
getExprParser
().
skipIfEqual
(
DefaultKeyword
.
USING
))
{
getExprParser
().
skipParentheses
();
}
parseJoinTable
();
...
...
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parser/sql/parser/AbstractUpdateParser.java
浏览文件 @
cfac63c1
...
...
@@ -56,7 +56,7 @@ public abstract class AbstractUpdateParser {
skipBetweenUpdateAndTable
();
exprParser
.
parseSingleTable
(
sqlContext
);
parseSetItems
();
exprParser
.
getLexer
().
skipUntil
(
DefaultKeyword
.
WHERE
);
exprParser
.
skipUntil
(
DefaultKeyword
.
WHERE
);
exprParser
.
setParametersIndex
(
parametersIndex
);
Optional
<
ConditionContext
>
conditionContext
=
exprParser
.
parseWhere
(
sqlContext
);
if
(
conditionContext
.
isPresent
())
{
...
...
@@ -68,28 +68,28 @@ public abstract class AbstractUpdateParser {
protected
abstract
void
skipBetweenUpdateAndTable
();
private
void
parseSetItems
()
{
exprParser
.
getLexer
().
accept
(
DefaultKeyword
.
SET
);
exprParser
.
accept
(
DefaultKeyword
.
SET
);
do
{
parseSetItem
();
}
while
(
exprParser
.
getLexer
().
skipIfEqual
(
Symbol
.
COMMA
));
}
while
(
exprParser
.
skipIfEqual
(
Symbol
.
COMMA
));
}
private
void
parseSetItem
()
{
if
(
exprParser
.
getLexer
().
equal
(
Symbol
.
LEFT_PAREN
))
{
if
(
exprParser
.
equal
(
Symbol
.
LEFT_PAREN
))
{
exprParser
.
skipParentheses
();
}
else
{
int
beginPosition
=
exprParser
.
getLexer
().
getToken
().
getEndPosition
();
String
literals
=
exprParser
.
getLexer
().
getToken
().
getLiterals
();
exprParser
.
getLexer
().
nextToken
();
String
tableName
=
sqlContext
.
getTables
().
get
(
0
).
getName
();
if
(
exprParser
.
getLexer
().
skipIfEqual
(
Symbol
.
DOT
))
{
if
(
exprParser
.
skipIfEqual
(
Symbol
.
DOT
))
{
if
(
tableName
.
equalsIgnoreCase
(
SQLUtil
.
getExactlyValue
(
literals
)))
{
sqlContext
.
getSqlTokens
().
add
(
new
TableToken
(
beginPosition
-
literals
.
length
(),
literals
,
tableName
));
}
exprParser
.
getLexer
().
nextToken
();
}
}
exprParser
.
getLexer
().
skipIfEqual
(
Symbol
.
EQ
,
Symbol
.
COLON_EQ
);
exprParser
.
skipIfEqual
(
Symbol
.
EQ
,
Symbol
.
COLON_EQ
);
exprParser
.
parseExpr
(
sqlContext
);
parametersIndex
=
exprParser
.
getParametersIndex
();
}
...
...
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parser/sql/parser/Parser.java
0 → 100755
浏览文件 @
cfac63c1
/*
* Copyright 1999-2015 dangdang.com.
* <p>
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* </p>
*/
package
com.dangdang.ddframe.rdb.sharding.parser.sql.parser
;
import
com.dangdang.ddframe.rdb.sharding.parser.sql.lexer.Assist
;
import
com.dangdang.ddframe.rdb.sharding.parser.sql.lexer.Lexer
;
import
com.dangdang.ddframe.rdb.sharding.parser.sql.lexer.Symbol
;
import
com.dangdang.ddframe.rdb.sharding.parser.sql.lexer.TokenType
;
import
com.google.common.collect.Sets
;
import
lombok.Getter
;
import
lombok.RequiredArgsConstructor
;
import
java.util.Set
;
/**
* 解析器.
*
* @author zhangliang
*/
@RequiredArgsConstructor
public
class
Parser
{
@Getter
private
final
Lexer
lexer
;
/**
* 跳过小括号内所有的语言符号.
*
* @return 小括号内所有的语言符号
*/
public
final
String
skipParentheses
()
{
StringBuilder
result
=
new
StringBuilder
(
""
);
int
count
=
0
;
if
(
Symbol
.
LEFT_PAREN
==
getLexer
().
getToken
().
getType
())
{
int
beginPosition
=
getLexer
().
getToken
().
getEndPosition
();
result
.
append
(
Symbol
.
LEFT_PAREN
.
getLiterals
());
getLexer
().
nextToken
();
while
(
true
)
{
if
(
Assist
.
EOF
==
getLexer
().
getToken
().
getType
()
||
(
Symbol
.
RIGHT_PAREN
==
getLexer
().
getToken
().
getType
()
&&
0
==
count
))
{
break
;
}
if
(
Symbol
.
LEFT_PAREN
==
getLexer
().
getToken
().
getType
())
{
count
++;
}
else
if
(
Symbol
.
RIGHT_PAREN
==
getLexer
().
getToken
().
getType
())
{
count
--;
}
getLexer
().
nextToken
();
}
result
.
append
(
getLexer
().
getInput
().
substring
(
beginPosition
,
getLexer
().
getToken
().
getEndPosition
()));
getLexer
().
nextToken
();
}
return
result
.
toString
();
}
/**
* 断言当前标记类型与传入值相等并跳过.
*
* @param tokenType 待判断的标记类型
*/
public
final
void
accept
(
final
TokenType
tokenType
)
{
if
(
lexer
.
getToken
().
getType
()
!=
tokenType
)
{
throw
new
ParserException
(
lexer
,
tokenType
);
}
lexer
.
nextToken
();
}
/**
* 判断当前语言标记是否和其中一个传入的标记相等.
*
* @param tokenTypes 待判断的标记类型
* @return 是否有相等的标记类型
*/
public
final
boolean
equal
(
final
TokenType
...
tokenTypes
)
{
for
(
TokenType
each
:
tokenTypes
)
{
if
(
each
==
lexer
.
getToken
().
getType
())
{
return
true
;
}
}
return
false
;
}
/**
* 如果当前语言符号等于传入值, 则跳过.
*
* @param tokenTypes 待跳过的语言符号
* @return 是否跳过(或可理解为是否相等)
*/
public
final
boolean
skipIfEqual
(
final
TokenType
...
tokenTypes
)
{
for
(
TokenType
each
:
tokenTypes
)
{
if
(
equal
(
each
))
{
lexer
.
nextToken
();
return
true
;
}
}
return
false
;
}
/**
* 直接跳转至传入的语言符号.
*
* @param tokenTypes 跳转至的语言符号
*/
public
final
void
skipUntil
(
final
TokenType
...
tokenTypes
)
{
Set
<
TokenType
>
tokenTypeSet
=
Sets
.
newHashSet
(
tokenTypes
);
tokenTypeSet
.
add
(
Assist
.
EOF
);
while
(!
tokenTypeSet
.
contains
(
lexer
.
getToken
().
getType
()))
{
lexer
.
nextToken
();
}
}
}
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parser/sql/parser/SQLExprParser.java
浏览文件 @
cfac63c1
...
...
@@ -58,10 +58,7 @@ import java.util.List;
*
* @author zhangliang
*/
public
class
SQLExprParser
{
@Getter
private
final
Lexer
lexer
;
public
class
SQLExprParser
extends
Parser
{
@Getter
private
final
ShardingRule
shardingRule
;
...
...
@@ -74,43 +71,43 @@ public class SQLExprParser {
private
int
parametersIndex
;
public
SQLExprParser
(
final
ShardingRule
shardingRule
,
final
List
<
Object
>
parameters
,
final
Lexer
lexer
)
{
this
.
lexer
=
lexer
;
super
(
lexer
)
;
this
.
shardingRule
=
shardingRule
;
this
.
parameters
=
parameters
;
}
protected
Optional
<
String
>
as
()
{
if
(
lexer
.
skipIfEqual
(
DefaultKeyword
.
AS
))
{
if
(
skipIfEqual
(
DefaultKeyword
.
AS
))
{
// TODO 判断Literals是符号则返回null, 目前仅判断为LEFT_PAREN
if
(
lexer
.
equal
(
Symbol
.
LEFT_PAREN
))
{
if
(
equal
(
Symbol
.
LEFT_PAREN
))
{
return
Optional
.
absent
();
}
String
result
=
SQLUtil
.
getExactlyValue
(
lexer
.
getToken
().
getLiterals
());
lexer
.
nextToken
();
String
result
=
SQLUtil
.
getExactlyValue
(
getLexer
()
.
getToken
().
getLiterals
());
getLexer
()
.
nextToken
();
return
Optional
.
of
(
result
);
}
// TODO 增加哪些数据库识别哪些关键字作为别名的配置
if
(
lexer
.
equal
(
Literals
.
IDENTIFIER
,
Literals
.
ALIAS
,
Literals
.
CHARS
,
if
(
equal
(
Literals
.
IDENTIFIER
,
Literals
.
ALIAS
,
Literals
.
CHARS
,
DefaultKeyword
.
USER
,
DefaultKeyword
.
END
,
DefaultKeyword
.
CASE
,
DefaultKeyword
.
KEY
,
DefaultKeyword
.
INTERVAL
,
DefaultKeyword
.
CONSTRAINT
))
{
String
result
=
SQLUtil
.
getExactlyValue
(
lexer
.
getToken
().
getLiterals
());
lexer
.
nextToken
();
String
result
=
SQLUtil
.
getExactlyValue
(
getLexer
()
.
getToken
().
getLiterals
());
getLexer
()
.
nextToken
();
return
Optional
.
of
(
result
);
}
return
Optional
.
absent
();
}
public
List
<
OrderByContext
>
parseOrderBy
(
final
SQLContext
sqlContext
)
{
if
(!
getLexer
().
skipIfEqual
(
DefaultKeyword
.
ORDER
))
{
if
(!
skipIfEqual
(
DefaultKeyword
.
ORDER
))
{
return
Collections
.
emptyList
();
}
List
<
OrderByContext
>
result
=
new
LinkedList
<>();
getLexer
().
skipIfEqual
(
DefaultKeyword
.
SIBLINGS
);
getLexer
().
accept
(
DefaultKeyword
.
BY
);
skipIfEqual
(
DefaultKeyword
.
SIBLINGS
);
accept
(
DefaultKeyword
.
BY
);
OrderByContext
orderByContext
=
parseSelectOrderByItem
(
sqlContext
);
if
(
null
!=
orderByContext
)
{
result
.
add
(
orderByContext
);
}
while
(
getLexer
().
equal
(
Symbol
.
COMMA
))
{
while
(
equal
(
Symbol
.
COMMA
))
{
getLexer
().
nextToken
();
orderByContext
=
parseSelectOrderByItem
(
sqlContext
);
if
(
null
!=
orderByContext
)
{
...
...
@@ -123,9 +120,9 @@ public class SQLExprParser {
public
OrderByContext
parseSelectOrderByItem
(
final
SQLContext
sqlContext
)
{
SQLExpr
expr
=
parseExpr
(
sqlContext
);
OrderByColumn
.
OrderByType
orderByType
=
OrderByColumn
.
OrderByType
.
ASC
;
if
(
getLexer
().
equal
(
DefaultKeyword
.
ASC
))
{
if
(
equal
(
DefaultKeyword
.
ASC
))
{
getLexer
().
nextToken
();
}
else
if
(
getLexer
().
equal
(
DefaultKeyword
.
DESC
))
{
}
else
if
(
equal
(
DefaultKeyword
.
DESC
))
{
getLexer
().
nextToken
();
orderByType
=
OrderByColumn
.
OrderByType
.
DESC
;
}
...
...
@@ -144,8 +141,8 @@ public class SQLExprParser {
protected
final
void
parseSingleTable
(
final
SQLContext
sqlContext
)
{
boolean
hasParentheses
=
false
;
if
(
getLexer
().
skipIfEqual
(
Symbol
.
LEFT_PAREN
))
{
if
(
getLexer
().
equal
(
DefaultKeyword
.
SELECT
))
{
if
(
skipIfEqual
(
Symbol
.
LEFT_PAREN
))
{
if
(
equal
(
DefaultKeyword
.
SELECT
))
{
throw
new
UnsupportedOperationException
(
"Cannot support subquery"
);
}
hasParentheses
=
true
;
...
...
@@ -154,16 +151,16 @@ public class SQLExprParser {
int
beginPosition
=
getLexer
().
getToken
().
getEndPosition
()
-
getLexer
().
getToken
().
getLiterals
().
length
();
String
literals
=
getLexer
().
getToken
().
getLiterals
();
getLexer
().
nextToken
();
if
(
getLexer
().
skipIfEqual
(
Symbol
.
DOT
))
{
if
(
skipIfEqual
(
Symbol
.
DOT
))
{
String
tableName
=
getLexer
().
getToken
().
getLiterals
();
getLexer
().
nextToken
();
if
(
hasParentheses
)
{
getLexer
().
accept
(
Symbol
.
RIGHT_PAREN
);
accept
(
Symbol
.
RIGHT_PAREN
);
}
tableContext
=
new
TableContext
(
tableName
,
SQLUtil
.
getExactlyValue
(
literals
),
as
());
}
else
{
if
(
hasParentheses
)
{
getLexer
().
accept
(
Symbol
.
RIGHT_PAREN
);
accept
(
Symbol
.
RIGHT_PAREN
);
}
tableContext
=
new
TableContext
(
literals
,
SQLUtil
.
getExactlyValue
(
literals
),
as
());
}
...
...
@@ -175,21 +172,21 @@ public class SQLExprParser {
}
public
final
boolean
isJoin
()
{
if
(
getLexer
().
skipIfEqual
(
DefaultKeyword
.
LEFT
,
DefaultKeyword
.
RIGHT
,
DefaultKeyword
.
FULL
))
{
getLexer
().
skipIfEqual
(
DefaultKeyword
.
OUTER
);
getLexer
().
accept
(
DefaultKeyword
.
JOIN
);
if
(
skipIfEqual
(
DefaultKeyword
.
LEFT
,
DefaultKeyword
.
RIGHT
,
DefaultKeyword
.
FULL
))
{
skipIfEqual
(
DefaultKeyword
.
OUTER
);
accept
(
DefaultKeyword
.
JOIN
);
return
true
;
}
else
if
(
getLexer
().
skipIfEqual
(
DefaultKeyword
.
INNER
))
{
getLexer
().
accept
(
DefaultKeyword
.
JOIN
);
}
else
if
(
skipIfEqual
(
DefaultKeyword
.
INNER
))
{
accept
(
DefaultKeyword
.
JOIN
);
return
true
;
}
else
if
(
getLexer
().
skipIfEqual
(
DefaultKeyword
.
JOIN
,
Symbol
.
COMMA
,
DefaultKeyword
.
STRAIGHT_JOIN
))
{
}
else
if
(
skipIfEqual
(
DefaultKeyword
.
JOIN
,
Symbol
.
COMMA
,
DefaultKeyword
.
STRAIGHT_JOIN
))
{
return
true
;
}
else
if
(
getLexer
().
skipIfEqual
(
DefaultKeyword
.
CROSS
))
{
if
(
getLexer
().
skipIfEqual
(
DefaultKeyword
.
JOIN
,
DefaultKeyword
.
APPLY
))
{
}
else
if
(
skipIfEqual
(
DefaultKeyword
.
CROSS
))
{
if
(
skipIfEqual
(
DefaultKeyword
.
JOIN
,
DefaultKeyword
.
APPLY
))
{
return
true
;
}
}
else
if
(
getLexer
().
skipIfEqual
(
DefaultKeyword
.
OUTER
))
{
if
(
getLexer
().
skipIfEqual
(
DefaultKeyword
.
APPLY
))
{
}
else
if
(
skipIfEqual
(
DefaultKeyword
.
OUTER
))
{
if
(
skipIfEqual
(
DefaultKeyword
.
APPLY
))
{
return
true
;
}
}
...
...
@@ -197,24 +194,24 @@ public class SQLExprParser {
}
public
final
SelectItemContext
parseSelectItem
(
final
int
index
,
final
SelectSQLContext
sqlContext
)
{
getLexer
().
skipIfEqual
(
DefaultKeyword
.
CONNECT_BY_ROOT
);
skipIfEqual
(
DefaultKeyword
.
CONNECT_BY_ROOT
);
String
literals
=
getLexer
().
getToken
().
getLiterals
();
if
(
getLexer
().
equal
(
Symbol
.
STAR
)
||
Symbol
.
STAR
.
getLiterals
().
equals
(
SQLUtil
.
getExactlyValue
(
literals
)))
{
if
(
equal
(
Symbol
.
STAR
)
||
Symbol
.
STAR
.
getLiterals
().
equals
(
SQLUtil
.
getExactlyValue
(
literals
)))
{
getLexer
().
nextToken
();
return
new
CommonSelectItemContext
(
Symbol
.
STAR
.
getLiterals
(),
as
(),
index
,
true
);
}
if
(
getLexer
().
skipIfEqual
(
DefaultKeyword
.
MAX
,
DefaultKeyword
.
MIN
,
DefaultKeyword
.
SUM
,
DefaultKeyword
.
AVG
,
DefaultKeyword
.
COUNT
))
{
if
(
skipIfEqual
(
DefaultKeyword
.
MAX
,
DefaultKeyword
.
MIN
,
DefaultKeyword
.
SUM
,
DefaultKeyword
.
AVG
,
DefaultKeyword
.
COUNT
))
{
return
new
AggregationSelectItemContext
(
skipParentheses
(),
as
(),
index
,
AggregationColumn
.
AggregationType
.
valueOf
(
literals
.
toUpperCase
()));
}
StringBuilder
expression
=
new
StringBuilder
();
// FIXME 无as的alias解析, 应该做成倒数第二个token不是运算符,倒数第一个token是Identifier或char,则为别名, 不过CommonSelectItemContext类型并不关注expression和alias
// FIXME 解析xxx.*
while
(!
getLexer
().
equal
(
DefaultKeyword
.
AS
)
&&
!
getLexer
().
equal
(
Symbol
.
COMMA
)
&&
!
getLexer
().
equal
(
DefaultKeyword
.
FROM
)
&&
!
getLexer
().
equal
(
Assist
.
EOF
))
{
while
(!
equal
(
DefaultKeyword
.
AS
)
&&
!
equal
(
Symbol
.
COMMA
)
&&
!
equal
(
DefaultKeyword
.
FROM
)
&&
!
equal
(
Assist
.
EOF
))
{
String
value
=
getLexer
().
getToken
().
getLiterals
();
int
position
=
getLexer
().
getToken
().
getEndPosition
()
-
value
.
length
();
expression
.
append
(
value
);
getLexer
().
nextToken
();
if
(
getLexer
().
equal
(
Symbol
.
DOT
))
{
if
(
equal
(
Symbol
.
DOT
))
{
sqlContext
.
getSqlTokens
().
add
(
new
TableToken
(
position
,
value
,
SQLUtil
.
getExactlyValue
(
value
)));
}
}
...
...
@@ -222,7 +219,7 @@ public class SQLExprParser {
}
public
Optional
<
ConditionContext
>
parseWhere
(
final
SQLContext
sqlContext
)
{
if
(
lexer
.
skipIfEqual
(
DefaultKeyword
.
WHERE
))
{
if
(
skipIfEqual
(
DefaultKeyword
.
WHERE
))
{
ParseContext
parseContext
=
getParseContext
(
sqlContext
);
parseConditions
(
sqlContext
,
parseContext
);
return
Optional
.
of
(
parseContext
.
getCurrentConditionContext
());
...
...
@@ -242,31 +239,31 @@ public class SQLExprParser {
private
void
parseConditions
(
final
SQLContext
sqlContext
,
final
ParseContext
parseContext
)
{
do
{
parseComparisonCondition
(
sqlContext
,
parseContext
);
}
while
(
lexer
.
skipIfEqual
(
DefaultKeyword
.
AND
));
if
(
lexer
.
equal
(
DefaultKeyword
.
OR
))
{
throw
new
ParserUnsupportedException
(
lexer
.
getToken
().
getType
());
}
while
(
skipIfEqual
(
DefaultKeyword
.
AND
));
if
(
equal
(
DefaultKeyword
.
OR
))
{
throw
new
ParserUnsupportedException
(
getLexer
()
.
getToken
().
getType
());
}
}
// TODO 解析组合expr
public
void
parseComparisonCondition
(
final
SQLContext
sqlContext
,
final
ParseContext
parseContext
)
{
getLexer
().
skipIfEqual
(
Symbol
.
LEFT_PAREN
);
skipIfEqual
(
Symbol
.
LEFT_PAREN
);
SQLExpr
left
=
parseExpr
(
sqlContext
);
if
(
lexer
.
equal
(
Symbol
.
EQ
))
{
if
(
equal
(
Symbol
.
EQ
))
{
parseEqualCondition
(
sqlContext
,
parseContext
,
left
);
}
else
if
(
lexer
.
equal
(
DefaultKeyword
.
IN
))
{
}
else
if
(
equal
(
DefaultKeyword
.
IN
))
{
parseInCondition
(
sqlContext
,
parseContext
,
left
);
}
else
if
(
lexer
.
equal
(
DefaultKeyword
.
BETWEEN
))
{
}
else
if
(
equal
(
DefaultKeyword
.
BETWEEN
))
{
parseBetweenCondition
(
sqlContext
,
parseContext
,
left
);
}
else
if
(
lexer
.
equal
(
Symbol
.
LT
)
||
lexer
.
equal
(
Symbol
.
GT
)
||
lexer
.
equal
(
Symbol
.
LT_EQ
)
||
lexer
.
equal
(
Symbol
.
GT_EQ
))
{
}
else
if
(
equal
(
Symbol
.
LT
)
||
equal
(
Symbol
.
GT
)
||
equal
(
Symbol
.
LT_EQ
)
||
equal
(
Symbol
.
GT_EQ
))
{
parserOtherCondition
(
sqlContext
);
}
getLexer
().
skipIfEqual
(
Symbol
.
LEFT_PAREN
);
skipIfEqual
(
Symbol
.
LEFT_PAREN
);
}
private
void
parseEqualCondition
(
final
SQLContext
sqlContext
,
final
ParseContext
parseContext
,
final
SQLExpr
left
)
{
lexer
.
nextToken
();
getLexer
()
.
nextToken
();
SQLExpr
right
=
parseExpr
(
sqlContext
);
// TODO 如果有多表,且找不到column是哪个表的,则不加入condition,以后需要解析binding table
if
((
1
==
sqlContext
.
getTables
().
size
()
||
left
instanceof
SQLPropertyExpr
)
&&
(
right
instanceof
SQLLiteralExpr
||
right
instanceof
SQLPlaceholderExpr
))
{
...
...
@@ -275,35 +272,35 @@ public class SQLExprParser {
}
private
void
parseInCondition
(
final
SQLContext
sqlContext
,
final
ParseContext
parseContext
,
final
SQLExpr
left
)
{
lexer
.
nextToken
();
lexer
.
accept
(
Symbol
.
LEFT_PAREN
);
getLexer
()
.
nextToken
();
accept
(
Symbol
.
LEFT_PAREN
);
List
<
SQLExpr
>
rights
=
new
LinkedList
<>();
do
{
if
(
lexer
.
equal
(
Symbol
.
COMMA
))
{
lexer
.
nextToken
();
if
(
equal
(
Symbol
.
COMMA
))
{
getLexer
()
.
nextToken
();
}
rights
.
add
(
parseExpr
(
sqlContext
));
}
while
(!
lexer
.
equal
(
Symbol
.
RIGHT_PAREN
));
}
while
(!
equal
(
Symbol
.
RIGHT_PAREN
));
parseContext
.
addCondition
(
left
,
Condition
.
BinaryOperator
.
IN
,
rights
);
lexer
.
nextToken
();
getLexer
()
.
nextToken
();
}
private
void
parseBetweenCondition
(
final
SQLContext
sqlContext
,
final
ParseContext
parseContext
,
final
SQLExpr
left
)
{
lexer
.
nextToken
();
getLexer
()
.
nextToken
();
List
<
SQLExpr
>
rights
=
new
LinkedList
<>();
rights
.
add
(
parseExpr
(
sqlContext
));
lexer
.
accept
(
DefaultKeyword
.
AND
);
accept
(
DefaultKeyword
.
AND
);
rights
.
add
(
parseExpr
(
sqlContext
));
parseContext
.
addCondition
(
left
,
Condition
.
BinaryOperator
.
BETWEEN
,
rights
);
}
private
void
parserOtherCondition
(
final
SQLContext
sqlContext
)
{
lexer
.
nextToken
();
getLexer
()
.
nextToken
();
parseExpr
(
sqlContext
);
}
public
SQLExpr
parseExpr
(
final
SQLContext
sqlContext
)
{
int
beginPosition
=
lexer
.
getToken
().
getEndPosition
();
int
beginPosition
=
getLexer
()
.
getToken
().
getEndPosition
();
SQLExpr
result
=
parseExpr
();
if
(
result
instanceof
SQLPropertyExpr
)
{
String
tableName
=
sqlContext
.
getTables
().
get
(
0
).
getName
();
...
...
@@ -316,25 +313,25 @@ public class SQLExprParser {
}
public
SQLExpr
parseExpr
()
{
String
literals
=
lexer
.
getToken
().
getLiterals
();
if
(
lexer
.
equal
(
Literals
.
IDENTIFIER
))
{
String
literals
=
getLexer
()
.
getToken
().
getLiterals
();
if
(
equal
(
Literals
.
IDENTIFIER
))
{
SQLExpr
result
=
getSQLExpr
(
SQLUtil
.
getExactlyValue
(
literals
));
getLexer
().
nextToken
();
if
(
lexer
.
skipIfEqual
(
Symbol
.
DOT
))
{
String
property
=
lexer
.
getToken
().
getLiterals
();
if
(
skipIfEqual
(
Symbol
.
DOT
))
{
String
property
=
getLexer
()
.
getToken
().
getLiterals
();
getLexer
().
nextToken
();
if
(!
lexer
.
equal
(
Symbol
.
PLUS
,
Symbol
.
SUB
,
Symbol
.
STAR
,
Symbol
.
SLASH
))
{
if
(!
equal
(
Symbol
.
PLUS
,
Symbol
.
SUB
,
Symbol
.
STAR
,
Symbol
.
SLASH
))
{
return
new
SQLPropertyExpr
(
new
SQLIdentifierExpr
(
literals
),
property
);
}
skipRest
();
return
new
SQLIgnoreExpr
();
}
if
(
lexer
.
equal
(
Symbol
.
LEFT_PAREN
))
{
if
(
equal
(
Symbol
.
LEFT_PAREN
))
{
skipParentheses
();
skipRest
();
return
new
SQLIgnoreExpr
();
}
if
(!
lexer
.
equal
(
Symbol
.
PLUS
,
Symbol
.
SUB
,
Symbol
.
STAR
,
Symbol
.
SLASH
))
{
if
(!
equal
(
Symbol
.
PLUS
,
Symbol
.
SUB
,
Symbol
.
STAR
,
Symbol
.
SLASH
))
{
return
result
;
}
skipRest
();
...
...
@@ -342,7 +339,7 @@ public class SQLExprParser {
}
SQLExpr
result
=
getSQLExpr
(
literals
);
getLexer
().
nextToken
();
if
(!
lexer
.
equal
(
Symbol
.
PLUS
,
Symbol
.
SUB
,
Symbol
.
STAR
,
Symbol
.
SLASH
))
{
if
(!
equal
(
Symbol
.
PLUS
,
Symbol
.
SUB
,
Symbol
.
STAR
,
Symbol
.
SLASH
))
{
return
result
;
}
skipParentheses
();
...
...
@@ -351,12 +348,12 @@ public class SQLExprParser {
}
private
void
skipRest
()
{
while
(
lexer
.
skipIfEqual
(
Symbol
.
PLUS
,
Symbol
.
SUB
,
Symbol
.
STAR
,
Symbol
.
SLASH
))
{
if
(
getLexer
().
equal
(
Symbol
.
QUESTION
))
{
while
(
skipIfEqual
(
Symbol
.
PLUS
,
Symbol
.
SUB
,
Symbol
.
STAR
,
Symbol
.
SLASH
))
{
if
(
equal
(
Symbol
.
QUESTION
))
{
++
parametersIndex
;
}
getLexer
().
nextToken
();
if
(
lexer
.
skipIfEqual
(
Symbol
.
DOT
))
{
if
(
skipIfEqual
(
Symbol
.
DOT
))
{
getLexer
().
nextToken
();
}
skipParentheses
();
...
...
@@ -364,54 +361,25 @@ public class SQLExprParser {
}
private
SQLExpr
getSQLExpr
(
final
String
literals
)
{
if
(
lexer
.
equal
(
Symbol
.
QUESTION
))
{
if
(
equal
(
Symbol
.
QUESTION
))
{
parametersIndex
++;
return
new
SQLPlaceholderExpr
(
parametersIndex
-
1
,
parameters
.
get
(
parametersIndex
-
1
));
}
if
(
lexer
.
equal
(
Literals
.
CHARS
))
{
if
(
equal
(
Literals
.
CHARS
))
{
return
new
SQLCharExpr
(
literals
);
}
if
(
lexer
.
equal
(
Literals
.
INT
))
{
if
(
equal
(
Literals
.
INT
))
{
return
new
SQLNumberExpr
(
Integer
.
parseInt
(
literals
));
}
if
(
lexer
.
equal
(
Literals
.
FLOAT
))
{
if
(
equal
(
Literals
.
FLOAT
))
{
return
new
SQLNumberExpr
(
Double
.
parseDouble
(
literals
));
}
if
(
lexer
.
equal
(
Literals
.
HEX
))
{
if
(
equal
(
Literals
.
HEX
))
{
return
new
SQLNumberExpr
(
Integer
.
parseInt
(
literals
,
16
));
}
if
(
lexer
.
equal
(
Literals
.
IDENTIFIER
))
{
if
(
equal
(
Literals
.
IDENTIFIER
))
{
return
new
SQLIdentifierExpr
(
literals
);
}
return
new
SQLIgnoreExpr
();
}
/**
* 跳过小括号内所有的语言符号.
*
* @return 小括号内所有的语言符号
*/
public
final
String
skipParentheses
()
{
StringBuilder
result
=
new
StringBuilder
(
""
);
int
count
=
0
;
if
(
Symbol
.
LEFT_PAREN
==
getLexer
().
getToken
().
getType
())
{
int
beginPosition
=
getLexer
().
getToken
().
getEndPosition
();
result
.
append
(
Symbol
.
LEFT_PAREN
.
getLiterals
());
getLexer
().
nextToken
();
while
(
true
)
{
if
(
Assist
.
EOF
==
getLexer
().
getToken
().
getType
()
||
(
Symbol
.
RIGHT_PAREN
==
getLexer
().
getToken
().
getType
()
&&
0
==
count
))
{
break
;
}
if
(
Symbol
.
LEFT_PAREN
==
getLexer
().
getToken
().
getType
())
{
count
++;
}
else
if
(
Symbol
.
RIGHT_PAREN
==
getLexer
().
getToken
().
getType
())
{
count
--;
}
getLexer
().
nextToken
();
}
result
.
append
(
getLexer
().
getInput
().
substring
(
beginPosition
,
getLexer
().
getToken
().
getEndPosition
()));
getLexer
().
nextToken
();
}
return
result
.
toString
();
}
}
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parser/sql/parser/SQLStatementParser.java
浏览文件 @
cfac63c1
...
...
@@ -53,20 +53,20 @@ public final class SQLStatementParser {
* @return SQL解析对象
*/
public
SQLContext
parseStatement
()
{
exprParser
.
getLexer
().
skipIfEqual
(
Symbol
.
SEMI
);
if
(
exprParser
.
getLexer
().
equal
(
DefaultKeyword
.
WITH
))
{
exprParser
.
skipIfEqual
(
Symbol
.
SEMI
);
if
(
exprParser
.
equal
(
DefaultKeyword
.
WITH
))
{
skipWith
();
}
if
(
exprParser
.
getLexer
().
equal
(
DefaultKeyword
.
SELECT
))
{
if
(
exprParser
.
equal
(
DefaultKeyword
.
SELECT
))
{
return
SQLSelectParserFactory
.
newInstance
(
exprParser
,
dbType
).
parse
();
}
if
(
exprParser
.
getLexer
().
equal
(
DefaultKeyword
.
INSERT
))
{
if
(
exprParser
.
equal
(
DefaultKeyword
.
INSERT
))
{
return
SQLInsertParserFactory
.
newInstance
(
shardingRule
,
parameters
,
exprParser
,
dbType
).
parse
();
}
if
(
exprParser
.
getLexer
().
equal
(
DefaultKeyword
.
UPDATE
))
{
if
(
exprParser
.
equal
(
DefaultKeyword
.
UPDATE
))
{
return
SQLUpdateParserFactory
.
newInstance
(
exprParser
,
dbType
).
parse
();
}
if
(
exprParser
.
getLexer
().
equal
(
DefaultKeyword
.
DELETE
))
{
if
(
exprParser
.
equal
(
DefaultKeyword
.
DELETE
))
{
return
SQLDeleteParserFactory
.
newInstance
(
exprParser
,
dbType
).
parse
();
}
throw
new
ParserUnsupportedException
(
exprParser
.
getLexer
().
getToken
().
getType
());
...
...
@@ -75,9 +75,9 @@ public final class SQLStatementParser {
private
void
skipWith
()
{
exprParser
.
getLexer
().
nextToken
();
do
{
exprParser
.
getLexer
().
skipUntil
(
DefaultKeyword
.
AS
);
exprParser
.
getLexer
().
accept
(
DefaultKeyword
.
AS
);
exprParser
.
skipUntil
(
DefaultKeyword
.
AS
);
exprParser
.
accept
(
DefaultKeyword
.
AS
);
exprParser
.
skipParentheses
();
}
while
(
exprParser
.
getLexer
().
skipIfEqual
(
Symbol
.
COMMA
));
}
while
(
exprParser
.
skipIfEqual
(
Symbol
.
COMMA
));
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录