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/04/27 00:48:17 UTC

[shardingsphere] branch master updated: Support for bitExpr with plus & minus interval (#25318)

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 2859d84242e Support for bitExpr with plus & minus interval  (#25318)
2859d84242e is described below

commit 2859d84242eb4f854f56cb545b29426a03a8322b
Author: kanha gupta <92...@users.noreply.github.com>
AuthorDate: Thu Apr 27 06:18:01 2023 +0530

    Support for bitExpr with plus & minus interval  (#25318)
    
    * support for Char function
    
    * support for Weight string SQL
    
    * Support for Char & weight string Function
    
    * null
    
    * Revert "Support for Substring function"
    
    This reverts commit 9af038be0f4be54affd801c9ac2f6750db883377.
    
    * Support for BitExpr_with_Plus & Minus interval
    
    * support for Char function
    
    * support for Weight string SQL
    
    * Support for Char & weight string Function
    
    * null
    
    * Revert "Support for Substring function"
    
    This reverts commit 9af038be0f4be54affd801c9ac2f6750db883377.
    
    * all changes
    
    * support for Char function
    
    * support for Weight string SQL
    
    * Support for Char & weight string Function
    
    * Revert "Support for Substring function"
    
    This reverts commit 9af038be0f4be54affd801c9ac2f6750db883377.
    
    * support for Char function
    
    * support for Weight string SQL
    
    * Support for Char & weight string Function
    
    * Revert "Support for Substring function"
    
    This reverts commit 9af038be0f4be54affd801c9ac2f6750db883377.
    
    * restore errors
---
 .../segment/expression/impl/FunctionConverter.java     |  3 +++
 .../expression/impl/LiteralExpressionConverter.java    |  3 +++
 .../mysql/visitor/statement/MySQLStatementVisitor.java |  7 +++++--
 .../test/it/optimize/SQLNodeConverterEngineIT.java     |  2 ++
 test/it/parser/src/main/resources/case/dml/insert.xml  | 11 +++++++++--
 test/it/parser/src/main/resources/case/dml/replace.xml | 11 +++++++++--
 .../src/main/resources/case/dml/select-expression.xml  | 18 ++++++++++++++++--
 7 files changed, 47 insertions(+), 8 deletions(-)

diff --git a/kernel/sql-federation/optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/converter/segment/expression/impl/FunctionConverter.java b/kernel/sql-federation/optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/converter/segment/expression/impl/FunctionConverter.java
index b49aab8139c..f261f9db4dd 100644
--- a/kernel/sql-federation/optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/converter/segment/expression/impl/FunctionConverter.java
+++ b/kernel/sql-federation/optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/converter/segment/expression/impl/FunctionConverter.java
@@ -52,6 +52,9 @@ public class FunctionConverter implements SQLSegmentConverter<FunctionSegment, S
         if ("TRIM".equalsIgnoreCase(functionName.getSimple())) {
             return new TrimFunctionConverter().convert(segment);
         }
+        if ("INTERVAL".equalsIgnoreCase(functionName.getSimple())) {
+            return Optional.of(new SqlBasicCall(SqlStdOperatorTable.INTERVAL, getFunctionParameters(segment.getParameters()), SqlParserPos.ZERO));
+        }
         List<SqlOperator> functions = new LinkedList<>();
         SqlStdOperatorTable.instance().lookupOperatorOverloads(functionName, null, SqlSyntax.FUNCTION, functions, SqlNameMatchers.withCaseSensitive(false));
         return Optional.of(functions.isEmpty()
diff --git a/kernel/sql-federation/optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/converter/segment/expression/impl/LiteralExpressionConverter.java b/kernel/sql-federation/optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/converter/segment/expression/impl/LiteralExpressionConverter.java
index 5b2708a8319..e75d8b0d1fd 100644
--- a/kernel/sql-federation/optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/converter/segment/expression/impl/LiteralExpressionConverter.java
+++ b/kernel/sql-federation/optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/converter/segment/expression/impl/LiteralExpressionConverter.java
@@ -52,6 +52,9 @@ public final class LiteralExpressionConverter implements SQLSegmentConverter<Lit
         if ("YEAR".equals(segment.getLiterals())) {
             return Optional.of(new SqlIntervalQualifier(TimeUnit.YEAR, null, SqlParserPos.ZERO));
         }
+        if ("SECOND".equals(segment.getLiterals())) {
+            return Optional.of(new SqlIntervalQualifier(TimeUnit.SECOND, null, SqlParserPos.ZERO));
+        }
         if (segment.getLiterals() instanceof Integer || segment.getLiterals() instanceof BigDecimal) {
             return Optional.of(SqlLiteral.createExactNumeric(String.valueOf(segment.getLiterals()), SqlParserPos.ZERO));
         }
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 cebb1317013..b009812c9f3 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
@@ -765,8 +765,11 @@ public abstract class MySQLStatementVisitor extends MySQLStatementBaseVisitor<AS
     
     @Override
     public final ASTNode visitIntervalExpression(final IntervalExpressionContext ctx) {
-        calculateParameterCount(Collections.singleton(ctx.intervalValue().expr()));
-        return new ExpressionProjectionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), getOriginalText(ctx));
+        FunctionSegment result = new FunctionSegment(ctx.INTERVAL().getSymbol().getStartIndex(), ctx.INTERVAL().getSymbol().getStopIndex(), ctx.INTERVAL().getText(), ctx.INTERVAL().getText());
+        result.getParameters().add((ExpressionSegment) visit(ctx.intervalValue().expr()));
+        result.getParameters().add(new LiteralExpressionSegment(ctx.intervalValue().intervalUnit().getStart().getStartIndex(), ctx.intervalValue().intervalUnit().getStop().getStopIndex(),
+                ctx.intervalValue().intervalUnit().getText()));
+        return result;
     }
     
     @Override
diff --git a/test/it/optimizer/src/test/java/org/apache/shardingsphere/test/it/optimize/SQLNodeConverterEngineIT.java b/test/it/optimizer/src/test/java/org/apache/shardingsphere/test/it/optimize/SQLNodeConverterEngineIT.java
index ab897f67eb5..42a230e0c95 100644
--- a/test/it/optimizer/src/test/java/org/apache/shardingsphere/test/it/optimize/SQLNodeConverterEngineIT.java
+++ b/test/it/optimizer/src/test/java/org/apache/shardingsphere/test/it/optimize/SQLNodeConverterEngineIT.java
@@ -203,6 +203,8 @@ class SQLNodeConverterEngineIT {
             result.add("select_with_spatial_function");
             result.add("select_from_dual");
             result.add("select_substring");
+            result.add("select_where_with_bit_expr_with_plus_interval");
+            result.add("select_where_with_bit_expr_with_minus_interval");
             return result;
         }
         // CHECKSTYLE:ON
diff --git a/test/it/parser/src/main/resources/case/dml/insert.xml b/test/it/parser/src/main/resources/case/dml/insert.xml
index 9c990f8165c..57cbc2ba76f 100644
--- a/test/it/parser/src/main/resources/case/dml/insert.xml
+++ b/test/it/parser/src/main/resources/case/dml/insert.xml
@@ -1354,13 +1354,20 @@
         <values>
             <value>
                 <assignment-value>
-                    <parameter-marker-expression parameter-index="0" start-index="96" stop-index="96" />
                     <function function-name="date_add" text="date_add(now(),interval ? second)" literal-text="date_add(now(),interval 1 second)" start-index="61" stop-index="93" literal-start-index="61" literal-stop-index="93">
                         <parameter>
                             <function function-name="now" text="now()" start-index="70" stop-index="74" />
                         </parameter>
                         <parameter>
-                            <expression-projection literal-text="interval 1 second" text="interval ? second" start-index="76" stop-index="92" />
+                            <function function-name="interval" text="interval" start-index="76" stop-index="83" >
+                                <parameter>
+                                    <parameter-marker-expression parameter-index="0" start-index="85" stop-index="85" />
+                                    <literal-expression value="1" start-index="85" stop-index="85" />
+                                </parameter>
+                                <parameter>
+                                    <literal-expression value="second" start-index="87" stop-index="92" />
+                                </parameter>
+                            </function>
                         </parameter>
                     </function>
                 </assignment-value>
diff --git a/test/it/parser/src/main/resources/case/dml/replace.xml b/test/it/parser/src/main/resources/case/dml/replace.xml
index ce92a4aa732..e3dccb901e7 100644
--- a/test/it/parser/src/main/resources/case/dml/replace.xml
+++ b/test/it/parser/src/main/resources/case/dml/replace.xml
@@ -831,13 +831,20 @@
         <values>
             <value>
                 <assignment-value>
-                    <parameter-marker-expression parameter-index="0" start-index="97" stop-index="97" />
                     <function function-name="date_add" text="date_add(now(),interval ? second)" literal-text="date_add(now(),interval 1 second)" start-index="62" stop-index="94" literal-start-index="62" literal-stop-index="94">
                         <parameter>
                             <function function-name="now" text="now()" start-index="71" stop-index="75" />
                         </parameter>
                         <parameter>
-                            <expression-projection text="interval ? second" literal-text="interval 1 second" start-index="77" stop-index="93" />
+                            <function function-name="interval" text="interval" start-index="77" stop-index="84" >
+                                <parameter>
+                                    <parameter-marker-expression parameter-index="0" start-index="86" stop-index="86" />
+                                    <literal-expression value="1" start-index="86" stop-index="86" />
+                                </parameter>
+                                <parameter>
+                                    <literal-expression value="second" start-index="88" stop-index="93" />
+                                </parameter>
+                            </function>
                         </parameter>
                     </function>
                 </assignment-value>
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 4f5c3bb9ac9..03f3f773121 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
@@ -1312,7 +1312,14 @@
                     </left>
                     <operator>+</operator>
                     <right>
-                        <expression-projection text="INTERVAL 1 SECOND" start-index="47" stop-index="63" />
+                        <function function-name="INTERVAL" text="INTERVAL" start-index="47" stop-index="54" >
+                            <parameter>
+                                <literal-expression value="1" start-index="56" stop-index="56" />
+                            </parameter>
+                            <parameter>
+                                <literal-expression value="SECOND" start-index="58" stop-index="63" />
+                            </parameter>
+                        </function>
                     </right>
                 </binary-operation-expression>
             </expr>
@@ -1336,7 +1343,14 @@
                     </left>
                     <operator>-</operator>
                     <right>
-                        <expression-projection text="INTERVAL 1 SECOND" start-index="47" stop-index="63" />
+                        <function function-name="INTERVAL" text="INTERVAL" start-index="47" stop-index="54" >
+                            <parameter>
+                                <literal-expression value="1" start-index="56" stop-index="56" />
+                            </parameter>
+                            <parameter>
+                                <literal-expression value="SECOND" start-index="58" stop-index="63" />
+                            </parameter>
+                        </function>
                     </right>
                 </binary-operation-expression>
             </expr>