This is an automated email from the ASF dual-hosted git repository.

duanzhengqiang 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 9255267  ParameterMarkerExpressionSegment cannot be cast to class 
LiteralExpressionSegment (#13064)
9255267 is described below

commit 925526789e37c7737104bb69739fb65cc564e814
Author: liguoping <[email protected]>
AuthorDate: Mon Oct 18 12:52:14 2021 +0800

    ParameterMarkerExpressionSegment cannot be cast to class 
LiteralExpressionSegment (#13064)
    
    * ParameterMarkerExpressionSegment cannot be cast to class 
LiteralExpressionSegment
    
    * ParameterMarkerProjection describe
    
    * unit test
---
 .../select/projection/engine/ProjectionEngine.java |  9 +++++
 .../projection/impl/ParameterMarkerProjection.java | 44 +++++++++++++++++-----
 .../projection/engine/ProjectionEngineTest.java    | 12 ++++++
 .../statement/impl/MySQLStatementSQLVisitor.java   |  2 +
 .../impl/SQL92DMLStatementSQLVisitor.java          |  6 +++
 .../impl/SQLServerDMLStatementSQLVisitor.java      |  6 +++
 .../simple/ParameterMarkerExpressionSegment.java   | 15 +++++++-
 7 files changed, 83 insertions(+), 11 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 d4f312c..b7dc0a9 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
@@ -24,11 +24,13 @@ import 
org.apache.shardingsphere.infra.binder.segment.select.projection.impl.Agg
 import 
org.apache.shardingsphere.infra.binder.segment.select.projection.impl.AggregationProjection;
 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.ParameterMarkerProjection;
 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.database.type.DatabaseType;
 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.expr.simple.ParameterMarkerExpressionSegment;
 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;
@@ -90,9 +92,16 @@ public final class ProjectionEngine {
         if (projectionSegment instanceof SubqueryProjectionSegment) {
             return Optional.of(createProjection((SubqueryProjectionSegment) 
projectionSegment));
         }
+        if (projectionSegment instanceof ParameterMarkerExpressionSegment) {
+            return 
Optional.of(createProjection((ParameterMarkerExpressionSegment) 
projectionSegment));
+        }
         // TODO subquery
         return Optional.empty();
     }
+
+    private ParameterMarkerProjection createProjection(final 
ParameterMarkerExpressionSegment projectionSegment) {
+        return new 
ParameterMarkerProjection(projectionSegment.getParameterMarkerIndex(), 
projectionSegment.getAlias().orElse(null));
+    }
     
     private SubqueryProjection createProjection(final 
SubqueryProjectionSegment projectionSegment) {
         return new SubqueryProjection(projectionSegment.getText(), 
projectionSegment.getAlias().orElse(null));
diff --git 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/expr/simple/ParameterMarkerExpressionSegment.java
 
b/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/projection/impl/ParameterMarkerProjection.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/expr/simple/ParameterMarkerExpressionSegment.java
copy to 
shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/projection/impl/ParameterMarkerProjection.java
index 2cd3fbd..305fc80 100644
--- 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/expr/simple/ParameterMarkerExpressionSegment.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/projection/impl/ParameterMarkerProjection.java
@@ -15,26 +15,50 @@
  * limitations under the License.
  */
 
-package 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.simple;
+package org.apache.shardingsphere.infra.binder.segment.select.projection.impl;
 
 import lombok.EqualsAndHashCode;
 import lombok.Getter;
 import lombok.RequiredArgsConstructor;
 import lombok.ToString;
-import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.ProjectionSegment;
+import 
org.apache.shardingsphere.infra.binder.segment.select.projection.Projection;
+
+import java.util.Optional;
 
 /**
- * Parameter marker expression segment.
+ * ParameterMarker projection.
  */
 @RequiredArgsConstructor
 @Getter
-@ToString
 @EqualsAndHashCode
-public class ParameterMarkerExpressionSegment implements 
SimpleExpressionSegment, ProjectionSegment {
-    
-    private final int startIndex;
-    
-    private final int stopIndex;
-    
+@ToString
+public final class ParameterMarkerProjection implements Projection {
+
     private final int parameterMarkerIndex;
+
+    private final String alias;
+
+    @Override
+    public String getExpression() {
+        return String.valueOf(parameterMarkerIndex);
+    }
+
+    @Override
+    public String getColumnLabel() {
+        return getAlias().orElse(String.valueOf(parameterMarkerIndex));
+    }
+
+    @Override
+    public Optional<String> getAlias() {
+        return Optional.ofNullable(alias);
+    }
+
+    /**
+     * Get expression with alias.
+     *
+     * @return expression with alias
+     */
+    public String getExpressionWithAlias() {
+        return getExpression() + (null == alias ? "" : " AS " + alias);
+    }
 }
diff --git 
a/shardingsphere-infra/shardingsphere-infra-binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/select/projection/engine/ProjectionEngineTest.java
 
b/shardingsphere-infra/shardingsphere-infra-binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/select/projection/engine/ProjectionEngineTest.java
index 6d48084..137f478 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/select/projection/engine/ProjectionEngineTest.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/select/projection/engine/ProjectionEngineTest.java
@@ -22,11 +22,13 @@ import 
org.apache.shardingsphere.infra.binder.segment.select.projection.impl.Agg
 import 
org.apache.shardingsphere.infra.binder.segment.select.projection.impl.AggregationProjection;
 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.ParameterMarkerProjection;
 import 
org.apache.shardingsphere.infra.binder.segment.select.projection.impl.ShorthandProjection;
 import org.apache.shardingsphere.infra.database.type.DatabaseType;
 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.column.ColumnSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.simple.ParameterMarkerExpressionSegment;
 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;
@@ -141,4 +143,14 @@ public final class ProjectionEngineTest {
         assertTrue(actual.isPresent());
         assertThat(actual.get(), instanceOf(AggregationProjection.class));
     }
+
+    @Test
+    public void 
assertCreateProjectionWhenProjectionSegmentInstanceOfParameterMarkerExpressionSegment()
 {
+        ParameterMarkerExpressionSegment parameterMarkerExpressionSegment = 
new ParameterMarkerExpressionSegment(7, 7, 0);
+        parameterMarkerExpressionSegment.setAlias(new AliasSegment(0, 0, new 
IdentifierValue("alias")));
+        Optional<Projection> actual = new ProjectionEngine(schema, 
databaseType).createProjection(mock(TableSegment.class), 
parameterMarkerExpressionSegment);
+        assertTrue(actual.isPresent());
+        assertThat(actual.get(), instanceOf(ParameterMarkerProjection.class));
+        assertThat(actual.get().getAlias().orElse(null), is("alias"));
+    }
 }
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 72d8c9a..351e26f 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
@@ -1310,6 +1310,8 @@ public abstract class MySQLStatementSQLVisitor extends 
MySQLStatementBaseVisitor
             return result;
         }
         if (projection instanceof ParameterMarkerExpressionSegment) {
+            ParameterMarkerExpressionSegment result = 
(ParameterMarkerExpressionSegment) projection;
+            result.setAlias(alias);
             return projection;
         }
         LiteralExpressionSegment column = (LiteralExpressionSegment) 
projection;
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 d9b8f6f..c2f3951f 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
@@ -65,6 +65,7 @@ import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.BinaryOp
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.ExpressionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.complex.CommonExpressionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.simple.LiteralExpressionSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.simple.ParameterMarkerExpressionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.subquery.SubqueryExpressionSegment;
 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;
@@ -343,6 +344,11 @@ public final class SQL92DMLStatementSQLVisitor extends 
SQL92StatementSQLVisitor
             result.setAlias(alias);
             return result;
         }
+        if (projection instanceof ParameterMarkerExpressionSegment) {
+            ParameterMarkerExpressionSegment result = 
(ParameterMarkerExpressionSegment) projection;
+            result.setAlias(alias);
+            return projection;
+        }
         LiteralExpressionSegment column = (LiteralExpressionSegment) 
projection;
         ExpressionProjectionSegment result = null == alias ? new 
ExpressionProjectionSegment(column.getStartIndex(), column.getStopIndex(), 
String.valueOf(column.getLiterals()))
                 : new ExpressionProjectionSegment(column.getStartIndex(), 
ctx.alias().stop.getStopIndex(), String.valueOf(column.getLiterals()));
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 0da1074..d925a5f 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
@@ -67,6 +67,7 @@ import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.Expressi
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.complex.CommonExpressionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.complex.CommonTableExpressionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.simple.LiteralExpressionSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.simple.ParameterMarkerExpressionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.subquery.SubqueryExpressionSegment;
 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;
@@ -422,6 +423,11 @@ public final class SQLServerDMLStatementSQLVisitor extends 
SQLServerStatementSQL
             result.setAlias(alias);
             return result;
         }
