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();