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>

Reply via email to