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) {
+ }
+}