You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by ji...@apache.org on 2022/11/18 09:14:24 UTC
[shardingsphere] branch master updated: Update Oracle SQL XMLCOLATTVAL function parse (#22258)
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 6469f8217b4 Update Oracle SQL XMLCOLATTVAL function parse (#22258)
6469f8217b4 is described below
commit 6469f8217b49b4bf878989ab63f287176a840b4b
Author: Zichao <57...@users.noreply.github.com>
AuthorDate: Fri Nov 18 22:14:16 2022 +1300
Update Oracle SQL XMLCOLATTVAL function parse (#22258)
* Update Oracle SQL XMLCOLATTVAL function parse
* Update Oracle SQL XMLCOLATTVAL function parse
---
.../src/main/antlr4/imports/oracle/BaseRule.g4 | 7 ++++++-
.../src/main/antlr4/imports/oracle/Keyword.g4 | 8 ++++++++
.../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, 50 insertions(+), 2 deletions(-)
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 2a7f263a550..7ac1b490270 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
@@ -163,7 +163,7 @@ unreservedWord
| HOST | PORT | EVERY | MINUTES | HOURS | NORELOCATE | SAVE | DISCARD | APPLICATION | INSTALL
| MINIMUM | VERSION | UNINSTALL | COMPATIBILITY | MATERIALIZE | SUBTYPE | RECORD | CONSTANT | CURSOR
| OTHERS | EXCEPTION | CPU_PER_SESSION | CONNECT_TIME | LOGICAL_READS_PER_SESSION | PRIVATE_SGA | PERCENT_RANK | ROWID
- | LPAD | ZONE | SESSIONTIMEZONE | TO_CHAR | XMLELEMENT | COLUMN_VALUE
+ | LPAD | ZONE | SESSIONTIMEZONE | TO_CHAR | XMLELEMENT | COLUMN_VALUE | EVALNAME
;
schemaName
@@ -1616,8 +1616,13 @@ datetimeExpr
xmlFunction
: xmlAggFunction
+ | xmlColattvalFunction
;
xmlAggFunction
: XMLAGG LP_ expr orderByClause? RP_
;
+
+xmlColattvalFunction
+ : XMLCOLATTVAL 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 fa40c91991b..dde510cde5a 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
@@ -683,3 +683,11 @@ XMLCAST
COLUMN_VALUE
: C O L U M N UL_ V A L U E
;
+
+XMLCOLATTVAL
+ : X M L C O L A T T V A L
+ ;
+
+EVALNAME
+ : E V A L N A M 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 05ca830aed6..11028049376 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
@@ -70,6 +70,7 @@ import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.Unrese
import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.ViewNameContext;
import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.XmlAggFunctionContext;
import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.XmlFunctionContext;
+import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.XmlColattvalFunctionContext;
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;
@@ -545,7 +546,10 @@ public abstract class OracleStatementSQLVisitor extends OracleStatementBaseVisit
@Override
public ASTNode visitXmlFunction(final XmlFunctionContext ctx) {
- return visit(ctx.xmlAggFunction());
+ if (null != ctx.xmlAggFunction()) {
+ return visit(ctx.xmlAggFunction());
+ }
+ return visit(ctx.xmlColattvalFunction());
}
@Override
@@ -553,6 +557,14 @@ public abstract class OracleStatementSQLVisitor extends OracleStatementBaseVisit
return new FunctionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), ctx.XMLAGG().getText(), getOriginalText(ctx));
}
+ @Override
+ public ASTNode visitXmlColattvalFunction(final XmlColattvalFunctionContext ctx) {
+ FunctionSegment result = new FunctionSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), ctx.XMLCOLATTVAL().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 81d50a9aa79..9fe0d56528b 100644
--- a/test/parser/src/main/resources/case/dml/select.xml
+++ b/test/parser/src/main/resources/case/dml/select.xml
@@ -4667,4 +4667,26 @@
<simple-table name="purchaseorder" start-index="55" stop-index="67" />
</from>
</select>
+
+ <select sql-case-id="select_xmlcolattval_function">
+ <projections start-index="7" stop-index="95" >
+ <expression-projection text="XMLCOLATTVAL(e.employee_id AS EVALNAME 'ID', e.last_name AS name, e.salary)" alias="Emp Element" start-index="7" stop-index="95" />
+ </projections>
+ <from>
+ <simple-table name="employees" alias="e" start-index="102" stop-index="112" />
+ </from>
+ <where start-index="114" stop-index="136">
+ <expr>
+ <binary-operation-expression start-index="120" stop-index="136" >
+ <left>
+ <column name="employee_id" start-index="120" stop-index="130" />
+ </left>
+ <operator>=</operator>
+ <right>
+ <literal-expression value="204" start-index="134" stop-index="136" />
+ </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 ceefb010f18..eccc72045d6 100644
--- a/test/parser/src/main/resources/sql/supported/dml/select.xml
+++ b/test/parser/src/main/resources/sql/supported/dml/select.xml
@@ -146,4 +146,5 @@
<sql-case id="select_to_char_function" value="SELECT TO_CHAR(ts_col, 'DD-MON-YYYY HH24:MI:SSxFF') AS ts_col FROM date_tab ORDER BY ts_col;" />
<sql-case id="select_xmlelement_xmlagg_function" value="SELECT XMLELEMENT('Department', XMLAGG(XMLELEMENT('Employee', e.job_id||' '||e.last_name) ORDER BY last_name)) as 'Dept_list' FROM employees e WHERE e.department_id = 30;" db-types="Oracle" />
<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-cases>