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 08227e4923c Update Oracle SQL XMLFOREST function parse (#22283)
08227e4923c is described below

commit 08227e4923c9748b18b872a647aedde421b0a495
Author: Zichao <[email protected]>
AuthorDate: Mon Nov 21 05:57:28 2022 +1300

    Update Oracle SQL XMLFOREST function parse (#22283)
---
 .../src/main/antlr4/imports/oracle/BaseRule.g4     |  5 +++++
 .../src/main/antlr4/imports/oracle/Keyword.g4      |  4 ++++
 .../statement/impl/OracleStatementSQLVisitor.java  | 14 +++++++++++++-
 test/parser/src/main/resources/case/dml/select.xml | 22 ++++++++++++++++++++++
 .../main/resources/sql/supported/dml/select.xml    |  1 +
 5 files changed, 45 insertions(+), 1 deletion(-)

diff --git 
a/sql-parser/dialect/oracle/src/main/antlr4/imports/oracle/BaseRule.g4 
b/sql-parser/dialect/oracle/src/main/antlr4/imports/oracle/BaseRule.g4
index 82643abf450..75f940fd86b 100644
--- a/sql-parser/dialect/oracle/src/main/antlr4/imports/oracle/BaseRule.g4
+++ b/sql-parser/dialect/oracle/src/main/antlr4/imports/oracle/BaseRule.g4
@@ -1618,6 +1618,7 @@ xmlFunction
     : xmlAggFunction
     | xmlColattvalFunction
     | xmlExistsFunction
+    | xmlForestFunction
     ;
 
 xmlAggFunction
@@ -1631,3 +1632,7 @@ xmlColattvalFunction
 xmlExistsFunction
     : XMLEXISTS LP_ STRING_ (PASSING (BY VALUE)? expr (AS alias)? (COMMA_ expr 
(AS alias)?)*)? RP_
     ;
+
+xmlForestFunction
+   : XMLFOREST LP_ expr (AS (alias | EVALNAME expr))? (COMMA_ expr (AS (alias 
| EVALNAME expr))?)* RP_
+   ;
diff --git 
a/sql-parser/dialect/oracle/src/main/antlr4/imports/oracle/Keyword.g4 
b/sql-parser/dialect/oracle/src/main/antlr4/imports/oracle/Keyword.g4
index 361a2f0176e..7b0694f8177 100644
--- a/sql-parser/dialect/oracle/src/main/antlr4/imports/oracle/Keyword.g4
+++ b/sql-parser/dialect/oracle/src/main/antlr4/imports/oracle/Keyword.g4
@@ -695,3 +695,7 @@ EVALNAME
 XMLEXISTS
     : X M L E X I S T S
     ;
+
+XMLFOREST
+    : X M L F O R E S T
+    ;
diff --git 
a/sql-parser/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/impl/OracleStatementSQLVisitor.java
 
b/sql-parser/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/impl/OracleStatementSQLVisitor.java
index ab4573e74a4..bfeabfc76c1 100644
--- 
a/sql-parser/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/impl/OracleStatementSQLVisitor.java
+++ 
b/sql-parser/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/impl/OracleStatementSQLVisitor.java
@@ -72,6 +72,7 @@ import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.XmlAgg
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.XmlFunctionContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.XmlColattvalFunctionContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.XmlExistsFunctionContext;
+import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.XmlForestFunctionContext;
 import org.apache.shardingsphere.sql.parser.sql.common.enums.AggregationType;
 import org.apache.shardingsphere.sql.parser.sql.common.enums.NullsOrderType;
 import org.apache.shardingsphere.sql.parser.sql.common.enums.OrderDirection;
@@ -554,7 +555,10 @@ public abstract class OracleStatementSQLVisitor extends 
OracleStatementBaseVisit
         if (null != ctx.xmlColattvalFunction()) {
             return visit(ctx.xmlColattvalFunction());
         }
-        return visit(ctx.xmlExistsFunction());
+        if (null != ctx.xmlExistsFunction()) {
+            return visit(ctx.xmlExistsFunction());
+        }
+        return visit(ctx.xmlForestFunction());
     }
     
     @Override
@@ -579,6 +583,14 @@ public abstract class OracleStatementSQLVisitor extends 
OracleStatementBaseVisit
         return result;
     }
     
