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 &quot;1999-01-02 10:11:12&quot;)" start-index="7" stop-index="50">
+                <expr>
+                    <function start-index="7" stop-index="50" text="extract(DAY_HOUR FROM &quot;1999-01-02 10:11:12&quot;)" 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(&quot;0&quot; in &quot;baaa&quot; in (1)),position(&quot;0&quot; in &quot;1&quot; in (1,2,3)),position(&quot;sql&quot; in (&quot;mysql&quot;))" db-types="MySQL" />
+    <sql-case id="select_extract_function_with_day_hour" value="select extract(DAY_HOUR FROM &quot;1999-01-02 10:11:12&quot;)" 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 &lt;&gt; 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" />