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

duanzhengqiang 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 62e796e05b6 Support more oracle xml functions parsing (#27535)
62e796e05b6 is described below

commit 62e796e05b6a9120b4c50c0873d4232fb2f922c6
Author: ZhangCheng <[email protected]>
AuthorDate: Fri Jul 28 16:47:24 2023 +0800

    Support more oracle xml functions parsing (#27535)
    
    * Support more oracle xml functions parsing
    
    * Support more oracle xml functions parsing
    
    * Support more oracle xml functions parsing
    
    * Support more oracle xml functions parsing
---
 .../src/main/antlr4/imports/oracle/BaseRule.g4     |  13 +-
 .../main/antlr4/imports/oracle/OracleKeyword.g4    |   4 +
 .../visitor/statement/OracleStatementVisitor.java  |   8 +-
 .../src/main/resources/case/ddl/alter-type.xml     |   2 -
 .../parser/src/main/resources/case/dml/select.xml  | 141 +++++++++++++++++++++
 .../main/resources/sql/supported/dml/select.xml    |   1 +
 6 files changed, 163 insertions(+), 6 deletions(-)

diff --git 
a/parser/sql/dialect/oracle/src/main/antlr4/imports/oracle/BaseRule.g4 
b/parser/sql/dialect/oracle/src/main/antlr4/imports/oracle/BaseRule.g4
index 11c792d851a..4dfbf983324 100644
--- a/parser/sql/dialect/oracle/src/main/antlr4/imports/oracle/BaseRule.g4
+++ b/parser/sql/dialect/oracle/src/main/antlr4/imports/oracle/BaseRule.g4
@@ -1899,8 +1899,11 @@ xmlFunction
     | xmlSerializeFunction
     | xmlTableFunction
     | xmlIsSchemaValidFunction
-    | specifiedFunctionName = (SYS_XMLGEN | SYS_XMLAGG | APPENDCHILDXML | 
DELETEXML | EXISTSNODE | EXTRACT | EXTRACTVALUE | INSERTCHILDXML | 
INSERTCHILDXMLAFTER | INSERTCHILDXMLBEFORE | INSERTXMLAFTER | INSERTXMLBEFORE) 
exprList
+    | specifiedFunctionName = (SYS_XMLGEN | SYS_XMLAGG | APPENDCHILDXML | 
DELETEXML | EXISTSNODE | EXTRACT | EXTRACTVALUE 
+        | INSERTCHILDXML | INSERTCHILDXMLAFTER | INSERTCHILDXMLBEFORE | 
INSERTXMLAFTER | INSERTXMLBEFORE
+        | SYS_DBURIGEN | UPDATEXML | XMLCONCAT | XMLDIFF | XMLEXISTS | 
XMLISVALID | XMLPATCH | XMLSEQUENCE | XMLTRANSFORM) exprList
     | specifiedFunctionName = (DEPTH | PATH) LP_ correlationInteger RP_
+    | specifiedFunctionName = XMLCOMMENT LP_ stringLiterals RP_
     ;
 
 xmlAggFunction
@@ -1908,7 +1911,11 @@ xmlAggFunction
     ;
 
 xmlColattvalFunction
-    : XMLCOLATTVAL LP_ expr (AS (alias | EVALNAME expr))? (COMMA_ expr (AS 
(alias | EVALNAME expr))?)* RP_
+    : XMLCOLATTVAL LP_ expr (xmlAsAliasOrEvalnameExpr)? (COMMA_ expr 
(xmlAsAliasOrEvalnameExpr)?)* RP_
+    ;
+
+xmlAsAliasOrEvalnameExpr
+    :AS (alias | EVALNAME expr)
     ;
 
 xmlExistsFunction
@@ -1916,7 +1923,7 @@ xmlExistsFunction
     ;
 
 xmlForestFunction
-   : XMLFOREST LP_ expr (AS (alias | EVALNAME expr))? (COMMA_ expr (AS (alias 
| EVALNAME expr))?)* RP_
+   : XMLFOREST LP_ expr (xmlAsAliasOrEvalnameExpr)? (COMMA_ expr 
(xmlAsAliasOrEvalnameExpr)?)* RP_
    ;
 
 xmlParseFunction
diff --git 
a/parser/sql/dialect/oracle/src/main/antlr4/imports/oracle/OracleKeyword.g4 
b/parser/sql/dialect/oracle/src/main/antlr4/imports/oracle/OracleKeyword.g4
index d3383343b19..8ad75b72a80 100644
--- a/parser/sql/dialect/oracle/src/main/antlr4/imports/oracle/OracleKeyword.g4
+++ b/parser/sql/dialect/oracle/src/main/antlr4/imports/oracle/OracleKeyword.g4
@@ -7648,6 +7648,10 @@ XPATHTABLE
     :X P A T H T A B L E
     ;
 
+XMLSEQUENCE
+    :X M L S E Q U E N C E
+    ;
+
 XS_SYS_CONTEXT
     :X S UL_ S Y S UL_ C O N T E X T
     ;
diff --git 
a/parser/sql/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/OracleStatementVisitor.java
 
b/parser/sql/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/OracleStatementVisitor.java
index f11df559c4c..c0574e294b4 100644
--- 
a/parser/sql/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/OracleStatementVisitor.java
+++ 
b/parser/sql/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/OracleStatementVisitor.java
@@ -650,7 +650,13 @@ public abstract class OracleStatementVisitor extends 
OracleStatementBaseVisitor<
         if (null != ctx.xmlTableFunction()) {
             return visit(ctx.xmlTableFunction());
         }
-        return new FunctionSegment(ctx.getStart().getStartIndex(), 
ctx.getStop().getStopIndex(), ctx.specifiedFunctionName.getText(), 
getOriginalText(ctx));
+        FunctionSegment result = new 
FunctionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), 
ctx.specifiedFunctionName.getText(), getOriginalText(ctx));
+        if (null != ctx.exprList()) {
+            for (ExprContext each : ctx.exprList().exprs().expr()) {
+                result.getParameters().add((ExpressionSegment) visit(each));
+            }
+        }
+        return result;
     }
     
     @Override
