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 304ee31  Add ExpressionProjectionSegment field (#11394)
304ee31 is described below

commit 304ee31241da580b1eea7543a86978bd7672a6c6
Author: tuichenchuxin <[email protected]>
AuthorDate: Tue Jul 20 11:09:39 2021 +0800

    Add ExpressionProjectionSegment field (#11394)
    
    * Add ExpressionProjectionSegment field
    Change orderByItemExpressionSegment Assert location
    Add test case
    
    * Add ExpressionProjectionSegment field
    Change orderByItemExpressionSegment Assert location
    Add test case
---
 .../statement/impl/MySQLStatementSQLVisitor.java   | 10 +++----
 .../dml/item/ExpressionProjectionSegment.java      | 11 ++++++++
 .../asserts/segment/orderby/OrderByItemAssert.java |  6 ++---
 .../segment/projection/ProjectionAssert.java       |  4 +++
 .../expression/ExpectedExpressionProjection.java   |  5 ++++
 .../main/resources/case/dml/select-expression.xml  | 31 ++++++++++++++++++++++
 .../sql/supported/dml/select-expression.xml        |  1 +
 7 files changed, 60 insertions(+), 8 deletions(-)

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 2cf0319..6b66755 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
@@ -1254,13 +1254,13 @@ public abstract class MySQLStatementSQLVisitor extends 
MySQLStatementBaseVisitor
         }
         if (projection instanceof CommonExpressionSegment) {
             CommonExpressionSegment segment = (CommonExpressionSegment) 
projection;
-            ExpressionProjectionSegment result = new 
ExpressionProjectionSegment(segment.getStartIndex(), segment.getStopIndex(), 
segment.getText());
+            ExpressionProjectionSegment result = new 
ExpressionProjectionSegment(segment.getStartIndex(), segment.getStopIndex(), 
segment.getText(), segment);
             result.setAlias(alias);
             return result;
         }
         // FIXME :For DISTINCT()
         if (projection instanceof ColumnSegment) {
-            ExpressionProjectionSegment result = new 
ExpressionProjectionSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), 
ctx.getText());
+            ExpressionProjectionSegment result = new 
ExpressionProjectionSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), 
ctx.getText(), (ColumnSegment) projection);
             result.setAlias(alias);
             return result;
         }
@@ -1274,7 +1274,7 @@ public abstract class MySQLStatementSQLVisitor extends 
MySQLStatementBaseVisitor
         if (projection instanceof BinaryOperationExpression) {
             int startIndex = ((BinaryOperationExpression) 
projection).getStartIndex();
             int stopIndex = null != alias ? alias.getStopIndex() : 
((BinaryOperationExpression) projection).getStopIndex();
-            ExpressionProjectionSegment result = new 
ExpressionProjectionSegment(startIndex, stopIndex, ((BinaryOperationExpression) 
projection).getText());
+            ExpressionProjectionSegment result = new 
ExpressionProjectionSegment(startIndex, stopIndex, ((BinaryOperationExpression) 
projection).getText(), (BinaryOperationExpression) projection);
             result.setAlias(alias);
             return result;
         }
@@ -1282,8 +1282,8 @@ public abstract class MySQLStatementSQLVisitor extends 
MySQLStatementBaseVisitor
             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()));
+        ExpressionProjectionSegment result = null == alias ? new 
ExpressionProjectionSegment(column.getStartIndex(), column.getStopIndex(), 
String.valueOf(column.getLiterals()), column)
+                : new ExpressionProjectionSegment(column.getStartIndex(), 
ctx.alias().stop.getStopIndex(), String.valueOf(column.getLiterals()), column);
         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/ExpressionProjectionSegment.java
 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/item/ExpressionProjectionSegment.java
index ed1dbfe..3d088bb 100644
--- 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/item/ExpressionProjectionSegment.java
+++ 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/item/ExpressionProjectionSegment.java
@@ -19,6 +19,7 @@ package 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item;
 
 import lombok.Getter;
 import lombok.Setter;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.ExpressionSegment;
 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.complex.ComplexExpressionSegment;
@@ -37,6 +38,8 @@ public final class ExpressionProjectionSegment implements 
ProjectionSegment, Com
     private final int stopIndex;
     
     private final String text;