+    @Override
+    public ASTNode visitXmlForestFunction(final XmlForestFunctionContext ctx) {
+        FunctionSegment result = new 
FunctionSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), 
ctx.XMLFOREST().getText(), getOriginalText(ctx));
+        Collection<ExpressionSegment> expressionSegments = 
ctx.expr().stream().map(each -> (ExpressionSegment) 
visit(each)).collect(Collectors.toList());
+        result.getParameters().addAll(expressionSegments);
+        return result;
+    }
+    
     private Collection<ExpressionSegment> getExpressions(final 
AggregationFunctionContext ctx) {
         return null == ctx.expr() ? Collections.emptyList() : 
ctx.expr().stream().map(each -> (ExpressionSegment) 
visit(each)).collect(Collectors.toList());
     }
diff --git a/test/parser/src/main/resources/case/dml/select.xml 
b/test/parser/src/main/resources/case/dml/select.xml
index 821f751626e..9c00403b98f 100644
--- a/test/parser/src/main/resources/case/dml/select.xml
+++ b/test/parser/src/main/resources/case/dml/select.xml
@@ -4711,4 +4711,26 @@
             <simple-table name="x_table" start-index="75" stop-index="81" />
         </from>
     </select>
+
+    <select sql-case-id="select_xmlforest_function">
+        <projections start-index="7" stop-index="78">
+            <expression-projection text="XMLFOREST(e.employee_id AS EVALNAME 
'ID', e.last_name AS name, e.salary)" start-index="7" stop-index="78" />
+        </projections>
+        <from>
+            <simple-table name="employees" start-index="85" stop-index="95" 
alias="e" />
+        </from>
+        <where start-index="97" stop-index="119">
+            <expr>
+                <binary-operation-expression start-index="103" 
stop-index="119">
+                    <left>
+                        <column name="employee_id" start-index="103" 
stop-index="113" />
+                    </left>
+                    <operator>=</operator>
+                    <right>
+                        <literal-expression value="204" start-index="117" 
stop-index="119" />
+                    </right>
+                </binary-operation-expression>
+            </expr>
+        </where>
+    </select>
 </sql-parser-test-cases>
diff --git a/test/parser/src/main/resources/sql/supported/dml/select.xml 
b/test/parser/src/main/resources/sql/supported/dml/select.xml
index 454adb3dbb9..23199963ea8 100644
--- a/test/parser/src/main/resources/sql/supported/dml/select.xml
+++ b/test/parser/src/main/resources/sql/supported/dml/select.xml
@@ -148,4 +148,5 @@
     <sql-case id="select_xmlcast_function" value="SELECT 
XMLCAST(des.COLUMN_VALUE AS VARCHAR2(256)) FROM purchaseorder;" 
db-types="Oracle" />
     <sql-case id="select_xmlcolattval_function" value="SELECT 
XMLCOLATTVAL(e.employee_id AS EVALNAME 'ID', e.last_name AS name, e.salary) 
'Emp Element' FROM employees e WHERE employee_id = 204;" db-types="Oracle" />
     <sql-case id="select_xmlexists_function" value="SELECT id, 
XMLEXISTS('//student[@age=20]' PASSING BY VALUE xcol AS x) FROM x_table;" 
db-types="Oracle" />
+    <sql-case id="select_xmlforest_function" value="SELECT 
XMLFOREST(e.employee_id AS EVALNAME 'ID', e.last_name AS name, e.salary) FROM 
employees e WHERE employee_id = 204;" db-types="Oracle" />
 </sql-cases>

Reply via email to