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/07/15 03:05:00 UTC

[shardingsphere] branch master updated: make subquery in SubqueryRouteTest work well (#6340)

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 3dd5005  make subquery in SubqueryRouteTest work well (#6340)
3dd5005 is described below

commit 3dd50053215e523225efe10f67d1f36b1a01bc0e
Author: DuanZhengqiang <st...@gmail.com>
AuthorDate: Tue Jul 14 22:04:39 2020 -0500

    make subquery in SubqueryRouteTest work well (#6340)
    
    * make subquery in SubqueryRouteTest work well
    
    * move getSubqueryWhereSegments function to SelectStatementContext
    
    * modify ArrayList to LinkedList
---
 .../engine/WhereClauseShardingConditionEngine.java |   7 +-
 .../engine/type/standard/AbstractSQLRouteTest.java |   7 +-
 .../engine/type/standard/SubqueryRouteTest.java    |  17 ---
 .../statement/dml/SelectStatementContext.java      | 121 ++++++++++++++++++++-
 .../parser/sql/statement/dml/SelectStatement.java  |  23 +---
 5 files changed, 128 insertions(+), 47 deletions(-)

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 612667a..7e311eb 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
@@ -31,11 +31,11 @@ import org.apache.shardingsphere.sharding.strategy.value.RangeRouteValue;
 import org.apache.shardingsphere.sharding.strategy.value.RouteValue;
 import org.apache.shardingsphere.sql.parser.binder.metadata.schema.SchemaMetaData;
 import org.apache.shardingsphere.sql.parser.binder.statement.SQLStatementContext;
+import org.apache.shardingsphere.sql.parser.binder.statement.dml.SelectStatementContext;
 import org.apache.shardingsphere.sql.parser.binder.type.WhereAvailable;
 import org.apache.shardingsphere.sql.parser.sql.segment.dml.predicate.AndPredicate;
 import org.apache.shardingsphere.sql.parser.sql.segment.dml.predicate.PredicateSegment;
 import org.apache.shardingsphere.sql.parser.sql.segment.dml.predicate.WhereSegment;
-import org.apache.shardingsphere.sql.parser.sql.statement.SQLStatement;
 import org.apache.shardingsphere.sql.parser.sql.statement.dml.SelectStatement;
 import org.apache.shardingsphere.sql.parser.sql.util.SafeRangeOperationUtils;
 
@@ -75,9 +75,8 @@ public final class WhereClauseShardingConditionEngine {
         if (whereSegment.isPresent()) {
             result.addAll(createShardingConditions(sqlStatementContext, whereSegment.get().getAndPredicates(), parameters));
         }
-        SQLStatement sqlStatement = sqlStatementContext.getSqlStatement();
-        Collection<WhereSegment> subqueryWhereSegments = sqlStatement instanceof SelectStatement
-                ? ((SelectStatement) sqlStatement).getSubqueryWhereSegments() : Collections.emptyList();
+        Collection<WhereSegment> subqueryWhereSegments = sqlStatementContext instanceof SelectStatementContext
+                ? ((SelectStatementContext) sqlStatementContext).getSubqueryWhereSegments((SelectStatement) sqlStatementContext.getSqlStatement()) : Collections.emptyList();
         for (WhereSegment each : subqueryWhereSegments) {
             Collection<ShardingCondition> subqueryShardingConditions = createShardingConditions(sqlStatementContext, each.getAndPredicates(), parameters);
             if (!result.containsAll(subqueryShardingConditions)) {
diff --git a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-route/src/test/java/org/apache/shardingsphere/sharding/route/engine/type/standard/AbstractSQLRouteTest.java b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-route/src/test/java/org/apache/shardingsphere/sharding/route/engine/type/standard/AbstractSQLRouteTest.java
index f5e1e40..18130c3 100644
--- a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-route/src/test/java/org/apache/shardingsphere/sharding/route/engine/type/standard/AbstractSQLRouteTest.java
+++ b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-route/src/test/java/org/apache/shardingsphere/sharding/route/engine/type/standard/AbstractSQLRouteTest.java
@@ -81,7 +81,10 @@ public abstract class AbstractSQLRouteTest extends AbstractRoutingEngineTest {
                 new ColumnMetaData("status", Types.VARCHAR, "varchar", false, false, false),
                 new ColumnMetaData("c_date", Types.TIMESTAMP, "timestamp", false, false, false)), Collections.emptySet()));
         tableMetaDataMap.put("t_other", new TableMetaData(Collections.singletonList(new ColumnMetaData("order_id", Types.INTEGER, "int", true, false, false)), Collections.emptySet()));
-        tableMetaDataMap.put("t_category", new TableMetaData(Collections.singletonList(new ColumnMetaData("order_id", Types.INTEGER, "int", true, false, false)), Collections.emptySet()));
-        return new RuleSchemaMetaData(new SchemaMetaData(tableMetaDataMap), Collections.emptyMap());
+        Map<String, TableMetaData> unconfiguredTableMetaDataMap = new HashMap<>(1, 1);
+        unconfiguredTableMetaDataMap.put("t_category", new TableMetaData(Collections.singletonList(new ColumnMetaData("order_id", Types.INTEGER, "int", true, false, false)), Collections.emptySet()));
+        Map<String, SchemaMetaData> unconfiguredSchemaMetaDataMap = new HashMap<>(1, 1);
+        unconfiguredSchemaMetaDataMap.put("ds_0", new SchemaMetaData(unconfiguredTableMetaDataMap));
+        return new RuleSchemaMetaData(new SchemaMetaData(tableMetaDataMap), unconfiguredSchemaMetaDataMap);
     }
 }
diff --git a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-route/src/test/java/org/apache/shardingsphere/sharding/route/engine/type/standard/SubqueryRouteTest.java b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-route/src/test/java/org/apache/shardingsphere/sharding/route/engine/type/standard/SubqueryRouteTest.java
index 819e612..d908039 100644
--- a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-route/src/test/java/org/apache/shardingsphere/sharding/route/engine/type/standard/SubqueryRouteTest.java
+++ b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-route/src/test/java/org/apache/shardingsphere/sharding/route/engine/type/standard/SubqueryRouteTest.java
@@ -18,16 +18,13 @@
 package org.apache.shardingsphere.sharding.route.engine.type.standard;
 
 import org.apache.shardingsphere.infra.hint.HintManager;
-import org.junit.Ignore;
 import org.junit.Test;
 
 import java.util.LinkedList;
 import java.util.List;
 
-@Ignore("Can not support subquery at current")
 public final class SubqueryRouteTest extends AbstractSQLRouteTest {
     
-    @Ignore("Can not support subquery at current")
     @Test(expected = IllegalStateException.class)
     public void assertOneTableError() {
         String sql = "select (select max(id) from t_order b where b.user_id =? ) from t_order a where user_id = ? ";
@@ -37,7 +34,6 @@ public final class SubqueryRouteTest extends AbstractSQLRouteTest {
         assertRoute(sql, parameters);
     }
     
-    @Ignore("Can not support subquery at current")
     @Test
     public void assertOneTable() {
         String sql = "select (select max(id) from t_order b where b.user_id = ? and b.user_id = a.user_id) from t_order a where user_id = ? ";
@@ -47,7 +43,6 @@ public final class SubqueryRouteTest extends AbstractSQLRouteTest {
         assertRoute(sql, parameters);
     }
     
-    @Ignore("Can not support subquery at current")
     @Test
     public void assertBindingTable() {
         String sql = "select (select max(id) from t_order_item b where b.user_id = ?) from t_order a where user_id = ? ";
@@ -57,7 +52,6 @@ public final class SubqueryRouteTest extends AbstractSQLRouteTest {
         assertRoute(sql, parameters);
     }
     
-    @Ignore("Can not support subquery at current")
     @Test
     public void assertNotShardingTable() {
         String sql = "select (select max(id) from t_category b where b.id = ?) from t_category a where id = ? ";
@@ -67,7 +61,6 @@ public final class SubqueryRouteTest extends AbstractSQLRouteTest {
         assertRoute(sql, parameters);
     }
     
-    @Ignore("Can not support subquery at current")
     @Test(expected = IllegalStateException.class)
     public void assertBindingTableWithDifferentValue() {
         String sql = "select (select max(id) from t_order_item b where b.user_id = ? ) from t_order a where user_id = ? ";
@@ -77,7 +70,6 @@ public final class SubqueryRouteTest extends AbstractSQLRouteTest {
         assertRoute(sql, parameters);
     }
     
-    @Ignore("Can not support subquery at current")
     @Test(expected = IllegalStateException.class)
     public void assertTwoTableWithDifferentOperator() {
         List<Object> parameters = new LinkedList<>();
@@ -88,7 +80,6 @@ public final class SubqueryRouteTest extends AbstractSQLRouteTest {
         assertRoute(sql, parameters);
     }
     
-    @Ignore("Can not support subquery at current")
     @Test(expected = IllegalStateException.class)
     public void assertTwoTableWithIn() {
         List<Object> parameters = new LinkedList<>();
@@ -100,7 +91,6 @@ public final class SubqueryRouteTest extends AbstractSQLRouteTest {
         assertRoute(sql, parameters);
     }
     
-    @Ignore("Can not support subquery at current")
     @Test(expected = IllegalStateException.class)
     public void assertSubqueryInSubqueryError() {
         List<Object> parameters = new LinkedList<>();
@@ -113,7 +103,6 @@ public final class SubqueryRouteTest extends AbstractSQLRouteTest {
         assertRoute(sql, parameters);
     }
     
-    @Ignore("Can not support subquery at current")
     @Test
     public void assertSubqueryInSubquery() {
         List<Object> parameters = new LinkedList<>();
@@ -126,7 +115,6 @@ public final class SubqueryRouteTest extends AbstractSQLRouteTest {
         assertRoute(sql, parameters);
     }
     
-    @Ignore("Can not support subquery at current")
     @Test(expected = IllegalStateException.class)
     public void assertSubqueryInFromError() {
         String sql = "select status from t_order b join (select user_id,status from t_order b where b.user_id =?) c on b.user_id = c.user_id where b.user_id =? ";
@@ -136,7 +124,6 @@ public final class SubqueryRouteTest extends AbstractSQLRouteTest {
         assertRoute(sql, parameters);
     }
     
-    @Ignore("Can not support subquery at current")
     @Test
     public void assertSubqueryInFrom() {
         String sql = "select status from t_order b join (select user_id,status from t_order b where b.user_id =?) c on b.user_id = c.user_id where b.user_id =? ";
@@ -146,7 +133,6 @@ public final class SubqueryRouteTest extends AbstractSQLRouteTest {
         assertRoute(sql, parameters);
     }
     
-    @Ignore("Can not support subquery at current")
     @Test
     public void assertSubqueryForAggregation() {
         String sql = "select count(*) from t_order where c.user_id = (select user_id from t_order where user_id =?) ";
@@ -155,7 +141,6 @@ public final class SubqueryRouteTest extends AbstractSQLRouteTest {
         assertRoute(sql, parameters);
     }
     
-    @Ignore("Can not support subquery at current")
     @Test
     public void assertSubqueryForBinding() {
         String sql = "select count(*) from t_order where user_id = (select user_id from t_order_item where user_id =?) ";
@@ -164,7 +149,6 @@ public final class SubqueryRouteTest extends AbstractSQLRouteTest {
         assertRoute(sql, parameters);
     }
     
-    @Ignore("Can not support subquery at current")
     @Test(expected = IllegalStateException.class)
     public void assertSubqueryWithoutHint() {
         List<Object> parameters = new LinkedList<>();
@@ -175,7 +159,6 @@ public final class SubqueryRouteTest extends AbstractSQLRouteTest {
         assertRoute(sql, parameters);
     }
     
-    @Ignore("Can not support subquery at current")
     @Test
     public void assertSubqueryWithHint() {
         HintManager hintManager = HintManager.getInstance();
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-binder/src/main/java/org/apache/shardingsphere/sql/parser/binder/statement/dml/SelectStatementContext.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-binder/src/main/java/org/apache/shardingsphere/sql/parser/binder/statement/dml/SelectStatementContext.java
index 38a59de..469f656 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-binder/src/main/java/org/apache/shardingsphere/sql/parser/binder/statement/dml/SelectStatementContext.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-binder/src/main/java/org/apache/shardingsphere/sql/parser/binder/statement/dml/SelectStatementContext.java
@@ -42,9 +42,12 @@ import org.apache.shardingsphere.sql.parser.sql.segment.dml.JoinedTableSegment;
 import org.apache.shardingsphere.sql.parser.sql.segment.dml.TableFactorSegment;
 import org.apache.shardingsphere.sql.parser.sql.segment.dml.TableReferenceSegment;
 import org.apache.shardingsphere.sql.parser.sql.segment.dml.column.ColumnSegment;
+import org.apache.shardingsphere.sql.parser.sql.segment.dml.expr.ExpressionSegment;
+import org.apache.shardingsphere.sql.parser.sql.segment.dml.expr.subquery.SubqueryExpressionSegment;
 import org.apache.shardingsphere.sql.parser.sql.segment.dml.item.ColumnProjectionSegment;
 import org.apache.shardingsphere.sql.parser.sql.segment.dml.item.ProjectionSegment;
 import org.apache.shardingsphere.sql.parser.sql.segment.dml.item.ProjectionsSegment;
+import org.apache.shardingsphere.sql.parser.sql.segment.dml.item.SubqueryProjectionSegment;
 import org.apache.shardingsphere.sql.parser.sql.segment.dml.order.item.ColumnOrderByItemSegment;
 import org.apache.shardingsphere.sql.parser.sql.segment.dml.order.item.ExpressionOrderByItemSegment;
 import org.apache.shardingsphere.sql.parser.sql.segment.dml.order.item.IndexOrderByItemSegment;
@@ -53,6 +56,9 @@ import org.apache.shardingsphere.sql.parser.sql.segment.dml.order.item.TextOrder
 import org.apache.shardingsphere.sql.parser.sql.segment.dml.predicate.AndPredicate;
 import org.apache.shardingsphere.sql.parser.sql.segment.dml.predicate.PredicateSegment;
 import org.apache.shardingsphere.sql.parser.sql.segment.dml.predicate.WhereSegment;
+import org.apache.shardingsphere.sql.parser.sql.segment.dml.predicate.value.PredicateBetweenRightValue;
+import org.apache.shardingsphere.sql.parser.sql.segment.dml.predicate.value.PredicateCompareRightValue;
+import org.apache.shardingsphere.sql.parser.sql.segment.dml.predicate.value.PredicateInRightValue;
 import org.apache.shardingsphere.sql.parser.sql.segment.generic.OwnerAvailable;
 import org.apache.shardingsphere.sql.parser.sql.segment.generic.OwnerSegment;
 import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.SimpleTableSegment;
@@ -62,10 +68,12 @@ import org.apache.shardingsphere.sql.parser.sql.statement.dml.SelectStatement;
 import org.apache.shardingsphere.sql.parser.sql.util.SQLUtil;
 
 import java.util.Collection;
+import java.util.Collections;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
+import java.util.stream.Collectors;
 
 /**
  * Select SQL statement context.
@@ -109,7 +117,7 @@ public final class SelectStatementContext extends CommonSQLStatementContext<Sele
     }
     
     private boolean containsSubquery() {
-        Collection<WhereSegment> subqueryPredicateSegments = getSqlStatement().getSubqueryWhereSegments();
+        Collection<WhereSegment> subqueryPredicateSegments = getSubqueryWhereSegments(getSqlStatement());
         for (WhereSegment each : subqueryPredicateSegments) {
             if (!each.getAndPredicates().isEmpty()) {
                 return true;
@@ -119,6 +127,115 @@ public final class SelectStatementContext extends CommonSQLStatementContext<Sele
     }
     
     /**
+     * Get subquery where segment from SelectStatement.
+     *
+     * @param selectStatement SelectStatement.
+     * @return subquery where segment collection.
+     */
+    public Collection<WhereSegment> getSubqueryWhereSegments(final SelectStatement selectStatement) {
+        Collection<WhereSegment> subqueryWhereSegments = new LinkedList<>();
+        subqueryWhereSegments.addAll(getSubqueryWhereSegmentsFromProjections(selectStatement.getProjections()));
+        subqueryWhereSegments.addAll(getSubqueryWhereSegmentsFromTableReferences(selectStatement.getTableReferences()));
+        subqueryWhereSegments.addAll(getSubqueryWhereSegmentsFromWhere(selectStatement.getWhere().orElse(null)));
+        return subqueryWhereSegments;
+    }
+    
+    private Collection<WhereSegment> getSubqueryWhereSegmentsFromProjections(final ProjectionsSegment projections) {
+        if (null == projections || projections.getProjections().isEmpty()) {
+            return Collections.emptyList();
+        }
+        Collection<WhereSegment> subqueryWhereSegments = new LinkedList<>();
+        
+        for (ProjectionSegment each : projections.getProjections()) {
+            if (!(each instanceof SubqueryProjectionSegment)) {
+                continue;
+            }
+            SelectStatement subquerySelect = ((SubqueryProjectionSegment) each).getSubquery().getSelect();
+            subquerySelect.getWhere().ifPresent(subqueryWhereSegments::add);
+            subqueryWhereSegments.addAll(getSubqueryWhereSegments(subquerySelect));
+        }
+        return subqueryWhereSegments;
+    }
+    
+    private Collection<WhereSegment> getSubqueryWhereSegmentsFromTableReferences(final Collection<TableReferenceSegment> tableReferences) {
+        if (tableReferences.isEmpty()) {
+            return Collections.emptyList();
+        }
+        Collection<WhereSegment> subqueryWhereSegments = new LinkedList<>();
+        for (TableReferenceSegment each : tableReferences) {
+            subqueryWhereSegments.addAll(getSubqueryWhereSegmentsFromTableFactor(each.getTableFactor()));
+            subqueryWhereSegments.addAll(getSubqueryWhereSegmentsFromJoinedTable(each.getJoinedTables()));
+        }
+        return subqueryWhereSegments;
+    }
+    
+    private Collection<WhereSegment> getSubqueryWhereSegmentsFromWhere(final WhereSegment where) {
+        if (null == where || where.getAndPredicates().isEmpty()) {
+            return Collections.emptyList();
+        }
+        Collection<WhereSegment> subqueryWhereSegments = new LinkedList<>();
+        List<PredicateSegment> predicateSegments = where.getAndPredicates().stream().flatMap(andPredicate -> andPredicate.getPredicates().stream()).collect(Collectors.toList());
+        for (PredicateSegment each : predicateSegments) {
+            if (each.getRightValue() instanceof PredicateBetweenRightValue) {
+                subqueryWhereSegments.addAll(getSubqueryWhereSegmentsFromExpression(((PredicateBetweenRightValue) each.getRightValue()).getBetweenExpression()));
+                subqueryWhereSegments.addAll(getSubqueryWhereSegmentsFromExpression(((PredicateBetweenRightValue) each.getRightValue()).getAndExpression()));
+            }
+            if (each.getRightValue() instanceof PredicateCompareRightValue) {
+                subqueryWhereSegments.addAll(getSubqueryWhereSegmentsFromExpression(((PredicateCompareRightValue) each.getRightValue()).getExpression()));
+            }
+            if (each.getRightValue() instanceof PredicateInRightValue) {
+                for (ExpressionSegment sqlExpression : ((PredicateInRightValue) each.getRightValue()).getSqlExpressions()) {
+                    subqueryWhereSegments.addAll(getSubqueryWhereSegmentsFromExpression(sqlExpression));
+                }
+            }
+        }
+        return subqueryWhereSegments;
+    }
+    
+    private Collection<WhereSegment> getSubqueryWhereSegmentsFromTableFactor(final TableFactorSegment tableFactor) {
+        if (null == tableFactor) {
+            return Collections.emptyList();
+        }
+        return getSubqueryWhereSegmentsFromTableSegment(tableFactor.getTable());
+    }
+    
+    private Collection<WhereSegment> getSubqueryWhereSegmentsFromJoinedTable(final Collection<JoinedTableSegment> joinedTables) {
+        if (joinedTables.isEmpty()) {
+            return Collections.emptyList();
+        }
+        Collection<WhereSegment> subqueryWhereSegments = new LinkedList<>();
+        for (JoinedTableSegment joinedTable : joinedTables) {
+            if (null == joinedTable.getTableFactor()) {
+                continue;
+            }
+            subqueryWhereSegments.addAll(getSubqueryWhereSegmentsFromTableSegment(joinedTable.getTableFactor().getTable()));
+        }
+        return subqueryWhereSegments;
+    }
+    
+    private Collection<WhereSegment> getSubqueryWhereSegmentsFromTableSegment(final TableSegment tableSegment) {
+        if (!(tableSegment instanceof SubqueryTableSegment)) {
+            return Collections.emptyList();
+        }
+        Collection<WhereSegment> subqueryWhereSegments = new LinkedList<>();
+        SelectStatement subquerySelect = ((SubqueryTableSegment) tableSegment).getSubquery().getSelect();
+        subquerySelect.getWhere().ifPresent(subqueryWhereSegments::add);
+        subqueryWhereSegments.addAll(getSubqueryWhereSegments(subquerySelect));
+        return subqueryWhereSegments;
+    }
+    
+    private Collection<WhereSegment> getSubqueryWhereSegmentsFromExpression(final ExpressionSegment expressionSegment) {
+        if (!(expressionSegment instanceof SubqueryExpressionSegment)) {
+            return Collections.emptyList();
+        }
+        Collection<WhereSegment> subqueryWhereSegments = new LinkedList<>();
+        SelectStatement subquerySelect = ((SubqueryExpressionSegment) expressionSegment).getSubquery().getSelect();
+        subquerySelect.getWhere().ifPresent(subqueryWhereSegments::add);
+        subqueryWhereSegments.addAll(getSubqueryWhereSegments(subquerySelect));
+        return subqueryWhereSegments;
+    }
+    
+    /**
      * Set indexes.
      *
      * @param columnLabelIndexMap map for column label and index
@@ -227,7 +344,7 @@ public final class SelectStatementContext extends CommonSQLStatementContext<Sele
         if (each instanceof OwnerAvailable) {
             return ((OwnerAvailable) each).getOwner();
         }
-        if (each instanceof ColumnProjectionSegment) { 
+        if (each instanceof ColumnProjectionSegment) {
             return ((ColumnProjectionSegment) each).getColumn().getOwner();
         }
         return Optional.empty();
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/statement/dml/SelectStatement.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/statement/dml/SelectStatement.java
index 02fb102..7771853 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/statement/dml/SelectStatement.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/statement/dml/SelectStatement.java
@@ -26,10 +26,7 @@ import org.apache.shardingsphere.sql.parser.sql.segment.dml.order.OrderBySegment
 import org.apache.shardingsphere.sql.parser.sql.segment.dml.pagination.limit.LimitSegment;
 import org.apache.shardingsphere.sql.parser.sql.segment.dml.predicate.LockSegment;
 import org.apache.shardingsphere.sql.parser.sql.segment.dml.predicate.WhereSegment;
-import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.SubqueryTableSegment;
-import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.TableSegment;
 
-import java.util.ArrayList;
 import java.util.Collection;
 import java.util.LinkedList;
 import java.util.Optional;
@@ -68,7 +65,7 @@ public final class SelectStatement extends DMLStatement {
     
     /**
      * Get group by segment.
-     * 
+     *
      * @return group by segment
      */
     public Optional<GroupBySegment> getGroupBy() {
@@ -101,22 +98,4 @@ public final class SelectStatement extends DMLStatement {
     public Optional<LockSegment> getLock() {
         return Optional.ofNullable(lock);
     }
-    
-    /**
-     * Get subquery where segment.
-     *
-     * @return subquery where segment collection.
-     */
-    public Collection<WhereSegment> getSubqueryWhereSegments() {
-        Collection<WhereSegment> subqueryWhereSegments = new ArrayList<>();
-        for (TableReferenceSegment each : tableReferences) {
-            TableSegment tableSegment = each.getTableFactor().getTable();
-            if (!(tableSegment instanceof SubqueryTableSegment)) {
-                continue;
-            }
-            Optional<WhereSegment> whereSegment = ((SubqueryTableSegment) tableSegment).getSubquery().getSelect().getWhere();
-            whereSegment.ifPresent(subqueryWhereSegments::add);
-        }
-        return subqueryWhereSegments;
-    }
 }