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>