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 <[email protected]>
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>

Reply via email to