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 0f8e1d8b239 Fix create view index out of range exception when view contains set operator (#22846) 0f8e1d8b239 is described below commit 0f8e1d8b239191fc91d7612d5fc5003ead5df2aa Author: Zhengqiang Duan <duanzhengqi...@apache.org> AuthorDate: Tue Dec 13 14:50:17 2022 +0800 Fix create view index out of range exception when view contains set operator (#22846) --- .../sql/common/extractor/TableExtractor.java | 2 +- .../sql/common/extractor/TableExtractorTest.java | 24 ++++++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/sql-parser/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/extractor/TableExtractor.java b/sql-parser/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/extractor/TableExtractor.java index 3a8f0dbae6e..534b2ee5e92 100644 --- a/sql-parser/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/extractor/TableExtractor.java +++ b/sql-parser/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/extractor/TableExtractor.java @@ -74,7 +74,7 @@ public final class TableExtractor { * @param selectStatement select statement */ public void extractTablesFromSelect(final SelectStatement selectStatement) { - if (null != selectStatement.getFrom()) { + if (null != selectStatement.getFrom() && !selectStatement.getCombine().isPresent()) { extractTablesFromTableSegment(selectStatement.getFrom()); } if (selectStatement.getWhere().isPresent()) { diff --git a/sql-parser/statement/src/test/java/org/apache/shardingsphere/sql/parser/sql/common/extractor/TableExtractorTest.java b/sql-parser/statement/src/test/java/org/apache/shardingsphere/sql/parser/sql/common/extractor/TableExtractorTest.java index febb3d8764f..8af6ba6045d 100644 --- a/sql-parser/statement/src/test/java/org/apache/shardingsphere/sql/parser/sql/common/extractor/TableExtractorTest.java +++ b/sql-parser/statement/src/test/java/org/apache/shardingsphere/sql/parser/sql/common/extractor/TableExtractorTest.java @@ -18,15 +18,18 @@ package org.apache.shardingsphere.sql.parser.sql.common.extractor; import org.apache.shardingsphere.sql.parser.sql.common.enums.AggregationType; +import org.apache.shardingsphere.sql.parser.sql.common.enums.CombineType; import org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.routine.RoutineBodySegment; import org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.routine.ValidStatementSegment; import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.assignment.AssignmentSegment; import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.assignment.ColumnAssignmentSegment; import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.column.ColumnSegment; import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.column.OnDuplicateKeyColumnsSegment; +import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.combine.CombineSegment; import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.simple.LiteralExpressionSegment; import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.AggregationProjectionSegment; 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.predicate.LockSegment; import org.apache.shardingsphere.sql.parser.sql.common.segment.generic.OwnerSegment; import org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SimpleTableSegment; @@ -119,4 +122,25 @@ public final class TableExtractorTest { assertTrue(actualTableName.isPresent()); assertThat(actualTableName.get(), is(expectedTableName)); } + + @Test + public void assertExtractTablesFromCombineSegment() { + MySQLSelectStatement selectStatement = createSelectStatement("t_order"); + selectStatement.setCombine(new CombineSegment(0, 0, createSelectStatement("t_order"), CombineType.UNION, createSelectStatement("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 static MySQLSelectStatement createSelectStatement(final String tableName) { + MySQLSelectStatement result = new MySQLSelectStatement(); + ProjectionsSegment projections = new ProjectionsSegment(0, 0); + projections.getProjections().add(new ShorthandProjectionSegment(0, 0)); + result.setProjections(projections); + result.setFrom(new SimpleTableSegment(new TableNameSegment(0, 0, new IdentifierValue(tableName)))); + return result; + } }