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 13dcbf82a8f [Oracle SQL] Support parsing set function for Oracle SQL 
(#27895)
13dcbf82a8f is described below

commit 13dcbf82a8f5785a59f9d304d3876cc835407edd
Author: Liao Lanyu <[email protected]>
AuthorDate: Fri Aug 4 11:25:39 2023 +0800

    [Oracle SQL] Support parsing set function for Oracle SQL (#27895)
    
    * support set function
    
    * support set function test
---
 .../src/main/antlr4/imports/oracle/BaseRule.g4      |  6 +++++-
 .../visitor/statement/OracleStatementVisitor.java   | 10 ++++++++++
 .../resources/case/dml/select-special-function.xml  | 21 +++++++++++++++++++++
 .../sql/supported/dml/select-special-function.xml   |  1 +
 4 files changed, 37 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 098fbabb399..2569e81206a 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,11 @@ leadLagInfo
     ;
 
 specialFunction
-    : castFunction | charFunction | extractFunction | formatFunction | 
firstOrLastValueFunction | trimFunction | featureFunction
+    : castFunction | charFunction | extractFunction | formatFunction | 
firstOrLastValueFunction | trimFunction | featureFunction | setFunction
+    ;
+
+setFunction
+    : SET LP_ expr RP_
     ;
 
 featureFunction
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 81d7c0e6c33..caff2b6348d 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
@@ -868,9 +868,19 @@ public abstract class OracleStatementVisitor extends 
OracleStatementBaseVisitor<
         if (null != ctx.featureFunction()) {
             return visit(ctx.featureFunction());
         }
+        if (null != ctx.setFunction()) {
+            return visit(ctx.setFunction());
+        }
         throw new IllegalStateException("SpecialFunctionContext must have 
castFunction, charFunction, extractFunction, formatFunction, 
firstOrLastValueFunction, trimFunction or featureFunction.");
     }
     
+    @Override
+    public final ASTNode visitSetFunction(final 
OracleStatementParser.SetFunctionContext ctx) {
+        FunctionSegment result = new 
FunctionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), 
ctx.SET().getText(), getOriginalText(ctx));
+        result.getParameters().add((ExpressionSegment) visit(ctx.expr()));
+        return result;
+    }
+    
     @Override
     public final ASTNode visitCastFunction(final CastFunctionContext ctx) {
         FunctionSegment result;
diff --git 
a/test/it/parser/src/main/resources/case/dml/select-special-function.xml 
b/test/it/parser/src/main/resources/case/dml/select-special-function.xml
index 765f66aafa4..89d44df472d 100644
--- a/test/it/parser/src/main/resources/case/dml/select-special-function.xml
+++ b/test/it/parser/src/main/resources/case/dml/select-special-function.xml
@@ -546,4 +546,25 @@
             <column-item name="xmlagg" order-direction="ASC" start-index="98" 
stop-index="103"/>
         </order-by>
     </select>
+
+    <select sql-case-id="select_set_function">
+        <projections start-index="7" stop-index="49">
+            <column-projection name="customer_id" start-index="7" 
stop-index="17" />
+            <expression-projection text="SET(cust_address_ntab)" 
alias="address" start-index="20" stop-index="49">
+                <expr>
+                    <function function-name="SET" start-index="20" 
stop-index="41" text="SET(cust_address_ntab)">
+                        <parameter>
+                            <column name="cust_address_ntab" start-index="24" 
stop-index="40" />
+                        </parameter>
+                    </function>
+                </expr>
+            </expression-projection>
+        </projections>
+        <from>
+            <simple-table name="customers_demo" start-index="56" 
stop-index="69" />
+        </from>
+        <order-by>
+            <column-item name="customer_id" order-direction="ASC" 
start-index="80" stop-index="90" literal-start-index="80" 
literal-stop-index="90" />
+        </order-by>
+    </select>
 </sql-parser-test-cases>
diff --git 
a/test/it/parser/src/main/resources/sql/supported/dml/select-special-function.xml
 
b/test/it/parser/src/main/resources/sql/supported/dml/select-special-function.xml
index d9233bfb53c..5f8e8b70518 100644
--- 
a/test/it/parser/src/main/resources/sql/supported/dml/select-special-function.xml
+++ 
b/test/it/parser/src/main/resources/sql/supported/dml/select-special-function.xml
@@ -42,4 +42,5 @@
     <sql-case id="select_extract_function_for_oracle" value="SELECT 
EXTRACT(YEAR FROM TIMESTAMP '2001-02-16 20:38:40') FROM DUAL" db-types="Oracle" 
/>
     <sql-case id="select_mod_function" value="SELECT MOD(order_id, 1) from 
t_order" db-types="PostgreSQL,openGauss" />
     <sql-case id="select_sys_xml_agg" value="SELECT 
SYS_XMLAGG(SYS_XMLGEN(last_name)) XMLAGG FROM employees WHERE last_name LIKE 
'R%' ORDER BY xmlagg;" db-types="Oracle" />
+    <sql-case id="select_set_function" value="SELECT customer_id, 
SET(cust_address_ntab) address FROM customers_demo ORDER BY customer_id;" 
db-types="Oracle" />
 </sql-cases>

Reply via email to