提交 b92d77a3 编写于 作者: T terrymanu

refactor parametersIndex from AbstractParser to SQLStatement

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