Loading sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/SQLParser.java +7 −2 Original line number Diff line number Diff line Loading @@ -250,6 +250,7 @@ public class SQLParser extends AbstractParser { * @param sqlStatement SQL语句对象 */ public final void parseWhere(final SQLStatement sqlStatement) { parseAlias(); if (skipIfEqual(DefaultKeyword.WHERE)) { parseConditions(sqlStatement); } Loading Loading @@ -281,7 +282,11 @@ public class SQLParser extends AbstractParser { return; } if (equalAny(Symbol.LT, Symbol.GT, Symbol.LT_EQ, Symbol.GT_EQ)) { if (left instanceof SQLIdentifierExpression && sqlStatement instanceof SelectStatement && isRowNumberCondition((SelectStatement) sqlStatement, (SQLIdentifierExpression) left)) { if (left instanceof SQLIdentifierExpression && sqlStatement instanceof SelectStatement && isRowNumberCondition((SelectStatement) sqlStatement, ((SQLIdentifierExpression) left).getName())) { parseRowNumberCondition((SelectStatement) sqlStatement); } else if (left instanceof SQLPropertyExpression && sqlStatement instanceof SelectStatement && isRowNumberCondition((SelectStatement) sqlStatement, ((SQLPropertyExpression) left).getName())) { parseRowNumberCondition((SelectStatement) sqlStatement); } else { parseOtherCondition(sqlStatement); Loading Loading @@ -332,7 +337,7 @@ public class SQLParser extends AbstractParser { } } protected boolean isRowNumberCondition(final SelectStatement selectStatement, final SQLIdentifierExpression left) { protected boolean isRowNumberCondition(final SelectStatement selectStatement, final String columnLabel) { return false; } Loading sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/dialect/oracle/OracleParser.java +2 −3 Original line number Diff line number Diff line Loading @@ -22,7 +22,6 @@ import com.dangdang.ddframe.rdb.sharding.parsing.lexer.dialect.oracle.OracleKeyw import com.dangdang.ddframe.rdb.sharding.parsing.lexer.dialect.oracle.OracleLexer; import com.dangdang.ddframe.rdb.sharding.parsing.parser.SQLParser; import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.selectitem.SelectItem; import com.dangdang.ddframe.rdb.sharding.parsing.parser.expression.SQLIdentifierExpression; import com.dangdang.ddframe.rdb.sharding.parsing.parser.statement.select.SelectStatement; import com.google.common.base.Optional; Loading @@ -47,13 +46,13 @@ public final class OracleParser extends SQLParser { } @Override protected boolean isRowNumberCondition(final SelectStatement selectStatement, final SQLIdentifierExpression expression) { protected boolean isRowNumberCondition(final SelectStatement selectStatement, final String columnLabel) { Optional<String> rowNumberAlias = Optional.absent(); for (SelectItem each : selectStatement.getItems()) { if (each.getAlias().isPresent() && "rownum".equalsIgnoreCase(each.getExpression())) { rowNumberAlias = each.getAlias(); } } return "rownum".equalsIgnoreCase(expression.getName()) || expression.getName().equalsIgnoreCase(rowNumberAlias.orNull()); return "rownum".equalsIgnoreCase(columnLabel) || columnLabel.equalsIgnoreCase(rowNumberAlias.orNull()); } } sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/dialect/sqlserver/SQLServerDeleteParser.java +1 −1 Original line number Diff line number Diff line Loading @@ -34,7 +34,7 @@ public final class SQLServerDeleteParser extends AbstractDeleteParser { @Override protected void skipBetweenDeleteAndTable() { ((SQLServerParser) getSqlParser()).skipTop(); ((SQLServerParser) getSqlParser()).parseTop(getDeleteStatement()); ((SQLServerParser) getSqlParser()).skipOutput(); getSqlParser().skipIfEqual(DefaultKeyword.FROM); } Loading sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/dialect/sqlserver/SQLServerParser.java +23 −5 Original line number Diff line number Diff line Loading @@ -30,7 +30,10 @@ import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.limit.RowCountLi import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.selectitem.SelectItem; import com.dangdang.ddframe.rdb.sharding.parsing.parser.exception.SQLParsingException; import com.dangdang.ddframe.rdb.sharding.parsing.parser.exception.SQLParsingUnsupportedException; import com.dangdang.ddframe.rdb.sharding.parsing.parser.expression.SQLIdentifierExpression; import com.dangdang.ddframe.rdb.sharding.parsing.parser.expression.SQLExpression; import com.dangdang.ddframe.rdb.sharding.parsing.parser.expression.SQLNumberExpression; import com.dangdang.ddframe.rdb.sharding.parsing.parser.expression.SQLPlaceholderExpression; import com.dangdang.ddframe.rdb.sharding.parsing.parser.statement.SQLStatement; import com.dangdang.ddframe.rdb.sharding.parsing.parser.statement.select.SelectStatement; import com.google.common.base.Optional; Loading @@ -47,19 +50,34 @@ public final class SQLServerParser extends SQLParser { } @Override protected boolean isRowNumberCondition(final SelectStatement selectStatement, final SQLIdentifierExpression expression) { protected boolean isRowNumberCondition(final SelectStatement selectStatement, final String columnLabel) { Optional<String> rowNumberAlias = Optional.absent(); for (SelectItem each : selectStatement.getItems()) { if (each.getAlias().isPresent() && "ROW_NUMBER".equalsIgnoreCase(each.getExpression())) { rowNumberAlias = each.getAlias(); } } return expression.getName().equalsIgnoreCase(rowNumberAlias.orNull()); return columnLabel.equalsIgnoreCase(rowNumberAlias.orNull()); } public void skipTop() { public void parseTop(final SQLStatement sqlStatement) { if (skipIfEqual(SQLServerKeyword.TOP)) { parseExpression(); skipIfEqual(Symbol.LEFT_PAREN); SQLExpression sqlExpression = parseExpression(); skipIfEqual(Symbol.RIGHT_PAREN); RowCountLimit rowCountLimit; if (sqlExpression instanceof SQLNumberExpression) { rowCountLimit = new RowCountLimit(((SQLNumberExpression) sqlExpression).getNumber().intValue(), -1); } else if (sqlExpression instanceof SQLPlaceholderExpression) { rowCountLimit = new RowCountLimit(-1, ((SQLPlaceholderExpression) sqlExpression).getIndex()); } else { throw new SQLParsingException(getLexer()); } if (null == sqlStatement.getLimit()) { sqlStatement.setLimit(new Limit(false, rowCountLimit)); } else { sqlStatement.getLimit().setRowCountLimit(rowCountLimit); } skipIfEqual(SQLServerKeyword.PERCENT); } } Loading sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/dialect/sqlserver/SQLServerSelectParser.java +2 −1 Original line number Diff line number Diff line Loading @@ -48,7 +48,7 @@ public class SQLServerSelectParser extends AbstractSelectParser { if (getSqlParser().skipIfEqual(DefaultKeyword.SELECT)) { parseDistinct(); if (getSqlParser().equalAny(SQLServerKeyword.TOP)) { ((SQLServerParser) getSqlParser()).skipTop(); ((SQLServerParser) getSqlParser()).parseTop(getSelectStatement()); } parseSelectList(); } Loading @@ -68,6 +68,7 @@ public class SQLServerSelectParser extends AbstractSelectParser { @Override protected SelectItem parseRowNumberSelectItem() { getSqlParser().getLexer().nextToken(); if (getSqlParser().equalAny(Symbol.LEFT_PAREN)) { getSqlParser().skipUntil(DefaultKeyword.AS); getSqlParser().getLexer().nextToken(); Loading Loading
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/SQLParser.java +7 −2 Original line number Diff line number Diff line Loading @@ -250,6 +250,7 @@ public class SQLParser extends AbstractParser { * @param sqlStatement SQL语句对象 */ public final void parseWhere(final SQLStatement sqlStatement) { parseAlias(); if (skipIfEqual(DefaultKeyword.WHERE)) { parseConditions(sqlStatement); } Loading Loading @@ -281,7 +282,11 @@ public class SQLParser extends AbstractParser { return; } if (equalAny(Symbol.LT, Symbol.GT, Symbol.LT_EQ, Symbol.GT_EQ)) { if (left instanceof SQLIdentifierExpression && sqlStatement instanceof SelectStatement && isRowNumberCondition((SelectStatement) sqlStatement, (SQLIdentifierExpression) left)) { if (left instanceof SQLIdentifierExpression && sqlStatement instanceof SelectStatement && isRowNumberCondition((SelectStatement) sqlStatement, ((SQLIdentifierExpression) left).getName())) { parseRowNumberCondition((SelectStatement) sqlStatement); } else if (left instanceof SQLPropertyExpression && sqlStatement instanceof SelectStatement && isRowNumberCondition((SelectStatement) sqlStatement, ((SQLPropertyExpression) left).getName())) { parseRowNumberCondition((SelectStatement) sqlStatement); } else { parseOtherCondition(sqlStatement); Loading Loading @@ -332,7 +337,7 @@ public class SQLParser extends AbstractParser { } } protected boolean isRowNumberCondition(final SelectStatement selectStatement, final SQLIdentifierExpression left) { protected boolean isRowNumberCondition(final SelectStatement selectStatement, final String columnLabel) { return false; } Loading
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/dialect/oracle/OracleParser.java +2 −3 Original line number Diff line number Diff line Loading @@ -22,7 +22,6 @@ import com.dangdang.ddframe.rdb.sharding.parsing.lexer.dialect.oracle.OracleKeyw import com.dangdang.ddframe.rdb.sharding.parsing.lexer.dialect.oracle.OracleLexer; import com.dangdang.ddframe.rdb.sharding.parsing.parser.SQLParser; import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.selectitem.SelectItem; import com.dangdang.ddframe.rdb.sharding.parsing.parser.expression.SQLIdentifierExpression; import com.dangdang.ddframe.rdb.sharding.parsing.parser.statement.select.SelectStatement; import com.google.common.base.Optional; Loading @@ -47,13 +46,13 @@ public final class OracleParser extends SQLParser { } @Override protected boolean isRowNumberCondition(final SelectStatement selectStatement, final SQLIdentifierExpression expression) { protected boolean isRowNumberCondition(final SelectStatement selectStatement, final String columnLabel) { Optional<String> rowNumberAlias = Optional.absent(); for (SelectItem each : selectStatement.getItems()) { if (each.getAlias().isPresent() && "rownum".equalsIgnoreCase(each.getExpression())) { rowNumberAlias = each.getAlias(); } } return "rownum".equalsIgnoreCase(expression.getName()) || expression.getName().equalsIgnoreCase(rowNumberAlias.orNull()); return "rownum".equalsIgnoreCase(columnLabel) || columnLabel.equalsIgnoreCase(rowNumberAlias.orNull()); } }
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/dialect/sqlserver/SQLServerDeleteParser.java +1 −1 Original line number Diff line number Diff line Loading @@ -34,7 +34,7 @@ public final class SQLServerDeleteParser extends AbstractDeleteParser { @Override protected void skipBetweenDeleteAndTable() { ((SQLServerParser) getSqlParser()).skipTop(); ((SQLServerParser) getSqlParser()).parseTop(getDeleteStatement()); ((SQLServerParser) getSqlParser()).skipOutput(); getSqlParser().skipIfEqual(DefaultKeyword.FROM); } Loading
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/dialect/sqlserver/SQLServerParser.java +23 −5 Original line number Diff line number Diff line Loading @@ -30,7 +30,10 @@ import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.limit.RowCountLi import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.selectitem.SelectItem; import com.dangdang.ddframe.rdb.sharding.parsing.parser.exception.SQLParsingException; import com.dangdang.ddframe.rdb.sharding.parsing.parser.exception.SQLParsingUnsupportedException; import com.dangdang.ddframe.rdb.sharding.parsing.parser.expression.SQLIdentifierExpression; import com.dangdang.ddframe.rdb.sharding.parsing.parser.expression.SQLExpression; import com.dangdang.ddframe.rdb.sharding.parsing.parser.expression.SQLNumberExpression; import com.dangdang.ddframe.rdb.sharding.parsing.parser.expression.SQLPlaceholderExpression; import com.dangdang.ddframe.rdb.sharding.parsing.parser.statement.SQLStatement; import com.dangdang.ddframe.rdb.sharding.parsing.parser.statement.select.SelectStatement; import com.google.common.base.Optional; Loading @@ -47,19 +50,34 @@ public final class SQLServerParser extends SQLParser { } @Override protected boolean isRowNumberCondition(final SelectStatement selectStatement, final SQLIdentifierExpression expression) { protected boolean isRowNumberCondition(final SelectStatement selectStatement, final String columnLabel) { Optional<String> rowNumberAlias = Optional.absent(); for (SelectItem each : selectStatement.getItems()) { if (each.getAlias().isPresent() && "ROW_NUMBER".equalsIgnoreCase(each.getExpression())) { rowNumberAlias = each.getAlias(); } } return expression.getName().equalsIgnoreCase(rowNumberAlias.orNull()); return columnLabel.equalsIgnoreCase(rowNumberAlias.orNull()); } public void skipTop() { public void parseTop(final SQLStatement sqlStatement) { if (skipIfEqual(SQLServerKeyword.TOP)) { parseExpression(); skipIfEqual(Symbol.LEFT_PAREN); SQLExpression sqlExpression = parseExpression(); skipIfEqual(Symbol.RIGHT_PAREN); RowCountLimit rowCountLimit; if (sqlExpression instanceof SQLNumberExpression) { rowCountLimit = new RowCountLimit(((SQLNumberExpression) sqlExpression).getNumber().intValue(), -1); } else if (sqlExpression instanceof SQLPlaceholderExpression) { rowCountLimit = new RowCountLimit(-1, ((SQLPlaceholderExpression) sqlExpression).getIndex()); } else { throw new SQLParsingException(getLexer()); } if (null == sqlStatement.getLimit()) { sqlStatement.setLimit(new Limit(false, rowCountLimit)); } else { sqlStatement.getLimit().setRowCountLimit(rowCountLimit); } skipIfEqual(SQLServerKeyword.PERCENT); } } Loading
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/dialect/sqlserver/SQLServerSelectParser.java +2 −1 Original line number Diff line number Diff line Loading @@ -48,7 +48,7 @@ public class SQLServerSelectParser extends AbstractSelectParser { if (getSqlParser().skipIfEqual(DefaultKeyword.SELECT)) { parseDistinct(); if (getSqlParser().equalAny(SQLServerKeyword.TOP)) { ((SQLServerParser) getSqlParser()).skipTop(); ((SQLServerParser) getSqlParser()).parseTop(getSelectStatement()); } parseSelectList(); } Loading @@ -68,6 +68,7 @@ public class SQLServerSelectParser extends AbstractSelectParser { @Override protected SelectItem parseRowNumberSelectItem() { getSqlParser().getLexer().nextToken(); if (getSqlParser().equalAny(Symbol.LEFT_PAREN)) { getSqlParser().skipUntil(DefaultKeyword.AS); getSqlParser().getLexer().nextToken(); Loading