+        if (projection instanceof ParameterMarkerExpressionSegment) {
+            ParameterMarkerExpressionSegment result = 
(ParameterMarkerExpressionSegment) projection;
+            result.setAlias(alias);
+            return projection;
+        }
         LiteralExpressionSegment column = (LiteralExpressionSegment) 
projection;
         ExpressionProjectionSegment result = null == alias ? new 
ExpressionProjectionSegment(column.getStartIndex(), column.getStopIndex(), 
String.valueOf(column.getLiterals()))
                 : new ExpressionProjectionSegment(column.getStartIndex(), 
ctx.alias().stop.getStopIndex(), String.valueOf(column.getLiterals()));
diff --git 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/expr/simple/ParameterMarkerExpressionSegment.java
 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/expr/simple/ParameterMarkerExpressionSegment.java
index 2cd3fbd..1cbd810 100644
--- 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/expr/simple/ParameterMarkerExpressionSegment.java
+++ 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/expr/simple/ParameterMarkerExpressionSegment.java
@@ -20,8 +20,13 @@ package 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.simple;
 import lombok.EqualsAndHashCode;
 import lombok.Getter;
 import lombok.RequiredArgsConstructor;
+import lombok.Setter;
 import lombok.ToString;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.ProjectionSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.AliasAvailable;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.AliasSegment;
+
+import java.util.Optional;
 
 /**
  * Parameter marker expression segment.
@@ -30,11 +35,19 @@ import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.Projecti
 @Getter
 @ToString
 @EqualsAndHashCode
-public class ParameterMarkerExpressionSegment implements 
SimpleExpressionSegment, ProjectionSegment {
+public class ParameterMarkerExpressionSegment implements 
SimpleExpressionSegment, ProjectionSegment, AliasAvailable {
     
     private final int startIndex;
     
     private final int stopIndex;
     
     private final int parameterMarkerIndex;
+
+    @Setter
+    private AliasSegment alias;
+
+    @Override
+    public Optional<String> getAlias() {
+        return null == alias ? Optional.empty() : 
Optional.ofNullable(alias.getIdentifier().getValue());
+    }
 }

Reply via email to