diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java index e16fea27c8..9da51a6d8c 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java @@ -90,137 +90,138 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV return false; } - public boolean visit(MySqlSelectQueryBlock select) { - if (select.getOrderBy() != null) { - select.getOrderBy().setParent(select); + public boolean visit(MySqlSelectQueryBlock x) { + if (x.getOrderBy() != null) { + x.getOrderBy().setParent(x); } print("SELECT "); - if (SQLSetQuantifier.ALL == select.getDistionOption()) print("ALL "); - else if (SQLSetQuantifier.DISTINCT == select.getDistionOption()) print("DISTINCT "); - else if (SQLSetQuantifier.DISTINCTROW == select.getDistionOption()) { + if (SQLSetQuantifier.ALL == x.getDistionOption()) print("ALL "); + else if (SQLSetQuantifier.DISTINCT == x.getDistionOption()) print("DISTINCT "); + else if (SQLSetQuantifier.DISTINCTROW == x.getDistionOption()) { print("DISTINCTROW "); } - if (select.isHignPriority()) { + if (x.isHignPriority()) { print("HIGH_PRIORITY "); } - if (select.isSmallResult()) { + if (x.isSmallResult()) { print("SQL_SMALL_RESULT "); } - if (select.isBigResult()) { + if (x.isBigResult()) { print("SQL_BIG_RESULT "); } - if (select.isBufferResult()) { + if (x.isBufferResult()) { print("SQL_BUFFER_RESULT "); } - if (select.getCache() != null) { - if (select.getCache().booleanValue()) { + if (x.getCache() != null) { + if (x.getCache().booleanValue()) { print("SQL_CACHE "); } else { print("SQL_NO_CACHE "); } } - if (select.isCalcFoundRows()) { + if (x.isCalcFoundRows()) { print("SQL_CALC_FOUND_ROWS "); } - printSelectList(select.getSelectList()); + printSelectList(x.getSelectList()); - if (select.getOutFile() != null) { + if (x.getOutFile() != null) { println(); print("INTO OUTFILE "); - select.getOutFile().accept(this); - if (select.getOutFileCharset() != null) { + x.getOutFile().accept(this); + if (x.getOutFileCharset() != null) { print(" CHARACTER SET "); - print(select.getOutFileCharset()); + print(x.getOutFileCharset()); } - if (select.getOutFileColumnsTerminatedBy() != null || select.getOutFileColumnsEnclosedBy() != null - || select.getOutFileColumnsEscaped() != null) { + if (x.getOutFileColumnsTerminatedBy() != null || x.getOutFileColumnsEnclosedBy() != null + || x.getOutFileColumnsEscaped() != null) { print(" COLUMNS"); - if (select.getOutFileColumnsTerminatedBy() != null) { + if (x.getOutFileColumnsTerminatedBy() != null) { print(" TERMINATED BY "); - select.getOutFileColumnsTerminatedBy().accept(this); + x.getOutFileColumnsTerminatedBy().accept(this); } - if (select.getOutFileColumnsEnclosedBy() != null) { - if (select.isOutFileColumnsEnclosedOptionally()) { + if (x.getOutFileColumnsEnclosedBy() != null) { + if (x.isOutFileColumnsEnclosedOptionally()) { print(" OPTIONALLY"); } print(" ENCLOSED BY "); - select.getOutFileColumnsEnclosedBy().accept(this); + x.getOutFileColumnsEnclosedBy().accept(this); } - if (select.getOutFileColumnsEscaped() != null) { + if (x.getOutFileColumnsEscaped() != null) { print(" ESCAPED BY "); - select.getOutFileColumnsEscaped().accept(this); + x.getOutFileColumnsEscaped().accept(this); } } - if (select.getOutFileLinesStartingBy() != null || select.getOutFileLinesTerminatedBy() != null) { + if (x.getOutFileLinesStartingBy() != null || x.getOutFileLinesTerminatedBy() != null) { print(" LINES"); - if (select.getOutFileLinesStartingBy() != null) { + if (x.getOutFileLinesStartingBy() != null) { print(" STARTING BY "); - select.getOutFileLinesStartingBy().accept(this); + x.getOutFileLinesStartingBy().accept(this); } - if (select.getOutFileLinesTerminatedBy() != null) { + if (x.getOutFileLinesTerminatedBy() != null) { print(" TERMINATED BY "); - select.getOutFileLinesTerminatedBy().accept(this); + x.getOutFileLinesTerminatedBy().accept(this); } } } - if (select.getFrom() != null) { + if (x.getFrom() != null) { println(); print("FROM "); - select.getFrom().accept(this); + x.getFrom().accept(this); } - if (select.getWhere() != null) { + if (x.getWhere() != null) { println(); print("WHERE "); - select.getWhere().accept(this); + x.getWhere().setParent(x); + x.getWhere().accept(this); } - if (select.getGroupBy() != null) { + if (x.getGroupBy() != null) { println(); - select.getGroupBy().accept(this); + x.getGroupBy().accept(this); } - if (select.getOrderBy() != null) { + if (x.getOrderBy() != null) { println(); - select.getOrderBy().accept(this); + x.getOrderBy().accept(this); } - if (select.getLimit() != null) { + if (x.getLimit() != null) { println(); - select.getLimit().accept(this); + x.getLimit().accept(this); } - if (select.getProcedureName() != null) { + if (x.getProcedureName() != null) { print(" PROCEDURE "); - select.getProcedureName().accept(this); - if (select.getProcedureArgumentList().size() > 0) { + x.getProcedureName().accept(this); + if (x.getProcedureArgumentList().size() > 0) { print("("); - printAndAccept(select.getProcedureArgumentList(), ", "); + printAndAccept(x.getProcedureArgumentList(), ", "); print(")"); } } - if (select.isForUpdate()) { + if (x.isForUpdate()) { println(); print("FOR UPDATE"); } - if (select.isLockInShareMode()) { + if (x.isLockInShareMode()) { println(); print("LOCK IN SHARE MODE"); } @@ -675,6 +676,7 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV if (x.getWhere() != null) { println(); print("WHERE "); + x.getWhere().setParent(x); x.getWhere().accept(this); } @@ -1036,6 +1038,7 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV if (x.getWhere() != null) { print(" WHERE "); + x.getWhere().setParent(x); x.getWhere().accept(this); } @@ -1067,6 +1070,7 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV if (x.getWhere() != null) { print(" WHERE "); + x.getWhere().setParent(x); x.getWhere().accept(this); } @@ -1089,6 +1093,7 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV if (x.getWhere() != null) { print(" WHERE "); + x.getWhere().setParent(x); x.getWhere().accept(this); } @@ -1141,6 +1146,7 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV if (x.getWhere() != null) { print(" WHERE "); + x.getWhere().setParent(x); x.getWhere().accept(this); } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleOutputVisitor.java index c378b166ac..54db2df90d 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleOutputVisitor.java @@ -274,6 +274,7 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS if (x.getWhere() != null) { println(); print("WHERE "); + x.getWhere().setParent(x); x.getWhere().accept(this); } @@ -438,30 +439,40 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS x.getLeft().accept(this); if (x.getJoinType() == JoinType.COMMA) { - print(","); + print(", "); + x.getRight().accept(this); } else { - print(" "); - print(JoinType.toString(x.getJoinType())); - } - - print(" "); - x.getRight().accept(this); - - if (x.getCondition() != null) { - print(" ON "); - x.getCondition().accept(this); - print(" "); - } - - if (x.getUsing().size() > 0) { - print(" USING ("); - printAndAccept(x.getUsing(), ", "); - print(")"); - } - - if (x.getFlashback() != null) { + boolean isRoot = x.getParent() instanceof SQLSelectQueryBlock; + if (isRoot) { + incrementIndent(); + } + println(); - x.getFlashback().accept(this); + print(JoinType.toString(x.getJoinType())); + print(" "); + + x.getRight().accept(this); + + if (isRoot) { + decrementIndent(); + } + + if (x.getCondition() != null) { + print(" ON "); + x.getCondition().accept(this); + print(" "); + } + + if (x.getUsing().size() > 0) { + print(" USING ("); + printAndAccept(x.getUsing(), ", "); + print(")"); + } + + if (x.getFlashback() != null) { + println(); + x.getFlashback().accept(this); + } } return false; @@ -529,58 +540,60 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS return super.visit(select); } - public boolean visit(OracleSelectQueryBlock select) { + public boolean visit(OracleSelectQueryBlock x) { print("SELECT "); - if (SQLSetQuantifier.ALL == select.getDistionOption()) { + if (SQLSetQuantifier.ALL == x.getDistionOption()) { print("ALL "); - } else if (SQLSetQuantifier.DISTINCT == select.getDistionOption()) { + } else if (SQLSetQuantifier.DISTINCT == x.getDistionOption()) { print("DISTINCT "); - } else if (SQLSetQuantifier.UNIQUE == select.getDistionOption()) { + } else if (SQLSetQuantifier.UNIQUE == x.getDistionOption()) { print("UNIQUE "); } - if (select.getHints().size() > 0) { + if (x.getHints().size() > 0) { print("/*+"); - printAndAccept(select.getHints(), ", "); + printAndAccept(x.getHints(), ", "); print("*/ "); } - printSelectList(select.getSelectList()); + printSelectList(x.getSelectList()); - if (select.getInto() != null) { + if (x.getInto() != null) { println(); print("INTO "); - select.getInto().accept(this); + x.getInto().accept(this); } println(); print("FROM "); - if (select.getFrom() == null) { + if (x.getFrom() == null) { print("DUAL"); } else { - select.getFrom().accept(this); + x.getFrom().setParent(x); + x.getFrom().accept(this); } - if (select.getWhere() != null) { + if (x.getWhere() != null) { println(); print("WHERE "); - select.getWhere().accept(this); + x.getWhere().setParent(x); + x.getWhere().accept(this); } - if (select.getHierachicalQueryClause() != null) { + if (x.getHierachicalQueryClause() != null) { println(); - select.getHierachicalQueryClause().accept(this); + x.getHierachicalQueryClause().accept(this); } - if (select.getGroupBy() != null) { + if (x.getGroupBy() != null) { println(); - select.getGroupBy().accept(this); + x.getGroupBy().accept(this); } - if (select.getModelClause() != null) { + if (x.getModelClause() != null) { println(); - select.getModelClause().accept(this); + x.getModelClause().accept(this); } return false; @@ -603,18 +616,15 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS public boolean visit(OracleSelectSubqueryTableSource x) { print("("); incrementIndent(); - x.getSelect().accept(this); println(); + x.getSelect().accept(this); decrementIndent(); + println(); print(")"); if (x.getPivot() != null) { - incrementIndent(); - println(); x.getPivot().accept(this); - - decrementIndent(); } if (x.getFlashback() != null) { @@ -655,17 +665,13 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS } if (x.getSampleClause() != null) { - println(); + print(" "); x.getSampleClause().accept(this); } if (x.getPivot() != null) { - incrementIndent(); - println(); x.getPivot().accept(this); - - decrementIndent(); } if (x.getFlashback() != null) { @@ -812,6 +818,7 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS if (x.getWhere() != null) { println(); print("WHERE "); + x.getWhere().setParent(x); x.getWhere().accept(this); } @@ -1496,6 +1503,7 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS incrementIndent(); println(); print("WHERE "); + x.getWhere().setParent(x); x.getWhere().accept(this); decrementIndent(); } @@ -1504,6 +1512,7 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS incrementIndent(); println(); print("DELETE WHERE "); + x.getDeleteWhere().setParent(x); x.getDeleteWhere().accept(this); decrementIndent(); } @@ -1530,6 +1539,7 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS incrementIndent(); println(); print("WHERE "); + x.getWhere().setParent(x); x.getWhere().accept(this); decrementIndent(); } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGOutputVisitor.java index b95a30931a..4822b339ed 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGOutputVisitor.java @@ -179,6 +179,7 @@ public class PGOutputVisitor extends SQLASTOutputVisitor implements PGASTVisitor if (x.getWhere() != null) { println(); print("WHERE "); + x.getWhere().setParent(x); x.getWhere().accept(this); } @@ -305,6 +306,7 @@ public class PGOutputVisitor extends SQLASTOutputVisitor implements PGASTVisitor if (x.getWhere() != null) { println(); print("WHERE "); + x.getWhere().setParent(x); x.getWhere().accept(this); } @@ -435,6 +437,7 @@ public class PGOutputVisitor extends SQLASTOutputVisitor implements PGASTVisitor if (x.getWhere() != null) { println(); print("WHERE "); + x.getWhere().setParent(x); x.getWhere().accept(this); } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerOutputVisitor.java index b40c74db77..5d38004f23 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerOutputVisitor.java @@ -11,38 +11,39 @@ public class SQLServerOutputVisitor extends SQLASTOutputVisitor implements SQLSe super(appender); } - public boolean visit(SQLServerSelectQueryBlock select) { + public boolean visit(SQLServerSelectQueryBlock x) { print("SELECT "); - if (SQLSetQuantifier.ALL == select.getDistionOption()) { + if (SQLSetQuantifier.ALL == x.getDistionOption()) { print("ALL "); - } else if (SQLSetQuantifier.DISTINCT == select.getDistionOption()) { + } else if (SQLSetQuantifier.DISTINCT == x.getDistionOption()) { print("DISTINCT "); - } else if (SQLSetQuantifier.UNIQUE == select.getDistionOption()) { + } else if (SQLSetQuantifier.UNIQUE == x.getDistionOption()) { print("UNIQUE "); } - if (select.getTop() != null) { - select.getTop().accept(this); + if (x.getTop() != null) { + x.getTop().accept(this); } - printSelectList(select.getSelectList()); + printSelectList(x.getSelectList()); - if (select.getFrom() != null) { + if (x.getFrom() != null) { println(); print("FROM "); - select.getFrom().accept(this); + x.getFrom().accept(this); } - if (select.getWhere() != null) { + if (x.getWhere() != null) { println(); print("WHERE "); - select.getWhere().accept(this); + x.getWhere().setParent(x); + x.getWhere().accept(this); } - if (select.getGroupBy() != null) { + if (x.getGroupBy() != null) { print(" "); - select.getGroupBy().accept(this); + x.getGroupBy().accept(this); } return false; diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java index 1da14d4bda..737a71a5c8 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java @@ -30,6 +30,7 @@ import com.alibaba.druid.sql.ast.expr.SQLAllExpr; import com.alibaba.druid.sql.ast.expr.SQLAnyExpr; import com.alibaba.druid.sql.ast.expr.SQLBetweenExpr; import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr; +import com.alibaba.druid.sql.ast.expr.SQLBinaryOperator; import com.alibaba.druid.sql.ast.expr.SQLCaseExpr; import com.alibaba.druid.sql.ast.expr.SQLCastExpr; import com.alibaba.druid.sql.ast.expr.SQLCharExpr; @@ -53,11 +54,12 @@ import com.alibaba.druid.sql.ast.expr.SQLQueryExpr; import com.alibaba.druid.sql.ast.expr.SQLSomeExpr; import com.alibaba.druid.sql.ast.expr.SQLUnaryExpr; import com.alibaba.druid.sql.ast.expr.SQLVariantRefExpr; -import com.alibaba.druid.sql.ast.statement.SQLAssignItem; import com.alibaba.druid.sql.ast.statement.NotNullConstraint; +import com.alibaba.druid.sql.ast.statement.SQLAssignItem; import com.alibaba.druid.sql.ast.statement.SQLCallStatement; import com.alibaba.druid.sql.ast.statement.SQLColumnConstraint; import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition; +import com.alibaba.druid.sql.ast.statement.SQLCommentStatement; import com.alibaba.druid.sql.ast.statement.SQLCreateTableStatement; import com.alibaba.druid.sql.ast.statement.SQLDeleteStatement; import com.alibaba.druid.sql.ast.statement.SQLDropTableStatement; @@ -66,7 +68,6 @@ import com.alibaba.druid.sql.ast.statement.SQLInsertStatement; import com.alibaba.druid.sql.ast.statement.SQLInsertStatement.ValuesClause; import com.alibaba.druid.sql.ast.statement.SQLJoinTableSource; import com.alibaba.druid.sql.ast.statement.SQLJoinTableSource.JoinType; -import com.alibaba.druid.sql.ast.statement.SQLCommentStatement; import com.alibaba.druid.sql.ast.statement.SQLSelect; import com.alibaba.druid.sql.ast.statement.SQLSelectGroupByClause; import com.alibaba.druid.sql.ast.statement.SQLSelectItem; @@ -200,12 +201,31 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter { } public boolean visit(SQLBinaryOpExpr x) { + SQLObject parent = x.getParent(); + boolean isRoot = parent instanceof SQLSelectQueryBlock; + boolean relational = x.getOperator() == SQLBinaryOperator.BooleanAnd + || x.getOperator() == SQLBinaryOperator.BooleanOr; + + if (isRoot && relational) { + incrementIndent(); + } + if (x.getLeft() instanceof SQLBinaryOpExpr) { SQLBinaryOpExpr left = (SQLBinaryOpExpr) x.getLeft(); + boolean leftRational = left.getOperator() == SQLBinaryOperator.BooleanAnd + || left.getOperator() == SQLBinaryOperator.BooleanOr; + if (left.getOperator().priority > x.getOperator().priority) { + if (leftRational) { + incrementIndent(); + } print('('); left.accept(this); print(')'); + + if (leftRational) { + decrementIndent(); + } } else { left.accept(this); } @@ -213,16 +233,38 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter { x.getLeft().accept(this); } - print(" "); + if (isRoot && relational) { + decrementIndent(); + } + + if (relational) { + if (isRoot) { + incrementIndent(); + } + println(); + } else { + print(" "); + } print(x.getOperator().name); print(" "); if (x.getRight() instanceof SQLBinaryOpExpr) { SQLBinaryOpExpr right = (SQLBinaryOpExpr) x.getRight(); + boolean rightRational = right.getOperator() == SQLBinaryOperator.BooleanAnd + || right.getOperator() == SQLBinaryOperator.BooleanOr; + if (right.getOperator().priority >= x.getOperator().priority) { + if (rightRational) { + incrementIndent(); + } + print('('); right.accept(this); print(')'); + + if (rightRational) { + decrementIndent(); + } } else { right.accept(this); } @@ -230,6 +272,10 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter { x.getRight().accept(this); } + if (isRoot && relational) { + decrementIndent(); + } + return false; } @@ -446,34 +492,35 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter { return false; } - public boolean visit(SQLSelectQueryBlock select) { + public boolean visit(SQLSelectQueryBlock x) { print("SELECT "); - if (SQLSetQuantifier.ALL == select.getDistionOption()) { + if (SQLSetQuantifier.ALL == x.getDistionOption()) { print("ALL "); - } else if (SQLSetQuantifier.DISTINCT == select.getDistionOption()) { + } else if (SQLSetQuantifier.DISTINCT == x.getDistionOption()) { print("DISTINCT "); - } else if (SQLSetQuantifier.UNIQUE == select.getDistionOption()) { + } else if (SQLSetQuantifier.UNIQUE == x.getDistionOption()) { print("UNIQUE "); } - printSelectList(select.getSelectList()); + printSelectList(x.getSelectList()); - if (select.getFrom() != null) { + if (x.getFrom() != null) { println(); print("FROM "); - select.getFrom().accept(this); + x.getFrom().accept(this); } - if (select.getWhere() != null) { + if (x.getWhere() != null) { println(); print("WHERE "); - select.getWhere().accept(this); + x.getWhere().setParent(x); + x.getWhere().accept(this); } - if (select.getGroupBy() != null) { + if (x.getGroupBy() != null) { print(" "); - select.getGroupBy().accept(this); + x.getGroupBy().accept(this); } return false; @@ -567,13 +614,13 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter { print(' '); item.accept(this); } - + if (x.getEnable() != null) { if (x.getEnable().booleanValue()) { print(" ENABLE"); } } - + return false; } @@ -589,6 +636,7 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter { if (x.getWhere() != null) { print(" WHERE "); + x.getWhere().setParent(x); x.getWhere().accept(this); } @@ -660,6 +708,7 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter { if (x.getWhere() != null) { print(" WHERE "); + x.getWhere().setParent(x); x.getWhere().accept(this); } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/ArithmeticOperatorsTest.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/ArithmeticOperatorsTest.java index cd19d06826..60c5e09c64 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/ArithmeticOperatorsTest.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/ArithmeticOperatorsTest.java @@ -167,7 +167,7 @@ public class ArithmeticOperatorsTest extends TestCase { String text = output(stmtList); - Assert.assertEquals("SELECT 1 = 0 OR A > ?;", text); + Assert.assertEquals("SELECT 1 = 0\n\tOR A > ?;", text); } public void test_13() throws Exception { @@ -178,7 +178,7 @@ public class ArithmeticOperatorsTest extends TestCase { String text = output(stmtList); - Assert.assertEquals("SELECT 1 = 0 AND ID = ?;", text); + Assert.assertEquals("SELECT 1 = 0\n\tAND ID = ?;", text); } private String output(List stmtList) { diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/LogicalOperatorsTest.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/LogicalOperatorsTest.java index da6d4ee0c0..c5ee9e5ab6 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/LogicalOperatorsTest.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/LogicalOperatorsTest.java @@ -123,7 +123,7 @@ public class LogicalOperatorsTest extends TestCase { String text = output(stmtList); - Assert.assertEquals("SELECT 1 AND 1;", text); + Assert.assertEquals("SELECT 1\n\tAND 1;", text); } public void test_9() throws Exception { @@ -134,7 +134,7 @@ public class LogicalOperatorsTest extends TestCase { String text = output(stmtList); - Assert.assertEquals("SELECT 1 AND NULL;", text); + Assert.assertEquals("SELECT 1\n\tAND NULL;", text); } public void test_10() throws Exception { @@ -145,7 +145,7 @@ public class LogicalOperatorsTest extends TestCase { String text = output(stmtList); - Assert.assertEquals("SELECT 0 OR NULL;", text); + Assert.assertEquals("SELECT 0\n\tOR NULL;", text); } public void test_11() throws Exception { diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleGroupingSetTest.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleGroupingSetTest.java index 224939bba9..92a9280367 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleGroupingSetTest.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleGroupingSetTest.java @@ -20,13 +20,16 @@ public class OracleGroupingSetTest extends TestCase { + "GROUP BY GROUPING SETS((channel_desc, calendar_month_desc, co.country_id), (channel_desc, co.country_id), " + "( calendar_month_desc, co.country_id) );\n"; - String expected = "SELECT channel_desc, calendar_month_desc, co.country_id, " - + "TO_CHAR(sum(amount_sold), '9,999,999,999') AS SALES$\n" - + "FROM sales, customers, times, channels, countries co\n" - + "WHERE sales.time_id = times.time_id AND sales.cust_id = customers.cust_id AND sales.channel_id = channels.channel_id " - + "AND customers.country_id = co.country_id AND channels.channel_desc IN ('Direct Sales', 'Internet') " - + "AND times.calendar_month_desc IN ('2000-09', '2000-10') " - + "AND co.country_id IN ('UK', 'US')\n" + String expected = "SELECT channel_desc, calendar_month_desc, co.country_id, " // + + "TO_CHAR(sum(amount_sold), '9,999,999,999') AS SALES$\n" // + + "FROM sales, customers, times, channels, countries co\n" // + + "WHERE sales.time_id = times.time_id" // + + "\n\tAND sales.cust_id = customers.cust_id" // + + "\n\tAND sales.channel_id = channels.channel_id" // + + "\n\tAND customers.country_id = co.country_id" // + + "\n\tAND channels.channel_desc IN ('Direct Sales', 'Internet')" // + + "\n\tAND times.calendar_month_desc IN ('2000-09', '2000-10')" + + "\n\tAND co.country_id IN ('UK', 'US')\n" + "GROUP BY GROUPING SETS ((channel_desc, calendar_month_desc, co.country_id), (channel_desc, co.country_id), " + "(calendar_month_desc, co.country_id));\n"; diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OraclePivotClauseTest.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OraclePivotClauseTest.java index 231c7ca9c5..a4c95c23cd 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OraclePivotClauseTest.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OraclePivotClauseTest.java @@ -15,7 +15,7 @@ public class OraclePivotClauseTest extends TestCase { + "ORDER BY year, order_mode;"; String expected = "SELECT *\n" + "FROM pivot_table\n" - + "\tUNPIVOT (yearly_total FOR order_mode IN (store AS 'direct', internet AS 'online'))\n" + + "UNPIVOT (yearly_total FOR order_mode IN (store AS 'direct', internet AS 'online'))\n" + "ORDER BY year, order_mode;\n"; OracleStatementParser parser = new OracleStatementParser(sql); @@ -34,9 +34,9 @@ public class OraclePivotClauseTest extends TestCase { + "PIVOT (SUM(order_total) FOR order_mode IN ('direct' AS Store, 'online' AS Internet));\n"; String expected = "SELECT *\n" - + "FROM (SELECT EXTRACT(YEAR FROM order_date) AS YEAR, order_mode, order_total\n" - + "\tFROM orders\n" + "\t)\n" - + "\tPIVOT (SUM(order_total) FOR order_mode IN ('direct' AS Store, 'online' AS Internet));\n"; + + "FROM (\n\tSELECT EXTRACT(YEAR FROM order_date) AS YEAR, order_mode, order_total\n" + + "\tFROM orders\n" + ")\n" + + "PIVOT (SUM(order_total) FOR order_mode IN ('direct' AS Store, 'online' AS Internet));\n"; OracleStatementParser parser = new OracleStatementParser(sql); SQLSelectStatement stmt = (SQLSelectStatement) parser.parseStatementList().get(0); @@ -54,9 +54,9 @@ public class OraclePivotClauseTest extends TestCase { + "PIVOT (SUM(order_total) FOR order_mode IN ('direct' AS Store, 'online' AS Internet));\n"; String expected = "SELECT *\n" - + "FROM (SELECT EXTRACT(YEAR FROM order_date) AS YEAR, order_mode, order_total\n" - + "\tFROM orders\n" + "\t)\n" - + "\tPIVOT (SUM(order_total) FOR order_mode IN ('direct' AS Store, 'online' AS Internet));\n"; + + "FROM (\n\tSELECT EXTRACT(YEAR FROM order_date) AS YEAR, order_mode, order_total\n" + + "\tFROM orders\n" + ")\n" + + "PIVOT (SUM(order_total) FOR order_mode IN ('direct' AS Store, 'online' AS Internet));\n"; OracleStatementParser parser = new OracleStatementParser(sql); SQLSelectStatement stmt = (SQLSelectStatement) parser.parseStatementList().get(0); @@ -73,9 +73,9 @@ public class OraclePivotClauseTest extends TestCase { + "FROM (SELECT EXTRACT(YEAR FROM order_date) as day, order_mode, order_total FROM orders)\n" + "PIVOT (SUM(order_total) FOR order_mode IN ('direct' AS Store, 'online' AS Internet));\n"; - String expected = "SELECT *\n" + "FROM (SELECT EXTRACT(YEAR FROM order_date) AS DAY, order_mode, order_total\n" - + "\tFROM orders\n" + "\t)\n" - + "\tPIVOT (SUM(order_total) FOR order_mode IN ('direct' AS Store, 'online' AS Internet));\n"; + String expected = "SELECT *\n" + "FROM (\n\tSELECT EXTRACT(YEAR FROM order_date) AS DAY, order_mode, order_total\n" + + "\tFROM orders\n" + ")\n" + + "PIVOT (SUM(order_total) FOR order_mode IN ('direct' AS Store, 'online' AS Internet));\n"; OracleStatementParser parser = new OracleStatementParser(sql); SQLSelectStatement stmt = (SQLSelectStatement) parser.parseStatementList().get(0); @@ -93,9 +93,9 @@ public class OraclePivotClauseTest extends TestCase { + "PIVOT (SUM(order_total) FOR order_mode IN ('direct' AS Store, 'online' AS Internet));\n"; String expected = "SELECT *\n" - + "FROM (SELECT EXTRACT(YEAR FROM order_date) AS DAY, order_mode AS YEAR, order_total\n" - + "\tFROM orders\n" + "\t)\n" - + "\tPIVOT (SUM(order_total) FOR order_mode IN ('direct' AS Store, 'online' AS Internet));\n"; + + "FROM (\n\tSELECT EXTRACT(YEAR FROM order_date) AS DAY, order_mode AS YEAR, order_total\n" + + "\tFROM orders\n" + ")\n" + + "PIVOT (SUM(order_total) FOR order_mode IN ('direct' AS Store, 'online' AS Internet));\n"; OracleStatementParser parser = new OracleStatementParser(sql); SQLSelectStatement stmt = (SQLSelectStatement) parser.parseStatementList().get(0); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSampleClauseTest.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSampleClauseTest.java index a0452132fd..b3f29cbae4 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSampleClauseTest.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSampleClauseTest.java @@ -12,7 +12,7 @@ public class OracleSampleClauseTest extends TestCase { public void test_0() throws Exception { String sql = "SELECT COUNT(*) * 10 FROM orders SAMPLE (10);"; - String expected = "SELECT COUNT(*) * 10\n" + "FROM orders\n" + "SAMPLE (10);\n"; + String expected = "SELECT COUNT(*) * 10\n" + "FROM orders SAMPLE (10);\n"; OracleStatementParser parser = new OracleStatementParser(sql); SQLSelectStatement stmt = (SQLSelectStatement) parser.parseStatementList().get(0); @@ -27,7 +27,7 @@ public class OracleSampleClauseTest extends TestCase { public void test_1() throws Exception { String sql = "SELECT COUNT(*) * 10 FROM orders SAMPLE (10) SEED (1);"; - String expected = "SELECT COUNT(*) * 10\n" + "FROM orders\n" + "SAMPLE (10) SEED (1);\n"; + String expected = "SELECT COUNT(*) * 10\n" + "FROM orders SAMPLE (10) SEED (1);\n"; OracleStatementParser parser = new OracleStatementParser(sql); SQLSelectStatement stmt = (SQLSelectStatement) parser.parseStatementList().get(0); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/visitor/OracleOutputVisitorTest_selectJoin.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/visitor/OracleOutputVisitorTest_selectJoin.java index fe27a34c44..ad03357da5 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/visitor/OracleOutputVisitorTest_selectJoin.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/visitor/OracleOutputVisitorTest_selectJoin.java @@ -37,7 +37,7 @@ public class OracleOutputVisitorTest_selectJoin extends TestCase { StringBuilder buf = new StringBuilder(); OracleOutputVisitor outputVisitor = new OracleOutputVisitor(buf); stmt.accept(outputVisitor); - Assert.assertEquals("SELECT e.salary\nFROM employee e JOIN department d\nWHERE e.depId = d.id;\n", + Assert.assertEquals("SELECT e.salary\nFROM employee e\n\tJOIN department d\nWHERE e.depId = d.id;\n", buf.toString()); } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/visitor/OracleResourceTest.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/visitor/OracleResourceTest.java index 9822b3d5ec..5da3e6e26f 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/visitor/OracleResourceTest.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/visitor/OracleResourceTest.java @@ -6,21 +6,20 @@ import java.io.Reader; import java.util.List; import junit.framework.Assert; -import junit.framework.TestCase; +import com.alibaba.druid.sql.OracleTest; import com.alibaba.druid.sql.ast.SQLStatement; import com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser; -import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlOutputVisitor; import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlParameterizedOutputVisitor; import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser; import com.alibaba.druid.sql.dialect.oracle.visitor.OracleSchemaStatVisitor; import com.alibaba.druid.util.JdbcUtils; -public class OracleResourceTest extends TestCase { +public class OracleResourceTest extends OracleTest { public void test_0() throws Exception { // 13 - exec_test("bvt/parser/oracle-53.txt"); + exec_test("bvt/parser/oracle-17.txt"); // for (int i = 0; i <= 53; ++i) { // exec_test("bvt/parser/oracle-" + i + ".txt"); // } @@ -43,11 +42,14 @@ public class OracleResourceTest extends TestCase { SQLStatement statemen = statementList.get(0); Assert.assertEquals(1, statementList.size()); + + System.out.println(sql); + + print(statementList); OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); statemen.accept(visitor); - System.out.println(sql); System.out.println("Tables : " + visitor.getTables()); System.out.println("fields : " + visitor.getColumns()); @@ -72,14 +74,4 @@ public class OracleResourceTest extends TestCase { Assert.assertEquals(expect, out.toString()); } - private String output(List stmtList) { - StringBuilder out = new StringBuilder(); - MySqlOutputVisitor visitor = new MySqlOutputVisitor(out); - - for (SQLStatement stmt : stmtList) { - stmt.accept(visitor); - } - - return out.toString(); - } } diff --git a/src/test/resources/bvt/parser/mysql-0.txt b/src/test/resources/bvt/parser/mysql-0.txt index e5f69a32ed..fa3fcb3359 100644 --- a/src/test/resources/bvt/parser/mysql-0.txt +++ b/src/test/resources/bvt/parser/mysql-0.txt @@ -8,5 +8,9 @@ ORDER BY a.col ASC, a.position ASC --------------------------- SELECT DISTINCT a.id AS "id", a.col AS "col", a.position AS "position", a.panel_id AS "panelId" FROM view_position_info a LEFT JOIN view_portal b ON a.panel_id = b.panel_id LEFT JOIN view_portal_panel c ON a.panel_id = c.panel_id -WHERE b.user_id = ? AND (b.is_grid = 'y' AND c.param_name = 'is_hidden' AND c.param_value = 'false' OR b.is_grid != 'y') +WHERE b.user_id = ? + AND (b.is_grid = 'y' + AND c.param_name = 'is_hidden' + AND c.param_value = 'false' + OR b.is_grid != 'y') ORDER BY a.col ASC, a.position ASC \ No newline at end of file diff --git a/src/test/resources/bvt/parser/mysql-1.txt b/src/test/resources/bvt/parser/mysql-1.txt index ab06c1582d..4f4317ecd2 100644 --- a/src/test/resources/bvt/parser/mysql-1.txt +++ b/src/test/resources/bvt/parser/mysql-1.txt @@ -10,6 +10,8 @@ SELECT id, item_type AS 'itemType', item_id AS 'itemId', item_name AS 'itemName', app_id AS 'appId' , sequence, refresh_intv AS "refreshIntv" FROM view_portal_info -WHERE 1 = 1 AND item_type = ? AND app_id = ? +WHERE 1 = 1 + AND item_type = ? + AND app_id = ? ORDER BY sequence DESC LIMIT ?, ? \ No newline at end of file diff --git a/src/test/resources/bvt/parser/mysql-3.txt b/src/test/resources/bvt/parser/mysql-3.txt index b5e781797b..c41cd7bfe4 100644 --- a/src/test/resources/bvt/parser/mysql-3.txt +++ b/src/test/resources/bvt/parser/mysql-3.txt @@ -7,6 +7,14 @@ GROUP BY c_URI) A SELECT COUNT(*) FROM (SELECT COUNT(*) FROM m_web_uri_m5 - WHERE monitor_item_id = ? AND app_num = ? AND inst_num = ? AND service_tag = ? AND monitor_item_id = ? AND collect_date >= ? AND collect_date < ? AND (1 = 0 OR c_URI IN (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83)) + WHERE monitor_item_id = ? + AND app_num = ? + AND inst_num = ? + AND service_tag = ? + AND monitor_item_id = ? + AND collect_date >= ? + AND collect_date < ? + AND (1 = 0 + OR c_URI IN (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83)) GROUP BY c_URI ) A \ No newline at end of file diff --git a/src/test/resources/bvt/parser/mysql-4.txt b/src/test/resources/bvt/parser/mysql-4.txt index e399a83dee..5244a34540 100644 --- a/src/test/resources/bvt/parser/mysql-4.txt +++ b/src/test/resources/bvt/parser/mysql-4.txt @@ -6,4 +6,5 @@ --------------------------- SELECT s.*, d.* FROM server s LEFT JOIN device_base d ON s.device_base_id = d.id LEFT JOIN logic_site l ON l.id = d.logic_site_id -WHERE s.gmt_modify > ? AND l.site_name = '开发测试' \ No newline at end of file +WHERE s.gmt_modify > ? + AND l.site_name = '开发测试' \ No newline at end of file diff --git a/src/test/resources/bvt/parser/mysql-5.txt b/src/test/resources/bvt/parser/mysql-5.txt index afdaf44e70..3fc9cb9f8a 100644 --- a/src/test/resources/bvt/parser/mysql-5.txt +++ b/src/test/resources/bvt/parser/mysql-5.txt @@ -10,5 +10,8 @@ ORDER BY e.word_alias,a.createtime DESC --------------------------- SELECT Count(*) FROM q_matchrelation a, q_offerdetail b, q_keyword e, Q_ADCREATIVE f -WHERE a.offerid = b.offerid AND a.keywordid = e.keywordid AND a.offerid = f.offerid AND a.issuspect = '1' +WHERE a.offerid = b.offerid + AND a.keywordid = e.keywordid + AND a.offerid = f.offerid + AND a.issuspect = '1' ORDER BY e.word_alias, a.createtime DESC \ No newline at end of file diff --git a/src/test/resources/bvt/parser/mysql-6.txt b/src/test/resources/bvt/parser/mysql-6.txt index a6edb8a5d9..304155ab78 100644 --- a/src/test/resources/bvt/parser/mysql-6.txt +++ b/src/test/resources/bvt/parser/mysql-6.txt @@ -42,5 +42,7 @@ FROM (SELECT a.activity_offer_id AS adResourceId, a.title AS adResourceName, a.b , c.position_name AS positionName, c.charge_setting AS feeRegulation, a.priority_weight AS priorityWeight, a.audit_state AS adResourceState, 0 AS adResourceType , a.gmt_create, a.refuse_remark FROM q_activity_offer_enroll a, q_custinfo b, q_activity_position c - WHERE a.custid = b.custid AND a.activity_position_id = c.activity_position_id AND c.activity_id = ? + WHERE a.custid = b.custid + AND a.activity_position_id = c.activity_position_id + AND c.activity_id = ? ) a diff --git a/src/test/resources/bvt/parser/mysql-8.txt b/src/test/resources/bvt/parser/mysql-8.txt index 6530e84e30..eb462f608d 100644 --- a/src/test/resources/bvt/parser/mysql-8.txt +++ b/src/test/resources/bvt/parser/mysql-8.txt @@ -9,7 +9,8 @@ WHERE a.examine_id = b.examine_id SELECT a.examine_id AS examineId, a.examine_name AS examineName, a.level_limit AS levelLimit FROM c_examinepaper a, (SELECT examine_id FROM c_examinepaper - WHERE level_limit = ? AND status = 1 + WHERE level_limit = ? + AND status = 1 MINUS SELECT DISTINCT examine_id FROM course diff --git a/src/test/resources/bvt/parser/mysql-9.txt b/src/test/resources/bvt/parser/mysql-9.txt index 29023d383c..dd191c94e5 100644 --- a/src/test/resources/bvt/parser/mysql-9.txt +++ b/src/test/resources/bvt/parser/mysql-9.txt @@ -3,8 +3,96 @@ OR a.id = ? OR a.id = ? OR a.id = ? OR a.id = ? OR a.id = ? OR a.id = ? OR a.id --------------------------- SELECT a.id AS "appId", a.name AS "appName", b.number AS "instanceNumber", b.hostname AS "hostname", c.name AS "monitorItemName" , d.id AS "alarmRuleStatusId", d.name AS "alarmRuleName", d.current_status AS "alarmRuleStatus", d.last_change_time AS "lastChangeTimeOfAlarmRule" -FROM mi_alarm_rule_status d LEFT JOIN monitor_item_status c ON d.mi_status_id = c.id LEFT JOIN instance b ON b.number = c.inst_num AND b.app_num = c.app_num AND b.hostname = c.hostname LEFT JOIN app a ON a.number = b.app_num -WHERE 1 = 0 OR a.id = ? OR a.id = ? OR a.id = ? OR a.id = ? OR a.id = ? OR a.id = ? OR a.id = ? OR a.id = ? OR a.id = ? OR a.id = ? OR a.id = ? OR a.id = ? OR a.id = ? OR a.id = ? OR a.id = ? OR a.id = ? OR a.id = ? OR a.id = ? OR a.id = ? OR a.id = ? OR a.id = ? OR a.id = ? OR a.id = ? OR a.id = ? OR a.id = ? OR a.id = ? OR a.id = ? OR a.id = ? OR a.id = ? OR a.id = ? OR a.id = ? OR a.id = ? OR a.id = ? OR a.id = ? OR a.id = ? OR a.id = ? OR a.id = ? OR a.id = ? OR a.id = ? OR a.id = ? OR a.id = ? OR a.id = ? OR a.id = ? OR a.id = ? OR a.id = ? OR a.id = ? OR a.id = ? OR a.id = ? OR a.id = ? OR a.id = ? OR a.id = ? OR a.id = ? OR a.id = ? OR a.id = ? OR a.id = ? OR a.id = ? OR a.id = ? OR a.id = ? OR a.id = ? OR a.id = ? OR a.id = ? OR a.id = ? OR a.id = ? OR a.id = ? OR a.id = ? OR a.id = ? OR a.id = ? OR a.id = ? OR a.id = ? OR a.id = ? OR a.id = ? OR a.id = ? OR a.id = ? OR a.id = ? OR a.id = ? OR a.id = ? OR a.id = ? OR a.id = ? OR a.id = ? OR a.id = ? OR a.id = ? OR a.id = ? OR a.id = ? OR a.id = ? OR a.id = ? OR a.id = ? +FROM mi_alarm_rule_status d LEFT JOIN monitor_item_status c ON d.mi_status_id = c.id LEFT JOIN instance b ON b.number = c.inst_num +AND b.app_num = c.app_num +AND b.hostname = c.hostname LEFT JOIN app a ON a.number = b.app_num +WHERE 1 = 0 + OR a.id = ? + OR a.id = ? + OR a.id = ? + OR a.id = ? + OR a.id = ? + OR a.id = ? + OR a.id = ? + OR a.id = ? + OR a.id = ? + OR a.id = ? + OR a.id = ? + OR a.id = ? + OR a.id = ? + OR a.id = ? + OR a.id = ? + OR a.id = ? + OR a.id = ? + OR a.id = ? + OR a.id = ? + OR a.id = ? + OR a.id = ? + OR a.id = ? + OR a.id = ? + OR a.id = ? + OR a.id = ? + OR a.id = ? + OR a.id = ? + OR a.id = ? + OR a.id = ? + OR a.id = ? + OR a.id = ? + OR a.id = ? + OR a.id = ? + OR a.id = ? + OR a.id = ? + OR a.id = ? + OR a.id = ? + OR a.id = ? + OR a.id = ? + OR a.id = ? + OR a.id = ? + OR a.id = ? + OR a.id = ? + OR a.id = ? + OR a.id = ? + OR a.id = ? + OR a.id = ? + OR a.id = ? + OR a.id = ? + OR a.id = ? + OR a.id = ? + OR a.id = ? + OR a.id = ? + OR a.id = ? + OR a.id = ? + OR a.id = ? + OR a.id = ? + OR a.id = ? + OR a.id = ? + OR a.id = ? + OR a.id = ? + OR a.id = ? + OR a.id = ? + OR a.id = ? + OR a.id = ? + OR a.id = ? + OR a.id = ? + OR a.id = ? + OR a.id = ? + OR a.id = ? + OR a.id = ? + OR a.id = ? + OR a.id = ? + OR a.id = ? + OR a.id = ? + OR a.id = ? + OR a.id = ? + OR a.id = ? + OR a.id = ? + OR a.id = ? + OR a.id = ? + OR a.id = ? + OR a.id = ? + OR a.id = ? + OR a.id = ? + OR a.id = ? ORDER BY lastChangeTimeOfAlarmRule DESC LIMIT ?, ? ---------------------------