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 a86cc42 fix select lost subquery projection (#10658)
a86cc42 is described below
commit a86cc42072b9a02367f925d704872fca25c3434a
Author: Zhengqiang Duan <[email protected]>
AuthorDate: Fri Jun 4 20:39:44 2021 +0800
fix select lost subquery projection (#10658)
* fix select lost subquery projection
* fix checkstyle
---
.../select/projection/engine/ProjectionEngine.java | 9 ++++++
.../select/projection/impl/SubqueryProjection.java | 31 ++++++++------------
.../engine/PaginationContextEngineTest.java | 2 +-
.../statement/impl/MySQLStatementSQLVisitor.java | 14 ++++++---
.../impl/OracleDMLStatementSQLVisitor.java | 5 +++-
.../impl/PostgreSQLStatementSQLVisitor.java | 3 +-
.../impl/SQL92DMLStatementSQLVisitor.java | 5 +++-
.../impl/SQLServerDMLStatementSQLVisitor.java | 5 +++-
.../dml/item/SubqueryProjectionSegment.java | 2 ++
.../segment/projection/ProjectionAssert.java | 33 +++++++++++++++-------
.../impl/subquery/ExpectedSubqueryProjection.java | 6 ++++
.../main/resources/case/dml/select-sub-query.xml | 29 +++++++++++++++----
.../sql/supported/dml/select-sub-query.xml | 3 +-
13 files changed, 101 insertions(+), 46 deletions(-)
diff --git
a/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/projection/engine/ProjectionEngine.java
b/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/projection/engine/ProjectionEngine.java
index 48f6ec8..d4f930f 100644
---
a/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/projection/engine/ProjectionEngine.java
+++
b/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/projection/engine/ProjectionEngine.java
@@ -25,6 +25,7 @@ import
org.apache.shardingsphere.infra.binder.segment.select.projection.impl.Agg
import
org.apache.shardingsphere.infra.binder.segment.select.projection.impl.ColumnProjection;
import
org.apache.shardingsphere.infra.binder.segment.select.projection.impl.ExpressionProjection;
import
org.apache.shardingsphere.infra.binder.segment.select.projection.impl.ShorthandProjection;
+import
org.apache.shardingsphere.infra.binder.segment.select.projection.impl.SubqueryProjection;
import org.apache.shardingsphere.infra.metadata.schema.ShardingSphereSchema;
import
org.apache.shardingsphere.sql.parser.sql.common.constant.AggregationType;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.AggregationDistinctProjectionSegment;
@@ -33,6 +34,7 @@ import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.ColumnPr
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.ExpressionProjectionSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.ProjectionSegment;
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.generic.table.SimpleTableSegment;
import java.util.Collection;
@@ -76,10 +78,17 @@ public final class ProjectionEngine {
if (projectionSegment instanceof AggregationProjectionSegment) {
return Optional.of(createProjection((AggregationProjectionSegment)
projectionSegment));
}
+ if (projectionSegment instanceof SubqueryProjectionSegment) {
+ return Optional.of(createProjection((SubqueryProjectionSegment)
projectionSegment));
+ }
// TODO subquery
return Optional.empty();
}
+ private SubqueryProjection createProjection(final
SubqueryProjectionSegment projectionSegment) {
+ return new SubqueryProjection(projectionSegment.getText(),
projectionSegment.getAlias().orElse(null));
+ }
+
private ShorthandProjection createProjection(final
Collection<SimpleTableSegment> tableSegments, final ShorthandProjectionSegment
projectionSegment) {
String owner = projectionSegment.getOwner().map(ownerSegment ->
ownerSegment.getIdentifier().getValue()).orElse(null);
Collection<ColumnProjection> shorthandColumns =
getShorthandColumns(tableSegments, owner);
diff --git
a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/item/SubqueryProjectionSegment.java
b/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/projection/impl/SubqueryProjection.java
similarity index 53%
copy from
shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/item/SubqueryProjectionSegment.java
copy to
shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/projection/impl/SubqueryProjection.java
index ea73d0f..ccb98bb 100644
---
a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/item/SubqueryProjectionSegment.java
+++
b/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/projection/impl/SubqueryProjection.java
@@ -15,45 +15,36 @@
* limitations under the License.
*/
-package org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item;
+package org.apache.shardingsphere.infra.binder.segment.select.projection.impl;
+import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
-import lombok.Setter;
import lombok.ToString;
-import
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.AliasAvailable;
-import
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.AliasSegment;
-import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.subquery.SubquerySegment;
+import
org.apache.shardingsphere.infra.binder.segment.select.projection.Projection;
import java.util.Optional;
/**
- * Subquery projection segment.
+ * Subquery projection.
*/
@RequiredArgsConstructor
@Getter
+@EqualsAndHashCode
@ToString
-public final class SubqueryProjectionSegment implements ProjectionSegment,
AliasAvailable {
+public final class SubqueryProjection implements Projection {
- private final SubquerySegment subquery;
+ private final String expression;
- @Setter
- private AliasSegment alias;
+ private final String alias;
@Override
public Optional<String> getAlias() {
- return null == alias ? Optional.empty() :
Optional.ofNullable(alias.getIdentifier().getValue());
+ return Optional.ofNullable(alias);
}
@Override
- public int getStartIndex() {
- return subquery.getStartIndex();
- }
-
- @Override
- public int getStopIndex() {
- return subquery.getStopIndex();
- // TODO
- // return null == alias ? alias.getStopIndex() : column.getStopIndex();
+ public String getColumnLabel() {
+ return getAlias().orElse(expression);
}
}
diff --git
a/shardingsphere-infra/shardingsphere-infra-binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/select/pagination/engine/PaginationContextEngineTest.java
b/shardingsphere-infra/shardingsphere-infra-binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/select/pagination/engine/PaginationContextEngineTest.java
index b67bfc6..4fcfe7e 100644
---
a/shardingsphere-infra/shardingsphere-infra-binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/select/pagination/engine/PaginationContextEngineTest.java
+++
b/shardingsphere-infra/shardingsphere-infra-binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/select/pagination/engine/PaginationContextEngineTest.java
@@ -90,7 +90,7 @@ public final class PaginationContextEngineTest {
subquerySelectStatement.getProjections().getProjections().add(new
TopProjectionSegment(0, 10, null, "rowNumberAlias"));
SQLServerSelectStatement selectStatement = new
SQLServerSelectStatement();
selectStatement.setProjections(new ProjectionsSegment(0, 0));
- selectStatement.getProjections().getProjections().add(new
SubqueryProjectionSegment(new SubquerySegment(0, 0, subquerySelectStatement)));
+ selectStatement.getProjections().getProjections().add(new
SubqueryProjectionSegment(new SubquerySegment(0, 0, subquerySelectStatement),
""));
PaginationContext paginationContext = new
PaginationContextEngine().createPaginationContext(selectStatement, null,
Collections.emptyList());
assertFalse(paginationContext.getOffsetSegment().isPresent());
assertFalse(paginationContext.getRowCountSegment().isPresent());
diff --git
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/impl/MySQLStatementSQLVisitor.java
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/impl/MySQLStatementSQLVisitor.java
index 19841ec..172b27a 100644
---
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/impl/MySQLStatementSQLVisitor.java
+++
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/impl/MySQLStatementSQLVisitor.java
@@ -40,9 +40,9 @@ import
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.CharFun
import
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.ColumnNameContext;
import
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.ColumnNamesContext;
import
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.ColumnRefContext;
+import
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.ConstraintNameContext;
import
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.ConvertFunctionContext;
import
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.DataTypeContext;
-import
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.ConstraintNameContext;
import
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.DeleteContext;
import
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.DuplicateSpecificationContext;
import
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.EscapedTableReferenceContext;
@@ -1208,12 +1208,16 @@ public abstract class MySQLStatementSQLVisitor extends
MySQLStatementBaseVisitor
return result;
}
if (exprProjection instanceof SubquerySegment) {
- SubqueryProjectionSegment result = new
SubqueryProjectionSegment((SubquerySegment) exprProjection);
+ SubquerySegment subquerySegment = (SubquerySegment) exprProjection;
+ String text = ctx.start.getInputStream().getText(new
Interval(subquerySegment.getStartIndex(), subquerySegment.getStopIndex()));
+ SubqueryProjectionSegment result = new
SubqueryProjectionSegment((SubquerySegment) exprProjection, text);
result.setAlias(alias);
return result;
}
if (exprProjection instanceof ExistsSubqueryExpression) {
- SubqueryProjectionSegment result = new
SubqueryProjectionSegment(((ExistsSubqueryExpression)
exprProjection).getSubquery());
+ ExistsSubqueryExpression existsSubqueryExpression =
(ExistsSubqueryExpression) exprProjection;
+ String text = ctx.start.getInputStream().getText(new
Interval(existsSubqueryExpression.getStartIndex(),
existsSubqueryExpression.getStopIndex()));
+ SubqueryProjectionSegment result = new
SubqueryProjectionSegment(((ExistsSubqueryExpression)
exprProjection).getSubquery(), text);
result.setAlias(alias);
return result;
}
@@ -1247,7 +1251,9 @@ public abstract class MySQLStatementSQLVisitor extends
MySQLStatementBaseVisitor
return result;
}
if (projection instanceof SubqueryExpressionSegment) {
- SubqueryProjectionSegment result = new
SubqueryProjectionSegment(((SubqueryExpressionSegment)
projection).getSubquery());
+ SubqueryExpressionSegment subqueryExpressionSegment =
(SubqueryExpressionSegment) projection;
+ String text = ctx.start.getInputStream().getText(new
Interval(subqueryExpressionSegment.getStartIndex(),
subqueryExpressionSegment.getStopIndex()));
+ SubqueryProjectionSegment result = new
SubqueryProjectionSegment(subqueryExpressionSegment.getSubquery(), text);
result.setAlias(alias);
return result;
}
diff --git
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/impl/OracleDMLStatementSQLVisitor.java
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/impl/OracleDMLStatementSQLVisitor.java
index 1228b1b..8cbfc6c 100644
---
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/impl/OracleDMLStatementSQLVisitor.java
+++
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/impl/OracleDMLStatementSQLVisitor.java
@@ -18,6 +18,7 @@
package org.apache.shardingsphere.sql.parser.oracle.visitor.statement.impl;
import lombok.NoArgsConstructor;
+import org.antlr.v4.runtime.misc.Interval;
import org.apache.shardingsphere.sql.parser.api.visitor.ASTNode;
import
org.apache.shardingsphere.sql.parser.api.visitor.operation.SQLStatementVisitor;
import org.apache.shardingsphere.sql.parser.api.visitor.type.DMLSQLVisitor;
@@ -406,7 +407,9 @@ public final class OracleDMLStatementSQLVisitor extends
OracleStatementSQLVisito
return result;
}
if (projection instanceof SubqueryExpressionSegment) {
- SubqueryProjectionSegment result = new
SubqueryProjectionSegment(((SubqueryExpressionSegment)
projection).getSubquery());
+ SubqueryExpressionSegment subqueryExpressionSegment =
(SubqueryExpressionSegment) projection;
+ String text = ctx.start.getInputStream().getText(new
Interval(subqueryExpressionSegment.getStartIndex(),
subqueryExpressionSegment.getStopIndex()));
+ SubqueryProjectionSegment result = new
SubqueryProjectionSegment(((SubqueryExpressionSegment)
projection).getSubquery(), text);
result.setAlias(alias);
return result;
}
diff --git
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-postgresql/src/main/java/org/apache/shardingsphere/sql/parser/postgresql/visitor/statement/impl/PostgreSQLStatementSQLVisitor.java
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-postgresql/src/main/java/org/apache/shardingsphere/sql/parser/postgresql/visitor/statement/impl/PostgreSQLStatementSQLVisitor.java
index 391ebbf..9e56ac7 100644
---
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-postgresql/src/main/java/org/apache/shardingsphere/sql/parser/postgresql/visitor/statement/impl/PostgreSQLStatementSQLVisitor.java
+++
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-postgresql/src/main/java/org/apache/shardingsphere/sql/parser/postgresql/visitor/statement/impl/PostgreSQLStatementSQLVisitor.java
@@ -881,7 +881,8 @@ public abstract class PostgreSQLStatementSQLVisitor extends
PostgreSQLStatementB
if (null != expr.cExpr() && null != expr.cExpr().selectWithParens()) {
PostgreSQLSelectStatement select = (PostgreSQLSelectStatement)
visit(expr.cExpr().selectWithParens());
SubquerySegment subquery = new
SubquerySegment(expr.cExpr().selectWithParens().start.getStartIndex(),
expr.cExpr().selectWithParens().stop.getStopIndex(), select);
- SubqueryProjectionSegment projection = new
SubqueryProjectionSegment(subquery);
+ String text = ctx.start.getInputStream().getText(new
Interval(subquery.getStartIndex(), subquery.getStopIndex()));
+ SubqueryProjectionSegment projection = new
SubqueryProjectionSegment(subquery, text);
AliasSegment alias = null != ctx.identifier()
? new AliasSegment(ctx.identifier().start.getStartIndex(),
ctx.identifier().stop.getStopIndex(), new
IdentifierValue(ctx.identifier().getText())) : null;
projection.setAlias(alias);
diff --git
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sql92/src/main/java/org/apache/shardingsphere/sql/parser/sql92/visitor/statement/impl/SQL92DMLStatementSQLVisitor.java
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sql92/src/main/java/org/apache/shardingsphere/sql/parser/sql92/visitor/statement/impl/SQL92DMLStatementSQLVisitor.java
index ce9b0d2..b34b770 100644
---
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sql92/src/main/java/org/apache/shardingsphere/sql/parser/sql92/visitor/statement/impl/SQL92DMLStatementSQLVisitor.java
+++
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sql92/src/main/java/org/apache/shardingsphere/sql/parser/sql92/visitor/statement/impl/SQL92DMLStatementSQLVisitor.java
@@ -18,6 +18,7 @@
package org.apache.shardingsphere.sql.parser.sql92.visitor.statement.impl;
import lombok.NoArgsConstructor;
+import org.antlr.v4.runtime.misc.Interval;
import org.apache.shardingsphere.sql.parser.api.visitor.ASTNode;
import
org.apache.shardingsphere.sql.parser.api.visitor.operation.SQLStatementVisitor;
import org.apache.shardingsphere.sql.parser.api.visitor.type.DMLSQLVisitor;
@@ -324,7 +325,9 @@ public final class SQL92DMLStatementSQLVisitor extends
SQL92StatementSQLVisitor
return result;
}
if (projection instanceof SubqueryExpressionSegment) {
- SubqueryProjectionSegment result = new
SubqueryProjectionSegment(((SubqueryExpressionSegment)
projection).getSubquery());
+ SubqueryExpressionSegment subqueryExpressionSegment =
(SubqueryExpressionSegment) projection;
+ String text = ctx.start.getInputStream().getText(new
Interval(subqueryExpressionSegment.getStartIndex(),
subqueryExpressionSegment.getStopIndex()));
+ SubqueryProjectionSegment result = new
SubqueryProjectionSegment(((SubqueryExpressionSegment)
projection).getSubquery(), text);
result.setAlias(alias);
return result;
}
diff --git
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/statement/impl/SQLServerDMLStatementSQLVisitor.java
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/statement/impl/SQLServerDMLStatementSQLVisitor.java
index 1b6ae15..194b968 100644
---
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/statement/impl/SQLServerDMLStatementSQLVisitor.java
+++
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/statement/impl/SQLServerDMLStatementSQLVisitor.java
@@ -18,6 +18,7 @@
package org.apache.shardingsphere.sql.parser.sqlserver.visitor.statement.impl;
import lombok.NoArgsConstructor;
+import org.antlr.v4.runtime.misc.Interval;
import org.apache.shardingsphere.sql.parser.api.visitor.ASTNode;
import
org.apache.shardingsphere.sql.parser.api.visitor.operation.SQLStatementVisitor;
import org.apache.shardingsphere.sql.parser.api.visitor.type.DMLSQLVisitor;
@@ -526,7 +527,9 @@ public final class SQLServerDMLStatementSQLVisitor extends
SQLServerStatementSQL
return result;
}
if (projection instanceof SubqueryExpressionSegment) {
- SubqueryProjectionSegment result = new
SubqueryProjectionSegment(((SubqueryExpressionSegment)
projection).getSubquery());
+ SubqueryExpressionSegment subqueryExpressionSegment =
(SubqueryExpressionSegment) projection;
+ String text = ctx.start.getInputStream().getText(new
Interval(subqueryExpressionSegment.getStartIndex(),
subqueryExpressionSegment.getStopIndex()));
+ SubqueryProjectionSegment result = new
SubqueryProjectionSegment(((SubqueryExpressionSegment)
projection).getSubquery(), text);
result.setAlias(alias);
return result;
}
diff --git
a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/item/SubqueryProjectionSegment.java
b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/item/SubqueryProjectionSegment.java
index ea73d0f..7329db2 100644
---
a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/item/SubqueryProjectionSegment.java
+++
b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/item/SubqueryProjectionSegment.java
@@ -37,6 +37,8 @@ public final class SubqueryProjectionSegment implements
ProjectionSegment, Alias
private final SubquerySegment subquery;
+ private final String text;
+
@Setter
private AliasSegment alias;
diff --git
a/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/segment/projection/ProjectionAssert.java
b/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/segment/projection/ProjectionAssert.java
index c9cc51c..7e0e64f 100644
---
a/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/segment/projection/ProjectionAssert.java
+++
b/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/segment/projection/ProjectionAssert.java
@@ -19,9 +19,21 @@ package
org.apache.shardingsphere.test.sql.parser.parameterized.asserts.segment.
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
+import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.AggregationDistinctProjectionSegment;
+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.ExpressionProjectionSegment;
+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.item.ShorthandProjectionSegment;
+import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.SubqueryProjectionSegment;
+import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.pagination.rownum.NumberLiteralRowNumberValueSegment;
+import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.pagination.rownum.ParameterMarkerRowNumberValueSegment;
+import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.pagination.top.TopProjectionSegment;
import
org.apache.shardingsphere.test.sql.parser.parameterized.asserts.SQLCaseAssertContext;
import
org.apache.shardingsphere.test.sql.parser.parameterized.asserts.segment.SQLSegmentAssert;
import
org.apache.shardingsphere.test.sql.parser.parameterized.asserts.segment.owner.OwnerAssert;
+import
org.apache.shardingsphere.test.sql.parser.parameterized.asserts.statement.dml.impl.SelectStatementAssert;
import
org.apache.shardingsphere.test.sql.parser.parameterized.asserts.value.IdentifierValueAssert;
import
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.segment.impl.projection.ExpectedProjection;
import
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.segment.impl.projection.ExpectedProjections;
@@ -30,17 +42,8 @@ import
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain
import
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.segment.impl.projection.impl.column.ExpectedColumnProjection;
import
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.segment.impl.projection.impl.expression.ExpectedExpressionProjection;
import
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.segment.impl.projection.impl.shorthand.ExpectedShorthandProjection;
+import
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.segment.impl.projection.impl.subquery.ExpectedSubqueryProjection;
import
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.segment.impl.projection.impl.top.ExpectedTopProjection;
-import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.AggregationDistinctProjectionSegment;
-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.ExpressionProjectionSegment;
-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.item.ShorthandProjectionSegment;
-import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.pagination.rownum.NumberLiteralRowNumberValueSegment;
-import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.pagination.rownum.ParameterMarkerRowNumberValueSegment;
-import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.pagination.top.TopProjectionSegment;
import
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.sql.SQLCaseType;
import java.util.List;
@@ -102,10 +105,20 @@ public final class ProjectionAssert {
} else if (actual instanceof TopProjectionSegment) {
assertThat(assertContext.getText("Projection type assertion error:
"), expected, instanceOf(ExpectedTopProjection.class));
assertTopProjection(assertContext, (TopProjectionSegment) actual,
(ExpectedTopProjection) expected);
+ } else if (actual instanceof SubqueryProjectionSegment) {
+ assertThat(assertContext.getText("Projection type assertion error:
"), expected, instanceOf(ExpectedSubqueryProjection.class));
+ assertSubqueryProjection(assertContext,
(SubqueryProjectionSegment) actual, (ExpectedSubqueryProjection) expected);
}
SQLSegmentAssert.assertIs(assertContext, actual, expected);
}
+ private static void assertSubqueryProjection(final SQLCaseAssertContext
assertContext, final SubqueryProjectionSegment actual, final
ExpectedSubqueryProjection expected) {
+ assertThat(assertContext.getText("Subquery projection alias assertion
error: "), actual.getAlias().orElse(null), is(expected.getAlias()));
+ String expectedText = SQLCaseType.Literal ==
assertContext.getSqlCaseType() && null != expected.getLiteralText() ?
expected.getLiteralText() : expected.getText();
+ assertThat(assertContext.getText("Subquery projection text assertion
error: "), actual.getText(), is(expectedText));
+ SelectStatementAssert.assertIs(assertContext,
actual.getSubquery().getSelect(), expected.getSubquery().getSelectTestCases());
+ }
+
private static void assertShorthandProjection(final SQLCaseAssertContext
assertContext, final ShorthandProjectionSegment actual, final
ExpectedShorthandProjection expected) {
if (null != expected.getOwner()) {
assertTrue(assertContext.getText("Actual owner should exist."),
actual.getOwner().isPresent());
diff --git
a/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/jaxb/cases/domain/segment/impl/projection/impl/subquery/ExpectedSubqueryProjection.java
b/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/jaxb/cases/domain/segment/impl/projection/impl/subquery/ExpectedSubqueryProjection.java
index bea7a8a..dc8a13e 100644
---
a/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/jaxb/cases/domain/segment/impl/projection/impl/subquery/ExpectedSubqueryProjection.java
+++
b/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/jaxb/cases/domain/segment/impl/projection/impl/subquery/ExpectedSubqueryProjection.java
@@ -38,4 +38,10 @@ public final class ExpectedSubqueryProjection extends
AbstractExpectedDelimiterS
@XmlElement
private ExpectedSubquery subquery;
+
+ @XmlAttribute
+ private String text;
+
+ @XmlAttribute(name = "literal-text")
+ private String literalText;
}
diff --git
a/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/main/resources/case/dml/select-sub-query.xml
b/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/main/resources/case/dml/select-sub-query.xml
index 90cce5c..9620e91 100644
---
a/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/main/resources/case/dml/select-sub-query.xml
+++
b/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/main/resources/case/dml/select-sub-query.xml
@@ -23,11 +23,11 @@
</from>
<projections start-index="7" stop-index="33">
<column-projection name="order_id" start-index="7" stop-index="14"
/>
- <subquery-projection start-index="17" stop-index="26" alias="num">
+ <subquery-projection start-index="17" stop-index="26" alias="num"
text="(SELECT 1)" literal-text="(SELECT 1)">
<subquery>
<select>
<projections start-index="25" stop-index="25">
- <expression-projection start-index="25"
stop-index="25" />
+ <expression-projection start-index="25"
stop-index="25" text="1" />
</projections>
</select>
</subquery>
@@ -222,16 +222,33 @@
</where>
</select>
- <select sql-case-id="select_with_exists_sub_query_with_project">
+ <select sql-case-id="select_with_exists_sub_query_with_project_for_mysql">
<projections start-index="7" stop-index="36">
- <subquery-projection start-index="14" stop-index="36">
+ <subquery-projection start-index="14" stop-index="36" text="EXISTS
(SELECT 1 FROM t_order)" literal-text="EXISTS (SELECT 1 FROM t_order)">
<subquery start-index="15" stop-index="35">
<select>
<from>
<simple-table name="t_order" start-index="29"
stop-index="35" />
</from>
- <projections start-index="43" stop-index="43">
- <expression-projection start-index="43"
stop-index="43" text="1"/>
+ <projections start-index="22" stop-index="22">
+ <expression-projection start-index="22"
stop-index="22" text="1"/>
+ </projections>
+ </select>
+ </subquery>
+ </subquery-projection>
+ </projections>
+ </select>
+
+ <select
sql-case-id="select_with_exists_sub_query_with_project_for_postgresql">
+ <projections start-index="7" stop-index="36">
+ <subquery-projection start-index="14" stop-index="36"
text="(SELECT 1 FROM t_order)" literal-text="(SELECT 1 FROM t_order)">
+ <subquery start-index="15" stop-index="35">
+ <select>
+ <from>
+ <simple-table name="t_order" start-index="29"
stop-index="35" />
+ </from>
+ <projections start-index="22" stop-index="22">
+ <expression-projection start-index="22"
stop-index="22" text="1"/>
</projections>
</select>
</subquery>
diff --git
a/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/main/resources/sql/supported/dml/select-sub-query.xml
b/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/main/resources/sql/supported/dml/select-sub-query.xml
index a189834..a9eb67f 100644
---
a/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/main/resources/sql/supported/dml/select-sub-query.xml
+++
b/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/main/resources/sql/supported/dml/select-sub-query.xml
@@ -22,5 +22,6 @@
<sql-case id="select_with_equal_subquery" value="SELECT * FROM t_order
WHERE user_id = (SELECT user_id FROM t_order_item WHERE id = 10)"
db-types="MySQL" />
<sql-case id="select_with_in_subquery" value="SELECT * FROM t_order WHERE
user_id IN (SELECT user_id FROM t_order_item WHERE id IN (10, 11))"
db-types="MySQL" />
<sql-case id="select_with_between_subquery" value="SELECT * FROM t_order
WHERE user_id BETWEEN (SELECT user_id FROM t_order_item WHERE order_id = 10)
AND ?" db-types="MySQL" />
- <sql-case id="select_with_exists_sub_query_with_project" value="SELECT
EXISTS (SELECT 1 FROM t_order)" db-types="MySQL,PostgreSQL" />
+ <sql-case id="select_with_exists_sub_query_with_project_for_mysql"
value="SELECT EXISTS (SELECT 1 FROM t_order)" db-types="MySQL" />
+ <sql-case id="select_with_exists_sub_query_with_project_for_postgresql"
value="SELECT EXISTS (SELECT 1 FROM t_order)" db-types="PostgreSQL" />
</sql-cases>