diff --git a/test/it/parser/src/main/resources/case/ddl/alter-type.xml 
b/test/it/parser/src/main/resources/case/ddl/alter-type.xml
index 568053ff183..b59491a50c9 100644
--- a/test/it/parser/src/main/resources/case/ddl/alter-type.xml
+++ b/test/it/parser/src/main/resources/case/ddl/alter-type.xml
@@ -23,8 +23,6 @@
     <alter-type sql-case-id="alter_type_add_attribute" />
     <alter-type sql-case-id="alter_type_add_value" />
     <alter-type sql-case-id="alter_type_rename_value" />
-    <alter-type sql-case-id="alter_type_default" />
-    <alter-type sql-case-id="alter_type_schema_name" />
     <alter-type sql-case-id="alter_type_compile" />
     <alter-type sql-case-id="alter_type_debug" />
     <alter-type sql-case-id="alter_type_spec" />
diff --git a/test/it/parser/src/main/resources/case/dml/select.xml 
b/test/it/parser/src/main/resources/case/dml/select.xml
index a4277ab0aee..bdafe84b87b 100644
--- a/test/it/parser/src/main/resources/case/dml/select.xml
+++ b/test/it/parser/src/main/resources/case/dml/select.xml
@@ -5879,6 +5879,9 @@
                 <literalText>SYS_XMLAGG(last_name)</literalText>
                 <expr>
                     <function function-name="SYS_XMLAGG" 
text="SYS_XMLAGG(last_name)" start-index="7" stop-index="27" 
literal-start-index="7" literal-stop-index="27">
+                        <parameter>
+                            <column name="last_name" start-index="18" 
stop-index="26" literal-start-index="18" literal-stop-index="26" />
+                        </parameter>
                         <literalText>SYS_XMLAGG(last_name)</literalText>
                     </function>
                 </expr>
@@ -6267,4 +6270,142 @@
             <column-item name="warehouse_id" order-direction="ASC" 
start-index="920" stop-index="931" literal-start-index="920" 
literal-stop-index="931" />
         </order-by>
     </select>
