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

jianglongtao 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 57f94715327 fix extract duplicate table with combine subquery 
projection. (#29356)
57f94715327 is described below

commit 57f947153271ab6b55b4c39004b89dab4692c678
Author: Chuxin Chen <[email protected]>
AuthorDate: Tue Dec 12 11:25:08 2023 +0800

    fix extract duplicate table with combine subquery projection. (#29356)
---
 .../sql/common/extractor/TableExtractor.java       |  2 +-
 .../sql/common/extractor/TableExtractorTest.java   | 22 ++++++++++++++++++++++
 2 files changed, 23 insertions(+), 1 deletion(-)

diff --git 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/extractor/TableExtractor.java
 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/extractor/TableExtractor.java
index cf6b7c03b09..3b7a2c7308a 100644
--- 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/extractor/TableExtractor.java
+++ 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/extractor/TableExtractor.java
@@ -87,7 +87,7 @@ public final class TableExtractor {
         if (selectStatement.getWhere().isPresent()) {
             
extractTablesFromExpression(selectStatement.getWhere().get().getExpr());
         }
-        if (null != selectStatement.getProjections()) {
+        if (null != selectStatement.getProjections() && 
!selectStatement.getCombine().isPresent()) {
             extractTablesFromProjections(selectStatement.getProjections());
         }
         if (selectStatement.getGroupBy().isPresent()) {
diff --git 
a/parser/sql/statement/src/test/java/org/apache/shardingsphere/sql/parser/sql/common/extractor/TableExtractorTest.java
 
b/parser/sql/statement/src/test/java/org/apache/shardingsphere/sql/parser/sql/common/extractor/TableExtractorTest.java
index 97888a11ee6..c5cb2501c8f 100644
--- 
a/parser/sql/statement/src/test/java/org/apache/shardingsphere/sql/parser/sql/common/extractor/TableExtractorTest.java
+++ 
b/parser/sql/statement/src/test/java/org/apache/shardingsphere/sql/parser/sql/common/extractor/TableExtractorTest.java
@@ -28,10 +28,12 @@ import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.column.OnDupl
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.combine.CombineSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.BinaryOperationExpression;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.simple.LiteralExpressionSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.subquery.SubquerySegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.AggregationProjectionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.ColumnProjectionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.ProjectionsSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.ShorthandProjectionSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.SubqueryProjectionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.predicate.LockSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.AliasSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.OwnerSegment;
@@ -173,6 +175,26 @@ class TableExtractorTest {
         return result;
     }
     
+    @Test
+    void assertExtractTablesFromCombineWithSubQueryProjection() {
+        MySQLSelectStatement selectStatement = 
createSelectStatementWithSubQueryProjection("t_order");
+        selectStatement.setCombine(new CombineSegment(0, 0, 
createSelectStatementWithSubQueryProjection("t_order"), CombineType.UNION, 
createSelectStatementWithSubQueryProjection("t_order_item")));
+        tableExtractor.extractTablesFromSelect(selectStatement);
+        Collection<SimpleTableSegment> actual = 
tableExtractor.getRewriteTables();
+        assertThat(actual.size(), is(2));
+        Iterator<SimpleTableSegment> iterator = actual.iterator();
+        assertTableSegment(iterator.next(), 0, 0, "t_order");
+        assertTableSegment(iterator.next(), 0, 0, "t_order_item");
+    }
+    
+    private MySQLSelectStatement 
createSelectStatementWithSubQueryProjection(final String tableName) {
+        MySQLSelectStatement result = new MySQLSelectStatement();
+        ProjectionsSegment projections = new ProjectionsSegment(0, 0);
+        projections.getProjections().add(new SubqueryProjectionSegment(new 
SubquerySegment(0, 0, createSelectStatement(tableName), ""), ""));
+        result.setProjections(projections);
+        return result;
+    }
+    
     @Test
     void assertExtractJoinTableSegmentsFromSelect() {
         JoinTableSegment joinTableSegment = new JoinTableSegment();

Reply via email to