+
+    private final ExpressionSegment expr;
     
     @Setter
     private AliasSegment alias;
@@ -45,6 +48,14 @@ public final class ExpressionProjectionSegment implements 
ProjectionSegment, Com
         this.startIndex = startIndex;
         this.stopIndex = stopIndex;
         this.text = SQLUtil.getExpressionWithoutOutsideParentheses(text);
+        this.expr = null;
+    }
+
+    public ExpressionProjectionSegment(final int startIndex, final int 
stopIndex, final String text, final ExpressionSegment expr) {
+        this.startIndex = startIndex;
+        this.stopIndex = stopIndex;
+        this.text = SQLUtil.getExpressionWithoutOutsideParentheses(text);
+        this.expr = expr;
     }
     
     @Override
diff --git 
a/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/segment/orderby/OrderByItemAssert.java
 
b/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/segment/orderby/OrderByItemAssert.java
index 51184bc..3c6f9ba 100644
--- 
a/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/segment/orderby/OrderByItemAssert.java
+++ 
b/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/segment/orderby/OrderByItemAssert.java
@@ -79,9 +79,6 @@ public final class OrderByItemAssert {
             if (each instanceof ExpressionOrderByItemSegment) {
                 assertOrderInfo(assertContext, each, 
expected.getExpressionItems().get(count), type);
                 assertExpressionOrderByItem(assertContext, 
(ExpressionOrderByItemSegment) each, expected.getExpressionItems().get(count), 
type);
-                if (null != ((ExpressionOrderByItemSegment) each).getExpr() && 
null != expected.getExpressionItems().get(count).getExpr()) {
-                    ExpressionAssert.assertExpression(assertContext, 
((ExpressionOrderByItemSegment) each).getExpr(), 
expected.getExpressionItems().get(count).getExpr());
-                }
                 count++;
             }
         }
