提交 cfac63c1 编写于 作者: T terrymanu

add base parser

上级 a121fcd7
......@@ -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().getLexer().equal(MySQLKeyword.IGNORE)) {
while (getExprParser().equal(MySQLKeyword.LOW_PRIORITY) || getExprParser().equal(MySQLKeyword.QUICK) || getExprParser().equal(MySQLKeyword.IGNORE)) {
getExprParser().getLexer().nextToken();
}
getExprParser().getLexer().skipIfEqual(DefaultKeyword.FROM);
getExprParser().skipIfEqual(DefaultKeyword.FROM);
}
}
......@@ -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--;
......
......@@ -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());
}
......
......@@ -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().getLexer().equal(DefaultKeyword.STRAIGHT_JOIN)
|| getExprParser().getLexer().equal(MySQLKeyword.SQL_SMALL_RESULT)
|| getExprParser().getLexer().equal(MySQLKeyword.SQL_BIG_RESULT) || getExprParser().getLexer().equal(MySQLKeyword.SQL_BUFFER_RESULT)
|| getExprParser().getLexer().equal(MySQLKeyword.SQL_CACHE)
|| getExprParser().getLexer().equal(MySQLKeyword.SQL_NO_CACHE) || getExprParser().getLexer().equal(MySQLKeyword.SQL_CALC_FOUND_ROWS)) {
while (getExprParser().equal(MySQLKeyword.HIGH_PRIORITY) || getExprParser().equal(DefaultKeyword.STRAIGHT_JOIN)
|| getExprParser().equal(MySQLKeyword.SQL_SMALL_RESULT)
|| getExprParser().equal(MySQLKeyword.SQL_BIG_RESULT) || getExprParser().equal(MySQLKeyword.SQL_BUFFER_RESULT)
|| getExprParser().equal(MySQLKeyword.SQL_CACHE)
|| getExprParser().equal(MySQLKeyword.SQL_NO_CACHE) || getExprParser().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().getLexer().equal(Assist.EOF)) {
while (!getExprParser().equal(DefaultKeyword.FROM) && !getExprParser().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();
......
......@@ -34,7 +34,7 @@ public final class MySQLUpdateParser extends AbstractUpdateParser {
@Override
protected void skipBetweenUpdateAndTable() {
while (getExprParser().getLexer().equal(MySQLKeyword.LOW_PRIORITY) || getExprParser().getLexer().equal(MySQLKeyword.IGNORE)) {
while (getExprParser().equal(MySQLKeyword.LOW_PRIORITY) || getExprParser().equal(MySQLKeyword.IGNORE)) {
getExprParser().getLexer().nextToken();
}
}
......
......@@ -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);
}
}
......@@ -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());
}
}
......
......@@ -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().getLexer().skipIfEqual(OracleKeyword.TIMESTAMP)) {
} else if (getExprParser().skipIfEqual(DefaultKeyword.AS)) {
if (getExprParser().skipIfEqual(OracleKeyword.OF)) {
if (getExprParser().skipIfEqual(OracleKeyword.SCN) || getExprParser().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);
}
}
}
......@@ -29,6 +29,6 @@ public class OracleUpdateParser extends AbstractUpdateParser {
@Override
protected void skipBetweenUpdateAndTable() {
getExprParser().getLexer().skipIfEqual(OracleKeyword.ONLY);
getExprParser().skipIfEqual(OracleKeyword.ONLY);
}
}
......@@ -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);
}
}
......@@ -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;
}
......
......@@ -34,6 +34,6 @@ public final class PostgreSQLUpdateParser extends AbstractUpdateParser {
@Override
protected void skipBetweenUpdateAndTable() {
getExprParser().getLexer().skipIfEqual(PostgreSQLKeyword.ONLY);
getExprParser().skipIfEqual(PostgreSQLKeyword.ONLY);
}
}
......@@ -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);
}
}
......@@ -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);
......
......@@ -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;
......
......@@ -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();
}
}
}
......@@ -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());
......
......@@ -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());
}
......
......@@ -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();
......
......@@ -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();
}
......
/*
* 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();
}
}
}
......@@ -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();
}
}
......@@ -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.
先完成此消息的编辑!
想要评论请 注册