You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by pa...@apache.org on 2020/09/18 08:05:00 UTC

[shardingsphere] branch master updated: Fix code format for #7353 (#7505)

This is an automated email from the ASF dual-hosted git repository.

panjuan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git


The following commit(s) were added to refs/heads/master by this push:
     new d467b1a  Fix code format for #7353 (#7505)
d467b1a is described below

commit d467b1a270e287b1d92ed1b30fc2d9850ec4410c
Author: JingShang Lu <lu...@apache.org>
AuthorDate: Fri Sep 18 16:04:27 2020 +0800

    Fix code format for #7353 (#7505)
    
    * Change BinaryOperationExpression attribute initialization method, from the set to the constructor
    
    * Change BetweenExpression attribute initialization method, from the set to the constructor
    
    * Change InExpression attribute initialization method, from the set to the constructor
    
    * simple WhereClauseShardingConditionEngine
    
    * fix
    
    * fix
    
    * fix
---
 .../rewrite/condition/EncryptConditionEngine.java  |   6 +-
 .../impl/EncryptPredicateColumnTokenGenerator.java |   6 +-
 .../shadow/condition/ShadowConditionEngine.java    |   6 +-
 .../impl/ShadowPredicateColumnTokenGenerator.java  |   6 +-
 .../impl/PreparedShadowDataSourceJudgeEngine.java  |   6 +-
 .../impl/PreparedShadowDataSourceRouterTest.java   |  21 +---
 .../impl/SimpleShadowDataSourceRouterTest.java     |  12 +--
 .../engine/WhereClauseShardingConditionEngine.java |  43 +++-----
 ...ConditionValueBetweenOperatorGeneratorTest.java |  20 +---
 ...ConditionValueCompareOperatorGeneratorTest.java |  32 ++----
 .../ConditionValueInOperatorGeneratorTest.java     |   5 +-
 .../impl/ShardingUpdateStatementValidatorTest.java |   7 +-
 .../engine/RowNumberPaginationContextEngine.java   |  46 ++++-----
 .../engine/TopPaginationContextEngine.java         |  46 +++++----
 .../RowNumberPaginationContextEngineTest.java      |  27 ++---
 .../engine/TopPaginationContextEngineTest.java     |  20 ++--
 .../statement/dml/UpdateStatementContextTest.java  |   3 +-
 .../statement/impl/SelectStatementContextTest.java |   7 +-
 .../sql/parser/mysql/visitor/MySQLVisitor.java     | 114 ++++++++-------------
 .../sql/parser/oracle/visitor/OracleVisitor.java   |  92 +++++++----------
 .../postgresql/visitor/PostgreSQLVisitor.java      |  67 +++++-------
 .../sql/parser/sql92/visitor/SQL92Visitor.java     |  92 +++++++----------
 .../parser/sqlserver/visitor/SQLServerVisitor.java |  92 +++++++----------
 .../common/segment/dml/expr/BetweenExpression.java |  14 +--
 .../dml/expr/BinaryOperationExpression.java        |  16 +--
 .../sql/common/segment/dml/expr/InExpression.java  |  12 ++-
 .../common/segment/dml/expr/ListExpression.java    |   8 +-
 ...essionBuildUtil.java => ExpressionBuilder.java} |  18 ++--
 28 files changed, 336 insertions(+), 508 deletions(-)

diff --git a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-rewrite/src/main/java/org/apache/shardingsphere/encrypt/rewrite/condition/EncryptConditionEngine.java b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-rewrite/src/main/java/org/apache/shardingsphere/encrypt/rewrite/condition/EncryptConditionEngine.java
index fff6ccd..33a2d72 100644
--- a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-rewrite/src/main/java/org/apache/shardingsphere/encrypt/rewrite/condition/EncryptConditionEngine.java
+++ b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-rewrite/src/main/java/org/apache/shardingsphere/encrypt/rewrite/condition/EncryptConditionEngine.java
@@ -33,7 +33,7 @@ import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.InExpres
 import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.simple.SimpleExpressionSegment;
 import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.predicate.AndPredicate;
 import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.predicate.WhereSegment;
-import org.apache.shardingsphere.sql.parser.sql.common.util.ExpressionBuildUtil;
+import org.apache.shardingsphere.sql.parser.sql.common.util.ExpressionBuilder;
 import org.apache.shardingsphere.sql.parser.sql.common.util.ColumnExtractFromExpression;
 
 import java.util.Collection;
@@ -69,8 +69,8 @@ public final class EncryptConditionEngine {
         }
     
         ExpressionSegment expression = ((WhereAvailable) sqlStatementContext).getWhere().get().getExpr();
