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

duanzhengqiang 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 032d10a  feature: add subquery valid in 
ShardingInsertStatementValidator and ShardingSelectStatementValidator (#8310)
032d10a is described below

commit 032d10a7c97e63c64299878c029687e96f6b55da
Author: coco <[email protected]>
AuthorDate: Mon Nov 30 12:29:20 2020 +0800

    feature: add subquery valid in ShardingInsertStatementValidator and 
ShardingSelectStatementValidator (#8310)
    
    * feature: add subquery valid in ShardingInsertStatementValidator and 
ShardingSelectStatementValidator.
    
    * style: modify code style.
    
    * fix: bugs in getDMLStatementValidator() method.
    
    * fix: bugs in preValidate().
    
    * refacor: prevalidate() method.
    
    Co-authored-by: wangguangyuan <[email protected]>
---
 .../sharding/route/engine/ShardingSQLRouter.java   |  78 ---------------
 .../ShardingStatementValidatorFactory.java         |   5 +
 .../dml/ShardingDMLStatementValidator.java         | 111 +++++++++++++++++++++
 .../dml/impl/ShardingInsertStatementValidator.java |   3 +
 .../dml/impl/ShardingSelectStatementValidator.java |  45 +++++++++
 5 files changed, 164 insertions(+), 78 deletions(-)

diff --git 
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-route/src/main/java/org/apache/shardingsphere/sharding/route/engine/ShardingSQLRouter.java
 
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-route/src/main/java/org/apache/shardingsphere/sharding/route/engine/ShardingSQLRouter.java
index 935e9b4..7a459d3 100644
--- 
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-route/src/main/java/org/apache/shardingsphere/sharding/route/engine/ShardingSQLRouter.java
+++ 
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-route/src/main/java/org/apache/shardingsphere/sharding/route/engine/ShardingSQLRouter.java
@@ -17,34 +17,25 @@
 
 package org.apache.shardingsphere.sharding.route.engine;
 
-import com.google.common.base.Preconditions;
 import org.apache.shardingsphere.infra.binder.LogicSQL;
 import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
 import 
org.apache.shardingsphere.infra.binder.statement.dml.InsertStatementContext;
 import 
org.apache.shardingsphere.infra.binder.statement.dml.SelectStatementContext;
 import 
org.apache.shardingsphere.infra.config.properties.ConfigurationProperties;
-import org.apache.shardingsphere.infra.hint.HintManager;
 import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import org.apache.shardingsphere.infra.route.SQLRouter;
 import org.apache.shardingsphere.infra.route.context.RouteContext;
-import 
org.apache.shardingsphere.sharding.api.config.strategy.sharding.HintShardingStrategyConfiguration;
 import org.apache.shardingsphere.sharding.constant.ShardingOrder;
 import 
org.apache.shardingsphere.sharding.route.engine.condition.ShardingCondition;
 import 
org.apache.shardingsphere.sharding.route.engine.condition.ShardingConditions;
 import 
org.apache.shardingsphere.sharding.route.engine.condition.engine.ShardingConditionEngine;
 import 
org.apache.shardingsphere.sharding.route.engine.condition.engine.ShardingConditionEngineFactory;
-import 
org.apache.shardingsphere.sharding.route.engine.condition.value.ListShardingConditionValue;
-import 
org.apache.shardingsphere.sharding.route.engine.condition.value.RangeShardingConditionValue;
-import 
org.apache.shardingsphere.sharding.route.engine.condition.value.ShardingConditionValue;
 import 
org.apache.shardingsphere.sharding.route.engine.type.ShardingRouteEngineFactory;
 import 
org.apache.shardingsphere.sharding.route.engine.validator.ShardingStatementValidator;
 import 
org.apache.shardingsphere.sharding.route.engine.validator.ShardingStatementValidatorFactory;
-import org.apache.shardingsphere.sharding.rule.BindingTableRule;
 import org.apache.shardingsphere.sharding.rule.ShardingRule;
-import org.apache.shardingsphere.sharding.rule.TableRule;
 import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.common.statement.dml.DMLStatement;
-import 
org.apache.shardingsphere.sql.parser.sql.common.util.SafeNumberOperationUtils;
 
 import java.util.Collections;
 import java.util.List;
@@ -65,7 +56,6 @@ public final class ShardingSQLRouter implements 
SQLRouter<ShardingRule> {
         ShardingConditions shardingConditions = 
createShardingConditions(logicSQL, metaData, rule);
         boolean needMergeShardingValues = 
isNeedMergeShardingValues(logicSQL.getSqlStatementContext(), rule);
         if (sqlStatement instanceof DMLStatement && needMergeShardingValues) {
-            checkSubqueryShardingValues(logicSQL.getSqlStatementContext(), 
rule, shardingConditions);
             mergeShardingConditions(shardingConditions);
         }
         ShardingRouteEngineFactory.newInstance(rule, metaData, 
logicSQL.getSqlStatementContext(), shardingConditions, props).route(result, 
rule);
@@ -92,74 +82,6 @@ public final class ShardingSQLRouter implements 
SQLRouter<ShardingRule> {
         return (selectContainsSubquery || insertSelectContainsSubquery) && 
!rule.getShardingLogicTableNames(sqlStatementContext.getTablesContext().getTableNames()).isEmpty();
     }
     
-    private void checkSubqueryShardingValues(final SQLStatementContext<?> 
sqlStatementContext, final ShardingRule shardingRule, final ShardingConditions 
shardingConditions) {
-        for (String each : 
sqlStatementContext.getTablesContext().getTableNames()) {
-            Optional<TableRule> tableRule = shardingRule.findTableRule(each);
-            if (tableRule.isPresent() && isRoutingByHint(shardingRule, 
tableRule.get())
-                    && !HintManager.getDatabaseShardingValues(each).isEmpty() 
&& !HintManager.getTableShardingValues(each).isEmpty()) {
-                return;
-            }
-        }
-        if (shardingConditions.getConditions().size() > 1) {
-            Preconditions.checkState(isSameShardingCondition(shardingRule, 
shardingConditions), "Sharding value must same with subquery.");
-        }
-    }
-    
-    private boolean isRoutingByHint(final ShardingRule shardingRule, final 
TableRule tableRule) {
-        return 
shardingRule.getDatabaseShardingStrategyConfiguration(tableRule) instanceof 
HintShardingStrategyConfiguration
-                && 
shardingRule.getTableShardingStrategyConfiguration(tableRule) instanceof 
HintShardingStrategyConfiguration;
-    }
-    
-    private boolean isSameShardingCondition(final ShardingRule shardingRule, 
final ShardingConditions shardingConditions) {
-        ShardingCondition example = 
shardingConditions.getConditions().remove(shardingConditions.getConditions().size()
 - 1);
-        for (ShardingCondition each : shardingConditions.getConditions()) {
-            if (!isSameShardingCondition(shardingRule, example, each)) {
-                return false;
-            }
-        }
-        return true;
-    }
-    
-    private boolean isSameShardingCondition(final ShardingRule shardingRule, 
final ShardingCondition shardingCondition1, final ShardingCondition 
shardingCondition2) {
-        if (shardingCondition1.getValues().size() != 
shardingCondition2.getValues().size()) {
-            return false;
-        }
-        for (int i = 0; i < shardingCondition1.getValues().size(); i++) {
-            ShardingConditionValue shardingConditionValue1 = 
shardingCondition1.getValues().get(i);
-            ShardingConditionValue shardingConditionValue2 = 
shardingCondition2.getValues().get(i);
-            if (!isSameShardingConditionValue(shardingRule, 
shardingConditionValue1, shardingConditionValue2)) {
-                return false;
-            }
-        }
-        return true;
-    }
-    
-    private boolean isSameShardingConditionValue(final ShardingRule 
shardingRule, final ShardingConditionValue shardingConditionValue1, final 
ShardingConditionValue shardingConditionValue2) {
-        return isSameLogicTable(shardingRule, shardingConditionValue1, 
shardingConditionValue2) && 
shardingConditionValue1.getColumnName().equals(shardingConditionValue2.getColumnName())
 
-                && isSameValue(shardingConditionValue1, 
shardingConditionValue2);
-    }
-    
-    private boolean isSameLogicTable(final ShardingRule shardingRule, final 
ShardingConditionValue shardingValue1, final ShardingConditionValue 
shardingValue2) {
-        return 
shardingValue1.getTableName().equals(shardingValue2.getTableName()) || 
isBindingTable(shardingRule, shardingValue1, shardingValue2);
-    }
-    
-    private boolean isBindingTable(final ShardingRule shardingRule, final 
ShardingConditionValue shardingValue1, final ShardingConditionValue 
shardingValue2) {
-        Optional<BindingTableRule> bindingRule = 
shardingRule.findBindingTableRule(shardingValue1.getTableName());
-        return bindingRule.isPresent() && 
bindingRule.get().hasLogicTable(shardingValue2.getTableName());
-    }
-    
-    @SuppressWarnings({"rawtypes", "unchecked"})
-    private boolean isSameValue(final ShardingConditionValue 
shardingConditionValue1, final ShardingConditionValue shardingConditionValue2) {
-        if (shardingConditionValue1 instanceof ListShardingConditionValue && 
shardingConditionValue2 instanceof ListShardingConditionValue) {
-            return SafeNumberOperationUtils.safeCollectionEquals(
-                    ((ListShardingConditionValue) 
shardingConditionValue1).getValues(), ((ListShardingConditionValue) 
shardingConditionValue2).getValues());
-        } else if (shardingConditionValue1 instanceof 
RangeShardingConditionValue && shardingConditionValue2 instanceof 
RangeShardingConditionValue) {
-            return SafeNumberOperationUtils.safeRangeEquals(
-                    ((RangeShardingConditionValue) 
shardingConditionValue1).getValueRange(), ((RangeShardingConditionValue) 
shardingConditionValue2).getValueRange());
-        }
-        return false;
-    }
-    
     private void mergeShardingConditions(final ShardingConditions 
shardingConditions) {
         if (shardingConditions.getConditions().size() > 1) {
             ShardingCondition shardingCondition = 
shardingConditions.getConditions().remove(shardingConditions.getConditions().size()
 - 1);
diff --git 
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-route/src/main/java/org/apache/shardingsphere/sharding/route/engine/validator/ShardingStatementValidatorFactory.java
 
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-route/src/main/java/org/apache/shardingsphere/sharding/route/engine/validator/ShardingStatementValidatorFactory.java
index 8aa0fe6..3a3e466 100644
--- 
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-route/src/main/java/org/apache/shardingsphere/sharding/route/engine/validator/ShardingStatementValidatorFactory.java
+++ 
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-route/src/main/java/org/apache/shardingsphere/sharding/route/engine/validator/ShardingStatementValidatorFactory.java
@@ -26,6 +26,7 @@ import 
org.apache.shardingsphere.sharding.route.engine.validator.ddl.impl.Shardi
 import 
org.apache.shardingsphere.sharding.route.engine.validator.ddl.impl.ShardingCreateViewStatementValidator;
 import 
org.apache.shardingsphere.sharding.route.engine.validator.dml.impl.ShardingDeleteStatementValidator;
 import 
org.apache.shardingsphere.sharding.route.engine.validator.dml.impl.ShardingInsertStatementValidator;
+import 
org.apache.shardingsphere.sharding.route.engine.validator.dml.impl.ShardingSelectStatementValidator;
 import 
org.apache.shardingsphere.sharding.route.engine.validator.dml.impl.ShardingUpdateStatementValidator;
 import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.AlterViewStatement;
@@ -38,6 +39,7 @@ import 
org.apache.shardingsphere.sql.parser.sql.common.statement.dml.DMLStatemen
 import 
org.apache.shardingsphere.sql.parser.sql.common.statement.dml.DeleteStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.common.statement.dml.InsertStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.common.statement.dml.UpdateStatement;
+import 
org.apache.shardingsphere.sql.parser.sql.common.statement.dml.SelectStatement;
 
 import java.util.Optional;
 
@@ -92,6 +94,9 @@ public final class ShardingStatementValidatorFactory {
         if (sqlStatement instanceof DeleteStatement) {
             return Optional.of(new ShardingDeleteStatementValidator());
         }
+        if (sqlStatement instanceof SelectStatement) {
+            return Optional.of(new ShardingSelectStatementValidator());
+        }
         return Optional.empty();
     }
 }
diff --git 
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-route/src/main/java/org/apache/shardingsphere/sharding/route/engine/validator/dml/ShardingDMLStatementValidator.java
 
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-route/src/main/java/org/apache/shardingsphere/sharding/route/engine/validator/dml/ShardingDMLStatementValidator.java
index 57fe45a..567260e 100644
--- 
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-route/src/main/java/org/apache/shardingsphere/sharding/route/engine/validator/dml/ShardingDMLStatementValidator.java
+++ 
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-route/src/main/java/org/apache/shardingsphere/sharding/route/engine/validator/dml/ShardingDMLStatementValidator.java
@@ -18,13 +18,35 @@
 package org.apache.shardingsphere.sharding.route.engine.validator.dml;
 
 import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
+import 
org.apache.shardingsphere.infra.binder.statement.dml.InsertStatementContext;
+import 
org.apache.shardingsphere.infra.binder.statement.dml.SelectStatementContext;
 import org.apache.shardingsphere.infra.exception.ShardingSphereException;
+import org.apache.shardingsphere.infra.hint.HintManager;
+import org.apache.shardingsphere.infra.metadata.schema.ShardingSphereSchema;
+import 
org.apache.shardingsphere.sharding.api.config.strategy.sharding.HintShardingStrategyConfiguration;
+import 
org.apache.shardingsphere.sharding.route.engine.condition.ShardingCondition;
+import 
org.apache.shardingsphere.sharding.route.engine.condition.ShardingConditions;
+import 
org.apache.shardingsphere.sharding.route.engine.condition.engine.ShardingConditionEngine;
+import 
org.apache.shardingsphere.sharding.route.engine.condition.engine.impl.WhereClauseShardingConditionEngine;
+import 
org.apache.shardingsphere.sharding.route.engine.condition.value.ListShardingConditionValue;
+import 
org.apache.shardingsphere.sharding.route.engine.condition.value.RangeShardingConditionValue;
+import 
org.apache.shardingsphere.sharding.route.engine.condition.value.ShardingConditionValue;
 import 
org.apache.shardingsphere.sharding.route.engine.validator.ShardingStatementValidator;
+import org.apache.shardingsphere.sharding.rule.BindingTableRule;
 import org.apache.shardingsphere.sharding.rule.ShardingRule;
+import org.apache.shardingsphere.sharding.rule.TableRule;
 import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
+import 
org.apache.shardingsphere.sql.parser.sql.common.statement.dml.DMLStatement;
+import 
org.apache.shardingsphere.sql.parser.sql.common.statement.dml.SelectStatement;
+import 
org.apache.shardingsphere.sql.parser.sql.common.util.SafeNumberOperationUtils;
+
+import com.google.common.base.Preconditions;
 
 import java.util.Collection;
+import java.util.Collections;
 import java.util.LinkedList;
+import java.util.List;
+import java.util.Optional;
 
 /**
  * Sharding dml statement validator.
@@ -52,4 +74,93 @@ public abstract class ShardingDMLStatementValidator<T 
extends SQLStatement> impl
         // TODO validate other single table scenario
         return allTableNames.isEmpty();
     }
+    
+    protected void checkSubqueryShardingValues(final ShardingRule 
shardingRule, final SQLStatementContext sqlStatementContext,
+        final List<Object> parameters, final ShardingSphereSchema schema) {
+        for (String each : 
sqlStatementContext.getTablesContext().getTableNames()) {
+            Optional<TableRule> tableRule = shardingRule.findTableRule(each);
+            if (tableRule.isPresent() && isRoutingByHint(shardingRule, 
tableRule.get())
+                && !HintManager.getDatabaseShardingValues(each).isEmpty() && 
!HintManager.getTableShardingValues(each).isEmpty()) {
+                return;
+            }
+        }
+        ShardingConditions shardingConditions = 
createShardingConditions(sqlStatementContext, parameters, schema, shardingRule);
+        if (shardingConditions.getConditions().size() > 1) {
+            Preconditions.checkState(isSameShardingCondition(shardingRule, 
shardingConditions), "Sharding value must same with subquery.");
+        }
+    }
+    
+    private boolean isRoutingByHint(final ShardingRule shardingRule, final 
TableRule tableRule) {
+        return 
shardingRule.getDatabaseShardingStrategyConfiguration(tableRule) instanceof 
HintShardingStrategyConfiguration
+            && shardingRule.getTableShardingStrategyConfiguration(tableRule) 
instanceof HintShardingStrategyConfiguration;
+    }
+    
+    private boolean isSameShardingCondition(final ShardingRule shardingRule, 
final ShardingConditions shardingConditions) {
+        ShardingCondition example = 
shardingConditions.getConditions().remove(shardingConditions.getConditions().size()
 - 1);
+        for (ShardingCondition each : shardingConditions.getConditions()) {
+            if (!isSameShardingCondition(shardingRule, example, each)) {
+                return false;
+            }
+        }
+        return true;
+    }
+    
+    private boolean isSameShardingCondition(final ShardingRule shardingRule, 
final ShardingCondition shardingCondition1, final ShardingCondition 
shardingCondition2) {
+        if (shardingCondition1.getValues().size() != 
shardingCondition2.getValues().size()) {
+            return false;
+        }
+        for (int i = 0; i < shardingCondition1.getValues().size(); i++) {
+            ShardingConditionValue shardingConditionValue1 = 
shardingCondition1.getValues().get(i);
+            ShardingConditionValue shardingConditionValue2 = 
shardingCondition2.getValues().get(i);
+            if (!isSameShardingConditionValue(shardingRule, 
shardingConditionValue1, shardingConditionValue2)) {
+                return false;
+            }
+        }
+        return true;
+    }
+    
+    private boolean isSameShardingConditionValue(final ShardingRule 
shardingRule, final ShardingConditionValue shardingConditionValue1, final 
ShardingConditionValue shardingConditionValue2) {
+        return isSameLogicTable(shardingRule, shardingConditionValue1, 
shardingConditionValue2) && 
shardingConditionValue1.getColumnName().equals(shardingConditionValue2.getColumnName())
+            && isSameValue(shardingConditionValue1, shardingConditionValue2);
+    }
+    
+    private boolean isSameLogicTable(final ShardingRule shardingRule, final 
ShardingConditionValue shardingValue1, final ShardingConditionValue 
shardingValue2) {
+        return 
shardingValue1.getTableName().equals(shardingValue2.getTableName()) || 
isBindingTable(shardingRule, shardingValue1, shardingValue2);
+    }
+    
+    private boolean isBindingTable(final ShardingRule shardingRule, final 
ShardingConditionValue shardingValue1, final ShardingConditionValue 
shardingValue2) {
+        Optional<BindingTableRule> bindingRule = 
shardingRule.findBindingTableRule(shardingValue1.getTableName());
+        return bindingRule.isPresent() && 
bindingRule.get().hasLogicTable(shardingValue2.getTableName());
+    }
+    
+    @SuppressWarnings({"rawtypes", "unchecked"})
+    private boolean isSameValue(final ShardingConditionValue 
shardingConditionValue1, final ShardingConditionValue shardingConditionValue2) {
+        if (shardingConditionValue1 instanceof ListShardingConditionValue && 
shardingConditionValue2 instanceof ListShardingConditionValue) {
+            return SafeNumberOperationUtils.safeCollectionEquals(
+                ((ListShardingConditionValue) 
shardingConditionValue1).getValues(), ((ListShardingConditionValue) 
shardingConditionValue2).getValues());
+        } else if (shardingConditionValue1 instanceof 
RangeShardingConditionValue && shardingConditionValue2 instanceof 
RangeShardingConditionValue) {
+            return SafeNumberOperationUtils.safeRangeEquals(
+                ((RangeShardingConditionValue) 
shardingConditionValue1).getValueRange(), ((RangeShardingConditionValue) 
shardingConditionValue2).getValueRange());
+        }
+        return false;
+    }
+    
+    private ShardingConditions createShardingConditions(final 
SQLStatementContext<SelectStatement> sqlStatementContext,
+        final List<Object> parameters, final ShardingSphereSchema schema, 
final ShardingRule rule) {
+        List<ShardingCondition> shardingConditions;
+        if (sqlStatementContext.getSqlStatement() instanceof DMLStatement) {
+            ShardingConditionEngine shardingConditionEngine = new 
WhereClauseShardingConditionEngine(rule, schema);
+            shardingConditions = 
shardingConditionEngine.createShardingConditions(sqlStatementContext, 
parameters);
+        } else {
+            shardingConditions = Collections.emptyList();
+        }
+        return new ShardingConditions(shardingConditions);
+    }
+    
+    protected boolean isNeedMergeShardingValues(final SQLStatementContext<?> 
sqlStatementContext, final ShardingRule rule) {
+        boolean selectContainsSubquery = sqlStatementContext instanceof 
SelectStatementContext && ((SelectStatementContext) 
sqlStatementContext).isContainsSubquery();
+        boolean insertSelectContainsSubquery = sqlStatementContext instanceof 
InsertStatementContext && null != ((InsertStatementContext) 
sqlStatementContext).getInsertSelectContext()
+            && ((InsertStatementContext) 
sqlStatementContext).getInsertSelectContext().getSelectStatementContext().isContainsSubquery();
+        return (selectContainsSubquery || insertSelectContainsSubquery) && 
!rule.getShardingLogicTableNames(sqlStatementContext.getTablesContext().getTableNames()).isEmpty();
+    }
 }
diff --git 
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-route/src/main/java/org/apache/shardingsphere/sharding/route/engine/validator/dml/impl/ShardingInsertStatementValidator.java
 
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-route/src/main/java/org/apache/shardingsphere/sharding/route/engine/validator/dml/impl/ShardingInsertStatementValidator.java
index 3730655..4876206 100644
--- 
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-route/src/main/java/org/apache/shardingsphere/sharding/route/engine/validator/dml/impl/ShardingInsertStatementValidator.java
+++ 
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-route/src/main/java/org/apache/shardingsphere/sharding/route/engine/validator/dml/impl/ShardingInsertStatementValidator.java
@@ -62,6 +62,9 @@ public final class ShardingInsertStatementValidator extends 
ShardingDMLStatement
         if (insertSelectSegment.isPresent() && 
!isAllSameTables(tablesContext.getTableNames()) && 
!shardingRule.isAllBindingTables(tablesContext.getTableNames())) {
             throw new ShardingSphereException("The table inserted and the 
table selected must be the same or bind tables.");
         }
+        if (insertSelectSegment.isPresent() && 
isNeedMergeShardingValues(sqlStatementContext, shardingRule)) {
+            checkSubqueryShardingValues(shardingRule, sqlStatementContext, 
parameters, schema);
+        }
     }
     
     private boolean isUpdateShardingKey(final ShardingRule shardingRule, final 
OnDuplicateKeyColumnsSegment onDuplicateKeyColumnsSegment, final String 
tableName) {
diff --git 
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-route/src/main/java/org/apache/shardingsphere/sharding/route/engine/validator/dml/impl/ShardingSelectStatementValidator.java
 
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-route/src/main/java/org/apache/shardingsphere/sharding/route/engine/validator/dml/impl/ShardingSelectStatementValidator.java
new file mode 100644
index 0000000..4cb7ee0
--- /dev/null
+++ 
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-route/src/main/java/org/apache/shardingsphere/sharding/route/engine/validator/dml/impl/ShardingSelectStatementValidator.java
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.sharding.route.engine.validator.dml.impl;
+
+import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
+import org.apache.shardingsphere.infra.metadata.schema.ShardingSphereSchema;
+import org.apache.shardingsphere.infra.route.context.RouteContext;
+import 
org.apache.shardingsphere.sharding.route.engine.validator.dml.ShardingDMLStatementValidator;
+import org.apache.shardingsphere.sharding.rule.ShardingRule;
+import 
org.apache.shardingsphere.sql.parser.sql.common.statement.dml.SelectStatement;
+
+import java.util.List;
+
+/**
+ * Sharding select statement validator.
+ */
+public final class ShardingSelectStatementValidator extends 
ShardingDMLStatementValidator<SelectStatement> {
+    
+    @Override
+    public void preValidate(final ShardingRule shardingRule, final 
SQLStatementContext<SelectStatement> sqlStatementContext, 
+                            final List<Object> parameters, final 
ShardingSphereSchema schema) {
+        if (isNeedMergeShardingValues(sqlStatementContext, shardingRule)) {
+            checkSubqueryShardingValues(shardingRule, sqlStatementContext, 
parameters, schema);
+        }
+    }
+    
+    @Override
+    public void postValidate(final SelectStatement sqlStatement, final 
RouteContext routeContext) {
+    }
+}

Reply via email to