+
+    <select sql-case-id="select_with_more_xml_functions">
+        <projections start-index="7" stop-index="348" literal-start-index="7" 
literal-stop-index="348">
+            <expression-projection text="XMLCOMMENT('OrderAnalysisComp 
imported, reconfigured, disassembled')" start-index="7" stop-index="74" 
literal-start-index="7" literal-stop-index="74">
+                <literalText>XMLCOMMENT('OrderAnalysisComp imported, 
reconfigured, disassembled')</literalText>
+                <expr>
+                    <function function-name="XMLCOMMENT" 
text="XMLCOMMENT('OrderAnalysisComp imported, reconfigured, disassembled')" 
start-index="7" stop-index="74" literal-start-index="7" literal-stop-index="74">
+                        <parameter>
+                            <literal-expression value="OrderAnalysisComp 
imported, reconfigured, disassembled" start-index="18" stop-index="73" 
literal-start-index="18" literal-stop-index="73" />
+                        </parameter>
+                        <literalText>XMLCOMMENT('OrderAnalysisComp imported, 
reconfigured, disassembled')</literalText>
+                    </function>
+                </expr>
+            </expression-projection>
+            <expression-projection text="XMLCONCAT(XMLELEMENT('First', 
e.first_name), XMLELEMENT('Last', e.last_name))" alias="Result" 
start-index="77" stop-index="165" literal-start-index="77" 
literal-stop-index="165">
+                <literalText>XMLCONCAT(XMLELEMENT('First', e.first_name), 
XMLELEMENT('Last', e.last_name))</literalText>
+                <expr>
+                    <function function-name="XMLCONCAT" 
text="XMLCONCAT(XMLELEMENT('First', e.first_name), XMLELEMENT('Last', 
e.last_name))" start-index="77" stop-index="153" literal-start-index="77" 
literal-stop-index="153">
+                        <parameter>
+                            <function function-name="XMLELEMENT" 
text="XMLELEMENT('First', e.first_name)" start-index="87" stop-index="119" 
literal-start-index="87" literal-stop-index="119">
+                                <parameter>
+                                    <literal-expression value="First" 
start-index="98" stop-index="104" literal-start-index="98" 
literal-stop-index="104" />
+                                </parameter>
+                                <parameter>
+                                    <column name="first_name" 
start-index="107" stop-index="118" literal-start-index="107" 
literal-stop-index="118">
+                                        <owner name="e" start-index="107" 
stop-index="107" literal-start-index="107" literal-stop-index="107" />
+                                    </column>
+                                </parameter>
+                                <literalText>XMLELEMENT('First', 
e.first_name)</literalText>
+                            </function>
+                        </parameter>
+                        <parameter>
+                            <function function-name="XMLELEMENT" 
text="XMLELEMENT('Last', e.last_name)" start-index="122" stop-index="152" 
literal-start-index="122" literal-stop-index="152">
+                                <parameter>
+                                    <literal-expression value="Last" 
start-index="133" stop-index="138" literal-start-index="133" 
literal-stop-index="138" />
+                                </parameter>
+                                <parameter>
+                                    <column name="last_name" start-index="141" 
stop-index="151" literal-start-index="141" literal-stop-index="151">
+                                        <owner name="e" start-index="141" 
stop-index="141" literal-start-index="141" literal-stop-index="141" />
+                                    </column>
+                                </parameter>
+                                <literalText>XMLELEMENT('Last', 
e.last_name)</literalText>
+                            </function>
+                        </parameter>
+                        <literalText>XMLCONCAT(XMLELEMENT('First', 
e.first_name), XMLELEMENT('Last', e.last_name))</literalText>
+                    </function>
+                </expr>
+            </expression-projection>
+            <expression-projection text="XMLPATCH(XMLTYPE('xml'))" 
start-index="168" stop-index="191" literal-start-index="168" 
literal-stop-index="191">
+                <literalText>XMLPATCH(XMLTYPE('xml'))</literalText>
+                <expr>
+                    <function function-name="XMLPATCH" 
text="XMLPATCH(XMLTYPE('xml'))" start-index="168" stop-index="191" 
literal-start-index="168" literal-stop-index="191">
+                        <parameter>
+                            <function function-name="XMLTYPE" 
text="XMLTYPE('xml')" start-index="177" stop-index="190" 
literal-start-index="177" literal-stop-index="190">
+                                <parameter>
+                                    <literal-expression value="xml" 
start-index="185" stop-index="189" literal-start-index="185" 
literal-stop-index="189" />
+                                </parameter>
+                                <literalText>XMLTYPE('xml')</literalText>
+                            </function>
+                        </parameter>
+                        <literalText>XMLPATCH(XMLTYPE('xml'))</literalText>
+                    </function>
+                </expr>
+            </expression-projection>
+            <expression-projection 
text="XMLDIFF(XMLTYPE('xml'),XMLTYPE('xml2'))" start-index="194" 
stop-index="232" literal-start-index="194" literal-stop-index="232">
+                
<literalText>XMLDIFF(XMLTYPE('xml'),XMLTYPE('xml2'))</literalText>
+                <expr>
+                    <function function-name="XMLDIFF" 
text="XMLDIFF(XMLTYPE('xml'),XMLTYPE('xml2'))" start-index="194" 
stop-index="232" literal-start-index="194" literal-stop-index="232">
+                        <parameter>
+                            <function function-name="XMLTYPE" 
text="XMLTYPE('xml')" start-index="202" stop-index="215" 
literal-start-index="202" literal-stop-index="215">
+                                <parameter>
+                                    <literal-expression value="xml" 
start-index="210" stop-index="214" literal-start-index="210" 
literal-stop-index="214" />
+                                </parameter>
+                                <literalText>XMLTYPE('xml')</literalText>
+                            </function>
+                        </parameter>
+                        <parameter>
+                            <function function-name="XMLTYPE" 
text="XMLTYPE('xml2')" start-index="217" stop-index="231" 
literal-start-index="217" literal-stop-index="231">
+                                <parameter>
+                                    <literal-expression value="xml2" 
start-index="225" stop-index="230" literal-start-index="225" 
literal-stop-index="230" />
+                                </parameter>
+                                <literalText>XMLTYPE('xml2')</literalText>
+                            </function>
+                        </parameter>
+                        
<literalText>XMLDIFF(XMLTYPE('xml'),XMLTYPE('xml2'))</literalText>
+                    </function>
+                </expr>
+            </expression-projection>
+            <expression-projection text="XMLELEMENT('Emp', 
XMLATTRIBUTES(e.employee_id, e.last_name))" start-index="235" stop-index="294" 
literal-start-index="235" literal-stop-index="294">
+                <literalText>XMLELEMENT('Emp', XMLATTRIBUTES(e.employee_id, 
e.last_name))</literalText>
+                <expr>
+                    <function function-name="XMLELEMENT" 
text="XMLELEMENT('Emp', XMLATTRIBUTES(e.employee_id, e.last_name))" 
start-index="235" stop-index="294" literal-start-index="235" 
literal-stop-index="294">
+                        <parameter>
+                            <literal-expression value="Emp" start-index="246" 
stop-index="250" literal-start-index="246" literal-stop-index="250" />
+                        </parameter>
+                        <parameter>
+                            <function function-name="XMLATTRIBUTES" 
text="XMLATTRIBUTES(e.employee_id, e.last_name)" start-index="253" 
stop-index="293" literal-start-index="253" literal-stop-index="293">
+                                <parameter>
+                                    <column name="employee_id" 
start-index="267" stop-index="279" literal-start-index="267" 
literal-stop-index="279">
+                                        <owner name="e" start-index="267" 
stop-index="267" literal-start-index="267" literal-stop-index="267" />
+                                    </column>
+                                </parameter>
+                                <parameter>
+                                    <column name="last_name" start-index="282" 
stop-index="292" literal-start-index="282" literal-stop-index="292">
+                                        <owner name="e" start-index="282" 
stop-index="282" literal-start-index="282" literal-stop-index="282" />
+                                    </column>
+                                </parameter>
+                                <literalText>XMLATTRIBUTES(e.employee_id, 
e.last_name)</literalText>
+                            </function>
+                        </parameter>
+                        <literalText>XMLELEMENT('Emp', 
XMLATTRIBUTES(e.employee_id, e.last_name))</literalText>
+                    </function>
+                </expr>
+            </expression-projection>
+            <expression-projection text="XMLSEQUENCE(EXTRACT(warehouse_spec, 
'/Warehouse/*'))" start-index="297" stop-index="348" literal-start-index="297" 
literal-stop-index="348">
+                <literalText>XMLSEQUENCE(EXTRACT(warehouse_spec, 
'/Warehouse/*'))</literalText>
+                <expr>
+                    <function function-name="XMLSEQUENCE" 
text="XMLSEQUENCE(EXTRACT(warehouse_spec, '/Warehouse/*'))" start-index="297" 
stop-index="348" literal-start-index="297" literal-stop-index="348">
+                        <parameter>
+                            <function function-name="EXTRACT" 
text="EXTRACT(warehouse_spec, '/Warehouse/*')" start-index="309" 
stop-index="347" literal-start-index="309" literal-stop-index="347">
+                                <parameter>
+                                    <column name="warehouse_spec" 
start-index="317" stop-index="330" literal-start-index="317" 
literal-stop-index="330" />
+                                </parameter>
+                                <parameter>
+                                    <literal-expression value="/Warehouse/*" 
start-index="333" stop-index="346" literal-start-index="333" 
literal-stop-index="346" />
+                                </parameter>
+                                <literalText>EXTRACT(warehouse_spec, 
'/Warehouse/*')</literalText>
+                            </function>
+                        </parameter>
+                        <literalText>XMLSEQUENCE(EXTRACT(warehouse_spec, 
'/Warehouse/*'))</literalText>
+                    </function>
+                </expr>
+            </expression-projection>
+        </projections>
+        <from>
+            <simple-table name="DUAL" start-index="355" stop-index="358" 
literal-start-index="355" literal-stop-index="358" />
+        </from>
+    </select>
 </sql-parser-test-cases>
