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>