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

tuichenchuxin 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 b14983bc0eb Update Oracle SQL XMLROOT function parse (#22324)
b14983bc0eb is described below

commit b14983bc0eb523b25a7860aae190ccecdbfbd4d7
Author: Zichao <[email protected]>
AuthorDate: Tue Nov 22 18:34:28 2022 +1300

    Update Oracle SQL XMLROOT function parse (#22324)
---
 .../oracle/src/main/antlr4/imports/oracle/BaseRule.g4      |  5 +++++
 .../oracle/src/main/antlr4/imports/oracle/Keyword.g4       |  8 ++++++++
 .../visitor/statement/impl/OracleStatementSQLVisitor.java  | 14 +++++++++++++-
 test/parser/src/main/resources/case/dml/select.xml         |  9 +++++++++
 .../parser/src/main/resources/sql/supported/dml/select.xml |  1 +
 5 files changed, 36 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 8231e3bfcae..b42b5dd1b2d 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
@@ -1622,6 +1622,7 @@ xmlFunction
     | xmlParseFunction
     | xmlPiFunction
     | xmlQueryFunction
+    | xmlRootFunction
     ;
 
 xmlAggFunction
@@ -1655,3 +1656,7 @@ xmlQueryFunction
 xmlPassingClause
     : PASSING (BY VALUE)? expr (AS alias)? (COMMA_ expr (AS alias)?)*
     ;
+
+xmlRootFunction
+    : XMLROOT LP_ expr COMMA_ VERSION (expr | NO VALUE) (COMMA_ STANDALONE 
(YES | NO | NO VALUE))? 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 67e019be8a9..483a182f2d3 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
@@ -723,3 +723,11 @@ XMLPI
 XMLQUERY
     : X M L Q U E R Y
     ;
+
+XMLROOT
+    : X M L R O O T
+    ;
+
+STANDALONE
+    : S T A N D A L O N E
+    ;
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 f19b4b76839..dc778b0eaa0 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
@@ -76,6 +76,7 @@ import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.XmlFor
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.XmlParseFunctionContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.XmlPiFunctionContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.XmlQueryFunctionContext;
+import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.XmlRootFunctionContext;
 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;
@@ -571,7 +572,10 @@ public abstract class OracleStatementSQLVisitor extends 
OracleStatementBaseVisit
         if (null != ctx.xmlPiFunction()) {
             return visit(ctx.xmlPiFunction());
         }
-        return visit(ctx.xmlQueryFunction());
+        if (null != ctx.xmlQueryFunction()) {
+            return visit(ctx.xmlQueryFunction());
+        }
+        return visit(ctx.xmlRootFunction());
     }
     
     @Override
@@ -628,6 +632,14 @@ public abstract class OracleStatementSQLVisitor extends 
OracleStatementBaseVisit
         return result;
     }
     
+    @Override
+    public ASTNode visitXmlRootFunction(final XmlRootFunctionContext ctx) {
+        FunctionSegment result = new 
FunctionSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), 
ctx.XMLROOT().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 866b9ff3c10..a8e89f3e0ef 100644
--- a/test/parser/src/main/resources/case/dml/select.xml
+++ b/test/parser/src/main/resources/case/dml/select.xml
@@ -4760,4 +4760,13 @@
             <simple-table name="x_table" start-index="102" stop-index="108" />
         </from>
     </select>
+
+    <select sql-case-id="select_xmlroot_function">
+        <projections start-index="7" stop-index="76">
+            <expression-projection text="XMLROOT(XMLType('143598'), VERSION 
'1.0', STANDALONE YES)" alias="XMLROOT" start-index="7" stop-index="76" />
+        </projections>
+        <from>
+            <simple-table name="DUAL" start-index="83" stop-index="86" />
+        </from>
+    </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 4eb82922b8f..e9ff9369438 100644
--- a/test/parser/src/main/resources/sql/supported/dml/select.xml
+++ b/test/parser/src/main/resources/sql/supported/dml/select.xml
@@ -152,4 +152,5 @@
     <sql-case id="select_xmlparse_function" value="SELECT XMLPARSE(DOCUMENT 
'DEPTXML' WELLFORMED) AS dept FROM DUAL;" db-types="Oracle" />
     <sql-case id="select_xmlpi_function" value="SELECT XMLPI(NAME &quot;Order 
analysisComp&quot;, 'imported, reconfigured, disassembled') AS 'XMLPI' FROM 
DUAL;" db-types="Oracle" />
     <sql-case id="select_xmlquery_function" value="SELECT 
XMLQUERY('//student[@age=20]' PASSING BY VALUE xcol AS x RETURNING CONTENT NULL 
ON EMPTY) FROM x_table;" db-types="Oracle" />
+    <sql-case id="select_xmlroot_function" value="SELECT 
XMLROOT(XMLType('143598'), VERSION '1.0', STANDALONE YES) AS 'XMLROOT' FROM 
DUAL;" db-types="Oracle" />
 </sql-cases>

Reply via email to