diff --git a/test/it/parser/src/main/resources/sql/supported/dml/select.xml 
b/test/it/parser/src/main/resources/sql/supported/dml/select.xml
index 7dafeb6e383..e62f82d64d5 100644
--- a/test/it/parser/src/main/resources/sql/supported/dml/select.xml
+++ b/test/it/parser/src/main/resources/sql/supported/dml/select.xml
@@ -203,4 +203,5 @@
     <sql-case id="select_with_rank_function" value="SELECT RANK(15500, .05) 
WITHIN GROUP (ORDER BY salary, commission_pct) 'Rank' FROM employees" 
db-types="Oracle" />
     <sql-case id="select_with_rownumber_function" value="SELECT department_id, 
first_name, last_name, salary FROM (SELECT department_id, first_name, 
last_name, salary, ROW_NUMBER() OVER (PARTITION BY department_id ORDER BY 
salary desc) rn  FROM employees) WHERE rn = 3 ORDER BY department_id, salary 
DESC, last_name" db-types="Oracle" />
     <sql-case id="select_with_xml_functions" value="SELECT 
INSERTCHILDXML(warehouse_spec, '/Warehouse/Building', 'Owner', 
XMLType('&lt;Owner>LesserCo&lt;/Owner>')), SYS_DBURIGEN(employee_id, email), 
INSERTCHILDXMLAFTER(warehouse_spec, '/Warehouse/Building','Owner[2]', 
XMLType('&lt;Owner>ThirdOwner&lt;/Owner>')), 
INSERTCHILDXMLBEFORE(warehouse_spec, '/Warehouse/Building','Owner[2]', 
XMLType('&lt;Owner>ThirdOwner&lt;/Owner>')), 
INSERTXMLAFTER(warehouse_spec,'/Warehouse/Building/Owner[1]',  [...]
+    <sql-case id="select_with_more_xml_functions" value="SELECT 
XMLCOMMENT('OrderAnalysisComp imported, reconfigured, disassembled'), 
XMLCONCAT(XMLELEMENT('First', e.first_name), XMLELEMENT('Last', e.last_name)) 
AS 'Result', XMLPATCH(XMLTYPE('xml')), XMLDIFF(XMLTYPE('xml'),XMLTYPE('xml2')), 
XMLELEMENT('Emp', XMLATTRIBUTES(e.employee_id, e.last_name)), 
XMLSEQUENCE(EXTRACT(warehouse_spec, '/Warehouse/*')) FROM DUAL" 
db-types="Oracle" />
 </sql-cases>

Reply via email to