Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
apache
Shardingsphere
提交
ec1ac49a
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,发现更多精彩内容 >>
提交
ec1ac49a
编写于
3月 16, 2017
作者:
T
terrymanu
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
refactor
上级
b6210225
变更
27
隐藏空白更改
内联
并排
Showing
27 changed file
with
127 addition
and
137 deletion
+127
-137
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parser/sql/dialect/mysql/lexer/MySQLKeyword.java
...sharding/parser/sql/dialect/mysql/lexer/MySQLKeyword.java
+1
-1
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parser/sql/dialect/mysql/lexer/MySQLLexer.java
...b/sharding/parser/sql/dialect/mysql/lexer/MySQLLexer.java
+3
-3
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
+6
-6
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
+3
-3
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
+1
-1
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parser/sql/dialect/oracle/lexer/OracleKeyword.java
...arding/parser/sql/dialect/oracle/lexer/OracleKeyword.java
+1
-1
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parser/sql/dialect/oracle/lexer/OracleLexer.java
...sharding/parser/sql/dialect/oracle/lexer/OracleLexer.java
+1
-1
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
+1
-1
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
+3
-3
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parser/sql/dialect/postgresql/lexer/PostgreSQLKeyword.java
...arser/sql/dialect/postgresql/lexer/PostgreSQLKeyword.java
+1
-1
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parser/sql/dialect/sqlserver/lexer/SQLServerKeyword.java
.../parser/sql/dialect/sqlserver/lexer/SQLServerKeyword.java
+1
-1
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parser/sql/dialect/sqlserver/lexer/SQLServerLexer.java
...ng/parser/sql/dialect/sqlserver/lexer/SQLServerLexer.java
+2
-2
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
+2
-2
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
+2
-2
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parser/sql/lexer/CharType.java
...gdang/ddframe/rdb/sharding/parser/sql/lexer/CharType.java
+5
-0
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parser/sql/lexer/Dictionary.java
...ang/ddframe/rdb/sharding/parser/sql/lexer/Dictionary.java
+2
-2
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
+21
-25
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parser/sql/lexer/Symbol.java
...angdang/ddframe/rdb/sharding/parser/sql/lexer/Symbol.java
+0
-15
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parser/sql/lexer/Tokenizer.java
...dang/ddframe/rdb/sharding/parser/sql/lexer/Tokenizer.java
+29
-25
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parser/sql/parser/AbstractInsertParser.java
.../rdb/sharding/parser/sql/parser/AbstractInsertParser.java
+8
-8
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parser/sql/parser/AbstractSelectParser.java
.../rdb/sharding/parser/sql/parser/AbstractSelectParser.java
+7
-7
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parser/sql/parser/AbstractUpdateParser.java
.../rdb/sharding/parser/sql/parser/AbstractUpdateParser.java
+2
-2
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
+9
-9
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parser/sql/parser/ParserException.java
...frame/rdb/sharding/parser/sql/parser/ParserException.java
+2
-2
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parser/sql/parser/SQLExprParser.java
...ddframe/rdb/sharding/parser/sql/parser/SQLExprParser.java
+12
-12
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parser/sql/parser/SQLStatementParser.java
...me/rdb/sharding/parser/sql/parser/SQLStatementParser.java
+1
-1
sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/sharding/parser/sql/lexer/LexerAssert.java
...ng/ddframe/rdb/sharding/parser/sql/lexer/LexerAssert.java
+1
-1
未找到文件。
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parser/sql/dialect/mysql/lexer/MySQLKeyword.java
浏览文件 @
ec1ac49a
...
...
@@ -20,7 +20,7 @@ package com.dangdang.ddframe.rdb.sharding.parser.sql.dialect.mysql.lexer;
import
com.dangdang.ddframe.rdb.sharding.parser.sql.lexer.Keyword
;
/**
* MySQL关键词.
* MySQL
词法
关键词.
*
* @author zhangliang
*/
...
...
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parser/sql/dialect/mysql/lexer/MySQLLexer.java
浏览文件 @
ec1ac49a
...
...
@@ -35,16 +35,16 @@ public final class MySQLLexer extends Lexer {
@Override
protected
boolean
isHintBegin
()
{
return
'/'
==
currentChar
()
&&
'*'
==
currentCharAt
(
1
)
&&
'!'
==
currentCharAt
(
2
);
return
'/'
==
getCurrentChar
(
0
)
&&
'*'
==
getCurrentChar
(
1
)
&&
'!'
==
getCurrentChar
(
2
);
}
@Override
protected
boolean
isCommentBegin
()
{
return
'#'
==
currentChar
(
)
||
super
.
isCommentBegin
();
return
'#'
==
getCurrentChar
(
0
)
||
super
.
isCommentBegin
();
}
@Override
protected
boolean
isVariableBegin
()
{
return
'@'
==
currentChar
(
);
return
'@'
==
getCurrentChar
(
0
);
}
}
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parser/sql/dialect/mysql/parser/MySQLExprParser.java
浏览文件 @
ec1ac49a
...
...
@@ -42,11 +42,11 @@ public class MySQLExprParser extends SQLExprParser {
public
LimitContext
parseLimit
(
final
int
parametersIndex
,
final
SelectSQLContext
sqlContext
)
{
skipIfEqual
(
MySQLKeyword
.
LIMIT
);
int
valueIndex
=
-
1
;
int
valueBeginPosition
=
getLexer
().
getToken
().
getEndPosition
();
int
valueBeginPosition
=
getLexer
().
get
Current
Token
().
getEndPosition
();
int
value
;
boolean
isParameterForValue
=
false
;
if
(
equal
(
Literals
.
INT
))
{
value
=
Integer
.
parseInt
(
getLexer
().
getToken
().
getLiterals
());
value
=
Integer
.
parseInt
(
getLexer
().
get
Current
Token
().
getLiterals
());
valueBeginPosition
=
valueBeginPosition
-
(
value
+
""
).
length
();
}
else
if
(
equal
(
Symbol
.
QUESTION
))
{
valueIndex
=
parametersIndex
;
...
...
@@ -73,12 +73,12 @@ public class MySQLExprParser extends SQLExprParser {
}
private
LimitContext
getLimitContextWithComma
(
final
int
parametersIndex
,
final
SelectSQLContext
sqlContext
,
final
int
valueIndex
,
final
int
valueBeginPosition
,
final
int
value
,
final
boolean
isParameterForValue
)
{
int
rowCountBeginPosition
=
getLexer
().
getToken
().
getEndPosition
();
int
rowCountBeginPosition
=
getLexer
().
get
Current
Token
().
getEndPosition
();
int
rowCount
;
int
rowCountIndex
=
-
1
;
boolean
isParameterForRowCount
=
false
;
if
(
equal
(
Literals
.
INT
))
{
rowCount
=
Integer
.
parseInt
(
getLexer
().
getToken
().
getLiterals
());
rowCount
=
Integer
.
parseInt
(
getLexer
().
get
Current
Token
().
getLiterals
());
rowCountBeginPosition
=
rowCountBeginPosition
-
(
rowCount
+
""
).
length
();
}
else
if
(
equal
(
Symbol
.
QUESTION
))
{
rowCountIndex
=
-
1
==
valueIndex
?
parametersIndex
:
valueIndex
+
1
;
...
...
@@ -102,12 +102,12 @@ public class MySQLExprParser extends SQLExprParser {
}
private
LimitContext
getLimitContextWithOffset
(
final
int
parametersIndex
,
final
SelectSQLContext
sqlContext
,
final
int
valueIndex
,
final
int
valueBeginPosition
,
final
int
value
,
final
boolean
isParameterForValue
)
{
int
offsetBeginPosition
=
getLexer
().
getToken
().
getEndPosition
();
int
offsetBeginPosition
=
getLexer
().
get
Current
Token
().
getEndPosition
();
int
offset
;
int
offsetIndex
=
-
1
;
boolean
isParameterForOffset
=
false
;
if
(
equal
(
Literals
.
INT
))
{
offset
=
Integer
.
parseInt
(
getLexer
().
getToken
().
getLiterals
());
offset
=
Integer
.
parseInt
(
getLexer
().
get
Current
Token
().
getLiterals
());
offsetBeginPosition
=
offsetBeginPosition
-
(
offset
+
""
).
length
();
}
else
if
(
equal
(
Symbol
.
QUESTION
))
{
offsetIndex
=
-
1
==
valueIndex
?
parametersIndex
:
valueIndex
+
1
;
...
...
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parser/sql/dialect/mysql/parser/MySQLInsertParser.java
浏览文件 @
ec1ac49a
...
...
@@ -65,11 +65,11 @@ public final class MySQLInsertParser extends AbstractInsertParser {
getExprParser
().
accept
(
Symbol
.
EQ
);
SQLExpr
sqlExpr
;
if
(
getExprParser
().
equal
(
Literals
.
INT
))
{
sqlExpr
=
new
SQLNumberExpr
(
Integer
.
parseInt
(
getExprParser
().
getLexer
().
getToken
().
getLiterals
()));
sqlExpr
=
new
SQLNumberExpr
(
Integer
.
parseInt
(
getExprParser
().
getLexer
().
get
Current
Token
().
getLiterals
()));
}
else
if
(
getExprParser
().
equal
(
Literals
.
FLOAT
))
{
sqlExpr
=
new
SQLNumberExpr
(
Double
.
parseDouble
(
getExprParser
().
getLexer
().
getToken
().
getLiterals
()));
sqlExpr
=
new
SQLNumberExpr
(
Double
.
parseDouble
(
getExprParser
().
getLexer
().
get
Current
Token
().
getLiterals
()));
}
else
if
(
getExprParser
().
equal
(
Literals
.
CHARS
))
{
sqlExpr
=
new
SQLCharExpr
(
getExprParser
().
getLexer
().
getToken
().
getLiterals
());
sqlExpr
=
new
SQLCharExpr
(
getExprParser
().
getLexer
().
get
Current
Token
().
getLiterals
());
}
else
if
(
getExprParser
().
equal
(
DefaultKeyword
.
NULL
))
{
sqlExpr
=
new
SQLIgnoreExpr
();
}
else
if
(
getExprParser
().
equal
(
Symbol
.
QUESTION
))
{
...
...
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parser/sql/dialect/mysql/parser/MySQLSelectParser.java
浏览文件 @
ec1ac49a
...
...
@@ -54,7 +54,7 @@ public class MySQLSelectParser extends AbstractSelectParser {
getSqlContext
().
setLimitContext
(((
MySQLExprParser
)
getExprParser
()).
parseLimit
(
getParametersIndex
(),
getSqlContext
()));
}
if
(
getExprParser
().
equal
(
DefaultKeyword
.
PROCEDURE
))
{
throw
new
ParserUnsupportedException
(
getExprParser
().
getLexer
().
getToken
().
getType
());
throw
new
ParserUnsupportedException
(
getExprParser
().
getLexer
().
get
Current
Token
().
getType
());
}
queryRest
();
}
...
...
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parser/sql/dialect/oracle/lexer/OracleKeyword.java
浏览文件 @
ec1ac49a
...
...
@@ -20,7 +20,7 @@ package com.dangdang.ddframe.rdb.sharding.parser.sql.dialect.oracle.lexer;
import
com.dangdang.ddframe.rdb.sharding.parser.sql.lexer.Keyword
;
/**
* Oracle关键词.
* Oracle
词法
关键词.
*
* @author zhangliang
*/
...
...
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parser/sql/dialect/oracle/lexer/OracleLexer.java
浏览文件 @
ec1ac49a
...
...
@@ -35,6 +35,6 @@ public final class OracleLexer extends Lexer {
@Override
protected
boolean
isHintBegin
()
{
return
'/'
==
currentChar
()
&&
'*'
==
currentCharAt
(
1
)
&&
'+'
==
currentCharAt
(
2
);
return
'/'
==
getCurrentChar
(
0
)
&&
'*'
==
getCurrentChar
(
1
)
&&
'+'
==
getCurrentChar
(
2
);
}
}
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parser/sql/dialect/oracle/parser/OracleExprParser.java
浏览文件 @
ec1ac49a
...
...
@@ -49,7 +49,7 @@ public class OracleExprParser extends SQLExprParser {
if
(
skipIfEqual
(
OracleKeyword
.
NULLS
))
{
getLexer
().
nextToken
();
if
(!
skipIfEqual
(
OracleKeyword
.
FIRST
,
OracleKeyword
.
LAST
))
{
throw
new
ParserUnsupportedException
(
getLexer
().
getToken
().
getType
());
throw
new
ParserUnsupportedException
(
getLexer
().
get
Current
Token
().
getType
());
}
}
return
result
;
...
...
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parser/sql/dialect/oracle/parser/OracleSelectParser.java
浏览文件 @
ec1ac49a
...
...
@@ -62,7 +62,7 @@ public class OracleSelectParser extends AbstractSelectParser {
private
void
skipInto
()
{
if
(
getExprParser
().
equal
(
DefaultKeyword
.
INTO
))
{
throw
new
ParserUnsupportedException
(
getExprParser
().
getLexer
().
getToken
().
getType
());
throw
new
ParserUnsupportedException
(
getExprParser
().
getLexer
().
get
Current
Token
().
getType
());
}
}
...
...
@@ -167,7 +167,7 @@ public class OracleSelectParser extends AbstractSelectParser {
}
private
void
skipModelColumnClause
()
{
throw
new
ParserUnsupportedException
(
getExprParser
().
getLexer
().
getToken
().
getType
());
throw
new
ParserUnsupportedException
(
getExprParser
().
getLexer
().
get
Current
Token
().
getType
());
}
@Override
...
...
@@ -214,7 +214,7 @@ public class OracleSelectParser extends AbstractSelectParser {
throw
new
UnsupportedOperationException
(
"Cannot support subquery"
);
}
if
(
getExprParser
().
equal
(
DefaultKeyword
.
SELECT
))
{
throw
new
ParserUnsupportedException
(
getExprParser
().
getLexer
().
getToken
().
getType
());
throw
new
ParserUnsupportedException
(
getExprParser
().
getLexer
().
get
Current
Token
().
getType
());
}
if
(
getExprParser
().
skipIfEqual
(
OracleKeyword
.
ONLY
))
{
getExprParser
().
skipIfEqual
(
Symbol
.
LEFT_PAREN
);
...
...
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parser/sql/dialect/postgresql/lexer/PostgreSQLKeyword.java
浏览文件 @
ec1ac49a
...
...
@@ -20,7 +20,7 @@ package com.dangdang.ddframe.rdb.sharding.parser.sql.dialect.postgresql.lexer;
import
com.dangdang.ddframe.rdb.sharding.parser.sql.lexer.Keyword
;
/**
* PostgreSQL关键词.
* PostgreSQL
词法
关键词.
*
* @author zhangliang
*/
...
...
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parser/sql/dialect/sqlserver/lexer/SQLServerKeyword.java
浏览文件 @
ec1ac49a
...
...
@@ -20,7 +20,7 @@ package com.dangdang.ddframe.rdb.sharding.parser.sql.dialect.sqlserver.lexer;
import
com.dangdang.ddframe.rdb.sharding.parser.sql.lexer.Keyword
;
/**
* SQLServer关键词.
* SQLServer
词法
关键词.
*
* @author zhangliang
*/
...
...
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parser/sql/dialect/sqlserver/lexer/SQLServerLexer.java
浏览文件 @
ec1ac49a
...
...
@@ -35,12 +35,12 @@ public final class SQLServerLexer extends Lexer {
@Override
protected
boolean
isHintBegin
()
{
return
'/'
==
currentChar
()
&&
'*'
==
currentCharAt
(
1
)
&&
'!'
==
currentCharAt
(
2
);
return
'/'
==
getCurrentChar
(
0
)
&&
'*'
==
getCurrentChar
(
1
)
&&
'!'
==
getCurrentChar
(
2
);
}
@Override
protected
boolean
isVariableBegin
()
{
return
'@'
==
currentChar
(
);
return
'@'
==
getCurrentChar
(
0
);
}
@Override
...
...
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parser/sql/dialect/sqlserver/parser/SQLServerExprParser.java
浏览文件 @
ec1ac49a
...
...
@@ -78,7 +78,7 @@ public class SQLServerExprParser extends SQLExprParser {
int
offset
;
int
offsetIndex
=
-
1
;
if
(
equal
(
Literals
.
INT
))
{
offset
=
Integer
.
parseInt
(
getLexer
().
getToken
().
getLiterals
());
offset
=
Integer
.
parseInt
(
getLexer
().
get
Current
Token
().
getLiterals
());
}
else
if
(
equal
(
Symbol
.
QUESTION
))
{
offsetIndex
=
getParametersIndex
();
offset
=
(
int
)
getParameters
().
get
(
offsetIndex
);
...
...
@@ -94,7 +94,7 @@ public class SQLServerExprParser extends SQLExprParser {
int
rowCountIndex
=
-
1
;
getLexer
().
nextToken
();
if
(
equal
(
Literals
.
INT
))
{
rowCount
=
Integer
.
parseInt
(
getLexer
().
getToken
().
getLiterals
());
rowCount
=
Integer
.
parseInt
(
getLexer
().
get
Current
Token
().
getLiterals
());
}
else
if
(
equal
(
Symbol
.
QUESTION
))
{
rowCountIndex
=
getParametersIndex
();
rowCount
=
(
int
)
getParameters
().
get
(
rowCountIndex
);
...
...
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parser/sql/dialect/sqlserver/parser/SQLServerSelectParser.java
浏览文件 @
ec1ac49a
...
...
@@ -51,7 +51,7 @@ public class SQLServerSelectParser extends AbstractSelectParser {
parseSelectList
();
}
if
(
getExprParser
().
equal
(
DefaultKeyword
.
INTO
))
{
throw
new
ParserUnsupportedException
(
getExprParser
().
getLexer
().
getToken
().
getType
());
throw
new
ParserUnsupportedException
(
getExprParser
().
getLexer
().
get
Current
Token
().
getType
());
}
parseFrom
();
parseWhere
();
...
...
@@ -87,7 +87,7 @@ public class SQLServerSelectParser extends AbstractSelectParser {
}
}
}
else
{
throw
new
ParserUnsupportedException
(
getExprParser
().
getLexer
().
getToken
().
getType
());
throw
new
ParserUnsupportedException
(
getExprParser
().
getLexer
().
get
Current
Token
().
getType
());
}
}
}
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parser/sql/lexer/CharType.java
浏览文件 @
ec1ac49a
...
...
@@ -45,4 +45,9 @@ final class CharType {
static
boolean
isDigital
(
final
char
ch
)
{
return
ch
>=
'0'
&&
ch
<=
'9'
;
}
static
boolean
isSymbol
(
final
char
ch
)
{
return
'('
==
ch
||
')'
==
ch
||
'['
==
ch
||
']'
==
ch
||
'{'
==
ch
||
'}'
==
ch
||
'+'
==
ch
||
'-'
==
ch
||
'*'
==
ch
||
'/'
==
ch
||
'%'
==
ch
||
'^'
==
ch
||
'='
==
ch
||
'>'
==
ch
||
'<'
==
ch
||
'~'
==
ch
||
'!'
==
ch
||
'?'
==
ch
||
'&'
==
ch
||
'|'
==
ch
||
'.'
==
ch
||
':'
==
ch
||
'#'
==
ch
||
','
==
ch
||
';'
==
ch
;
}
}
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parser/sql/lexer/Dictionary.java
浏览文件 @
ec1ac49a
...
...
@@ -42,12 +42,12 @@ public final class Dictionary {
}
}
TokenType
getToken
(
final
String
literals
,
final
TokenType
defaultTokenType
)
{
TokenType
findTokenType
(
final
String
literals
,
final
TokenType
defaultTokenType
)
{
String
key
=
null
==
literals
?
null
:
literals
.
toUpperCase
();
return
tokens
.
containsKey
(
key
)
?
tokens
.
get
(
key
)
:
defaultTokenType
;
}
TokenType
getToken
(
final
String
literals
)
{
TokenType
findTokenType
(
final
String
literals
)
{
String
key
=
null
==
literals
?
null
:
literals
.
toUpperCase
();
if
(
tokens
.
containsKey
(
key
))
{
return
tokens
.
get
(
key
);
...
...
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parser/sql/lexer/Lexer.java
浏览文件 @
ec1ac49a
...
...
@@ -36,7 +36,7 @@ public class Lexer {
private
int
offset
;
@Getter
private
Token
t
oken
;
private
Token
currentT
oken
;
/**
* 分析下一个词法标记.
...
...
@@ -44,25 +44,25 @@ public class Lexer {
public
final
void
nextToken
()
{
skipIgnoredToken
();
if
(
isVariableBegin
())
{
t
oken
=
new
Tokenizer
(
input
,
dictionary
,
offset
).
scanVariable
();
}
else
if
(
is
SupportNChars
()
&&
is
NCharBegin
())
{
t
oken
=
new
Tokenizer
(
input
,
dictionary
,
++
offset
).
scanChars
();
currentT
oken
=
new
Tokenizer
(
input
,
dictionary
,
offset
).
scanVariable
();
}
else
if
(
isNCharBegin
())
{
currentT
oken
=
new
Tokenizer
(
input
,
dictionary
,
++
offset
).
scanChars
();
}
else
if
(
isIdentifierBegin
())
{
t
oken
=
new
Tokenizer
(
input
,
dictionary
,
offset
).
scanIdentifier
();
currentT
oken
=
new
Tokenizer
(
input
,
dictionary
,
offset
).
scanIdentifier
();
}
else
if
(
isHexDecimalBegin
())
{
t
oken
=
new
Tokenizer
(
input
,
dictionary
,
offset
).
scanHexDecimal
();
currentT
oken
=
new
Tokenizer
(
input
,
dictionary
,
offset
).
scanHexDecimal
();
}
else
if
(
isNumberBegin
())
{
t
oken
=
new
Tokenizer
(
input
,
dictionary
,
offset
).
scanNumber
();
currentT
oken
=
new
Tokenizer
(
input
,
dictionary
,
offset
).
scanNumber
();
}
else
if
(
isSymbolBegin
())
{
t
oken
=
new
Tokenizer
(
input
,
dictionary
,
offset
).
scanSymbol
();
currentT
oken
=
new
Tokenizer
(
input
,
dictionary
,
offset
).
scanSymbol
();
}
else
if
(
isCharsBegin
())
{
t
oken
=
new
Tokenizer
(
input
,
dictionary
,
offset
).
scanChars
();
currentT
oken
=
new
Tokenizer
(
input
,
dictionary
,
offset
).
scanChars
();
}
else
if
(
isEnd
())
{
t
oken
=
new
Token
(
Assist
.
END
,
""
,
offset
);
currentT
oken
=
new
Token
(
Assist
.
END
,
""
,
offset
);
}
else
{
t
oken
=
new
Token
(
Assist
.
ERROR
,
""
,
offset
);
currentT
oken
=
new
Token
(
Assist
.
ERROR
,
""
,
offset
);
}
offset
=
t
oken
.
getEndPosition
();
offset
=
currentT
oken
.
getEndPosition
();
}
private
void
skipIgnoredToken
()
{
...
...
@@ -82,8 +82,8 @@ public class Lexer {
}
protected
boolean
isCommentBegin
()
{
char
current
=
currentChar
(
);
char
next
=
currentCharAt
(
1
);
char
current
=
getCurrentChar
(
0
);
char
next
=
getCurrentChar
(
1
);
return
'/'
==
current
&&
'/'
==
next
||
'-'
==
current
&&
'-'
==
next
||
'/'
==
current
&&
'*'
==
next
;
}
...
...
@@ -96,11 +96,11 @@ public class Lexer {
}
private
boolean
isNCharBegin
()
{
return
'N'
==
currentChar
()
&&
'\''
==
currentCharAt
(
1
);
return
isSupportNChars
()
&&
'N'
==
getCurrentChar
(
0
)
&&
'\''
==
getCurrentChar
(
1
);
}
private
boolean
isIdentifierBegin
()
{
return
isIdentifierBegin
(
currentChar
(
));
return
isIdentifierBegin
(
getCurrentChar
(
0
));
}
private
boolean
isIdentifierBegin
(
final
char
ch
)
{
...
...
@@ -108,30 +108,26 @@ public class Lexer {
}
private
boolean
isHexDecimalBegin
()
{
return
'0'
==
currentChar
()
&&
'x'
==
currentCharAt
(
1
);
return
'0'
==
getCurrentChar
(
0
)
&&
'x'
==
getCurrentChar
(
1
);
}
private
boolean
isNumberBegin
()
{
return
CharType
.
isDigital
(
currentChar
())
||
(
'.'
==
currentChar
()
&&
CharType
.
isDigital
(
currentCharAt
(
1
))
&&
!
isIdentifierBegin
(
currentCharAt
(-
1
)));
return
CharType
.
isDigital
(
getCurrentChar
(
0
))
||
(
'.'
==
getCurrentChar
(
0
)
&&
CharType
.
isDigital
(
getCurrentChar
(
1
))
&&
!
isIdentifierBegin
(
getCurrentChar
(-
1
)));
}
private
boolean
isSymbolBegin
()
{
return
Symbol
.
isSymbol
(
currentChar
(
));
return
CharType
.
isSymbol
(
getCurrentChar
(
0
));
}
private
boolean
isCharsBegin
()
{
return
'\''
==
currentChar
()
||
'\"'
==
currentChar
(
);
return
'\''
==
getCurrentChar
(
0
)
||
'\"'
==
getCurrentChar
(
0
);
}
private
boolean
isEnd
()
{
return
offset
>=
input
.
length
();
}
protected
final
char
currentChar
()
{
return
currentCharAt
(
0
);
}
protected
final
char
currentCharAt
(
final
int
offset
)
{
protected
final
char
getCurrentChar
(
final
int
offset
)
{
return
this
.
offset
+
offset
>=
input
.
length
()
?
(
char
)
CharType
.
EOI
:
input
.
charAt
(
this
.
offset
+
offset
);
}
}
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parser/sql/lexer/Symbol.java
浏览文件 @
ec1ac49a
...
...
@@ -17,13 +17,11 @@
package
com.dangdang.ddframe.rdb.sharding.parser.sql.lexer
;
import
com.google.common.collect.Sets
;
import
lombok.Getter
;
import
lombok.RequiredArgsConstructor
;
import
java.util.HashMap
;
import
java.util.Map
;
import
java.util.Set
;
/**
* 词法符号标记.
...
...
@@ -77,13 +75,10 @@ public enum Symbol implements TokenType {
private
static
Map
<
String
,
Symbol
>
symbols
=
new
HashMap
<>(
128
);
private
static
Set
<
Character
>
symbolChars
;
static
{
for
(
Symbol
each
:
Symbol
.
values
())
{
symbols
.
put
(
each
.
getLiterals
(),
each
);
}
symbolChars
=
Sets
.
newHashSet
(
'('
,
')'
,
'['
,
']'
,
'{'
,
'}'
,
'+'
,
'-'
,
'*'
,
'/'
,
'%'
,
'^'
,
'='
,
'>'
,
'<'
,
'~'
,
'!'
,
'?'
,
'&'
,
'|'
,
'.'
,
':'
,
'#'
,
','
,
';'
);
}
private
final
String
literals
;
...
...
@@ -97,14 +92,4 @@ public enum Symbol implements TokenType {
public
static
Symbol
literalsOf
(
final
String
literals
)
{
return
symbols
.
get
(
literals
);
}
/**
* 判断字符是否是词法符号.
*
* @param ch 待判断的字符
* @return 是否为词法符号
*/
public
static
boolean
isSymbol
(
final
char
ch
)
{
return
symbolChars
.
contains
(
ch
);
}
}
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parser/sql/lexer/Tokenizer.java
浏览文件 @
ec1ac49a
...
...
@@ -27,6 +27,16 @@ import lombok.RequiredArgsConstructor;
@RequiredArgsConstructor
final
class
Tokenizer
{
private
static
final
int
MYSQL_SPECIAL_COMMENT_BEGIN_SYMBOL_LENGTH
=
1
;
private
static
final
int
COMMENT_BEGIN_SYMBOL_LENGTH
=
2
;
private
static
final
int
HINT_BEGIN_SYMBOL_LENGTH
=
3
;
private
static
final
int
COMMENT_AND_HINT_END_SYMBOL_LENGTH
=
2
;
private
static
final
int
HEX_BEGIN_SYMBOL_LENGTH
=
2
;
private
final
String
input
;
private
final
Dictionary
dictionary
;
...
...
@@ -42,13 +52,13 @@ final class Tokenizer {
}
int
skipComment
()
{
char
current
Char
=
charAt
(
offset
);
char
next
Char
=
charAt
(
offset
+
1
);
if
(
isSingleLineCommentBegin
(
current
Char
,
nextChar
))
{
return
skipSingleLineComment
(
2
);
}
else
if
(
'#'
==
current
Char
)
{
return
skipSingleLineComment
(
1
);
}
else
if
(
isMultipleLineCommentBegin
(
current
Char
,
nextChar
))
{
char
current
=
charAt
(
offset
);
char
next
=
charAt
(
offset
+
1
);
if
(
isSingleLineCommentBegin
(
current
,
next
))
{
return
skipSingleLineComment
(
COMMENT_BEGIN_SYMBOL_LENGTH
);
}
else
if
(
'#'
==
current
)
{
return
skipSingleLineComment
(
MYSQL_SPECIAL_COMMENT_BEGIN_SYMBOL_LENGTH
);
}
else
if
(
isMultipleLineCommentBegin
(
current
,
next
))
{
return
skipMultiLineComment
();
}
return
offset
;
...
...
@@ -58,8 +68,8 @@ final class Tokenizer {
return
'/'
==
ch
&&
'/'
==
next
||
'-'
==
ch
&&
'-'
==
next
;
}
private
int
skipSingleLineComment
(
final
int
comment
Flag
Length
)
{
int
length
=
comment
Flag
Length
;
private
int
skipSingleLineComment
(
final
int
comment
Symbol
Length
)
{
int
length
=
comment
Symbol
Length
;
while
(!
CharType
.
isEndOfInput
(
charAt
(
offset
+
length
))
&&
'\n'
!=
charAt
(
offset
+
length
))
{
length
++;
}
...
...
@@ -71,22 +81,22 @@ final class Tokenizer {
}
private
int
skipMultiLineComment
()
{
return
untilCommentAndHintTerminateSign
(
2
);
return
untilCommentAndHintTerminateSign
(
COMMENT_BEGIN_SYMBOL_LENGTH
);
}
int
skipHint
()
{
return
untilCommentAndHintTerminateSign
(
3
);
return
untilCommentAndHintTerminateSign
(
HINT_BEGIN_SYMBOL_LENGTH
);
}
private
int
untilCommentAndHintTerminateSign
(
final
int
beginS
ign
Length
)
{
int
length
=
beginS
ign
Length
;
private
int
untilCommentAndHintTerminateSign
(
final
int
beginS
ymbol
Length
)
{
int
length
=
beginS
ymbol
Length
;
while
(!
isMultipleLineCommentEnd
(
charAt
(
offset
+
length
),
charAt
(
offset
+
length
+
1
)))
{
if
(
CharType
.
isEndOfInput
(
charAt
(
offset
+
length
)))
{
throw
new
UnterminatedCharException
(
"*/"
);
}
length
++;
}
return
offset
+
length
+
2
;
return
offset
+
length
+
COMMENT_AND_HINT_END_SYMBOL_LENGTH
;
}
private
boolean
isMultipleLineCommentEnd
(
final
char
ch
,
final
char
next
)
{
...
...
@@ -121,7 +131,7 @@ final class Tokenizer {
if
(
isAmbiguousIdentifier
(
literals
))
{
return
new
Token
(
processAmbiguousIdentifier
(
offset
+
length
,
literals
),
literals
,
offset
+
length
);
}
return
new
Token
(
dictionary
.
getToken
(
literals
,
Literals
.
IDENTIFIER
),
literals
,
offset
+
length
);
return
new
Token
(
dictionary
.
findTokenType
(
literals
,
Literals
.
IDENTIFIER
),
literals
,
offset
+
length
);
}
private
int
getLengthUntilTerminatedChar
(
final
char
terminatedChar
)
{
...
...
@@ -135,8 +145,7 @@ final class Tokenizer {
}
length
++;
}
length
++;
return
length
;
return
length
+
1
;
}
private
boolean
hasEscapeChar
(
final
char
charIdentifier
,
final
int
offset
)
{
...
...
@@ -157,13 +166,13 @@ final class Tokenizer {
i
++;
}
if
(
DefaultKeyword
.
BY
.
name
().
equalsIgnoreCase
(
String
.
valueOf
(
new
char
[]
{
charAt
(
offset
+
i
),
charAt
(
offset
+
i
+
1
)})))
{
return
dictionary
.
getToken
(
literals
);
return
dictionary
.
findTokenType
(
literals
);
}
return
Literals
.
IDENTIFIER
;
}
Token
scanHexDecimal
()
{
int
length
=
2
;
int
length
=
HEX_BEGIN_SYMBOL_LENGTH
;
if
(
'-'
==
charAt
(
offset
+
length
))
{
length
++;
}
...
...
@@ -185,11 +194,6 @@ final class Tokenizer {
length
+=
getDigitalLength
(
offset
+
length
);
boolean
isFloat
=
false
;
if
(
'.'
==
charAt
(
offset
+
length
))
{
// TODO 待确认 数字后面加两个点表示什么
if
(
'.'
==
charAt
(
offset
+
length
+
1
))
{
length
++;
return
new
Token
(
Literals
.
INT
,
input
.
substring
(
offset
,
offset
+
length
),
offset
+
length
);
}
isFloat
=
true
;
length
++;
length
+=
getDigitalLength
(
offset
+
length
);
...
...
@@ -238,7 +242,7 @@ final class Tokenizer {
Token
scanSymbol
()
{
int
length
=
0
;
while
(
Symbol
.
isSymbol
(
charAt
(
offset
+
length
)))
{
while
(
CharType
.
isSymbol
(
charAt
(
offset
+
length
)))
{
length
++;
}
String
literals
=
input
.
substring
(
offset
,
offset
+
length
);
...
...
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parser/sql/parser/AbstractInsertParser.java
浏览文件 @
ec1ac49a
...
...
@@ -76,9 +76,9 @@ public abstract class AbstractInsertParser {
if
(
exprParser
.
equal
(
DefaultKeyword
.
SELECT
,
Symbol
.
LEFT_PAREN
))
{
throw
new
UnsupportedOperationException
(
"Cannot support subquery"
);
}
if
(
getValuesKeywords
().
contains
(
exprParser
.
getLexer
().
getToken
().
getType
()))
{
if
(
getValuesKeywords
().
contains
(
exprParser
.
getLexer
().
get
Current
Token
().
getType
()))
{
parseValues
(
columns
);
}
else
if
(
getCustomizedInsertKeywords
().
contains
(
exprParser
.
getLexer
().
getToken
().
getType
()))
{
}
else
if
(
getCustomizedInsertKeywords
().
contains
(
exprParser
.
getLexer
().
get
Current
Token
().
getType
()))
{
parseCustomizedInsert
();
}
return
sqlContext
;
...
...
@@ -89,8 +89,8 @@ public abstract class AbstractInsertParser {
}
private
void
parseInto
()
{
if
(
getUnsupportedKeywords
().
contains
(
exprParser
.
getLexer
().
getToken
().
getType
()))
{
throw
new
ParserUnsupportedException
(
exprParser
.
getLexer
().
getToken
().
getType
());
if
(
getUnsupportedKeywords
().
contains
(
exprParser
.
getLexer
().
get
Current
Token
().
getType
()))
{
throw
new
ParserUnsupportedException
(
exprParser
.
getLexer
().
get
Current
Token
().
getType
());
}
exprParser
.
skipUntil
(
DefaultKeyword
.
INTO
);
exprParser
.
getLexer
().
nextToken
();
...
...
@@ -99,7 +99,7 @@ public abstract class AbstractInsertParser {
}
private
void
skipBetweenTableAndValues
()
{
while
(
getSkippedKeywordsBetweenTableAndValues
().
contains
(
exprParser
.
getLexer
().
getToken
().
getType
()))
{
while
(
getSkippedKeywordsBetweenTableAndValues
().
contains
(
exprParser
.
getLexer
().
get
Current
Token
().
getType
()))
{
exprParser
.
getLexer
().
nextToken
();
if
(
exprParser
.
equal
(
Symbol
.
LEFT_PAREN
))
{
exprParser
.
skipParentheses
();
...
...
@@ -120,7 +120,7 @@ public abstract class AbstractInsertParser {
result
.
add
(
getColumn
(
autoIncrementColumns
));
exprParser
.
getLexer
().
nextToken
();
}
while
(!
exprParser
.
equal
(
Symbol
.
RIGHT_PAREN
)
&&
!
exprParser
.
equal
(
Assist
.
END
));
ItemsToken
itemsToken
=
new
ItemsToken
(
exprParser
.
getLexer
().
get
Token
().
getEndPosition
()
-
exprParser
.
getLexer
().
ge
tToken
().
getLiterals
().
length
());
ItemsToken
itemsToken
=
new
ItemsToken
(
exprParser
.
getLexer
().
get
CurrentToken
().
getEndPosition
()
-
exprParser
.
getLexer
().
getCurren
tToken
().
getLiterals
().
length
());
for
(
String
each
:
autoIncrementColumns
)
{
itemsToken
.
getItems
().
add
(
each
);
result
.
add
(
new
Condition
.
Column
(
each
,
sqlContext
.
getTables
().
get
(
0
).
getName
(),
true
));
...
...
@@ -134,7 +134,7 @@ public abstract class AbstractInsertParser {
}
protected
final
Condition
.
Column
getColumn
(
final
Collection
<
String
>
autoIncrementColumns
)
{
String
columnName
=
SQLUtil
.
getExactlyValue
(
exprParser
.
getLexer
().
getToken
().
getLiterals
());
String
columnName
=
SQLUtil
.
getExactlyValue
(
exprParser
.
getLexer
().
get
Current
Token
().
getLiterals
());
if
(
autoIncrementColumns
.
contains
(
columnName
))
{
autoIncrementColumns
.
remove
(
columnName
);
}
...
...
@@ -158,7 +158,7 @@ public abstract class AbstractInsertParser {
do
{
sqlExprs
.
add
(
exprParser
.
parseExpr
());
}
while
(
exprParser
.
skipIfEqual
(
Symbol
.
COMMA
));
ItemsToken
itemsToken
=
new
ItemsToken
(
exprParser
.
getLexer
().
get
Token
().
getEndPosition
()
-
exprParser
.
getLexer
().
ge
tToken
().
getLiterals
().
length
());
ItemsToken
itemsToken
=
new
ItemsToken
(
exprParser
.
getLexer
().
get
CurrentToken
().
getEndPosition
()
-
exprParser
.
getLexer
().
getCurren
tToken
().
getLiterals
().
length
());
int
count
=
0
;
for
(
Condition
.
Column
each
:
columns
)
{
if
(
each
.
isAutoIncrement
())
{
...
...
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parser/sql/parser/AbstractSelectParser.java
浏览文件 @
ec1ac49a
...
...
@@ -105,12 +105,12 @@ public abstract class AbstractSelectParser {
}
index
++;
}
while
(
getExprParser
().
skipIfEqual
(
Symbol
.
COMMA
));
sqlContext
.
setSelectListLastPosition
(
getExprParser
().
getLexer
().
get
Token
().
getEndPosition
()
-
getExprParser
().
getLexer
().
ge
tToken
().
getLiterals
().
length
());
sqlContext
.
setSelectListLastPosition
(
getExprParser
().
getLexer
().
get
CurrentToken
().
getEndPosition
()
-
getExprParser
().
getLexer
().
getCurren
tToken
().
getLiterals
().
length
());
}
protected
void
queryRest
()
{
if
(
getExprParser
().
equal
(
DefaultKeyword
.
UNION
,
DefaultKeyword
.
EXCEPT
,
DefaultKeyword
.
INTERSECT
,
DefaultKeyword
.
MINUS
))
{
throw
new
ParserUnsupportedException
(
getExprParser
().
getLexer
().
getToken
().
getType
());
throw
new
ParserUnsupportedException
(
getExprParser
().
getLexer
().
get
Current
Token
().
getType
());
}
}
...
...
@@ -135,7 +135,7 @@ public abstract class AbstractSelectParser {
}
getExprParser
().
getLexer
().
nextToken
();
}
while
(
getExprParser
().
equal
(
DefaultKeyword
.
WITH
)
||
getExprParser
().
getLexer
().
getToken
().
getLiterals
().
equalsIgnoreCase
(
"ROLLUP"
))
{
while
(
getExprParser
().
equal
(
DefaultKeyword
.
WITH
)
||
getExprParser
().
getLexer
().
get
Current
Token
().
getLiterals
().
equalsIgnoreCase
(
"ROLLUP"
))
{
getExprParser
().
getLexer
().
nextToken
();
}
if
(
getExprParser
().
skipIfEqual
(
DefaultKeyword
.
HAVING
))
{
...
...
@@ -178,8 +178,8 @@ public abstract class AbstractSelectParser {
}
protected
final
void
parseTableFactor
()
{
int
beginPosition
=
getExprParser
().
getLexer
().
get
Token
().
getEndPosition
()
-
getExprParser
().
getLexer
().
ge
tToken
().
getLiterals
().
length
();
String
literals
=
getExprParser
().
getLexer
().
getToken
().
getLiterals
();
int
beginPosition
=
getExprParser
().
getLexer
().
get
CurrentToken
().
getEndPosition
()
-
getExprParser
().
getLexer
().
getCurren
tToken
().
getLiterals
().
length
();
String
literals
=
getExprParser
().
getLexer
().
get
Current
Token
().
getLiterals
();
getExprParser
().
getLexer
().
nextToken
();
if
(
getExprParser
().
skipIfEqual
(
Symbol
.
DOT
))
{
getExprParser
().
getLexer
().
nextToken
();
...
...
@@ -196,9 +196,9 @@ public abstract class AbstractSelectParser {
parseTable
();
if
(
getExprParser
().
skipIfEqual
(
DefaultKeyword
.
ON
))
{
do
{
parseTableCondition
(
getExprParser
().
getLexer
().
getToken
().
getEndPosition
());
parseTableCondition
(
getExprParser
().
getLexer
().
get
Current
Token
().
getEndPosition
());
getExprParser
().
accept
(
Symbol
.
EQ
);
parseTableCondition
(
getExprParser
().
getLexer
().
get
Token
().
getEndPosition
()
-
getExprParser
().
getLexer
().
ge
tToken
().
getLiterals
().
length
());
parseTableCondition
(
getExprParser
().
getLexer
().
get
CurrentToken
().
getEndPosition
()
-
getExprParser
().
getLexer
().
getCurren
tToken
().
getLiterals
().
length
());
}
while
(
getExprParser
().
skipIfEqual
(
DefaultKeyword
.
AND
));
}
else
if
(
getExprParser
().
skipIfEqual
(
DefaultKeyword
.
USING
))
{
getExprParser
().
skipParentheses
();
...
...
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parser/sql/parser/AbstractUpdateParser.java
浏览文件 @
ec1ac49a
...
...
@@ -78,8 +78,8 @@ public abstract class AbstractUpdateParser {
if
(
exprParser
.
equal
(
Symbol
.
LEFT_PAREN
))
{
exprParser
.
skipParentheses
();
}
else
{
int
beginPosition
=
exprParser
.
getLexer
().
getToken
().
getEndPosition
();
String
literals
=
exprParser
.
getLexer
().
getToken
().
getLiterals
();
int
beginPosition
=
exprParser
.
getLexer
().
get
Current
Token
().
getEndPosition
();
String
literals
=
exprParser
.
getLexer
().
get
Current
Token
().
getLiterals
();
exprParser
.
getLexer
().
nextToken
();
String
tableName
=
sqlContext
.
getTables
().
get
(
0
).
getName
();
if
(
exprParser
.
skipIfEqual
(
Symbol
.
DOT
))
{
...
...
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parser/sql/parser/Parser.java
浏览文件 @
ec1ac49a
...
...
@@ -46,22 +46,22 @@ public class Parser {
public
final
String
skipParentheses
()
{
StringBuilder
result
=
new
StringBuilder
(
""
);
int
count
=
0
;
if
(
Symbol
.
LEFT_PAREN
==
getLexer
().
getToken
().
getType
())
{
final
int
beginPosition
=
getLexer
().
getToken
().
getEndPosition
();
if
(
Symbol
.
LEFT_PAREN
==
getLexer
().
get
Current
Token
().
getType
())
{
final
int
beginPosition
=
getLexer
().
get
Current
Token
().
getEndPosition
();
result
.
append
(
Symbol
.
LEFT_PAREN
.
getLiterals
());
getLexer
().
nextToken
();
while
(
true
)
{
if
(
Assist
.
END
==
getLexer
().
get
Token
().
getType
()
||
(
Symbol
.
RIGHT_PAREN
==
getLexer
().
ge
tToken
().
getType
()
&&
0
==
count
))
{
if
(
Assist
.
END
==
getLexer
().
get
CurrentToken
().
getType
()
||
(
Symbol
.
RIGHT_PAREN
==
getLexer
().
getCurren
tToken
().
getType
()
&&
0
==
count
))
{
break
;
}
if
(
Symbol
.
LEFT_PAREN
==
getLexer
().
getToken
().
getType
())
{
if
(
Symbol
.
LEFT_PAREN
==
getLexer
().
get
Current
Token
().
getType
())
{
count
++;
}
else
if
(
Symbol
.
RIGHT_PAREN
==
getLexer
().
getToken
().
getType
())
{
}
else
if
(
Symbol
.
RIGHT_PAREN
==
getLexer
().
get
Current
Token
().
getType
())
{
count
--;
}
getLexer
().
nextToken
();
}
result
.
append
(
getLexer
().
getInput
().
substring
(
beginPosition
,
getLexer
().
getToken
().
getEndPosition
()));
result
.
append
(
getLexer
().
getInput
().
substring
(
beginPosition
,
getLexer
().
get
Current
Token
().
getEndPosition
()));
getLexer
().
nextToken
();
}
return
result
.
toString
();
...
...
@@ -74,7 +74,7 @@ public class Parser {
* @param tokenType 待判断的标记类型
*/
public
final
void
accept
(
final
TokenType
tokenType
)
{
if
(
lexer
.
getToken
().
getType
()
!=
tokenType
)
{
if
(
lexer
.
get
Current
Token
().
getType
()
!=
tokenType
)
{
throw
new
ParserException
(
lexer
,
tokenType
);
}
lexer
.
nextToken
();
...
...
@@ -88,7 +88,7 @@ public class Parser {
*/
public
final
boolean
equal
(
final
TokenType
...
tokenTypes
)
{
for
(
TokenType
each
:
tokenTypes
)
{
if
(
each
==
lexer
.
getToken
().
getType
())
{
if
(
each
==
lexer
.
get
Current
Token
().
getType
())
{
return
true
;
}
}
...
...
@@ -119,7 +119,7 @@ public class Parser {
public
final
void
skipUntil
(
final
TokenType
...
tokenTypes
)
{
Set
<
TokenType
>
tokenTypeSet
=
Sets
.
newHashSet
(
tokenTypes
);
tokenTypeSet
.
add
(
Assist
.
END
);
while
(!
tokenTypeSet
.
contains
(
lexer
.
getToken
().
getType
()))
{
while
(!
tokenTypeSet
.
contains
(
lexer
.
get
Current
Token
().
getType
()))
{
lexer
.
nextToken
();
}
}
...
...
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parser/sql/parser/ParserException.java
浏览文件 @
ec1ac49a
...
...
@@ -29,10 +29,10 @@ public class ParserException extends RuntimeException {
private
static
final
String
TOKEN_ERROR_MESSAGE
=
"SQL syntax error, token is '%s', literals is '%s'."
;
public
ParserException
(
final
Lexer
lexer
,
final
TokenType
expectedTokenType
)
{
super
(
String
.
format
(
UNMATCH_MESSAGE
,
expectedTokenType
,
lexer
.
get
Token
().
getType
(),
lexer
.
ge
tToken
().
getLiterals
()));
super
(
String
.
format
(
UNMATCH_MESSAGE
,
expectedTokenType
,
lexer
.
get
CurrentToken
().
getType
(),
lexer
.
getCurren
tToken
().
getLiterals
()));
}
public
ParserException
(
final
Lexer
lexer
)
{
super
(
String
.
format
(
TOKEN_ERROR_MESSAGE
,
lexer
.
get
Token
().
getType
(),
lexer
.
ge
tToken
().
getLiterals
()));
super
(
String
.
format
(
TOKEN_ERROR_MESSAGE
,
lexer
.
get
CurrentToken
().
getType
(),
lexer
.
getCurren
tToken
().
getLiterals
()));
}
}
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parser/sql/parser/SQLExprParser.java
浏览文件 @
ec1ac49a
...
...
@@ -82,13 +82,13 @@ public class SQLExprParser extends Parser {
if
(
equal
(
Symbol
.
LEFT_PAREN
))
{
return
Optional
.
absent
();
}
String
result
=
SQLUtil
.
getExactlyValue
(
getLexer
().
getToken
().
getLiterals
());
String
result
=
SQLUtil
.
getExactlyValue
(
getLexer
().
get
Current
Token
().
getLiterals
());
getLexer
().
nextToken
();
return
Optional
.
of
(
result
);
}
// TODO 增加哪些数据库识别哪些关键字作为别名的配置
if
(
equal
(
Literals
.
IDENTIFIER
,
Literals
.
CHARS
,
DefaultKeyword
.
USER
,
DefaultKeyword
.
END
,
DefaultKeyword
.
CASE
,
DefaultKeyword
.
KEY
,
DefaultKeyword
.
INTERVAL
,
DefaultKeyword
.
CONSTRAINT
))
{
String
result
=
SQLUtil
.
getExactlyValue
(
getLexer
().
getToken
().
getLiterals
());
String
result
=
SQLUtil
.
getExactlyValue
(
getLexer
().
get
Current
Token
().
getLiterals
());
getLexer
().
nextToken
();
return
Optional
.
of
(
result
);
}
...
...
@@ -147,11 +147,11 @@ public class SQLExprParser extends Parser {
hasParentheses
=
true
;
}
TableContext
tableContext
;
final
int
beginPosition
=
getLexer
().
get
Token
().
getEndPosition
()
-
getLexer
().
ge
tToken
().
getLiterals
().
length
();
String
literals
=
getLexer
().
getToken
().
getLiterals
();
final
int
beginPosition
=
getLexer
().
get
CurrentToken
().
getEndPosition
()
-
getLexer
().
getCurren
tToken
().
getLiterals
().
length
();
String
literals
=
getLexer
().
get
Current
Token
().
getLiterals
();
getLexer
().
nextToken
();
if
(
skipIfEqual
(
Symbol
.
DOT
))
{
String
tableName
=
getLexer
().
getToken
().
getLiterals
();
String
tableName
=
getLexer
().
get
Current
Token
().
getLiterals
();
getLexer
().
nextToken
();
if
(
hasParentheses
)
{
accept
(
Symbol
.
RIGHT_PAREN
);
...
...
@@ -194,7 +194,7 @@ public class SQLExprParser extends Parser {
public
final
SelectItemContext
parseSelectItem
(
final
int
index
,
final
SelectSQLContext
sqlContext
)
{
skipIfEqual
(
DefaultKeyword
.
CONNECT_BY_ROOT
);
String
literals
=
getLexer
().
getToken
().
getLiterals
();
String
literals
=
getLexer
().
get
Current
Token
().
getLiterals
();
if
(
equal
(
Symbol
.
STAR
)
||
Symbol
.
STAR
.
getLiterals
().
equals
(
SQLUtil
.
getExactlyValue
(
literals
)))
{
getLexer
().
nextToken
();
return
new
CommonSelectItemContext
(
Symbol
.
STAR
.
getLiterals
(),
as
(),
index
,
true
);
...
...
@@ -206,8 +206,8 @@ public class SQLExprParser extends Parser {
// FIXME 无as的alias解析, 应该做成倒数第二个token不是运算符,倒数第一个token是Identifier或char,则为别名, 不过CommonSelectItemContext类型并不关注expression和alias
// FIXME 解析xxx.*
while
(!
equal
(
DefaultKeyword
.
AS
)
&&
!
equal
(
Symbol
.
COMMA
)
&&
!
equal
(
DefaultKeyword
.
FROM
)
&&
!
equal
(
Assist
.
END
))
{
String
value
=
getLexer
().
getToken
().
getLiterals
();
int
position
=
getLexer
().
getToken
().
getEndPosition
()
-
value
.
length
();
String
value
=
getLexer
().
get
Current
Token
().
getLiterals
();
int
position
=
getLexer
().
get
Current
Token
().
getEndPosition
()
-
value
.
length
();
expression
.
append
(
value
);
getLexer
().
nextToken
();
if
(
equal
(
Symbol
.
DOT
))
{
...
...
@@ -240,7 +240,7 @@ public class SQLExprParser extends Parser {
parseComparisonCondition
(
sqlContext
,
parseContext
);
}
while
(
skipIfEqual
(
DefaultKeyword
.
AND
));
if
(
equal
(
DefaultKeyword
.
OR
))
{
throw
new
ParserUnsupportedException
(
getLexer
().
getToken
().
getType
());
throw
new
ParserUnsupportedException
(
getLexer
().
get
Current
Token
().
getType
());
}
}
...
...
@@ -299,7 +299,7 @@ public class SQLExprParser extends Parser {
}
public
SQLExpr
parseExpr
(
final
SQLContext
sqlContext
)
{
int
beginPosition
=
getLexer
().
getToken
().
getEndPosition
();
int
beginPosition
=
getLexer
().
get
Current
Token
().
getEndPosition
();
SQLExpr
result
=
parseExpr
();
if
(
result
instanceof
SQLPropertyExpr
)
{
String
tableName
=
sqlContext
.
getTables
().
get
(
0
).
getName
();
...
...
@@ -312,12 +312,12 @@ public class SQLExprParser extends Parser {
}
public
SQLExpr
parseExpr
()
{
String
literals
=
getLexer
().
getToken
().
getLiterals
();
String
literals
=
getLexer
().
get
Current
Token
().
getLiterals
();
if
(
equal
(
Literals
.
IDENTIFIER
))
{
SQLExpr
result
=
getSQLExpr
(
SQLUtil
.
getExactlyValue
(
literals
));
getLexer
().
nextToken
();
if
(
skipIfEqual
(
Symbol
.
DOT
))
{
String
property
=
getLexer
().
getToken
().
getLiterals
();
String
property
=
getLexer
().
get
Current
Token
().
getLiterals
();
getLexer
().
nextToken
();
if
(!
equal
(
Symbol
.
PLUS
,
Symbol
.
SUB
,
Symbol
.
STAR
,
Symbol
.
SLASH
))
{
return
new
SQLPropertyExpr
(
new
SQLIdentifierExpr
(
literals
),
property
);
...
...
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parser/sql/parser/SQLStatementParser.java
浏览文件 @
ec1ac49a
...
...
@@ -69,7 +69,7 @@ public final class SQLStatementParser {
if
(
exprParser
.
equal
(
DefaultKeyword
.
DELETE
))
{
return
SQLDeleteParserFactory
.
newInstance
(
exprParser
,
dbType
).
parse
();
}
throw
new
ParserUnsupportedException
(
exprParser
.
getLexer
().
getToken
().
getType
());
throw
new
ParserUnsupportedException
(
exprParser
.
getLexer
().
get
Current
Token
().
getType
());
}
private
void
skipWith
()
{
...
...
sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/sharding/parser/sql/lexer/LexerAssert.java
浏览文件 @
ec1ac49a
...
...
@@ -10,7 +10,7 @@ public final class LexerAssert {
public
static
void
assertNextToken
(
final
Lexer
lexer
,
final
TokenType
expectedTokenType
,
final
String
expectedLiterals
)
{
lexer
.
nextToken
();
Token
actualToken
=
lexer
.
getToken
();
Token
actualToken
=
lexer
.
get
Current
Token
();
assertThat
(
actualToken
.
getType
(),
is
(
expectedTokenType
));
assertThat
(
actualToken
.
getLiterals
(),
is
(
expectedLiterals
));
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录