-        ExpressionBuildUtil expressionBuildUtil = new ExpressionBuildUtil(expression);
-        Collection<AndPredicate> andPredicates = new LinkedList<>(expressionBuildUtil.extractAndPredicates().getAndPredicates());
+        ExpressionBuilder expressionBuilder = new ExpressionBuilder(expression);
+        Collection<AndPredicate> andPredicates = new LinkedList<>(expressionBuilder.extractAndPredicates().getAndPredicates());
         List<EncryptCondition> result = new LinkedList<>();
         for (AndPredicate each : andPredicates) {
             result.addAll(createEncryptConditions(sqlStatementContext, each));
diff --git a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-rewrite/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/impl/EncryptPredicateColumnTokenGenerator.java b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-rewrite/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/impl/EncryptPredicateColumnTokenGenerator.java
index a4ac493..662c092 100644
--- a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-rewrite/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/impl/EncryptPredicateColumnTokenGenerator.java
+++ b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-rewrite/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/impl/EncryptPredicateColumnTokenGenerator.java
@@ -31,7 +31,7 @@ import org.apache.shardingsphere.sql.parser.binder.type.WhereAvailable;
 import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.column.ColumnSegment;
 import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.ExpressionSegment;
 import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.predicate.AndPredicate;
-import org.apache.shardingsphere.sql.parser.sql.common.util.ExpressionBuildUtil;
+import org.apache.shardingsphere.sql.parser.sql.common.util.ExpressionBuilder;
 import org.apache.shardingsphere.sql.parser.sql.common.util.ColumnExtractFromExpression;
 
 import java.util.Collection;
@@ -59,8 +59,8 @@ public final class EncryptPredicateColumnTokenGenerator extends BaseEncryptSQLTo
         Preconditions.checkState(((WhereAvailable) sqlStatementContext).getWhere().isPresent());
         Collection<SubstitutableColumnNameToken> result = new LinkedHashSet<>();
         ExpressionSegment expression = ((WhereAvailable) sqlStatementContext).getWhere().get().getExpr();
-        ExpressionBuildUtil util = new ExpressionBuildUtil(expression);
-        Collection<AndPredicate> andPredicates = new LinkedList<>(util.extractAndPredicates().getAndPredicates());
+        ExpressionBuilder expressionBuilder = new ExpressionBuilder(expression);
+        Collection<AndPredicate> andPredicates = new LinkedList<>(expressionBuilder.extractAndPredicates().getAndPredicates());
         for (AndPredicate each : andPredicates) {
             result.addAll(generateSQLTokens(sqlStatementContext, each));
         }
diff --git a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-common/src/main/java/org/apache/shardingsphere/shadow/condition/ShadowConditionEngine.java b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-common/src/main/java/org/apache/shardingsphere/shadow/condition/ShadowConditionEngine.java
index 6582a4f..b475c27 100644
--- a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-common/src/main/java/org/apache/shardingsphere/shadow/condition/ShadowConditionEngine.java
+++ b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-common/src/main/java/org/apache/shardingsphere/shadow/condition/ShadowConditionEngine.java
@@ -30,7 +30,7 @@ import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.InExpres
 import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.simple.SimpleExpressionSegment;
 import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.predicate.AndPredicate;
 import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.predicate.WhereSegment;
-import org.apache.shardingsphere.sql.parser.sql.common.util.ExpressionBuildUtil;
+import org.apache.shardingsphere.sql.parser.sql.common.util.ExpressionBuilder;
 import org.apache.shardingsphere.sql.parser.sql.common.util.ColumnExtractFromExpression;
 
 import java.util.Collection;
@@ -61,8 +61,8 @@ public final class ShadowConditionEngine {
             return Optional.empty();
         }
         ExpressionSegment expression = ((WhereAvailable) sqlStatementContext).getWhere().get().getExpr();
-        ExpressionBuildUtil util = new ExpressionBuildUtil(expression);
-        Collection<AndPredicate> andPredicates = new LinkedList<>(util.extractAndPredicates().getAndPredicates());
+        ExpressionBuilder expressionBuilder = new ExpressionBuilder(expression);
+        Collection<AndPredicate> andPredicates = new LinkedList<>(expressionBuilder.extractAndPredicates().getAndPredicates());
         for (AndPredicate each : andPredicates) {
             Optional<ShadowCondition> condition = createShadowCondition(each);
             if (condition.isPresent()) {
diff --git a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-rewrite/src/main/java/org/apache/shardingsphere/shadow/rewrite/token/generator/impl/ShadowPredicateColumnTokenGenerator.java b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-rewrite/src/main/java/org/apache/shardingsphere/shadow/rewrite/token/generator/impl/ShadowPredicateColumnTokenGenerator.java
index 8d22545..3789d1f 100644
--- a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-rewrite/src/main/java/org/apache/shardingsphere/shadow/rewrite/token/generator/impl/ShadowPredicateColumnTokenGenerator.java
+++ b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-rewrite/src/main/java/org/apache/shardingsphere/shadow/rewrite/token/generator/impl/ShadowPredicateColumnTokenGenerator.java
@@ -29,7 +29,7 @@ import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.column.Column
 import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.ExpressionSegment;
 import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.predicate.AndPredicate;
 import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.predicate.WhereSegment;
-import org.apache.shardingsphere.sql.parser.sql.common.util.ExpressionBuildUtil;
+import org.apache.shardingsphere.sql.parser.sql.common.util.ExpressionBuilder;
 import org.apache.shardingsphere.sql.parser.sql.common.util.ColumnExtractFromExpression;
 
 import java.util.Collection;
@@ -53,8 +53,8 @@ public final class ShadowPredicateColumnTokenGenerator extends BaseShadowSQLToke
         Preconditions.checkState(((WhereAvailable) sqlStatementContext).getWhere().isPresent());
         Collection<SQLToken> result = new LinkedList<>();
         ExpressionSegment expression = ((WhereAvailable) sqlStatementContext).getWhere().get().getExpr();
-        ExpressionBuildUtil util = new ExpressionBuildUtil(expression);
-        Collection<AndPredicate> andPredicates = new LinkedList<>(util.extractAndPredicates().getAndPredicates());
+        ExpressionBuilder expressionBuilder = new ExpressionBuilder(expression);
+        Collection<AndPredicate> andPredicates = new LinkedList<>(expressionBuilder.extractAndPredicates().getAndPredicates());
         for (AndPredicate each : andPredicates) {
             result.addAll(generateSQLTokens(((WhereAvailable) sqlStatementContext).getWhere().get(), each));
         }
diff --git a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-route/src/main/java/org/apache/shardingsphere/shadow/route/engine/judge/impl/PreparedShadowDataSourceJudgeEngine.java b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-route/src/main/java/org/apache/shardingsphere/shadow/route/engine/judge/impl/PreparedShadowDataSourceJudgeEngine.java
index 11f7431..81c5e1e 100644
--- a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-route/src/main/java/org/apache/shardingsphere/shadow/route/engine/judge/impl/PreparedShadowDataSourceJudgeEngine.java
+++ b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-route/src/main/java/org/apache/shardingsphere/shadow/route/engine/judge/impl/PreparedShadowDataSourceJudgeEngine.java
@@ -32,7 +32,7 @@ import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.simple.L
 import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.simple.ParameterMarkerExpressionSegment;
 import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.predicate.AndPredicate;
 import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.predicate.WhereSegment;
-import org.apache.shardingsphere.sql.parser.sql.common.util.ExpressionBuildUtil;
+import org.apache.shardingsphere.sql.parser.sql.common.util.ExpressionBuilder;
 
 import java.util.Collection;
 import java.util.LinkedList;
@@ -72,8 +72,8 @@ public final class PreparedShadowDataSourceJudgeEngine implements ShadowDataSour
             return false;
         }
         ExpressionSegment expression = whereSegment.get().getExpr();
-        ExpressionBuildUtil util = new ExpressionBuildUtil(expression);
-        Collection<AndPredicate> andPredicates = new LinkedList<>(util.extractAndPredicates().getAndPredicates());
+        ExpressionBuilder expressionBuilder = new ExpressionBuilder(expression);
+        Collection<AndPredicate> andPredicates = new LinkedList<>(expressionBuilder.extractAndPredicates().getAndPredicates());
         for (AndPredicate andPredicate : andPredicates) {
             if (judgePredicateSegments(andPredicate.getPredicates())) {
                 return true;
diff --git a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-route/src/test/java/org/apache/shardingsphere/shadow/route/engine/judge/impl/PreparedShadowDataSourceRouterTest.java b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-route/src/test/java/org/apache/shardingsphere/shadow/route/engine/judge/impl/PreparedShadowDataSourceRouterTest.java
index 48663e8..ae95412 100644
--- a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-route/src/test/java/org/apache/shardingsphere/shadow/route/engine/judge/impl/PreparedShadowDataSourceRouterTest.java
+++ b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-route/src/test/java/org/apache/shardingsphere/shadow/route/engine/judge/impl/PreparedShadowDataSourceRouterTest.java
@@ -72,24 +72,9 @@ public final class PreparedShadowDataSourceRouterTest {
     }
     
     private SelectStatementContext selectStatementContext() {
-        BinaryOperationExpression left = new BinaryOperationExpression();
-        left.setLeft(new ColumnSegment(0, 0, new IdentifierValue("id")));
-        left.setRight(new ParameterMarkerExpressionSegment(0, 0, 0));
-        left.setText("id=?");
-        left.setOperator("=");
-        
-        BinaryOperationExpression right = new BinaryOperationExpression();
-        right.setLeft(new ColumnSegment(0, 0, new IdentifierValue("shadow")));
-        right.setRight(new LiteralExpressionSegment(45, 48, "true"));
-        right.setText("shadow=true");
-        right.setOperator("=");
-        
-        BinaryOperationExpression binaryOperationExpression = new BinaryOperationExpression();
-        binaryOperationExpression.setLeft(left);
-        binaryOperationExpression.setRight(right);
-        binaryOperationExpression.setOperator("and");
-        binaryOperationExpression.setText("id=? and shadow=true");
-        
+        BinaryOperationExpression left = new BinaryOperationExpression(0, 0, new ColumnSegment(0, 0, new IdentifierValue("id")), new ParameterMarkerExpressionSegment(0, 0, 0), "=", "id=?");
+        BinaryOperationExpression right = new BinaryOperationExpression(0, 0, new ColumnSegment(0, 0, new IdentifierValue("shadow")), new LiteralExpressionSegment(45, 48, "true"), "=", "shadow=true");
+        BinaryOperationExpression binaryOperationExpression = new BinaryOperationExpression(0, 0, left, right, "and", "id=? and shadow=true");
         WhereSegment whereSegment = new WhereSegment(0, 0, binaryOperationExpression);
         SelectStatement selectStatement = new SelectStatement();
         selectStatement.setWhere(whereSegment);
diff --git a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-route/src/test/java/org/apache/shardingsphere/shadow/route/engine/judge/impl/SimpleShadowDataSourceRouterTest.java b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-route/src/test/java/org/apache/shardingsphere/shadow/route/engine/judge/impl/SimpleShadowDataSourceRouterTest.java
index b3b73d5..9644607 100644
--- a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-route/src/test/java/org/apache/shardingsphere/shadow/route/engine/judge/impl/SimpleShadowDataSourceRouterTest.java
+++ b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-route/src/test/java/org/apache/shardingsphere/shadow/route/engine/judge/impl/SimpleShadowDataSourceRouterTest.java
@@ -109,10 +109,9 @@ public final class SimpleShadowDataSourceRouterTest {
     
     @Test
     public void judgeForWhereSegment() {
-        BinaryOperationExpression expression = new BinaryOperationExpression();
-        expression.setLeft(new ColumnSegment(0, 0, new IdentifierValue("shadow")));
-        expression.setRight(new LiteralExpressionSegment(0, 0, true));
-        expression.setOperator("=");
+        ColumnSegment left = new ColumnSegment(0, 0, new IdentifierValue("shadow"));
+        LiteralExpressionSegment right = new LiteralExpressionSegment(0, 0, true);
+        BinaryOperationExpression expression = new BinaryOperationExpression(0, 0, left, right, "=", null);
         WhereSegment whereSegment = new WhereSegment(0, 0, expression);
         SelectStatement selectStatement = new SelectStatement();
         selectStatement.setWhere(whereSegment);
@@ -123,8 +122,9 @@ public final class SimpleShadowDataSourceRouterTest {
         SelectStatementContext selectStatementContext = new SelectStatementContext(schemaMetaData, Collections.emptyList(), selectStatement);
         SimpleShadowDataSourceJudgeEngine simpleShadowDataSourceRouter = new SimpleShadowDataSourceJudgeEngine(shadowRule, selectStatementContext);
         assertTrue("should be shadow", simpleShadowDataSourceRouter.isShadow());
-        expression.setLeft(new ColumnSegment(0, 0, new IdentifierValue("shadow")));
-        expression.setRight(new LiteralExpressionSegment(0, 0, false));
+        expression = new BinaryOperationExpression(0, 0, new ColumnSegment(0, 0, new IdentifierValue("shadow")), new LiteralExpressionSegment(0, 0, false), "=", null);
+        whereSegment = new WhereSegment(0, 0, expression);
+        selectStatement.setWhere(whereSegment);
         projectionsSegment.getProjections().clear();
         projectionsSegment.getProjections().addAll(Collections.singletonList(new ExpressionProjectionSegment(0, 0, "false")));
         assertFalse("should not be shadow", simpleShadowDataSourceRouter.isShadow());
diff --git a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-route/src/main/java/org/apache/shardingsphere/sharding/route/engine/condition/engine/WhereClauseShardingConditionEngine.java b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-route/src/main/java/org/apache/shardingsphere/sharding/route/engine/condition/engine/WhereClauseShardingConditionEngine.java
index a7015ad..baf85f5 100644
--- a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-route/src/main/java/org/apache/shardingsphere/sharding/route/engine/condition/engine/WhereClauseShardingConditionEngine.java
+++ b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-route/src/main/java/org/apache/shardingsphere/sharding/route/engine/condition/engine/WhereClauseShardingConditionEngine.java
@@ -33,14 +33,12 @@ import org.apache.shardingsphere.sql.parser.binder.metadata.schema.SchemaMetaDat
 import org.apache.shardingsphere.sql.parser.binder.statement.SQLStatementContext;
 import org.apache.shardingsphere.sql.parser.binder.type.WhereAvailable;
 import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.column.ColumnSegment;
-import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.BetweenExpression;
-import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.BinaryOperationExpression;
 import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.ExpressionSegment;
-import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.InExpression;
 import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.predicate.AndPredicate;
 import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.predicate.WhereSegment;
 import org.apache.shardingsphere.sql.parser.sql.common.statement.dml.SelectStatement;
-import org.apache.shardingsphere.sql.parser.sql.common.util.ExpressionBuildUtil;
+import org.apache.shardingsphere.sql.parser.sql.common.util.ColumnExtractFromExpression;
+import org.apache.shardingsphere.sql.parser.sql.common.util.ExpressionBuilder;
 import org.apache.shardingsphere.sql.parser.sql.common.util.SafeNumberOperationUtils;
 import org.apache.shardingsphere.sql.parser.sql.common.util.WhereSegmentExtractUtils;
 
@@ -94,8 +92,8 @@ public final class WhereClauseShardingConditionEngine {
     private Collection<ShardingCondition> createShardingConditions(final SQLStatementContext<?> sqlStatementContext, final ExpressionSegment expressionSegment, final List<Object> parameters) {
         Collection<ShardingCondition> result = new LinkedList<>();
     
-        ExpressionBuildUtil util = new ExpressionBuildUtil(expressionSegment);
-        Collection<AndPredicate> andPredicates = new LinkedList<>(util.extractAndPredicates().getAndPredicates());
+        ExpressionBuilder expressionBuilder = new ExpressionBuilder(expressionSegment);
+        Collection<AndPredicate> andPredicates = new LinkedList<>(expressionBuilder.extractAndPredicates().getAndPredicates());
         for (AndPredicate each : andPredicates) {
             Map<Column, Collection<RouteValue>> routeValueMap = createRouteValueMap(sqlStatementContext, each, parameters);
             if (routeValueMap.isEmpty()) {
@@ -108,34 +106,17 @@ public final class WhereClauseShardingConditionEngine {
     
     private Map<Column, Collection<RouteValue>> createRouteValueMap(final SQLStatementContext<?> sqlStatementContext, final AndPredicate expressions, final List<Object> parameters) {
         Map<Column, Collection<RouteValue>> result = new HashMap<>();
-    
         for (ExpressionSegment each : expressions.getPredicates()) {
-            Optional<RouteValue> routeValue = Optional.empty();
-            Column column = null;
-            if (each instanceof BinaryOperationExpression && ((BinaryOperationExpression) each).getLeft() instanceof ColumnSegment) {
-                ColumnSegment columnSegment = (ColumnSegment) ((BinaryOperationExpression) each).getLeft();
-                Optional<String> tableName = sqlStatementContext.getTablesContext().findTableName(columnSegment, schemaMetaData);
-                if (tableName.isPresent() && shardingRule.isShardingColumn(columnSegment.getIdentifier().getValue(), tableName.get())) {
-                    column = new Column(columnSegment.getIdentifier().getValue(), tableName.get());
-                    routeValue = ConditionValueGeneratorFactory.generate(each, column, parameters);
-                }
+            Optional<ColumnSegment> columnSegment = ColumnExtractFromExpression.extract(each);
+            if (!columnSegment.isPresent()) {
+                continue;
             }
-            if (each instanceof InExpression && ((InExpression) each).getLeft() instanceof ColumnSegment) {
-                ColumnSegment columnSegment = (ColumnSegment) ((InExpression) each).getLeft();
-                Optional<String> tableName = sqlStatementContext.getTablesContext().findTableName(columnSegment, schemaMetaData);
-                if (tableName.isPresent() && shardingRule.isShardingColumn(columnSegment.getIdentifier().getValue(), tableName.get())) {
-                    column = new Column(columnSegment.getIdentifier().getValue(), tableName.get());
-                    routeValue = ConditionValueGeneratorFactory.generate(each, column, parameters);
-                }
-            }
-            if (each instanceof BetweenExpression && ((BetweenExpression) each).getLeft() instanceof ColumnSegment) {
-                ColumnSegment columnSegment = (ColumnSegment) ((BetweenExpression) each).getLeft();
-                Optional<String> tableName = sqlStatementContext.getTablesContext().findTableName(columnSegment, schemaMetaData);
-                if (tableName.isPresent() && shardingRule.isShardingColumn(columnSegment.getIdentifier().getValue(), tableName.get())) {
-                    column = new Column(columnSegment.getIdentifier().getValue(), tableName.get());
-                    routeValue = ConditionValueGeneratorFactory.generate(each, column, parameters);
-                }
+            Optional<String> tableName = sqlStatementContext.getTablesContext().findTableName(columnSegment.get(), schemaMetaData);
+            if (!(tableName.isPresent() && shardingRule.isShardingColumn(columnSegment.get().getIdentifier().getValue(), tableName.get()))) {
+                continue;
             }
+            Column column = new Column(columnSegment.get().getIdentifier().getValue(), tableName.get());
+            Optional<RouteValue> routeValue = ConditionValueGeneratorFactory.generate(each, column, parameters);
             if (routeValue.isPresent()) {
                 if (!result.containsKey(column)) {
                     Collection<RouteValue> routeValues = new LinkedList<>();
diff --git a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-route/src/test/java/org/apache/shardingsphere/sharding/route/engine/condition/generator/impl/ConditionValueBetweenOperatorGeneratorTest.java b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-route/src/test/java/org/apache/shardingsphere/sharding/route/engine/condition/generator/impl/ConditionValueBetweenOperatorGeneratorTest.java
index 7b1a976..0094a78 100644
--- a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-route/src/test/java/org/apache/shardingsphere/sharding/route/engine/condition/generator/impl/ConditionValueBetweenOperatorGeneratorTest.java
+++ b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-route/src/test/java/org/apache/shardingsphere/sharding/route/engine/condition/generator/impl/ConditionValueBetweenOperatorGeneratorTest.java
@@ -49,9 +49,7 @@ public final class ConditionValueBetweenOperatorGeneratorTest {
         int and = 2;
         ExpressionSegment betweenSegment = new LiteralExpressionSegment(0, 0, between);
         ExpressionSegment andSegment = new LiteralExpressionSegment(0, 0, and);
-        BetweenExpression value = new BetweenExpression();
-        value.setBetweenExpr(betweenSegment);
-        value.setAndExpr(andSegment);
+        BetweenExpression value = new BetweenExpression(0, 0, null, betweenSegment, andSegment, false);
         Optional<RouteValue> routeValue = generator.generate(value, column, new LinkedList<>());
         assertTrue(routeValue.isPresent());
         RangeRouteValue<Integer> rangeRouteValue = (RangeRouteValue<Integer>) routeValue.get();
@@ -68,9 +66,7 @@ public final class ConditionValueBetweenOperatorGeneratorTest {
         long and = 3147483647L;
         ExpressionSegment betweenSegment = new LiteralExpressionSegment(0, 0, between);
         ExpressionSegment andSegment = new LiteralExpressionSegment(0, 0, and);
-        BetweenExpression value = new BetweenExpression();
-        value.setBetweenExpr(betweenSegment);
-        value.setAndExpr(andSegment);
+        BetweenExpression value = new BetweenExpression(0, 0, null, betweenSegment, andSegment, false);
         Optional<RouteValue> routeValue = generator.generate(value, column, new LinkedList<>());
         assertTrue(routeValue.isPresent());
         RangeRouteValue<Comparable<?>> rangeRouteValue = (RangeRouteValue<Comparable<?>>) routeValue.get();
@@ -85,9 +81,7 @@ public final class ConditionValueBetweenOperatorGeneratorTest {
         int between = 1;
         ExpressionSegment betweenSegment = new LiteralExpressionSegment(0, 0, between);
         ExpressionSegment andSegment = new CommonExpressionSegment(0, 0, "now()");
-        BetweenExpression value = new BetweenExpression();
-        value.setBetweenExpr(betweenSegment);
-        value.setAndExpr(andSegment);
+        BetweenExpression value = new BetweenExpression(0, 0, null, betweenSegment, andSegment, false);
         generator.generate(value, column, new LinkedList<>());
     }
     
@@ -97,9 +91,7 @@ public final class ConditionValueBetweenOperatorGeneratorTest {
         Date date = new Date();
         ExpressionSegment betweenSegment = new LiteralExpressionSegment(0, 0, date);
         ExpressionSegment andSegment = new CommonExpressionSegment(0, 0, "now()");
-        BetweenExpression value = new BetweenExpression();
-        value.setBetweenExpr(betweenSegment);
-        value.setAndExpr(andSegment);
+        BetweenExpression value = new BetweenExpression(0, 0, null, betweenSegment, andSegment, false);
         Optional<RouteValue> routeValue = generator.generate(value, column, new LinkedList<>());
         assertTrue(routeValue.isPresent());
         RangeRouteValue<Date> rangeRouteValue = (RangeRouteValue<Date>) routeValue.get();
@@ -116,9 +108,7 @@ public final class ConditionValueBetweenOperatorGeneratorTest {
         final Date after = calendar.getTime();
         ExpressionSegment betweenSegment = new CommonExpressionSegment(0, 0, "now()");
         ExpressionSegment andSegment = new CommonExpressionSegment(0, 0, "now()");
-        BetweenExpression value = new BetweenExpression();
-        value.setBetweenExpr(betweenSegment);
-        value.setAndExpr(andSegment);
+        BetweenExpression value = new BetweenExpression(0, 0, null, betweenSegment, andSegment, false);
         Optional<RouteValue> routeValue = generator.generate(value, column, new LinkedList<>());
         assertTrue(routeValue.isPresent());
         RangeRouteValue<Date> rangeRouteValue = (RangeRouteValue<Date>) routeValue.get();
diff --git a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-route/src/test/java/org/apache/shardingsphere/sharding/route/engine/condition/generator/impl/ConditionValueCompareOperatorGeneratorTest.java b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-route/src/test/java/org/apache/shardingsphere/sharding/route/engine/condition/generator/impl/ConditionValueCompareOperatorGeneratorTest.java
index a611f3a..712b700 100644
--- a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-route/src/test/java/org/apache/shardingsphere/sharding/route/engine/condition/generator/impl/ConditionValueCompareOperatorGeneratorTest.java
+++ b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-route/src/test/java/org/apache/shardingsphere/sharding/route/engine/condition/generator/impl/ConditionValueCompareOperatorGeneratorTest.java
@@ -43,9 +43,7 @@ public final class ConditionValueCompareOperatorGeneratorTest {
     @Test
     public void assertGenerateConditionValue() {
         int value = 1;
-        BinaryOperationExpression rightValue = new BinaryOperationExpression();
-        rightValue.setOperator("=");
-        rightValue.setRight(new LiteralExpressionSegment(0, 0, value));
+        BinaryOperationExpression rightValue = new BinaryOperationExpression(0, 0, null, new LiteralExpressionSegment(0, 0, value), "=", null);
         Optional<RouteValue> routeValue = generator.generate(rightValue, column, new LinkedList<>());
         assertTrue(routeValue.isPresent());
         assertTrue(((ListRouteValue<Integer>) routeValue.get()).getValues().contains(value));
@@ -54,9 +52,7 @@ public final class ConditionValueCompareOperatorGeneratorTest {
     @SuppressWarnings("unchecked")
     @Test
     public void assertGenerateConditionValueWithLessThanOperator() {
-        BinaryOperationExpression rightValue = new BinaryOperationExpression();
-        rightValue.setOperator("<");
-        rightValue.setRight(new LiteralExpressionSegment(0, 0, 1));
+        BinaryOperationExpression rightValue = new BinaryOperationExpression(0, 0, null, new LiteralExpressionSegment(0, 0, 1), "<", null);
         Optional<RouteValue> routeValue = generator.generate(rightValue, column, new LinkedList<>());
         assertTrue(routeValue.isPresent());
         assertTrue(Range.lessThan(1).encloses(((RangeRouteValue<Integer>) routeValue.get()).getValueRange()));
@@ -65,9 +61,7 @@ public final class ConditionValueCompareOperatorGeneratorTest {
     @SuppressWarnings("unchecked")
     @Test
     public void assertGenerateConditionValueWithGreaterThanOperator() {
-        BinaryOperationExpression rightValue = new BinaryOperationExpression();
-        rightValue.setOperator(">");
-        rightValue.setRight(new LiteralExpressionSegment(0, 0, 1));
+        BinaryOperationExpression rightValue = new BinaryOperationExpression(0, 0, null, new LiteralExpressionSegment(0, 0, 1), ">", null);
         Optional<RouteValue> routeValue = generator.generate(rightValue, column, new LinkedList<>());
         assertTrue(routeValue.isPresent());
         assertTrue(Range.greaterThan(1).encloses(((RangeRouteValue<Integer>) routeValue.get()).getValueRange()));
@@ -76,9 +70,7 @@ public final class ConditionValueCompareOperatorGeneratorTest {
     @SuppressWarnings("unchecked")
     @Test
     public void assertGenerateConditionValueWithAtMostOperator() {
-        BinaryOperationExpression rightValue = new BinaryOperationExpression();
-        rightValue.setOperator("<=");
-        rightValue.setRight(new LiteralExpressionSegment(0, 0, 1));
+        BinaryOperationExpression rightValue = new BinaryOperationExpression(0, 0, null, new LiteralExpressionSegment(0, 0, 1), "<=", null);
         Optional<RouteValue> routeValue = generator.generate(rightValue, column, new LinkedList<>());
         assertTrue(routeValue.isPresent());
         assertTrue(Range.atMost(1).encloses(((RangeRouteValue<Integer>) routeValue.get()).getValueRange()));
@@ -87,9 +79,7 @@ public final class ConditionValueCompareOperatorGeneratorTest {
     @SuppressWarnings("unchecked")
     @Test
     public void assertGenerateConditionValueWithAtLeastOperator() {
-        BinaryOperationExpression rightValue = new BinaryOperationExpression();
-        rightValue.setOperator(">=");
-        rightValue.setRight(new LiteralExpressionSegment(0, 0, 1));
+        BinaryOperationExpression rightValue = new BinaryOperationExpression(0, 0, null, new LiteralExpressionSegment(0, 0, 1), ">=", null);
         Optional<RouteValue> routeValue = generator.generate(rightValue, column, new LinkedList<>());
         assertTrue(routeValue.isPresent());
         assertTrue(Range.atLeast(1).encloses(((RangeRouteValue<Integer>) routeValue.get()).getValueRange()));
@@ -97,26 +87,20 @@ public final class ConditionValueCompareOperatorGeneratorTest {
     
     @Test
     public void assertGenerateConditionValueWithErrorOperator() {
-        BinaryOperationExpression rightValue = new BinaryOperationExpression();
-        rightValue.setOperator("!=");
-        rightValue.setRight(new LiteralExpressionSegment(0, 0, 1));
+        BinaryOperationExpression rightValue = new BinaryOperationExpression(0, 0, null, new LiteralExpressionSegment(0, 0, 1), "!=", null);
         assertFalse(generator.generate(rightValue, column, new LinkedList<>()).isPresent());
     }
     
     @Test
     public void assertGenerateConditionValueWithoutNowExpression() {
-        BinaryOperationExpression rightValue = new BinaryOperationExpression();
-        rightValue.setOperator("=");
-        rightValue.setRight(new CommonExpressionSegment(0, 0, "value"));
+        BinaryOperationExpression rightValue = new BinaryOperationExpression(0, 0, null, new CommonExpressionSegment(0, 0, "value"), "=", null);
         assertFalse(generator.generate(rightValue, column, new LinkedList<>()).isPresent());
     }
     
     @SuppressWarnings("unchecked")
     @Test
     public void assertGenerateConditionValueWithNowExpression() {
-        BinaryOperationExpression rightValue = new BinaryOperationExpression();
-        rightValue.setOperator("=");
-        rightValue.setRight(new LiteralExpressionSegment(0, 0, "now()"));
+        BinaryOperationExpression rightValue = new BinaryOperationExpression(0, 0, null, new LiteralExpressionSegment(0, 0, "now()"), "=", null);
         Optional<RouteValue> routeValue = generator.generate(rightValue, column, new LinkedList<>());
         assertTrue(routeValue.isPresent());
         assertFalse(((ListRouteValue<Integer>) routeValue.get()).getValues().isEmpty());
diff --git a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-route/src/test/java/org/apache/shardingsphere/sharding/route/engine/condition/generator/impl/ConditionValueInOperatorGeneratorTest.java b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-route/src/test/java/org/apache/shardingsphere/sharding/route/engine/condition/generator/impl/ConditionValueInOperatorGeneratorTest.java
index 2920a0f..edb4db1 100644
--- a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-route/src/test/java/org/apache/shardingsphere/sharding/route/engine/condition/generator/impl/ConditionValueInOperatorGeneratorTest.java
+++ b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-route/src/test/java/org/apache/shardingsphere/sharding/route/engine/condition/generator/impl/ConditionValueInOperatorGeneratorTest.java
@@ -41,10 +41,9 @@ public final class ConditionValueInOperatorGeneratorTest {
     
     @Test
     public void assertNowExpression() {
-        ListExpression listExpression = new ListExpression();
+        ListExpression listExpression = new ListExpression(0, 0);
         listExpression.getItems().add(new CommonExpressionSegment(0, 0, "now()"));
-        InExpression inExpression = new InExpression();
-        inExpression.setRight(listExpression);
+        InExpression inExpression = new InExpression(0, 0, null, listExpression, false);
         Optional<RouteValue> routeValue = generator.generate(inExpression, column, new LinkedList<>());
         assertTrue(routeValue.isPresent());
         assertThat(((ListRouteValue) routeValue.get()).getValues().iterator().next(), instanceOf(Date.class));
diff --git a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-route/src/test/java/org/apache/shardingsphere/sharding/route/engine/validator/impl/ShardingUpdateStatementValidatorTest.java b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-route/src/test/java/org/apache/shardingsphere/sharding/route/engine/validator/impl/ShardingUpdateStatementValidatorTest.java
index 7a3eaa3..7190820 100644
--- a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-route/src/test/java/org/apache/shardingsphere/sharding/route/engine/validator/impl/ShardingUpdateStatementValidatorTest.java
+++ b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-route/src/test/java/org/apache/shardingsphere/sharding/route/engine/validator/impl/ShardingUpdateStatementValidatorTest.java
@@ -120,10 +120,9 @@ public final class ShardingUpdateStatementValidatorTest {
                 new AssignmentSegment(0, 0, new ColumnSegment(0, 0, new IdentifierValue("id")), new LiteralExpressionSegment(0, 0, shardingColumnParameter)));
         SetAssignmentSegment setAssignmentSegment = new SetAssignmentSegment(0, 0, assignments);
         result.setSetAssignment(setAssignmentSegment);
-        BinaryOperationExpression binaryOperationExpression = new BinaryOperationExpression();
-        binaryOperationExpression.setLeft(new ColumnSegment(0, 0, new IdentifierValue("id")));
-        binaryOperationExpression.setRight(new ParameterMarkerExpressionSegment(0, 0, 0));
-        binaryOperationExpression.setOperator("=");
+        ColumnSegment left = new ColumnSegment(0, 0, new IdentifierValue("id"));
+        ParameterMarkerExpressionSegment right = new ParameterMarkerExpressionSegment(0, 0, 0);
+        BinaryOperationExpression binaryOperationExpression = new BinaryOperationExpression(0, 0, left, right, "=", null);
         WhereSegment where = new WhereSegment(0, 0, binaryOperationExpression);
         result.setWhere(where);
         return result;
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-binder/src/main/java/org/apache/shardingsphere/sql/parser/binder/segment/select/pagination/engine/RowNumberPaginationContextEngine.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-binder/src/main/java/org/apache/shardingsphere/sql/parser/binder/segment/select/pagination/engine/RowNumberPaginationContextEngine.java
index 9026fb8..bd8c39e 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-binder/src/main/java/org/apache/shardingsphere/sql/parser/binder/segment/select/pagination/engine/RowNumberPaginationContextEngine.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-binder/src/main/java/org/apache/shardingsphere/sql/parser/binder/segment/select/pagination/engine/RowNumberPaginationContextEngine.java
@@ -27,6 +27,8 @@ import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.simple.P
 import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.pagination.rownum.NumberLiteralRowNumberValueSegment;
 import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.pagination.rownum.ParameterMarkerRowNumberValueSegment;
 import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.pagination.rownum.RowNumberValueSegment;
+import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.predicate.AndPredicate;
+import org.apache.shardingsphere.sql.parser.sql.common.util.ExpressionBuilder;
 
 import java.util.Collection;
 import java.util.HashSet;
@@ -60,29 +62,18 @@ public final class RowNumberPaginationContextEngine {
         if (!rowNumberAlias.isPresent()) {
             return new PaginationContext(null, null, parameters);
         }
-        Collection<BinaryOperationExpression> rowNumberPredicates = getRowNumberPredicates(where, rowNumberAlias.get());
+        Collection<AndPredicate> andPredicates = new ExpressionBuilder(where).extractAndPredicates().getAndPredicates();
+        Collection<BinaryOperationExpression> rowNumberPredicates = getRowNumberPredicates(andPredicates, rowNumberAlias.get());
         return rowNumberPredicates.isEmpty() ? new PaginationContext(null, null, parameters) : createPaginationWithRowNumber(rowNumberPredicates, parameters);
     }
     
-    private Collection<BinaryOperationExpression> getRowNumberPredicates(final ExpressionSegment where, final String rowNumberAlias) {
+    private Collection<BinaryOperationExpression> getRowNumberPredicates(final Collection<AndPredicate> andPredicates, final String rowNumberAlias) {
         List<BinaryOperationExpression> result = new LinkedList<>();
-        if (!(where instanceof BinaryOperationExpression)) {
-            return result;
-        }
-        String operator = ((BinaryOperationExpression) where).getOperator();
-        if (((BinaryOperationExpression) where).getLeft() instanceof ColumnSegment && isRowNumberColumn((ColumnSegment) ((BinaryOperationExpression) where).getLeft(), rowNumberAlias)
-                && isCompareCondition(operator)) {
-            result.add((BinaryOperationExpression) where);
-            return result;
-        }
-        if ("and".equalsIgnoreCase(operator) || "&&".equalsIgnoreCase(operator) || "||".equalsIgnoreCase(operator) || "or".equalsIgnoreCase(operator)) {
-            Collection<BinaryOperationExpression> left = getRowNumberPredicates(((BinaryOperationExpression) where).getLeft(), rowNumberAlias);
-            if (!left.isEmpty()) {
-                return left;
-            }
-            Collection<BinaryOperationExpression> right = getRowNumberPredicates(((BinaryOperationExpression) where).getRight(), rowNumberAlias);
-            if (!left.isEmpty()) {
-                return right;
+        for (AndPredicate each : andPredicates) {
+            for (ExpressionSegment expression : each.getPredicates()) {
+                if (isRowNumberColumn(expression, rowNumberAlias) && isCompareCondition(expression)) {
+                    result.add((BinaryOperationExpression) expression);
+                }
             }
         }
         return result;
@@ -98,12 +89,21 @@ public final class RowNumberPaginationContextEngine {
         return Optional.empty();
     }
     
-    private boolean isRowNumberColumn(final ColumnSegment column, final String rowNumberAlias) {
-        return ROW_NUMBER_IDENTIFIERS.contains(column.getIdentifier().getValue()) || column.getIdentifier().getValue().equalsIgnoreCase(rowNumberAlias);
+    private boolean isRowNumberColumn(final ExpressionSegment predicate, final String rowNumberAlias) {
+        if (predicate instanceof BinaryOperationExpression) {
+            ExpressionSegment left = ((BinaryOperationExpression) predicate).getLeft();
+            return left instanceof ColumnSegment ? ROW_NUMBER_IDENTIFIERS.contains(((ColumnSegment) left).getIdentifier().getValue())
+                    || ((ColumnSegment) left).getIdentifier().getValue().equalsIgnoreCase(rowNumberAlias) : false;
+        }
+        return false;
     }
     
-    private boolean isCompareCondition(final String operator) {
-        return "<".equals(operator) || "<=".equals(operator) || ">".equals(operator) || ">=".equals(operator);
+    private boolean isCompareCondition(final ExpressionSegment predicate) {
+        if (predicate instanceof BinaryOperationExpression) {
+            String operator = ((BinaryOperationExpression) predicate).getOperator();
+            return "<".equals(operator) || "<=".equals(operator) || ">".equals(operator) || ">=".equals(operator);
+        }
+        return false;
     }
     
     private PaginationContext createPaginationWithRowNumber(final Collection<BinaryOperationExpression> rowNumberPredicates, final List<Object> parameters) {
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-binder/src/main/java/org/apache/shardingsphere/sql/parser/binder/segment/select/pagination/engine/TopPaginationContextEngine.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-binder/src/main/java/org/apache/shardingsphere/sql/parser/binder/segment/select/pagination/engine/TopPaginationContextEngine.java
index f9489ce..e5c66eb 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-binder/src/main/java/org/apache/shardingsphere/sql/parser/binder/segment/select/pagination/engine/TopPaginationContextEngine.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-binder/src/main/java/org/apache/shardingsphere/sql/parser/binder/segment/select/pagination/engine/TopPaginationContextEngine.java
@@ -28,7 +28,10 @@ import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.pagination.ro
 import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.pagination.rownum.ParameterMarkerRowNumberValueSegment;
 import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.pagination.rownum.RowNumberValueSegment;
 import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.pagination.top.TopProjectionSegment;
+import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.predicate.AndPredicate;
+import org.apache.shardingsphere.sql.parser.sql.common.util.ExpressionBuilder;
 
+import java.util.Collection;
 import java.util.List;
 import java.util.Optional;
 
@@ -46,40 +49,39 @@ public final class TopPaginationContextEngine {
      * @return pagination context
      */
     public PaginationContext createPaginationContext(final TopProjectionSegment topProjectionSegment, final ExpressionSegment where, final List<Object> parameters) {
-        Optional<ExpressionSegment> rowNumberPredicate = null != where ? getRowNumberPredicate(where, topProjectionSegment.getAlias()) : Optional.empty();
+        Collection<AndPredicate> andPredicates = new ExpressionBuilder(where).extractAndPredicates().getAndPredicates();
+        Optional<ExpressionSegment> rowNumberPredicate = null != where ? getRowNumberPredicate(andPredicates, topProjectionSegment.getAlias()) : Optional.empty();
         Optional<PaginationValueSegment> offset = rowNumberPredicate.isPresent() ? createOffsetWithRowNumber(rowNumberPredicate.get()) : Optional.empty();
         PaginationValueSegment rowCount = topProjectionSegment.getTop();
         return new PaginationContext(offset.orElse(null), rowCount, parameters);
     }
     
-    private Optional<ExpressionSegment> getRowNumberPredicate(final ExpressionSegment where, final String rowNumberAlias) {
-        if (!(where instanceof BinaryOperationExpression)) {
-            return Optional.empty();
-        }
-        String operator = ((BinaryOperationExpression) where).getOperator();
-        if (((BinaryOperationExpression) where).getLeft() instanceof ColumnSegment && isRowNumberColumn((ColumnSegment) ((BinaryOperationExpression) where).getLeft(), rowNumberAlias)
-            && isCompareCondition(operator)) {
-            return Optional.of(where);
-        }
-        if ("and".equalsIgnoreCase(operator) || "&&".equalsIgnoreCase(operator) || "||".equalsIgnoreCase(operator) || "or".equalsIgnoreCase(operator)) {
-            Optional<ExpressionSegment> left = getRowNumberPredicate(((BinaryOperationExpression) where).getLeft(), rowNumberAlias);
-            if (left.isPresent()) {
-                return left;
-            }
-            Optional<ExpressionSegment> right = getRowNumberPredicate(((BinaryOperationExpression) where).getRight(), rowNumberAlias);
-            if (right.isPresent()) {
-                return right;
+    private Optional<ExpressionSegment> getRowNumberPredicate(final Collection<AndPredicate> andPredicates, final String rowNumberAlias) {
+        for (AndPredicate each : andPredicates) {
+            for (ExpressionSegment expression : each.getPredicates()) {
+                if (isRowNumberColumn(expression, rowNumberAlias) && isCompareCondition(expression)) {
+                    return Optional.of(expression);
+                }
+            
             }
         }
         return Optional.empty();
     }
     
-    private boolean isRowNumberColumn(final ColumnSegment columnSegment, final String rowNumberAlias) {
-        return columnSegment.getIdentifier().getValue().equalsIgnoreCase(rowNumberAlias);
+    private boolean isRowNumberColumn(final ExpressionSegment predicate, final String rowNumberAlias) {
+        if (predicate instanceof BinaryOperationExpression) {
+            ExpressionSegment left = ((BinaryOperationExpression) predicate).getLeft();
+            return left instanceof ColumnSegment ? ((ColumnSegment) left).getIdentifier().getValue().equalsIgnoreCase(rowNumberAlias) : false;
+        }
+        return false;
     }
     
-    private boolean isCompareCondition(final String operator) {
-        return ">".equals(operator) || ">=".equals(operator);
+    private boolean isCompareCondition(final ExpressionSegment predicate) {
+        if (predicate instanceof BinaryOperationExpression) {
+            String operator = ((BinaryOperationExpression) predicate).getOperator();
+            return ">".equals(operator) || ">=".equals(operator);
+        }
+        return false;
     }
     
     private Optional<PaginationValueSegment> createOffsetWithRowNumber(final ExpressionSegment predicateSegment) {
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-binder/src/test/java/org/apache/shardingsphere/sql/parser/binder/segment/select/pagination/engine/RowNumberPaginationContextEngineTest.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-binder/src/test/java/org/apache/shardingsphere/sql/parser/binder/segment/select/pagination/engine/RowNumberPaginationContextEngineTest.java
index 8701951..36591b6 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-binder/src/test/java/org/apache/shardingsphere/sql/parser/binder/segment/select/pagination/engine/RowNumberPaginationContextEngineTest.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-binder/src/test/java/org/apache/shardingsphere/sql/parser/binder/segment/select/pagination/engine/RowNumberPaginationContextEngineTest.java
@@ -89,8 +89,8 @@ public final class RowNumberPaginationContextEngineTest {
         Projection projectionWithRowNumberAlias = new ColumnProjection(null, ROW_NUMBER_COLUMN_NAME, ROW_NUMBER_COLUMN_ALIAS);
         ProjectionsContext projectionsContext = new ProjectionsContext(0, 0, false, Collections.singleton(projectionWithRowNumberAlias));
         AndPredicate andPredicate = new AndPredicate();
-        BinaryOperationExpression predicateSegment = new BinaryOperationExpression();
-        predicateSegment.setLeft(new ColumnSegment(0, 10, new IdentifierValue(ROW_NUMBER_COLUMN_NAME)));
+        ColumnSegment left = new ColumnSegment(0, 10, new IdentifierValue(ROW_NUMBER_COLUMN_NAME));
+        BinaryOperationExpression predicateSegment = new BinaryOperationExpression(0, 0, left, null, null, null);
         andPredicate.getPredicates().addAll(Collections.singleton(predicateSegment));
         PaginationContext paginationContext = new RowNumberPaginationContextEngine().createPaginationContext(null, projectionsContext, Collections.emptyList());
         assertFalse(paginationContext.getOffsetSegment().isPresent());
@@ -101,11 +101,9 @@ public final class RowNumberPaginationContextEngineTest {
     public void assertCreatePaginationContextWhenParameterMarkerRowNumberValueSegment() {
         Projection projectionWithRowNumberAlias = new ColumnProjection(null, ROW_NUMBER_COLUMN_NAME, ROW_NUMBER_COLUMN_ALIAS);
         ProjectionsContext projectionsContext = new ProjectionsContext(0, 0, false, Collections.singleton(projectionWithRowNumberAlias));
-    
-        BinaryOperationExpression expression = new BinaryOperationExpression();
-        expression.setOperator(">");
-        expression.setRight(new ParameterMarkerExpressionSegment(0, 10, 0));
-        expression.setLeft(new ColumnSegment(0, 10, new IdentifierValue(ROW_NUMBER_COLUMN_NAME)));
+        ColumnSegment left = new ColumnSegment(0, 10, new IdentifierValue(ROW_NUMBER_COLUMN_NAME));
+        ParameterMarkerExpressionSegment right = new ParameterMarkerExpressionSegment(0, 10, 0);
+        BinaryOperationExpression expression = new BinaryOperationExpression(0, 0, left, right, ">", null);
         PaginationContext paginationContext = new RowNumberPaginationContextEngine()
                 .createPaginationContext(expression, projectionsContext, Collections.singletonList(1));
         Optional<PaginationValueSegment> offSetSegmentPaginationValue = paginationContext.getOffsetSegment();
@@ -117,10 +115,9 @@ public final class RowNumberPaginationContextEngineTest {
     private void assertCreatePaginationContextWhenRowNumberAliasPresentAndRowNumberPredicatedNotEmptyWithGivenOperator(final String operator) {
         Projection projectionWithRowNumberAlias = new ColumnProjection(null, ROW_NUMBER_COLUMN_NAME, ROW_NUMBER_COLUMN_ALIAS);
         ProjectionsContext projectionsContext = new ProjectionsContext(0, 0, false, Collections.singleton(projectionWithRowNumberAlias));
-        BinaryOperationExpression expression = new BinaryOperationExpression();
-        expression.setOperator(operator);
-        expression.setRight(new LiteralExpressionSegment(0, 10, 100));
-        expression.setLeft(new ColumnSegment(0, 10, new IdentifierValue(ROW_NUMBER_COLUMN_NAME)));
+        ColumnSegment left = new ColumnSegment(0, 10, new IdentifierValue(ROW_NUMBER_COLUMN_NAME));
+        LiteralExpressionSegment right = new LiteralExpressionSegment(0, 10, 100);
+        BinaryOperationExpression expression = new BinaryOperationExpression(0, 0, left, right, operator, null);
         PaginationContext paginationContext = new RowNumberPaginationContextEngine().createPaginationContext(expression, projectionsContext, Collections.emptyList());
         assertFalse(paginationContext.getOffsetSegment().isPresent());
         Optional<PaginationValueSegment> paginationValueSegmentOptional = paginationContext.getRowCountSegment();
@@ -136,11 +133,9 @@ public final class RowNumberPaginationContextEngineTest {
     private void assertCreatePaginationContextWhenOffsetSegmentInstanceOfNumberLiteralRowNumberValueSegmentWithGivenOperator(final String operator) {
         Projection projectionWithRowNumberAlias = new ColumnProjection(null, ROW_NUMBER_COLUMN_NAME, ROW_NUMBER_COLUMN_ALIAS);
         ProjectionsContext projectionsContext = new ProjectionsContext(0, 0, false, Collections.singleton(projectionWithRowNumberAlias));
-        BinaryOperationExpression expression = new BinaryOperationExpression();
-        expression.setOperator(operator);
-        expression.setRight(new LiteralExpressionSegment(0, 10, 100));
-        expression.setLeft(new ColumnSegment(0, 10, new IdentifierValue(ROW_NUMBER_COLUMN_NAME)));
-        
+        ColumnSegment left = new ColumnSegment(0, 10, new IdentifierValue(ROW_NUMBER_COLUMN_NAME));
+        LiteralExpressionSegment right = new LiteralExpressionSegment(0, 10, 100);
+        BinaryOperationExpression expression = new BinaryOperationExpression(0, 0, left, right, operator, null);
         PaginationContext rowNumberPaginationContextEngine = new RowNumberPaginationContextEngine()
                 .createPaginationContext(expression, projectionsContext, Collections.emptyList());
         Optional<PaginationValueSegment> paginationValueSegment = rowNumberPaginationContextEngine.getOffsetSegment();
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-binder/src/test/java/org/apache/shardingsphere/sql/parser/binder/segment/select/pagination/engine/TopPaginationContextEngineTest.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-binder/src/test/java/org/apache/shardingsphere/sql/parser/binder/segment/select/pagination/engine/TopPaginationContextEngineTest.java
index 3983a81..1ae120b 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-binder/src/test/java/org/apache/shardingsphere/sql/parser/binder/segment/select/pagination/engine/TopPaginationContextEngineTest.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-binder/src/test/java/org/apache/shardingsphere/sql/parser/binder/segment/select/pagination/engine/TopPaginationContextEngineTest.java
@@ -76,9 +76,7 @@ public final class TopPaginationContextEngineTest {
     public void assertCreatePaginationContextWhenPredicateInRightValue() {
         String name = "rowNumberAlias";
         ColumnSegment columnSegment = new ColumnSegment(0, 10, new IdentifierValue(name));
-        InExpression inExpression = new InExpression();
-        inExpression.setLeft(new ColumnSegment(0, 10, new IdentifierValue(name)));
-        inExpression.setRight(new ListExpression());
+        InExpression inExpression = new InExpression(0, 0, columnSegment, new ListExpression(0, 0), false);
         PaginationContext paginationContext = topPaginationContextEngine.createPaginationContext(new TopProjectionSegment(0, 10, null, name), inExpression, Collections.emptyList());
         assertFalse(paginationContext.getOffsetSegment().isPresent());
         assertFalse(paginationContext.getRowCountSegment().isPresent());
@@ -87,11 +85,9 @@ public final class TopPaginationContextEngineTest {
     @Test
     public void assertCreatePaginationContextWhenParameterMarkerRowNumberValueSegment() {
         String name = "rowNumberAlias";
-        BinaryOperationExpression expression = new BinaryOperationExpression();
-        expression.setOperator(">");
-        expression.setRight(new ParameterMarkerExpressionSegment(0, 10, 0));
-        expression.setLeft(new ColumnSegment(0, 10, new IdentifierValue(name)));
-        
+        ColumnSegment left = new ColumnSegment(0, 10, new IdentifierValue(name));
+        ParameterMarkerExpressionSegment right = new ParameterMarkerExpressionSegment(0, 10, 0);
+        BinaryOperationExpression expression = new BinaryOperationExpression(0, 0, left, right, ">", null);
         PaginationContext paginationContext = topPaginationContextEngine.createPaginationContext(new TopProjectionSegment(0, 10, null, name), expression, Collections.singletonList(1));
         assertTrue(paginationContext.getOffsetSegment().isPresent());
         PaginationValueSegment paginationValueSegment = paginationContext.getOffsetSegment().get();
@@ -105,11 +101,9 @@ public final class TopPaginationContextEngineTest {
     
     private void assertCreatePaginationContextWhenRowNumberPredicatePresentAndWithGivenOperator(final String operator) {
         String name = "rowNumberAlias";
-        BinaryOperationExpression expression = new BinaryOperationExpression();
-        expression.setOperator(operator);
-        expression.setRight(new LiteralExpressionSegment(0, 10, 100));
-        expression.setLeft(new ColumnSegment(0, 10, new IdentifierValue(name)));
-        
+        ColumnSegment left = new ColumnSegment(0, 10, new IdentifierValue(name));
+        LiteralExpressionSegment right = new LiteralExpressionSegment(0, 10, 100);
+        BinaryOperationExpression expression = new BinaryOperationExpression(0, 0, left, right, operator, null);
         PaginationContext paginationContext = topPaginationContextEngine.createPaginationContext(new TopProjectionSegment(0, 10, null, name), expression, Collections.emptyList());
         assertTrue(paginationContext.getOffsetSegment().isPresent());
         PaginationValueSegment paginationValueSegment = paginationContext.getOffsetSegment().get();
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-binder/src/test/java/org/apache/shardingsphere/sql/parser/binder/statement/dml/UpdateStatementContextTest.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-binder/src/test/java/org/apache/shardingsphere/sql/parser/binder/statement/dml/UpdateStatementContextTest.java
index 46ba6af..28dcff2 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-binder/src/test/java/org/apache/shardingsphere/sql/parser/binder/statement/dml/UpdateStatementContextTest.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-binder/src/test/java/org/apache/shardingsphere/sql/parser/binder/statement/dml/UpdateStatementContextTest.java
@@ -53,8 +53,7 @@ public final class UpdateStatementContextTest {
     @Test
     public void assertNewInstance() {
         when(columnSegment.getOwner()).thenReturn(Optional.of(new OwnerSegment(0, 0, new IdentifierValue("tbl_2"))));
-        BinaryOperationExpression expression = new BinaryOperationExpression();
-        expression.setLeft(columnSegment);
+        BinaryOperationExpression expression = new BinaryOperationExpression(0, 0, columnSegment, null, null, null);
         when(whereSegment.getExpr()).thenReturn(expression);
         SimpleTableSegment table1 = new SimpleTableSegment(0, 0, new IdentifierValue("tbl_1"));
         SimpleTableSegment table2 = new SimpleTableSegment(0, 0, new IdentifierValue("tbl_2"));
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-binder/src/test/java/org/apache/shardingsphere/sql/parser/binder/statement/impl/SelectStatementContextTest.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-binder/src/test/java/org/apache/shardingsphere/sql/parser/binder/statement/impl/SelectStatementContextTest.java
index 1574819..95ff93a 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-binder/src/test/java/org/apache/shardingsphere/sql/parser/binder/statement/impl/SelectStatementContextTest.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-binder/src/test/java/org/apache/shardingsphere/sql/parser/binder/statement/impl/SelectStatementContextTest.java
@@ -190,10 +190,9 @@ public final class SelectStatementContextTest {
     
     @Test
     public void assertContainsSubqueryWhereEmpty() {
-        BinaryOperationExpression expression = new BinaryOperationExpression();
-        expression.setLeft(new ColumnSegment(0, 10, new IdentifierValue("id")));
-        expression.setRight(new LiteralExpressionSegment(0, 0, 20));
-        expression.setOperator("=");
+        ColumnSegment left = new ColumnSegment(0, 10, new IdentifierValue("id"));
+        LiteralExpressionSegment right = new LiteralExpressionSegment(0, 0, 20);
+        BinaryOperationExpression expression = new BinaryOperationExpression(0, 0, left, right, "=", null);
         WhereSegment subWhereSegment = new WhereSegment(0, 0, expression);
         SelectStatement subSelectStatement = new SelectStatement();
         subSelectStatement.setWhere(subWhereSegment);
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/MySQLVisitor.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/MySQLVisitor.java
index 9bad086..1702859 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/MySQLVisitor.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/MySQLVisitor.java
@@ -258,25 +258,19 @@ public abstract class MySQLVisitor extends MySQLStatementBaseVisitor<ASTNode> {
             return visit(ctx.expr(0));
         }
         if (null != ctx.XOR()) {
-            BinaryOperationExpression result = new BinaryOperationExpression();
-            result.setStartIndex(ctx.start.getStartIndex());
-            result.setStopIndex(ctx.stop.getStopIndex());
-            result.setLeft((ExpressionSegment) visit(ctx.expr(0)));
-            result.setRight((ExpressionSegment) visit(ctx.expr(1)));
-            result.setOperator("XOR");
+            ExpressionSegment left = (ExpressionSegment) visit(ctx.expr(0));
+            ExpressionSegment right = (ExpressionSegment) visit(ctx.expr(1));
+            String operator = "XOR";
             String text = ctx.start.getInputStream().getText(new Interval(ctx.start.getStartIndex(), ctx.stop.getStopIndex()));
-            result.setText(text);
+            BinaryOperationExpression result = new BinaryOperationExpression(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), left, right, operator, text);
+    
             return result;
         }
         if (null != ctx.logicalOperator()) {
-            BinaryOperationExpression result = new BinaryOperationExpression();
-            result.setStartIndex(ctx.start.getStartIndex());
-            result.setStopIndex(ctx.stop.getStopIndex());
-            result.setLeft((ExpressionSegment) visit(ctx.expr(0)));
-            result.setRight((ExpressionSegment) visit(ctx.expr(1)));
-            result.setOperator(ctx.logicalOperator().getText());
             String text = ctx.start.getInputStream().getText(new Interval(ctx.start.getStartIndex(), ctx.stop.getStopIndex()));
-            result.setText(text);
+            BinaryOperationExpression result = new BinaryOperationExpression(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), (ExpressionSegment) visit(ctx.expr(0)),
+                    (ExpressionSegment) visit(ctx.expr(1)), ctx.logicalOperator().getText(), text);
+    
             return result;
         }
         NotExpression result = new NotExpression();
@@ -289,15 +283,12 @@ public abstract class MySQLVisitor extends MySQLStatementBaseVisitor<ASTNode> {
     @Override
     public final ASTNode visitBooleanPrimary(final BooleanPrimaryContext ctx) {
         if (null != ctx.IS()) {
-            BinaryOperationExpression result = new BinaryOperationExpression();
-            result.setStartIndex(ctx.start.getStartIndex());
-            result.setStopIndex(ctx.stop.getStopIndex());
-            result.setLeft((ExpressionSegment) visit(ctx.booleanPrimary()));
-            result.setRight(new LiteralExpressionSegment(ctx.IS().getSymbol().getStopIndex() + 1, ctx.stop.getStopIndex(), new Interval(ctx.IS().getSymbol().getStopIndex() + 1,
-                    ctx.stop.getStopIndex())));
-            result.setOperator("IS");
+            ExpressionSegment left = (ExpressionSegment) visit(ctx.booleanPrimary());
+            ExpressionSegment right = new LiteralExpressionSegment(ctx.IS().getSymbol().getStopIndex() + 1, ctx.stop.getStopIndex(), new Interval(ctx.IS().getSymbol().getStopIndex() + 1,
+                    ctx.stop.getStopIndex()));
+            String operator = "IS";
             String text = ctx.start.getInputStream().getText(new Interval(ctx.start.getStartIndex(), ctx.stop.getStopIndex()));
-            result.setText(text);
+            BinaryOperationExpression result = new BinaryOperationExpression(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), left, right, operator, text);
             return result;
         }
         if (null != ctx.comparisonOperator() || null != ctx.SAFE_EQ_()) {
@@ -307,19 +298,16 @@ public abstract class MySQLVisitor extends MySQLStatementBaseVisitor<ASTNode> {
     }
     
     private ASTNode createCompareSegment(final BooleanPrimaryContext ctx) {
-        BinaryOperationExpression result = new BinaryOperationExpression();
-        result.setStartIndex(ctx.start.getStartIndex());
-        result.setStopIndex(ctx.stop.getStopIndex());
-        result.setLeft((ExpressionSegment) visit(ctx.booleanPrimary()));
+        ExpressionSegment left = (ExpressionSegment) visit(ctx.booleanPrimary());
+        ExpressionSegment right;
         if (null != ctx.predicate()) {
-            result.setRight((ExpressionSegment) visit(ctx.predicate()));
+            right = (ExpressionSegment) visit(ctx.predicate());
         } else {
-            result.setRight((ExpressionSegment) visit(ctx.subquery()));
+            right = (ExpressionSegment) visit(ctx.subquery());
         }
         String operator = null != ctx.SAFE_EQ_() ? ctx.SAFE_EQ_().getText() : ctx.comparisonOperator().getText();
-        result.setOperator(operator);
         String text = ctx.start.getInputStream().getText(new Interval(ctx.start.getStartIndex(), ctx.stop.getStopIndex()));
-        result.setText(text);
+        BinaryOperationExpression result = new BinaryOperationExpression(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), left, right, operator, text);
         return result;
     }
     
@@ -341,68 +329,57 @@ public abstract class MySQLVisitor extends MySQLStatementBaseVisitor<ASTNode> {
     }
     
     private InExpression createInSegment(final PredicateContext ctx) {
-        InExpression result = new InExpression();
-        result.setStartIndex(ctx.start.getStartIndex());
-        result.setStopIndex(ctx.stop.getStopIndex());
-        result.setLeft((ExpressionSegment) visit(ctx.bitExpr(0)));
+        boolean not = null != ctx.NOT() ? true : false;
+        ExpressionSegment left = (ExpressionSegment) visit(ctx.bitExpr(0));
+        ExpressionSegment right;
         if (null != ctx.subquery()) {
-            result.setRight(new SubqueryExpressionSegment(new SubquerySegment(ctx.subquery().start.getStartIndex(), ctx.subquery().stop.getStopIndex(), (SelectStatement) visit(ctx.subquery()))));
+            right = new SubqueryExpressionSegment(new SubquerySegment(ctx.subquery().start.getStartIndex(), ctx.subquery().stop.getStopIndex(), (SelectStatement) visit(ctx.subquery())));
         } else {
-            ListExpression listExpression = new ListExpression();
-            listExpression.setStartIndex(ctx.LP_().getSymbol().getStartIndex());
-            listExpression.setStopIndex(ctx.RP_().getSymbol().getStopIndex());
+            right = new ListExpression(ctx.LP_().getSymbol().getStartIndex(), ctx.RP_().getSymbol().getStopIndex());
             for (ExprContext each : ctx.expr()) {
-                listExpression.getItems().add((ExpressionSegment) visit(each));
+                ((ListExpression) right).getItems().add((ExpressionSegment) visit(each));
             }
-            result.setRight(listExpression);
         }
-        result.setNot(null != ctx.NOT());
+        InExpression result = new InExpression(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), left, right, not);
         return result;
     }
     
     private BinaryOperationExpression createBinaryOperationExpressionFromLike(final PredicateContext ctx) {
-        BinaryOperationExpression result = new BinaryOperationExpression();
-        result.setStartIndex(ctx.start.getStartIndex());
-        result.setStopIndex(ctx.stop.getStopIndex());
-        result.setLeft((ExpressionSegment) visit(ctx.bitExpr(0)));
+        ExpressionSegment left = (ExpressionSegment) visit(ctx.bitExpr(0));
         String operator;
+        ExpressionSegment right;
         if (null != ctx.SOUNDS()) {
-            result.setRight((ExpressionSegment) visit(ctx.bitExpr(1)));
+            right = (ExpressionSegment) visit(ctx.bitExpr(1));
             operator = "SOUNDS LIKE";
         } else {
-            ListExpression listExpression = new ListExpression();
+            ListExpression listExpression = new ListExpression(ctx.simpleExpr(0).start.getStartIndex(), ctx.simpleExpr().get(ctx.simpleExpr().size() - 1).stop.getStopIndex());
             for (SimpleExprContext each : ctx.simpleExpr()) {
                 listExpression.getItems().add((ExpressionSegment) visit(each));
             }
-            result.setRight(listExpression);
+            right = listExpression;
             operator = null != ctx.NOT() ? "NOT LIKE" : "LIKE";
         }
-        result.setOperator(operator);
         String text = ctx.start.getInputStream().getText(new Interval(ctx.start.getStartIndex(), ctx.stop.getStopIndex()));
-        result.setText(text);
+        BinaryOperationExpression result = new BinaryOperationExpression(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), left, right, operator, text);
         return result;
     }
     
     private BinaryOperationExpression createBinaryOperationExpressionFromRegexp(final PredicateContext ctx) {
-        BinaryOperationExpression result = new BinaryOperationExpression();
-        result.setStartIndex(ctx.start.getStartIndex());
-        result.setStopIndex(ctx.stop.getStopIndex());
-        result.setLeft((ExpressionSegment) visit(ctx.bitExpr(0)));
-        result.setRight((ExpressionSegment) visit(ctx.bitExpr(1)));
+        ExpressionSegment left = (ExpressionSegment) visit(ctx.bitExpr(0));
+        ExpressionSegment right = (ExpressionSegment) visit(ctx.bitExpr(1));
         String operator = null != ctx.NOT() ? "NOT REGEXP" : "REGEXP";
-        result.setOperator(operator);
         String text = ctx.start.getInputStream().getText(new Interval(ctx.start.getStartIndex(), ctx.stop.getStopIndex()));
-        result.setText(text);
+        BinaryOperationExpression result = new BinaryOperationExpression(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), left, right, operator, text);
+    
         return result;
     }
     
     private BetweenExpression createBetweenSegment(final PredicateContext ctx) {
-        BetweenExpression result = new BetweenExpression();
-        result.setStartIndex(ctx.start.getStartIndex());
-        result.setStopIndex(ctx.stop.getStopIndex());
-        result.setLeft((ExpressionSegment) visit(ctx.bitExpr(0)));
-        result.setBetweenExpr((ExpressionSegment) visit(ctx.bitExpr(1)));
-        result.setAndExpr((ExpressionSegment) visit(ctx.predicate()));
+        ExpressionSegment left = (ExpressionSegment) visit(ctx.bitExpr(0));
+        ExpressionSegment between = (ExpressionSegment) visit(ctx.bitExpr(1));
+        ExpressionSegment and = (ExpressionSegment) visit(ctx.predicate());
+        boolean not = null != ctx.NOT() ? true : false;
+        BetweenExpression result = new BetweenExpression(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), left, between, and, not);
         return result;
     }
     
@@ -411,14 +388,11 @@ public abstract class MySQLVisitor extends MySQLStatementBaseVisitor<ASTNode> {
         if (null != ctx.simpleExpr()) {
             return createExpressionSegment(visit(ctx.simpleExpr()), ctx);
         }
-        BinaryOperationExpression result = new BinaryOperationExpression();
-        result.setStartIndex(ctx.start.getStartIndex());
-        result.setStopIndex(ctx.stop.getStopIndex());
-        result.setLeft((ExpressionSegment) visit(ctx.getChild(0)));
-        result.setRight((ExpressionSegment) visit(ctx.getChild(2)));
-        result.setOperator(ctx.getChild(1).getText());
+        ExpressionSegment left = (ExpressionSegment) visit(ctx.getChild(0));
+        ExpressionSegment right = (ExpressionSegment) visit(ctx.getChild(2));
+        String operator = ctx.getChild(1).getText();
         String text = ctx.start.getInputStream().getText(new Interval(ctx.start.getStartIndex(), ctx.stop.getStopIndex()));
-        result.setText(text);
+        BinaryOperationExpression result = new BinaryOperationExpression(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), left, right, operator, text);
         return result;
     }
     
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/OracleVisitor.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/OracleVisitor.java
index 7385863..3bc05d2 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/OracleVisitor.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/OracleVisitor.java
@@ -238,14 +238,11 @@ public abstract class OracleVisitor extends OracleStatementBaseVisitor<ASTNode>
             return visit(ctx.expr(0));
         }
         if (null != ctx.logicalOperator()) {
-            BinaryOperationExpression result = new BinaryOperationExpression();
-            result.setStartIndex(ctx.start.getStartIndex());
-            result.setStopIndex(ctx.stop.getStopIndex());
-            result.setLeft((ExpressionSegment) visit(ctx.expr(0)));
-            result.setRight((ExpressionSegment) visit(ctx.expr(1)));
-            result.setOperator(ctx.logicalOperator().getText());
+            ExpressionSegment left = (ExpressionSegment) visit(ctx.expr(0));
+            ExpressionSegment right = (ExpressionSegment) visit(ctx.expr(1));
+            String operator = ctx.logicalOperator().getText();
             String text = ctx.start.getInputStream().getText(new Interval(ctx.start.getStartIndex(), ctx.stop.getStopIndex()));
-            result.setText(text);
+            BinaryOperationExpression result = new BinaryOperationExpression(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), left, right, operator, text);
             return result;
         }
         NotExpression result = new NotExpression();
@@ -258,15 +255,12 @@ public abstract class OracleVisitor extends OracleStatementBaseVisitor<ASTNode>
     @Override
     public final ASTNode visitBooleanPrimary(final BooleanPrimaryContext ctx) {
         if (null != ctx.IS()) {
-            BinaryOperationExpression result = new BinaryOperationExpression();
-            result.setStartIndex(ctx.start.getStartIndex());
-            result.setStopIndex(ctx.stop.getStopIndex());
-            result.setLeft((ExpressionSegment) visit(ctx.booleanPrimary()));
-            result.setRight(new LiteralExpressionSegment(ctx.IS().getSymbol().getStopIndex() + 1, ctx.stop.getStopIndex(), new Interval(ctx.IS().getSymbol().getStopIndex() + 1,
-                    ctx.stop.getStopIndex())));
-            result.setOperator("IS");
+            ExpressionSegment left = (ExpressionSegment) visit(ctx.booleanPrimary());
+            ExpressionSegment right = new LiteralExpressionSegment(ctx.IS().getSymbol().getStopIndex() + 1, ctx.stop.getStopIndex(), new Interval(ctx.IS().getSymbol().getStopIndex() + 1,
+                    ctx.stop.getStopIndex()));
+            String operator = "IS";
             String text = ctx.start.getInputStream().getText(new Interval(ctx.start.getStartIndex(), ctx.stop.getStopIndex()));
-            result.setText(text);
+            BinaryOperationExpression result = new BinaryOperationExpression(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), left, right, operator, text);
             return result;
         }
         if (null != ctx.comparisonOperator() || null != ctx.SAFE_EQ_()) {
@@ -276,19 +270,16 @@ public abstract class OracleVisitor extends OracleStatementBaseVisitor<ASTNode>
     }
     
     private ASTNode createCompareSegment(final BooleanPrimaryContext ctx) {
-        BinaryOperationExpression result = new BinaryOperationExpression();
-        result.setStartIndex(ctx.start.getStartIndex());
-        result.setStopIndex(ctx.stop.getStopIndex());
-        result.setLeft((ExpressionSegment) visit(ctx.booleanPrimary()));
+        ExpressionSegment left = (ExpressionSegment) visit(ctx.booleanPrimary());
+        ExpressionSegment right;
         if (null != ctx.predicate()) {
-            result.setRight((ExpressionSegment) visit(ctx.predicate()));
+            right = (ExpressionSegment) visit(ctx.predicate());
         } else {
-            result.setRight((ExpressionSegment) visit(ctx.subquery()));
+            right = (ExpressionSegment) visit(ctx.subquery());
         }
         String operator = null != ctx.SAFE_EQ_() ? ctx.SAFE_EQ_().getText() : ctx.comparisonOperator().getText();
-        result.setOperator(operator);
         String text = ctx.start.getInputStream().getText(new Interval(ctx.start.getStartIndex(), ctx.stop.getStopIndex()));
-        result.setText(text);
+        BinaryOperationExpression result = new BinaryOperationExpression(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), left, right, operator, text);
         return result;
     }
     
@@ -307,50 +298,40 @@ public abstract class OracleVisitor extends OracleStatementBaseVisitor<ASTNode>
     }
     
     private InExpression createInSegment(final PredicateContext ctx) {
-        InExpression result = new InExpression();
-        result.setStartIndex(ctx.start.getStartIndex());
-        result.setStopIndex(ctx.stop.getStopIndex());
-        result.setLeft((ExpressionSegment) visit(ctx.bitExpr(0)));
+        ExpressionSegment left = (ExpressionSegment) visit(ctx.bitExpr(0));
+        ExpressionSegment right;
         if (null != ctx.subquery()) {
-            result.setRight(new SubqueryExpressionSegment(new SubquerySegment(ctx.subquery().start.getStartIndex(), ctx.subquery().stop.getStopIndex(), (SelectStatement) visit(ctx.subquery()))));
+            right = new SubqueryExpressionSegment(new SubquerySegment(ctx.subquery().start.getStartIndex(), ctx.subquery().stop.getStopIndex(), (SelectStatement) visit(ctx.subquery())));
         } else {
-            ListExpression listExpression = new ListExpression();
-            listExpression.setStartIndex(ctx.LP_().getSymbol().getStartIndex());
-            listExpression.setStopIndex(ctx.RP_().getSymbol().getStopIndex());
+            ListExpression listExpression = new ListExpression(ctx.LP_().getSymbol().getStartIndex(), ctx.RP_().getSymbol().getStopIndex());
             for (ExprContext each : ctx.expr()) {
                 listExpression.getItems().add((ExpressionSegment) visit(each));
             }
-            result.setRight(listExpression);
+            right = listExpression;
         }
-        result.setNot(null != ctx.NOT());
+        boolean not = null != ctx.NOT() ? true : false;
+        InExpression result = new InExpression(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), left, right, not);
         return result;
     }
     
     private BinaryOperationExpression createBinaryOperationExpressionFromLike(final PredicateContext ctx) {
-        BinaryOperationExpression result = new BinaryOperationExpression();
-        result.setStartIndex(ctx.start.getStartIndex());
-        result.setStopIndex(ctx.stop.getStopIndex());
-        result.setLeft((ExpressionSegment) visit(ctx.bitExpr(0)));
-        ListExpression listExpression = new ListExpression();
+        ExpressionSegment left = (ExpressionSegment) visit(ctx.bitExpr(0));
+        ListExpression right = new ListExpression(ctx.simpleExpr(0).start.getStartIndex(), ctx.simpleExpr().get(ctx.simpleExpr().size() - 1).stop.getStopIndex());
         for (SimpleExprContext each : ctx.simpleExpr()) {
-            listExpression.getItems().add((ExpressionSegment) visit(each));
+            right.getItems().add((ExpressionSegment) visit(each));
         }
-        result.setRight(listExpression);
-        String operator;
-        operator = null != ctx.NOT() ? "NOT LIKE" : "LIKE";
-        result.setOperator(operator);
+        String operator = null != ctx.NOT() ? "NOT LIKE" : "LIKE";
         String text = ctx.start.getInputStream().getText(new Interval(ctx.start.getStartIndex(), ctx.stop.getStopIndex()));
-        result.setText(text);
+        BinaryOperationExpression result = new BinaryOperationExpression(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), left, right, operator, text);
         return result;
     }
     
     private BetweenExpression createBetweenSegment(final PredicateContext ctx) {
-        BetweenExpression result = new BetweenExpression();
-        result.setStartIndex(ctx.start.getStartIndex());
-        result.setStopIndex(ctx.stop.getStopIndex());
-        result.setLeft((ExpressionSegment) visit(ctx.bitExpr(0)));
-        result.setBetweenExpr((ExpressionSegment) visit(ctx.bitExpr(1)));
-        result.setAndExpr((ExpressionSegment) visit(ctx.predicate()));
+        ExpressionSegment left = (ExpressionSegment) visit(ctx.bitExpr(0));
+        ExpressionSegment between = (ExpressionSegment) visit(ctx.bitExpr(1));
+        ExpressionSegment and = (ExpressionSegment) visit(ctx.predicate());
+        boolean not = null != ctx.NOT() ? true : false;
+        BetweenExpression result = new BetweenExpression(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), left, between, and, not);
         return result;
     }
     
@@ -359,14 +340,11 @@ public abstract class OracleVisitor extends OracleStatementBaseVisitor<ASTNode>
         if (null != ctx.simpleExpr()) {
             return createExpressionSegment(visit(ctx.simpleExpr()), ctx);
         }
-        BinaryOperationExpression result = new BinaryOperationExpression();
-        result.setStartIndex(ctx.start.getStartIndex());
-        result.setStopIndex(ctx.stop.getStopIndex());
-        result.setLeft((ExpressionSegment) visit(ctx.getChild(0)));
-        result.setRight((ExpressionSegment) visit(ctx.getChild(2)));
-        result.setOperator(ctx.getChild(1).getText());
+        ExpressionSegment left = (ExpressionSegment) visit(ctx.getChild(0));
+        ExpressionSegment right = (ExpressionSegment) visit(ctx.getChild(2));
+        String operator = ctx.getChild(1).getText();
         String text = ctx.start.getInputStream().getText(new Interval(ctx.start.getStartIndex(), ctx.stop.getStopIndex()));
-        result.setText(text);
+        BinaryOperationExpression result = new BinaryOperationExpression(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), left, right, operator, text);
         return result;
     }
     
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-postgresql/src/main/java/org/apache/shardingsphere/sql/parser/postgresql/visitor/PostgreSQLVisitor.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-postgresql/src/main/java/org/apache/shardingsphere/sql/parser/postgresql/visitor/PostgreSQLVisitor.java
index c3da893..039f484 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-postgresql/src/main/java/org/apache/shardingsphere/sql/parser/postgresql/visitor/PostgreSQLVisitor.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-postgresql/src/main/java/org/apache/shardingsphere/sql/parser/postgresql/visitor/PostgreSQLVisitor.java
@@ -183,25 +183,19 @@ public abstract class PostgreSQLVisitor extends PostgreSQLStatementBaseVisitor<A
             return createInSegment(ctx);
         }
         if (null != ctx.comparisonOperator()) {
-            BinaryOperationExpression result = new BinaryOperationExpression();
-            result.setStartIndex(ctx.start.getStartIndex());
-            result.setStopIndex(ctx.stop.getStopIndex());
-            result.setLeft((ExpressionSegment) visit(ctx.aExpr(0)));
-            result.setRight((ExpressionSegment) visit(ctx.aExpr(1)));
-            result.setOperator(ctx.comparisonOperator().getText());
+            ExpressionSegment left = (ExpressionSegment) visit(ctx.aExpr(0));
+            ExpressionSegment right = (ExpressionSegment) visit(ctx.aExpr(1));
+            String operator = ctx.comparisonOperator().getText();
             String text = ctx.start.getInputStream().getText(new Interval(ctx.start.getStartIndex(), ctx.stop.getStopIndex()));
-            result.setText(text);
+            BinaryOperationExpression result = new BinaryOperationExpression(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), left, right, operator, text);
             return result;
         }
         if (null != ctx.logicalOperator()) {
-            BinaryOperationExpression result = new BinaryOperationExpression();
-            result.setStartIndex(ctx.start.getStartIndex());
-            result.setStopIndex(ctx.stop.getStopIndex());
-            result.setLeft((ExpressionSegment) visit(ctx.aExpr(0)));
-            result.setRight((ExpressionSegment) visit(ctx.aExpr(1)));
-            result.setOperator(ctx.logicalOperator().getText());
+            ExpressionSegment left = (ExpressionSegment) visit(ctx.aExpr(0));
+            ExpressionSegment right = (ExpressionSegment) visit(ctx.aExpr(1));
+            String operator = ctx.logicalOperator().getText();
             String text = ctx.start.getInputStream().getText(new Interval(ctx.start.getStartIndex(), ctx.stop.getStopIndex()));
-            result.setText(text);
+            BinaryOperationExpression result = new BinaryOperationExpression(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), left, right, operator, text);
             return result;
         }
         super.visitAExpr(ctx);
@@ -261,12 +255,10 @@ public abstract class PostgreSQLVisitor extends PostgreSQLStatementBaseVisitor<A
     }
     
     private InExpression createInSegment(final AExprContext ctx) {
-        InExpression result = new InExpression();
-        result.setStartIndex(ctx.start.getStartIndex());
-        result.setStopIndex(ctx.stop.getStopIndex());
-        result.setLeft((ExpressionSegment) visit(ctx.aExpr(0)));
-        result.setRight(visitInExpression(ctx.inExpr()));
-        result.setNot(null != ctx.NOT());
+        ExpressionSegment left = (ExpressionSegment) visit(ctx.aExpr(0));
+        ExpressionSegment right = visitInExpression(ctx.inExpr());
+        boolean not = null != ctx.NOT() ? true : false;
+        InExpression result = new InExpression(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), left, right, not);
         return result;
     }
     
@@ -281,9 +273,7 @@ public abstract class PostgreSQLVisitor extends PostgreSQLStatementBaseVisitor<A
     
     @Override
     public ASTNode visitExprList(final ExprListContext ctx) {
-        ListExpression result = new ListExpression();
-        result.setStartIndex(ctx.start.getStartIndex());
-        result.setStopIndex(ctx.stop.getStopIndex());
+        ListExpression result = new ListExpression(ctx.start.getStartIndex(), ctx.stop.getStopIndex());
         if (null != ctx.exprList()) {
             result.getItems().addAll(((ListExpression) visitExprList(ctx.exprList())).getItems());
         }
@@ -292,15 +282,11 @@ public abstract class PostgreSQLVisitor extends PostgreSQLStatementBaseVisitor<A
     }
     
     private BetweenExpression createBetweenSegment(final AExprContext ctx) {
-        BetweenExpression result = new BetweenExpression();
-        result.setStartIndex(ctx.start.getStartIndex());
-        result.setStopIndex(ctx.stop.getStopIndex());
-        result.setLeft((ExpressionSegment) visit(ctx.aExpr(0)));
-        result.setBetweenExpr((ExpressionSegment) visit(ctx.bExpr()));
-        result.setAndExpr((ExpressionSegment) visit(ctx.aExpr(1)));
-        if (null != ctx.NOT()) {
-            result.setNot(true);
-        }
+        ExpressionSegment left = (ExpressionSegment) visit(ctx.aExpr(0));
+        ExpressionSegment between = (ExpressionSegment) visit(ctx.bExpr());
+        ExpressionSegment and = (ExpressionSegment) visit(ctx.aExpr(1));
+        boolean not = null != ctx.NOT() ? true : false;
+        BetweenExpression result = new BetweenExpression(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), left, between, and, not);
         return result;
     }
     
@@ -310,19 +296,18 @@ public abstract class PostgreSQLVisitor extends PostgreSQLStatementBaseVisitor<A
             return visit(ctx.cExpr());
         }
         if (null != ctx.TYPE_CAST_() || null != ctx.qualOp()) {
-            BinaryOperationExpression result = new BinaryOperationExpression();
-            result.setStartIndex(ctx.start.getStartIndex());
-            result.setStopIndex(ctx.stop.getStopIndex());
-            result.setLeft((ExpressionSegment) visit(ctx.bExpr(0)));
+            ExpressionSegment left = (ExpressionSegment) visit(ctx.bExpr(0));
+            ExpressionSegment right;
+            String operator;
             if (null != ctx.TYPE_CAST_()) {
-                result.setOperator(ctx.TYPE_CAST_().getText());
-                result.setRight(new CommonExpressionSegment(ctx.typeName().start.getStartIndex(), ctx.typeName().stop.getStopIndex(), ctx.typeName().getText()));
+                operator = ctx.TYPE_CAST_().getText();
+                right = new CommonExpressionSegment(ctx.typeName().start.getStartIndex(), ctx.typeName().stop.getStopIndex(), ctx.typeName().getText());
             } else {
-                result.setOperator(ctx.qualOp().getText());
-                result.setRight((ExpressionSegment) visit(ctx.bExpr(1)));
+                operator = ctx.qualOp().getText();
+                right = (ExpressionSegment) visit(ctx.bExpr(1));
             }
             String text = ctx.start.getInputStream().getText(new Interval(ctx.start.getStartIndex(), ctx.stop.getStopIndex()));
-            result.setText(text);
+            BinaryOperationExpression result = new BinaryOperationExpression(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), left, right, operator, text);
             return result;
         }
         for (BExprContext each : ctx.bExpr()) {
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sql92/src/main/java/org/apache/shardingsphere/sql/parser/sql92/visitor/SQL92Visitor.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sql92/src/main/java/org/apache/shardingsphere/sql/parser/sql92/visitor/SQL92Visitor.java
index 0d6a449..5c09a22 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sql92/src/main/java/org/apache/shardingsphere/sql/parser/sql92/visitor/SQL92Visitor.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sql92/src/main/java/org/apache/shardingsphere/sql/parser/sql92/visitor/SQL92Visitor.java
@@ -231,14 +231,11 @@ public abstract class SQL92Visitor extends SQL92StatementBaseVisitor<ASTNode> {
             return visit(ctx.expr(0));
         }
         if (null != ctx.logicalOperator()) {
-            BinaryOperationExpression result = new BinaryOperationExpression();
-            result.setStartIndex(ctx.start.getStartIndex());
-            result.setStopIndex(ctx.stop.getStopIndex());
-            result.setLeft((ExpressionSegment) visit(ctx.expr(0)));
-            result.setRight((ExpressionSegment) visit(ctx.expr(1)));
-            result.setOperator(ctx.logicalOperator().getText());
+            ExpressionSegment left = (ExpressionSegment) visit(ctx.expr(0));
+            ExpressionSegment right = (ExpressionSegment) visit(ctx.expr(1));
+            String operator = ctx.logicalOperator().getText();
             String text = ctx.start.getInputStream().getText(new Interval(ctx.start.getStartIndex(), ctx.stop.getStopIndex()));
-            result.setText(text);
+            BinaryOperationExpression result = new BinaryOperationExpression(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), left, right, operator, text);
             return result;
         }
         NotExpression result = new NotExpression();
@@ -251,15 +248,12 @@ public abstract class SQL92Visitor extends SQL92StatementBaseVisitor<ASTNode> {
     @Override
     public final ASTNode visitBooleanPrimary(final BooleanPrimaryContext ctx) {
         if (null != ctx.IS()) {
-            BinaryOperationExpression result = new BinaryOperationExpression();
-            result.setStartIndex(ctx.start.getStartIndex());
-            result.setStopIndex(ctx.stop.getStopIndex());
-            result.setLeft((ExpressionSegment) visit(ctx.booleanPrimary()));
-            result.setRight(new LiteralExpressionSegment(ctx.IS().getSymbol().getStopIndex() + 1, ctx.stop.getStopIndex(), new Interval(ctx.IS().getSymbol().getStopIndex() + 1,
-                    ctx.stop.getStopIndex())));
-            result.setOperator("IS");
+            ExpressionSegment left = (ExpressionSegment) visit(ctx.booleanPrimary());
+            ExpressionSegment right = new LiteralExpressionSegment(ctx.IS().getSymbol().getStopIndex() + 1, ctx.stop.getStopIndex(), new Interval(ctx.IS().getSymbol().getStopIndex() + 1,
+                    ctx.stop.getStopIndex()));
+            String operator = "IS";
             String text = ctx.start.getInputStream().getText(new Interval(ctx.start.getStartIndex(), ctx.stop.getStopIndex()));
-            result.setText(text);
+            BinaryOperationExpression result = new BinaryOperationExpression(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), left, right, operator, text);
             return result;
         }
         if (null != ctx.comparisonOperator() || null != ctx.SAFE_EQ_()) {
@@ -269,19 +263,16 @@ public abstract class SQL92Visitor extends SQL92StatementBaseVisitor<ASTNode> {
     }
     
     private ASTNode createCompareSegment(final BooleanPrimaryContext ctx) {
-        BinaryOperationExpression result = new BinaryOperationExpression();
-        result.setLeft((ExpressionSegment) visit(ctx.booleanPrimary()));
-        result.setStartIndex(ctx.start.getStartIndex());
-        result.setStopIndex(ctx.stop.getStopIndex());
+        ExpressionSegment left = (ExpressionSegment) visit(ctx.booleanPrimary());
+        ExpressionSegment right;
         if (null != ctx.predicate()) {
-            result.setRight((ExpressionSegment) visit(ctx.predicate()));
+            right = (ExpressionSegment) visit(ctx.predicate());
         } else {
-            result.setRight((ExpressionSegment) visit(ctx.subquery()));
+            right = (ExpressionSegment) visit(ctx.subquery());
         }
         String operator = null != ctx.SAFE_EQ_() ? ctx.SAFE_EQ_().getText() : ctx.comparisonOperator().getText();
-        result.setOperator(operator);
         String text = ctx.start.getInputStream().getText(new Interval(ctx.start.getStartIndex(), ctx.stop.getStopIndex()));
-        result.setText(text);
+        BinaryOperationExpression result = new BinaryOperationExpression(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), left, right, operator, text);
         return result;
     }
     
@@ -300,50 +291,40 @@ public abstract class SQL92Visitor extends SQL92StatementBaseVisitor<ASTNode> {
     }
     
     private BinaryOperationExpression createBinaryOperationExpressionFromLike(final PredicateContext ctx) {
-        BinaryOperationExpression result = new BinaryOperationExpression();
-        result.setStartIndex(ctx.start.getStartIndex());
-        result.setStopIndex(ctx.stop.getStopIndex());
-        result.setLeft((ExpressionSegment) visit(ctx.bitExpr(0)));
-        ListExpression listExpression = new ListExpression();
+        ExpressionSegment left = (ExpressionSegment) visit(ctx.bitExpr(0));
+        ListExpression right = new ListExpression(ctx.simpleExpr(0).start.getStartIndex(), ctx.simpleExpr().get(ctx.simpleExpr().size() - 1).stop.getStopIndex());
         for (SimpleExprContext each : ctx.simpleExpr()) {
-            listExpression.getItems().add((ExpressionSegment) visit(each));
+            right.getItems().add((ExpressionSegment) visit(each));
         }
-        result.setRight(listExpression);
-        String operator;
-        operator = null != ctx.NOT() ? "NOT LIKE" : "LIKE";
-        result.setOperator(operator);
+        String operator = null != ctx.NOT() ? "NOT LIKE" : "LIKE";
         String text = ctx.start.getInputStream().getText(new Interval(ctx.start.getStartIndex(), ctx.stop.getStopIndex()));
-        result.setText(text);
+        BinaryOperationExpression result = new BinaryOperationExpression(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), left, right, operator, text);
         return result;
     }
     
     private InExpression createInSegment(final PredicateContext ctx) {
-        InExpression result = new InExpression();
-        result.setStartIndex(ctx.start.getStartIndex());
-        result.setStopIndex(ctx.stop.getStopIndex());
-        result.setLeft((ExpressionSegment) visit(ctx.bitExpr(0)));
+        ExpressionSegment left = (ExpressionSegment) visit(ctx.bitExpr(0));
+        ExpressionSegment right;
         if (null != ctx.subquery()) {
-            result.setRight(new SubqueryExpressionSegment(new SubquerySegment(ctx.subquery().start.getStartIndex(), ctx.subquery().stop.getStopIndex(), (SelectStatement) visit(ctx.subquery()))));
+            right = new SubqueryExpressionSegment(new SubquerySegment(ctx.subquery().start.getStartIndex(), ctx.subquery().stop.getStopIndex(), (SelectStatement) visit(ctx.subquery())));
         } else {
-            ListExpression listExpression = new ListExpression();
-            listExpression.setStartIndex(ctx.LP_().getSymbol().getStartIndex());
-            listExpression.setStopIndex(ctx.RP_().getSymbol().getStopIndex());
+            ListExpression listExpression = new ListExpression(ctx.LP_().getSymbol().getStartIndex(), ctx.RP_().getSymbol().getStopIndex());
             for (ExprContext each : ctx.expr()) {
                 listExpression.getItems().add((ExpressionSegment) visit(each));
             }
-            result.setRight(listExpression);
+            right = listExpression;
         }
-        result.setNot(null != ctx.NOT());
+        boolean not = null != ctx.NOT() ? true : false;
+        InExpression result = new InExpression(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), left, right, not);
         return result;
     }
     
     private BetweenExpression createBetweenSegment(final PredicateContext ctx) {
-        BetweenExpression result = new BetweenExpression();
-        result.setStartIndex(ctx.start.getStartIndex());
-        result.setStopIndex(ctx.stop.getStopIndex());
-        result.setLeft((ExpressionSegment) visit(ctx.bitExpr(0)));
-        result.setBetweenExpr((ExpressionSegment) visit(ctx.bitExpr(1)));
-        result.setAndExpr((ExpressionSegment) visit(ctx.predicate()));
+        ExpressionSegment left = (ExpressionSegment) visit(ctx.bitExpr(0));
+        ExpressionSegment between = (ExpressionSegment) visit(ctx.bitExpr(1));
+        ExpressionSegment and = (ExpressionSegment) visit(ctx.predicate());
+        boolean not = null != ctx.NOT() ? true : false;
+        BetweenExpression result = new BetweenExpression(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), left, between, and, not);
         return result;
     }
     
@@ -352,14 +333,11 @@ public abstract class SQL92Visitor extends SQL92StatementBaseVisitor<ASTNode> {
         if (null != ctx.simpleExpr()) {
             return createExpressionSegment(visit(ctx.simpleExpr()), ctx);
         }
-        BinaryOperationExpression result = new BinaryOperationExpression();
-        result.setStartIndex(ctx.start.getStartIndex());
-        result.setStopIndex(ctx.stop.getStopIndex());
-        result.setLeft((ExpressionSegment) visit(ctx.getChild(0)));
-        result.setRight((ExpressionSegment) visit(ctx.getChild(2)));
-        result.setOperator(ctx.getChild(1).getText());
+        ExpressionSegment left = (ExpressionSegment) visit(ctx.getChild(0));
+        ExpressionSegment right = (ExpressionSegment) visit(ctx.getChild(2));
+        String operator = ctx.getChild(1).getText();
         String text = ctx.start.getInputStream().getText(new Interval(ctx.start.getStartIndex(), ctx.stop.getStopIndex()));
-        result.setText(text);
+        BinaryOperationExpression result = new BinaryOperationExpression(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), left, right, operator, text);
         return result;
     }
     
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/SQLServerVisitor.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/SQLServerVisitor.java
index 7caa5fa..79cf0a1 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/SQLServerVisitor.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/SQLServerVisitor.java
@@ -245,14 +245,11 @@ public abstract class SQLServerVisitor extends SQLServerStatementBaseVisitor<AST
             return visit(ctx.expr(0));
         }
         if (null != ctx.logicalOperator()) {
-            BinaryOperationExpression result = new BinaryOperationExpression();
-            result.setStartIndex(ctx.start.getStartIndex());
-            result.setStopIndex(ctx.stop.getStopIndex());
-            result.setLeft((ExpressionSegment) visit(ctx.expr(0)));
-            result.setRight((ExpressionSegment) visit(ctx.expr(1)));
-            result.setOperator(ctx.logicalOperator().getText());
+            ExpressionSegment left = (ExpressionSegment) visit(ctx.expr(0));
+            ExpressionSegment right = (ExpressionSegment) visit(ctx.expr(1));
+            String operator = ctx.logicalOperator().getText();
             String text = ctx.start.getInputStream().getText(new Interval(ctx.start.getStartIndex(), ctx.stop.getStopIndex()));
-            result.setText(text);
+            BinaryOperationExpression result = new BinaryOperationExpression(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), left, right, operator, text);
             return result;
         }
         NotExpression result = new NotExpression();
@@ -265,15 +262,12 @@ public abstract class SQLServerVisitor extends SQLServerStatementBaseVisitor<AST
     @Override
     public final ASTNode visitBooleanPrimary(final BooleanPrimaryContext ctx) {
         if (null != ctx.IS()) {
-            BinaryOperationExpression result = new BinaryOperationExpression();
-            result.setStartIndex(ctx.start.getStartIndex());
-            result.setStopIndex(ctx.stop.getStopIndex());
-            result.setLeft((ExpressionSegment) visit(ctx.booleanPrimary()));
-            result.setRight(new LiteralExpressionSegment(ctx.IS().getSymbol().getStopIndex() + 1, ctx.stop.getStopIndex(), new Interval(ctx.IS().getSymbol().getStopIndex() + 1,
-                    ctx.stop.getStopIndex())));
-            result.setOperator("IS");
+            ExpressionSegment left = (ExpressionSegment) visit(ctx.booleanPrimary());
+            ExpressionSegment right = new LiteralExpressionSegment(ctx.IS().getSymbol().getStopIndex() + 1, ctx.stop.getStopIndex(), new Interval(ctx.IS().getSymbol().getStopIndex() + 1,
+                    ctx.stop.getStopIndex()));
+            String operator = "IS";
             String text = ctx.start.getInputStream().getText(new Interval(ctx.start.getStartIndex(), ctx.stop.getStopIndex()));
-            result.setText(text);
+            BinaryOperationExpression result = new BinaryOperationExpression(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), left, right, operator, text);
             return result;
         }
         if (null != ctx.comparisonOperator() || null != ctx.SAFE_EQ_()) {
@@ -283,19 +277,16 @@ public abstract class SQLServerVisitor extends SQLServerStatementBaseVisitor<AST
     }
     
     private ASTNode createCompareSegment(final BooleanPrimaryContext ctx) {
-        BinaryOperationExpression result = new BinaryOperationExpression();
-        result.setStartIndex(ctx.start.getStartIndex());
-        result.setStopIndex(ctx.stop.getStopIndex());
-        result.setLeft((ExpressionSegment) visit(ctx.booleanPrimary()));
+        ExpressionSegment left = (ExpressionSegment) visit(ctx.booleanPrimary());
+        ExpressionSegment right;
         if (null != ctx.predicate()) {
-            result.setRight((ExpressionSegment) visit(ctx.predicate()));
+            right = (ExpressionSegment) visit(ctx.predicate());
         } else {
-            result.setRight((ExpressionSegment) visit(ctx.subquery()));
+            right = (ExpressionSegment) visit(ctx.subquery());
         }
         String operator = null != ctx.SAFE_EQ_() ? ctx.SAFE_EQ_().getText() : ctx.comparisonOperator().getText();
-        result.setOperator(operator);
         String text = ctx.start.getInputStream().getText(new Interval(ctx.start.getStartIndex(), ctx.stop.getStopIndex()));
-        result.setText(text);
+        BinaryOperationExpression result = new BinaryOperationExpression(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), left, right, operator, text);
         return result;
     }
     
@@ -314,50 +305,40 @@ public abstract class SQLServerVisitor extends SQLServerStatementBaseVisitor<AST
     }
     
     private BinaryOperationExpression createBinaryOperationExpressionFromLike(final PredicateContext ctx) {
-        BinaryOperationExpression result = new BinaryOperationExpression();
-        result.setStartIndex(ctx.start.getStartIndex());
-        result.setStopIndex(ctx.stop.getStopIndex());
-        result.setLeft((ExpressionSegment) visit(ctx.bitExpr(0)));
-        ListExpression listExpression = new ListExpression();
+        ExpressionSegment left = (ExpressionSegment) visit(ctx.bitExpr(0));
+        ListExpression right = new ListExpression(ctx.simpleExpr(0).start.getStartIndex(), ctx.simpleExpr().get(ctx.simpleExpr().size() - 1).stop.getStopIndex());
         for (SimpleExprContext each : ctx.simpleExpr()) {
-            listExpression.getItems().add((ExpressionSegment) visit(each));
+            right.getItems().add((ExpressionSegment) visit(each));
         }
-        result.setRight(listExpression);
-        String operator;
-        operator = null != ctx.NOT() ? "NOT LIKE" : "LIKE";
-        result.setOperator(operator);
+        String operator = null != ctx.NOT() ? "NOT LIKE" : "LIKE";
         String text = ctx.start.getInputStream().getText(new Interval(ctx.start.getStartIndex(), ctx.stop.getStopIndex()));
-        result.setText(text);
+        BinaryOperationExpression result = new BinaryOperationExpression(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), left, right, operator, text);
         return result;
     }
     
     private InExpression createInSegment(final PredicateContext ctx) {
-        InExpression result = new InExpression();
-        result.setStartIndex(ctx.start.getStartIndex());
-        result.setStopIndex(ctx.stop.getStopIndex());
-        result.setLeft((ExpressionSegment) visit(ctx.bitExpr(0)));
+        ExpressionSegment left = (ExpressionSegment) visit(ctx.bitExpr(0));
+        ExpressionSegment right;
         if (null != ctx.subquery()) {
-            result.setRight(new SubqueryExpressionSegment(new SubquerySegment(ctx.subquery().start.getStartIndex(), ctx.subquery().stop.getStopIndex(), (SelectStatement) visit(ctx.subquery()))));
+            right = new SubqueryExpressionSegment(new SubquerySegment(ctx.subquery().start.getStartIndex(), ctx.subquery().stop.getStopIndex(), (SelectStatement) visit(ctx.subquery())));
         } else {
-            ListExpression listExpression = new ListExpression();
-            listExpression.setStartIndex(ctx.LP_().getSymbol().getStartIndex());
-            listExpression.setStopIndex(ctx.RP_().getSymbol().getStopIndex());
+            ListExpression listExpression = new ListExpression(ctx.LP_().getSymbol().getStartIndex(), ctx.RP_().getSymbol().getStopIndex());
             for (ExprContext each : ctx.expr()) {
                 listExpression.getItems().add((ExpressionSegment) visit(each));
             }
-            result.setRight(listExpression);
+            right = listExpression;
         }
-        result.setNot(null != ctx.NOT());
+        boolean not = null != ctx.NOT() ? true : false;
+        InExpression result = new InExpression(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), left, right, not);
         return result;
     }
     
     private BetweenExpression createBetweenSegment(final PredicateContext ctx) {
-        BetweenExpression result = new BetweenExpression();
-        result.setStartIndex(ctx.start.getStartIndex());
-        result.setStopIndex(ctx.stop.getStopIndex());
-        result.setLeft((ExpressionSegment) visit(ctx.bitExpr(0)));
-        result.setBetweenExpr((ExpressionSegment) visit(ctx.bitExpr(1)));
-        result.setAndExpr((ExpressionSegment) visit(ctx.predicate()));
+        ExpressionSegment left = (ExpressionSegment) visit(ctx.bitExpr(0));
+        ExpressionSegment between = (ExpressionSegment) visit(ctx.bitExpr(1));
+        ExpressionSegment and = (ExpressionSegment) visit(ctx.predicate());
+        boolean not = null != ctx.NOT() ? true : false;
+        BetweenExpression result = new BetweenExpression(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), left, between, and, not);
         return result;
     }
     
@@ -366,14 +347,11 @@ public abstract class SQLServerVisitor extends SQLServerStatementBaseVisitor<AST
         if (null != ctx.simpleExpr()) {
             return createExpressionSegment(visit(ctx.simpleExpr()), ctx);
         }
-        BinaryOperationExpression result = new BinaryOperationExpression();
-        result.setStartIndex(ctx.start.getStartIndex());
-        result.setStopIndex(ctx.stop.getStopIndex());
-        result.setLeft((ExpressionSegment) visit(ctx.getChild(0)));
-        result.setRight((ExpressionSegment) visit(ctx.getChild(2)));
-        result.setOperator(ctx.getChild(1).getText());
+        ExpressionSegment left = (ExpressionSegment) visit(ctx.getChild(0));
+        ExpressionSegment right = (ExpressionSegment) visit(ctx.getChild(2));
+        String operator = ctx.getChild(1).getText();
         String text = ctx.start.getInputStream().getText(new Interval(ctx.start.getStartIndex(), ctx.stop.getStopIndex()));
-        result.setText(text);
+        BinaryOperationExpression result = new BinaryOperationExpression(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), left, right, operator, text);
         return result;
     }
     
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/expr/BetweenExpression.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/expr/BetweenExpression.java
index e04ce92..4d05f87 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/expr/BetweenExpression.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/expr/BetweenExpression.java
@@ -18,22 +18,24 @@
 package org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr;
 
 import lombok.Getter;
+import lombok.RequiredArgsConstructor;
 import lombok.Setter;
 
 @Setter
 @Getter
+@RequiredArgsConstructor
 public final class BetweenExpression implements ExpressionSegment {
     
-    private int startIndex;
+    private final int startIndex;
     
-    private int stopIndex;
+    private final int stopIndex;
     
-    private ExpressionSegment left;
+    private final ExpressionSegment left;
     
-    private ExpressionSegment betweenExpr;
+    private final ExpressionSegment betweenExpr;
     
-    private ExpressionSegment andExpr;
+    private final ExpressionSegment andExpr;
     
-    private boolean not;
+    private final boolean not;
 }
 
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/expr/BinaryOperationExpression.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/expr/BinaryOperationExpression.java
index a0c3e27..5afbde5 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/expr/BinaryOperationExpression.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/expr/BinaryOperationExpression.java
@@ -18,24 +18,26 @@
 package org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr;
 
 import lombok.Getter;
+import lombok.RequiredArgsConstructor;
 import lombok.Setter;
 
 /**
  * Binary operation expression.
  */
-@Setter
+@RequiredArgsConstructor
 @Getter
+@Setter
 public final class BinaryOperationExpression implements ExpressionSegment {
     
-    private int startIndex;
+    private final int startIndex;
     
-    private int stopIndex;
+    private final int stopIndex;
     
-    private ExpressionSegment left;
+    private final ExpressionSegment left;
     
-    private ExpressionSegment right;
+    private final ExpressionSegment right;
     
-    private String operator;
+    private final String operator;
     
-    private String text;
+    private final String text;
 }
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/expr/InExpression.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/expr/InExpression.java
index 938624c..7c243d1 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/expr/InExpression.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/expr/InExpression.java
@@ -18,6 +18,7 @@
 package org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr;
 
 import lombok.Getter;
+import lombok.RequiredArgsConstructor;
 import lombok.Setter;
 
 import java.util.Collection;
@@ -25,17 +26,18 @@ import java.util.LinkedList;
 
 @Getter
 @Setter
+@RequiredArgsConstructor
 public final class InExpression implements ExpressionSegment {
     
-    private int startIndex;
+    private final int startIndex;
     
-    private int stopIndex;
+    private final int stopIndex;
     
-    private ExpressionSegment left;
+    private final ExpressionSegment left;
     
-    private ExpressionSegment right;
+    private final ExpressionSegment right;
     
-    private boolean not;
+    private final boolean not;
     
     /**
      * Get expression list from right.
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/expr/ListExpression.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/expr/ListExpression.java
index 74f635d..b3c5cb1 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/expr/ListExpression.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/expr/ListExpression.java
@@ -18,6 +18,7 @@
 package org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr;
 
 import lombok.Getter;
+import lombok.RequiredArgsConstructor;
 import lombok.Setter;
 
 import java.util.LinkedList;
@@ -25,12 +26,13 @@ import java.util.List;
 
 @Setter
 @Getter
+@RequiredArgsConstructor
 public final class ListExpression implements ExpressionSegment {
     
-    private int startIndex;
+    private final int startIndex;
     
-    private int stopIndex;
+    private final int stopIndex;
     
-    private List<ExpressionSegment> items = new LinkedList<>();
+    private final List<ExpressionSegment> items = new LinkedList<>();
 }
 
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/util/ExpressionBuildUtil.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/util/ExpressionBuilder.java
similarity index 75%
rename from shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/util/ExpressionBuildUtil.java
rename to shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/util/ExpressionBuilder.java
index 0c2ab6a..513a54a 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/util/ExpressionBuildUtil.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/util/ExpressionBuilder.java
@@ -27,7 +27,7 @@ import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.predicate.OrP
 import java.util.Optional;
 
 @RequiredArgsConstructor
-public final class ExpressionBuildUtil {
+public final class ExpressionBuilder {
     
     private final ExpressionSegment expression;
     
@@ -42,15 +42,15 @@ public final class ExpressionBuildUtil {
             String operator = ((BinaryOperationExpression) expression).getOperator();
             Optional<LogicalOperator> logicalOperator = LogicalOperator.valueFrom(operator);
             if (logicalOperator.isPresent() && LogicalOperator.OR == logicalOperator.get()) {
-                ExpressionBuildUtil leftUtil = new ExpressionBuildUtil(((BinaryOperationExpression) expression).getLeft());
-                ExpressionBuildUtil rightUtil = new ExpressionBuildUtil(((BinaryOperationExpression) expression).getRight());
-                result.getAndPredicates().addAll(leftUtil.extractAndPredicates().getAndPredicates());
-                result.getAndPredicates().addAll(rightUtil.extractAndPredicates().getAndPredicates());
+                ExpressionBuilder leftBuilder = new ExpressionBuilder(((BinaryOperationExpression) expression).getLeft());
+                ExpressionBuilder rightBuilder = new ExpressionBuilder(((BinaryOperationExpression) expression).getRight());
+                result.getAndPredicates().addAll(leftBuilder.extractAndPredicates().getAndPredicates());
+                result.getAndPredicates().addAll(rightBuilder.extractAndPredicates().getAndPredicates());
             } else if (logicalOperator.isPresent() && LogicalOperator.AND == logicalOperator.get()) {
-                ExpressionBuildUtil leftUtil = new ExpressionBuildUtil(((BinaryOperationExpression) expression).getLeft());
-                ExpressionBuildUtil rightUtil = new ExpressionBuildUtil(((BinaryOperationExpression) expression).getRight());
-                for (AndPredicate eachLeft : leftUtil.extractAndPredicates().getAndPredicates()) {
-                    for (AndPredicate eachRight : rightUtil.extractAndPredicates().getAndPredicates()) {
+                ExpressionBuilder leftBuilder = new ExpressionBuilder(((BinaryOperationExpression) expression).getLeft());
+                ExpressionBuilder rightBuilder = new ExpressionBuilder(((BinaryOperationExpression) expression).getRight());
+                for (AndPredicate eachLeft : leftBuilder.extractAndPredicates().getAndPredicates()) {
+                    for (AndPredicate eachRight : rightBuilder.extractAndPredicates().getAndPredicates()) {
                         result.getAndPredicates().add(createAndPredicate(eachLeft, eachRight));
                     }
                 }