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>