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>