You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by tu...@apache.org on 2022/11/21 05:38:37 UTC

[shardingsphere] branch master updated: Update Oracle SQL XMLPARSE function parse (#22309)

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 3cd1d5c8afc Update Oracle SQL XMLPARSE function parse (#22309)
3cd1d5c8afc is described below

commit 3cd1d5c8afc43bd2098a4869bdbbce5275774154
Author: Zichao <57...@users.noreply.github.com>
AuthorDate: Mon Nov 21 18:38:31 2022 +1300

    Update Oracle SQL XMLPARSE function parse (#22309)
---
 .../oracle/src/main/antlr4/imports/oracle/BaseRule.g4    |  5 +++++
 .../oracle/src/main/antlr4/imports/oracle/Keyword.g4     | 16 ++++++++++++++++
 .../statement/impl/OracleStatementSQLVisitor.java        | 11 ++++++++++-
 test/parser/src/main/resources/case/dml/select.xml       |  9 +++++++++
 .../src/main/resources/sql/supported/dml/select.xml      |  1 +
 5 files changed, 41 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 75f940fd86b..c5d2c454d49 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
@@ -1619,6 +1619,7 @@ xmlFunction
     | xmlColattvalFunction
     | xmlExistsFunction
     | xmlForestFunction
+    | xmlParseFunction
     ;
 
 xmlAggFunction
@@ -1636,3 +1637,7 @@ xmlExistsFunction
 xmlForestFunction
    : XMLFOREST LP_ expr (AS (alias | EVALNAME expr))? (COMMA_ expr (AS (alias | EVALNAME expr))?)* RP_
    ;
+
+xmlParseFunction
+    : XMLPARSE LP_ (DOCUMENT | CONTENT) expr (WELLFORMED)? 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 7b0694f8177..d479a305216 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
@@ -699,3 +699,19 @@ XMLEXISTS
 XMLFOREST
     : X M L F O R E S T
     ;
+
+XMLPARSE
+    : X M L P A R S E
+    ;
+
+DOCUMENT
+    : D O C U M E N T
+    ;
+
+CONTENT
+    : C O N T E N T
+    ;
+
+WELLFORMED
+    : W E L L F O R M E D
+    ;
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 bfeabfc76c1..51452012592 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
@@ -73,6 +73,7 @@ import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.XmlFun
 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.autogen.OracleStatementParser.XmlParseFunctionContext;
 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;
@@ -558,7 +559,10 @@ public abstract class OracleStatementSQLVisitor extends OracleStatementBaseVisit
         if (null != ctx.xmlExistsFunction()) {
             return visit(ctx.xmlExistsFunction());
         }
-        return visit(ctx.xmlForestFunction());
+        if (null != ctx.xmlForestFunction()) {
+            return visit(ctx.xmlForestFunction());
+        }
+        return visit(ctx.xmlParseFunction());
     }
     
     @Override
@@ -591,6 +595,11 @@ public abstract class OracleStatementSQLVisitor extends OracleStatementBaseVisit
         return result;
     }
     
+    @Override
+    public ASTNode visitXmlParseFunction(final XmlParseFunctionContext ctx) {
+        return new ExpressionProjectionSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), getOriginalText(ctx), (ExpressionSegment) visit(ctx.expr()));
+    }
+    
     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 9c00403b98f..656b49724eb 100644
--- a/test/parser/src/main/resources/case/dml/select.xml
+++ b/test/parser/src/main/resources/case/dml/select.xml
@@ -4733,4 +4733,13 @@
             </expr>
         </where>
     </select>
+
+    <select sql-case-id="select_xmlparse_function">
+        <projections start-index="7" stop-index="53">
+            <expression-projection text="XMLPARSE(DOCUMENT 'DEPTXML' WELLFORMED)" alias="dept" start-index="7" stop-index="53" />
+        </projections>
+        <from>
+            <simple-table name="DUAL" start-index="60" stop-index="63" />
+        </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 23199963ea8..ef3e8388c00 100644
--- a/test/parser/src/main/resources/sql/supported/dml/select.xml
+++ b/test/parser/src/main/resources/sql/supported/dml/select.xml
@@ -149,4 +149,5 @@
     <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-case id="select_xmlparse_function" value="SELECT XMLPARSE(DOCUMENT 'DEPTXML' WELLFORMED) AS dept FROM DUAL;" db-types="Oracle" />
 </sql-cases>