You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by ji...@apache.org on 2023/08/04 11:32:06 UTC

[shardingsphere] branch master updated: [Oracle SQL] Support parsing translate function for Oracle (#27907)

This is an automated email from the ASF dual-hosted git repository.

jianglongtao 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 2dd67f82297 [Oracle SQL] Support parsing translate function for Oracle (#27907)
2dd67f82297 is described below

commit 2dd67f822979212403220e9c8dbd19bdd6f9a6c3
Author: Liao Lanyu <14...@qq.com>
AuthorDate: Fri Aug 4 19:31:59 2023 +0800

    [Oracle SQL] Support parsing translate function for Oracle (#27907)
    
    * support translate function
    
    * test
    
    * test
---
 .../src/main/antlr4/imports/oracle/BaseRule.g4      |  7 ++++++-
 .../visitor/statement/OracleStatementVisitor.java   | 12 ++++++++++++
 .../parser/src/main/resources/case/dml/update.xml   | 21 +++++++++++++++++++++
 .../src/main/resources/sql/supported/dml/update.xml |  1 +
 4 files changed, 40 insertions(+), 1 deletion(-)

diff --git a/parser/sql/dialect/oracle/src/main/antlr4/imports/oracle/BaseRule.g4 b/parser/sql/dialect/oracle/src/main/antlr4/imports/oracle/BaseRule.g4
index 2f0c3b7a38d..06bc224ca1e 100644
--- a/parser/sql/dialect/oracle/src/main/antlr4/imports/oracle/BaseRule.g4
+++ b/parser/sql/dialect/oracle/src/main/antlr4/imports/oracle/BaseRule.g4
@@ -758,7 +758,12 @@ leadLagInfo
     ;
 
 specialFunction
-    : castFunction | charFunction | extractFunction | formatFunction | firstOrLastValueFunction | trimFunction | featureFunction | setFunction
+    : castFunction | charFunction | extractFunction | formatFunction | firstOrLastValueFunction | trimFunction | featureFunction
+    | setFunction | translateFunction
+    ;
+
+translateFunction
+    : TRANSLATE LP_ expr USING (CHAR_CS | NCHAR_CS) RP_
     ;
 
 setFunction
diff --git a/parser/sql/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/OracleStatementVisitor.java b/parser/sql/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/OracleStatementVisitor.java
index caff2b6348d..4859ba3c92c 100644
--- a/parser/sql/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/OracleStatementVisitor.java
+++ b/parser/sql/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/OracleStatementVisitor.java
@@ -871,9 +871,21 @@ public abstract class OracleStatementVisitor extends OracleStatementBaseVisitor<
         if (null != ctx.setFunction()) {
             return visit(ctx.setFunction());
         }
+        if (null != ctx.translateFunction()) {
+            return visit(ctx.translateFunction());
+        }
         throw new IllegalStateException("SpecialFunctionContext must have castFunction, charFunction, extractFunction, formatFunction, firstOrLastValueFunction, trimFunction or featureFunction.");
     }
     
+    @Override
+    public final ASTNode visitTranslateFunction(final OracleStatementParser.TranslateFunctionContext ctx) {
+        FunctionSegment result = new FunctionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), ctx.TRANSLATE().getText(), getOriginalText(ctx));
+        result.getParameters().add((ExpressionSegment) visit(ctx.expr()));
+        TerminalNode charSet = null != ctx.NCHAR_CS() ? ctx.NCHAR_CS() : ctx.CHAR_CS();
+        result.getParameters().add(new LiteralExpressionSegment(charSet.getSymbol().getStartIndex(), charSet.getSymbol().getStopIndex(), charSet.getText()));
+        return result;
+    }
+    
     @Override
     public final ASTNode visitSetFunction(final OracleStatementParser.SetFunctionContext ctx) {
         FunctionSegment result = new FunctionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), ctx.SET().getText(), getOriginalText(ctx));
diff --git a/test/it/parser/src/main/resources/case/dml/update.xml b/test/it/parser/src/main/resources/case/dml/update.xml
index 1690bd29d7f..88204ebc909 100644
--- a/test/it/parser/src/main/resources/case/dml/update.xml
+++ b/test/it/parser/src/main/resources/case/dml/update.xml
@@ -1175,6 +1175,27 @@
         </where>
     </update>
 
+    <update sql-case-id="update_with_translate_function">
+        <table start-index="7" stop-index="19">
+            <simple-table name="translate_tab" start-index="7" stop-index="19" />
+        </table>
+        <set start-index="21" stop-index="70">
+            <assignment start-index="21" stop-index="70" >
+                <column name="char_col" start-index="25" stop-index="32" />
+                <assignment-value>
+                    <function function-name="TRANSLATE" text="TRANSLATE (nchar_col USING CHAR_CS)" start-index="36" stop-index="70">
+                        <parameter>
+                            <column name="nchar_col" start-index="47" stop-index="55" />
+                        </parameter>
+                        <parameter>
+                            <literal-expression value="CHAR_CS" start-index="63" stop-index="69" />
+                        </parameter>
+                    </function>
+                </assignment-value>
+            </assignment>
+        </set>
+    </update>
+
     <update sql-case-id="update_with_dot_column_name">
         <table start-index="7" stop-index="15">
             <simple-table name="employees" start-index="7" stop-index="15" />
diff --git a/test/it/parser/src/main/resources/sql/supported/dml/update.xml b/test/it/parser/src/main/resources/sql/supported/dml/update.xml
index 8ca89b3aa3f..f47e805fc80 100644
--- a/test/it/parser/src/main/resources/sql/supported/dml/update.xml
+++ b/test/it/parser/src/main/resources/sql/supported/dml/update.xml
@@ -44,6 +44,7 @@
     <sql-case id="update_with_multi_columns" value="UPDATE employees a SET department_id = (SELECT department_id FROM departments WHERE location_id = '2100'), (salary, commission_pct) = (SELECT 1.1*AVG(salary), 1.5*AVG(commission_pct) FROM employees b WHERE a.department_id = b.department_id)" db-types="Oracle" />
     <sql-case id="update_with_force_index" value="UPDATE t_order FORCE INDEX (PRIMARY) SET status = ? WHERE order_id = ?" db-types="MySQL" />
     <sql-case id="update_with_subquery_using_interval" value="UPDATE employees a SET salary = (SELECT salary FROM employees AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '2' MINUTE) WHERE last_name = 'Chung') WHERE last_name = 'Chung'" db-types="Oracle" />
+    <sql-case id="update_with_translate_function" value="UPDATE translate_tab SET char_col = TRANSLATE (nchar_col USING CHAR_CS);" db-types="Oracle"/>
     <sql-case id="update_with_dot_column_name" value="UPDATE employees SET salary =.salary + 10  WHERE employee_id BETWEEN 1 and 10; " db-types="Oracle" />
     <sql-case id="update_with_set_value_clause" value="UPDATE ot1 SET VALUE(ot1.x) = t1(20) WHERE VALUE(ot1.x) = t1(10);" db-types="Oracle" />
 </sql-cases>