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 3d6efdc fix error when execute select statement with order by
expression (#11339)
3d6efdc is described below
commit 3d6efdce5ee1e4f4c4cb7d63fe4028e034449141
Author: Zhengqiang Duan <[email protected]>
AuthorDate: Thu Jul 15 12:04:08 2021 +0800
fix error when execute select statement with order by expression (#11339)
---
.../engine/ProjectionsContextEngine.java | 16 ++++++-------
.../engine/ProjectionsContextEngineTest.java | 28 ++++++++++++++++++++--
2 files changed, 34 insertions(+), 10 deletions(-)
diff --git
a/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/projection/engine/ProjectionsContextEngine.java
b/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/projection/engine/ProjectionsContextEngine.java
index 1ae250e..7e94462 100644
---
a/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/projection/engine/ProjectionsContextEngine.java
+++
b/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/projection/engine/ProjectionsContextEngine.java
@@ -30,6 +30,7 @@ import
org.apache.shardingsphere.infra.metadata.schema.ShardingSphereSchema;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.ProjectionSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.ProjectionsSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.order.item.ColumnOrderByItemSegment;
+import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.order.item.ExpressionOrderByItemSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.order.item.IndexOrderByItemSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.order.item.OrderByItemSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.order.item.TextOrderByItemSegment;
@@ -101,15 +102,14 @@ public final class ProjectionsContextEngine {
}
private boolean containsProjection(final Collection<Projection>
projections, final OrderByItemSegment orderByItemSegment, final
Collection<SimpleTableSegment> tables) {
- return orderByItemSegment instanceof IndexOrderByItemSegment
- || containsItemInShorthandProjection(projections,
orderByItemSegment, tables) || containsProjection(projections,
orderByItemSegment);
+ return containsItemInShorthandProjection(projections,
orderByItemSegment, tables) || containsProjection(projections,
orderByItemSegment);
}
private boolean containsProjection(final Collection<Projection>
projections, final OrderByItemSegment orderItem) {
+ if (orderItem instanceof IndexOrderByItemSegment) {
+ return true;
+ }
for (Projection each : projections) {
- if (orderItem instanceof IndexOrderByItemSegment) {
- return true;
- }
if (isSameAlias(each, (TextOrderByItemSegment) orderItem) ||
isSameQualifiedName(each, (TextOrderByItemSegment) orderItem)) {
return true;
}
@@ -118,12 +118,12 @@ public final class ProjectionsContextEngine {
}
private boolean containsItemInShorthandProjection(final
Collection<Projection> projections, final OrderByItemSegment
orderByItemSegment, final Collection<SimpleTableSegment> tables) {
- return isUnqualifiedShorthandProjection(projections) ||
containsItemWithOwnerInShorthandProjections(projections, orderByItemSegment,
tables)
+ return isUnqualifiedShorthandProjection(projections,
orderByItemSegment) || containsItemWithOwnerInShorthandProjections(projections,
orderByItemSegment, tables)
|| containsItemWithoutOwnerInShorthandProjections(projections,
orderByItemSegment, tables);
}
- private boolean isUnqualifiedShorthandProjection(final
Collection<Projection> projections) {
- if (1 != projections.size()) {
+ private boolean isUnqualifiedShorthandProjection(final
Collection<Projection> projections, final OrderByItemSegment
orderByItemSegment) {
+ if (1 != projections.size() || orderByItemSegment instanceof
ExpressionOrderByItemSegment) {
return false;
}
Projection projection = projections.iterator().next();
diff --git
a/shardingsphere-infra/shardingsphere-infra-binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/select/projection/engine/ProjectionsContextEngineTest.java
b/shardingsphere-infra/shardingsphere-infra-binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/select/projection/engine/ProjectionsContextEngineTest.java
index 91dcf51..6fb782a 100644
---
a/shardingsphere-infra/shardingsphere-infra-binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/select/projection/engine/ProjectionsContextEngineTest.java
+++
b/shardingsphere-infra/shardingsphere-infra-binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/select/projection/engine/ProjectionsContextEngineTest.java
@@ -47,19 +47,27 @@ import
org.apache.shardingsphere.sql.parser.sql.dialect.statement.postgresql.dml
import
org.apache.shardingsphere.sql.parser.sql.dialect.statement.sql92.dml.SQL92SelectStatement;
import
org.apache.shardingsphere.sql.parser.sql.dialect.statement.sqlserver.dml.SQLServerSelectStatement;
import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnitRunner;
+import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
+import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
+@RunWith(MockitoJUnitRunner.class)
public final class ProjectionsContextEngineTest {
- private final ShardingSphereSchema schema = new
ShardingSphereSchema(Collections.emptyMap());
+ @Mock
+ private ShardingSphereSchema schema;
@Test
public void assertProjectionsContextCreatedProperlyForMySQL() {
@@ -221,8 +229,9 @@ public final class ProjectionsContextEngineTest {
private SelectStatementContext createSelectStatementContext(final
SelectStatement selectStatement) {
Map<String, ShardingSphereMetaData> metaDataMap = new HashMap<>();
ShardingSphereMetaData metaData = mock(ShardingSphereMetaData.class);
- when(metaData.getSchema()).thenReturn(schema);
metaDataMap.put("schema", metaData);
+ when(metaData.getSchema()).thenReturn(schema);
+
when(schema.getAllColumnNames("t_order")).thenReturn(Arrays.asList("order_id",
"content"));
return new SelectStatementContext(metaDataMap,
Collections.emptyList(), selectStatement, "schema");
}
@@ -449,4 +458,19 @@ public final class ProjectionsContextEngineTest {
.createProjectionsContext(selectStatementContext.getFromSimpleTableSegments(),
projectionsSegment, groupByContext, new OrderByContext(Collections.emptyList(),
false));
assertNotNull(actual);
}
+
+ @Test
+ public void assertCreateProjectionsContextWithOrderByExpressionForMySQL() {
+ SelectStatement selectStatement = new MySQLSelectStatement();
+ ProjectionsSegment projectionsSegment = new ProjectionsSegment(0, 0);
+
projectionsSegment.getProjections().addAll(Collections.singletonList(new
ShorthandProjectionSegment(0, 0)));
+ selectStatement.setProjections(projectionsSegment);
+ selectStatement.setFrom(new SimpleTableSegment(new TableNameSegment(0,
0, new IdentifierValue("t_order"))));
+ OrderByItem orderByItem = new OrderByItem(new
ExpressionOrderByItemSegment(0, 0, "id + 1", OrderDirection.ASC));
+ OrderByContext orderByContext = new
OrderByContext(Collections.singleton(orderByItem), false);
+ SelectStatementContext selectStatementContext =
createSelectStatementContext(selectStatement);
+ ProjectionsContext actual = new ProjectionsContextEngine(schema)
+
.createProjectionsContext(selectStatementContext.getFromSimpleTableSegments(),
projectionsSegment, new GroupByContext(Collections.emptyList()),
orderByContext);
+ assertThat(actual.getProjections().size(), is(2));
+ }
}