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/07/22 23:38:31 UTC
[shardingsphere] branch master updated: Support EXTRACT function for mysql (#27289)
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 6dec1c34afe Support EXTRACT function for mysql (#27289)
6dec1c34afe is described below
commit 6dec1c34afeb80051935c5cc571fb47bf63d1462
Author: niu niu <zi...@aliyun.com>
AuthorDate: Sun Jul 23 07:38:25 2023 +0800
Support EXTRACT function for mysql (#27289)
---
.../mysql/src/main/antlr4/imports/mysql/BaseRule.g4 | 2 +-
.../mysql/visitor/statement/MySQLStatementVisitor.java | 2 +-
test/it/parser/src/main/resources/case/dml/select.xml | 17 +++++++++++++++++
.../src/main/resources/sql/supported/dml/select.xml | 1 +
4 files changed, 20 insertions(+), 2 deletions(-)
diff --git a/parser/sql/dialect/mysql/src/main/antlr4/imports/mysql/BaseRule.g4 b/parser/sql/dialect/mysql/src/main/antlr4/imports/mysql/BaseRule.g4
index e40f69d3f3f..26ce28cf41f 100644
--- a/parser/sql/dialect/mysql/src/main/antlr4/imports/mysql/BaseRule.g4
+++ b/parser/sql/dialect/mysql/src/main/antlr4/imports/mysql/BaseRule.g4
@@ -1095,7 +1095,7 @@ substringFunction
;
extractFunction
- : EXTRACT LP_ identifier FROM expr RP_
+ : EXTRACT LP_ intervalUnit FROM expr RP_
;
charFunction
diff --git a/parser/sql/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/MySQLStatementVisitor.java b/parser/sql/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/MySQLStatementVisitor.java
index 98bdfb88861..23f41da1f69 100644
--- a/parser/sql/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/MySQLStatementVisitor.java
+++ b/parser/sql/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/MySQLStatementVisitor.java
@@ -1074,7 +1074,7 @@ public abstract class MySQLStatementVisitor extends MySQLStatementBaseVisitor<AS
public final ASTNode visitExtractFunction(final ExtractFunctionContext ctx) {
calculateParameterCount(Collections.singleton(ctx.expr()));
FunctionSegment result = new FunctionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), ctx.EXTRACT().getText(), getOriginalText(ctx));
- result.getParameters().add(new LiteralExpressionSegment(ctx.identifier().getStart().getStartIndex(), ctx.identifier().getStop().getStopIndex(), ctx.identifier().getText()));
+ result.getParameters().add(new LiteralExpressionSegment(ctx.intervalUnit().getStart().getStartIndex(), ctx.intervalUnit().getStop().getStopIndex(), ctx.intervalUnit().getText()));
result.getParameters().add((ExpressionSegment) visit(ctx.expr()));
return result;
}
diff --git a/test/it/parser/src/main/resources/case/dml/select.xml b/test/it/parser/src/main/resources/case/dml/select.xml
index 2ffd03409b2..5fb77274530 100644
--- a/test/it/parser/src/main/resources/case/dml/select.xml
+++ b/test/it/parser/src/main/resources/case/dml/select.xml
@@ -86,6 +86,23 @@
</projections>
</select>
+ <select sql-case-id="select_extract_function_with_day_hour">
+ <projections start-index="7" stop-index="50">
+ <expression-projection text="extract(DAY_HOUR FROM "1999-01-02 10:11:12")" start-index="7" stop-index="50">
+ <expr>
+ <function start-index="7" stop-index="50" text="extract(DAY_HOUR FROM "1999-01-02 10:11:12")" function-name="extract">
+ <parameter>
+ <literal-expression start-index="15" stop-index="22" value="DAY_HOUR" />
+ </parameter>
+ <parameter>
+ <literal-expression start-index="29" stop-index="49" value="1999-01-02 10:11:12" />
+ </parameter>
+ </function>
+ </expr>
+ </expression-projection>
+ </projections>
+ </select>
+
<select sql-case-id="select_with_latin1">
<projections start-index="7" stop-index="62">
<expression-projection text="_latin1'B' collate latin1_bin in (_latin1'a',_latin1'b')" start-index="7" stop-index="62">
diff --git a/test/it/parser/src/main/resources/sql/supported/dml/select.xml b/test/it/parser/src/main/resources/sql/supported/dml/select.xml
index 02c35b97568..c9d4a38a540 100644
--- a/test/it/parser/src/main/resources/sql/supported/dml/select.xml
+++ b/test/it/parser/src/main/resources/sql/supported/dml/select.xml
@@ -18,6 +18,7 @@
<sql-cases>
<sql-case id="select_position_function" value="select position("0" in "baaa" in (1)),position("0" in "1" in (1,2,3)),position("sql" in ("mysql"))" db-types="MySQL" />
+ <sql-case id="select_extract_function_with_day_hour" value="select extract(DAY_HOUR FROM "1999-01-02 10:11:12")" db-types="MySQL" />
<sql-case id="select_with_latin1" value="select _latin1'B' collate latin1_bin in (_latin1'a',_latin1'b')" db-types="MySQL" />
<sql-case id="select_with_default_str" value="select * from t1 where str <> default(str)" db-types="MySQL" />
<sql-case id="select_subquery_excpet" value="select * from (select * from t1 except all select * from t1 limit 2) a" db-types="MySQL" />