@@ -113,6 +110,9 @@ public final class OrderByItemAssert {
     private static void assertExpressionOrderByItem(final SQLCaseAssertContext 
assertContext,
                                                     final 
ExpressionOrderByItemSegment actual, final ExpectedExpressionOrderByItem 
expected, final String type) {
         assertThat(assertContext.getText(String.format("%s item expression 
assertion error: ", type)), actual.getExpression(), 
is(expected.getExpression()));
+        if (null != expected.getExpr()) {
+            ExpressionAssert.assertExpression(assertContext, actual.getExpr(), 
expected.getExpr());
+        }
         SQLSegmentAssert.assertIs(assertContext, actual, expected);
     }
 }
diff --git 
a/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/segment/projection/ProjectionAssert.java
 
b/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/segment/projection/ProjectionAssert.java
index 7e0e64f..0bc6dc1 100644
--- 
a/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/segment/projection/ProjectionAssert.java
+++ 
b/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/segment/projection/ProjectionAssert.java
@@ -32,6 +32,7 @@ import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.pagination.ro
 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.expression.ExpressionAssert;
 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;
@@ -157,6 +158,9 @@ public final class ProjectionAssert {
                 ? expected.getLiteralText() : expected.getText();
         assertThat(assertContext.getText("Expression projection text assertion 
error: "),
                 actual.getText(), is(expectedText));
+        if (expected.getExpr() != null) {
+            ExpressionAssert.assertExpression(assertContext, actual.getExpr(), 
expected.getExpr());
+        }
     }
     
     private static void assertTopProjection(final SQLCaseAssertContext 
assertContext, final TopProjectionSegment actual, final ExpectedTopProjection 
expected) {
diff --git 
a/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/jaxb/cases/domain/segment/impl/projection/impl/expression/ExpectedExpressionProjection.java
 
b/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/jaxb/cases/domain/segment/impl/projection/impl/expression/ExpectedExpressionProjection.java
index 1287aef..5abf8af 100644
--- 
a/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/jaxb/cases/domain/segment/impl/projection/impl/expression/ExpectedExpressionProjection.java
+++ 
b/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/jaxb/cases/domain/segment/impl/projection/impl/expression/ExpectedExpressionProjection.java
@@ -20,10 +20,12 @@ package 
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domai
 import lombok.Getter;
 import lombok.Setter;
 import 
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.segment.AbstractExpectedSQLSegment;
+import 
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.segment.impl.expr.ExpectedExpression;
 import 
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.segment.impl.expr.complex.ExpectedComplexExpressionSegment;
 import 
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.segment.impl.projection.ExpectedProjection;
 
 import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElement;
 
 @Getter
 @Setter
@@ -37,4 +39,7 @@ public final class ExpectedExpressionProjection extends 
AbstractExpectedSQLSegme
 
     @XmlAttribute(name = "alias")
     private String alias;
+
+    @XmlElement(name = "expr")
+    private ExpectedExpression expr;
 }
diff --git 
a/shardingsphere-test/shardingsphere-parser-test/src/main/resources/case/dml/select-expression.xml
 
b/shardingsphere-test/shardingsphere-parser-test/src/main/resources/case/dml/select-expression.xml
index 626f2df..e307bfe 100644
--- 
a/shardingsphere-test/shardingsphere-parser-test/src/main/resources/case/dml/select-expression.xml
+++ 
b/shardingsphere-test/shardingsphere-parser-test/src/main/resources/case/dml/select-expression.xml
@@ -1694,4 +1694,35 @@
             <column-item name="last_name" start-index="125" stop-index="133" />
         </order-by>
     </select>
+
+    <select sql-case-id="select_projections_with_expr">
+        <projections start-index="7" stop-index="58">
+            <expression-projection start-index="7" stop-index="11" 
text="10+20">
+                <expr>
+                    <binary-operation-expression start-index="7" 
stop-index="11">
+                        <left>
+                            <literal-expression value="10" start-index="7" 
stop-index="8"/>
+                        </left>
+                        <right>
+                            <literal-expression value="20" start-index="10" 
stop-index="11"/>
+                        </right>
+                        <operator>+</operator>
+                    </binary-operation-expression>
+                </expr>
+            </expression-projection>
+            <expression-projection start-index="13" stop-index="56" text="CASE 
order_id WHEN 1 THEN '11' ELSE '00' END">
+                <expr>
+                    <common-expression literal-text="CASE order_id WHEN 1 THEN 
'11' ELSE '00' END" start-index="13" stop-index="56"/>
+                </expr>
+            </expression-projection>
+            <expression-projection start-index="58" stop-index="58" text="1">
+                <expr>
+                    <literal-expression value="1" start-index="58" 
stop-index="58"/>
+                </expr>
+            </expression-projection>
+        </projections>
+        <from>
+            <simple-table name="t_order" start-index="65" stop-index="71" />
+        </from>
+    </select>
 </sql-parser-test-cases>
diff --git 
a/shardingsphere-test/shardingsphere-parser-test/src/main/resources/sql/supported/dml/select-expression.xml
 
b/shardingsphere-test/shardingsphere-parser-test/src/main/resources/sql/supported/dml/select-expression.xml
index 9e1bd48..8821b44 100644
--- 
a/shardingsphere-test/shardingsphere-parser-test/src/main/resources/sql/supported/dml/select-expression.xml
+++ 
b/shardingsphere-test/shardingsphere-parser-test/src/main/resources/sql/supported/dml/select-expression.xml
@@ -78,4 +78,5 @@
     <sql-case id="select_where_with_expr_with_not_with_order_by" value="SELECT 
last_name, job_id, salary, department_id FROM employees WHERE NOT (job_id = 
'PU_CLERK' AND department_id = 30) ORDER BY last_name" db-types="Oracle"/>
     <sql-case id="select_where_with_subquery" value="SELECT last_name, 
department_id FROM employees WHERE department_id = (SELECT department_id FROM 
employees WHERE last_name = 'Lorentz') ORDER BY last_name, department_id" 
db-types="Oracle"/>
     <sql-case id="select_where_with_expr_with_not_in" value="SELECT * FROM 
employees WHERE department_id NOT IN (SELECT department_id FROM departments 
WHERE location_id = 1700) ORDER BY last_name" db-types="Oracle"/>
+    <sql-case id="select_projections_with_expr" value="SELECT 10+20,CASE 
order_id WHEN 1 THEN '11' ELSE '00' END,1 FROM t_order" db-types="MySQL"/>
 </sql-cases>

Reply via email to