You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by du...@apache.org on 2023/05/02 05:42:26 UTC

[shardingsphere] branch master updated: Support BetweenExpression in Projection (#25294) (#25375)

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 b548b49c6f6 Support BetweenExpression in Projection (#25294) (#25375)
b548b49c6f6 is described below

commit b548b49c6f63faae9e8440ae79e4c5b291b7e806
Author: Cong Hu <ia...@qq.com>
AuthorDate: Tue May 2 13:42:10 2023 +0800

    Support BetweenExpression in Projection (#25294) (#25375)
    
    * Support BetweenExpression in Projection (#25294)
    
    * Complete test (#25294)
    
    * retrigger checks
---
 .../visitor/statement/MySQLStatementVisitor.java   |  5 +++++
 .../main/resources/case/dml/select-expression.xml  | 24 ++++++++++++++++++++++
 .../sql/supported/dml/select-expression.xml        |  1 +
 3 files changed, 30 insertions(+)

diff --git a/sql-parser/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/MySQLStatementVisitor.java b/sql-parser/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/MySQLStatementVisitor.java
index b009812c9f3..fd721e2e0bb 100644
--- a/sql-parser/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/MySQLStatementVisitor.java
+++ b/sql-parser/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/MySQLStatementVisitor.java
@@ -1611,6 +1611,11 @@ public abstract class MySQLStatementVisitor extends MySQLStatementBaseVisitor<AS
             result.setAlias(alias);
             return result;
         }
+        if (projection instanceof BetweenExpression) {
+            ExpressionProjectionSegment result = new ExpressionProjectionSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), getOriginalText(ctx.expr()), (BetweenExpression) projection);
+            result.setAlias(alias);
+            return result;
+        }
         LiteralExpressionSegment column = (LiteralExpressionSegment) projection;
         ExpressionProjectionSegment result = null == alias
                 ? new ExpressionProjectionSegment(column.getStartIndex(), column.getStopIndex(), String.valueOf(column.getLiterals()), column)
diff --git a/test/it/parser/src/main/resources/case/dml/select-expression.xml b/test/it/parser/src/main/resources/case/dml/select-expression.xml
index 03f3f773121..cb3dfbde134 100644
--- a/test/it/parser/src/main/resources/case/dml/select-expression.xml
+++ b/test/it/parser/src/main/resources/case/dml/select-expression.xml
@@ -2288,4 +2288,28 @@
             <simple-table name="DUAL" start-index="44" stop-index="47" />
         </from>
     </select>
+
+    <select sql-case-id="select_between_expression">
+        <projections start-index="7" stop-index="44">
+            <expression-projection text="item_id BETWEEN 1 AND order_id" start-index="7" stop-index="36">
+                <expr>
+                    <between-expression start-index="7" stop-index="36">
+                        <left>
+                            <column start-index="7" stop-index="13" name="item_id" />
+                        </left>
+                        <between-expr>
+                            <literal-expression start-index="23" stop-index="23" value="1" />
+                        </between-expr>
+                        <and-expr>
+                            <column start-index="29" stop-index="36" name="order_id" />
+                        </and-expr>
+                    </between-expression>
+                </expr>
+            </expression-projection>
+            <column-projection start-index="39" stop-index="44" name="status" />
+        </projections>
+        <from>
+            <simple-table name="t_order_item" start-index="51" stop-index="62" />
+        </from>
+    </select>
 </sql-parser-test-cases>
diff --git a/test/it/parser/src/main/resources/sql/supported/dml/select-expression.xml b/test/it/parser/src/main/resources/sql/supported/dml/select-expression.xml
index 6766e984771..fa450ef0870 100644
--- a/test/it/parser/src/main/resources/sql/supported/dml/select-expression.xml
+++ b/test/it/parser/src/main/resources/sql/supported/dml/select-expression.xml
@@ -96,4 +96,5 @@
     <sql-case id="select_with_collate_with_marker" value="SELECT * FROM t_order WHERE order_id COLLATE ?" db-types="MySQL" />
     <sql-case id="select_age_for_postgres" value="SELECT * FROM cypher('sharding_test_1', $$ CREATE (n) $$) as (a agtype)" db-types="PostgreSQL" />
     <sql-case id="select_datetime_expression" value="SELECT SYSTIMESTAMP AT TIME ZONE 'UTC' FROM DUAL;" db-types="Oracle" />
+    <sql-case id="select_between_expression" value="SELECT item_id BETWEEN 1 AND order_id, status FROM t_order_item;" db-types="MySQL" />
 </sql-cases>