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('<Owner>LesserCo</Owner>')), SYS_DBURIGEN(employee_id, email),
INSERTCHILDXMLAFTER(warehouse_spec, '/Warehouse/Building','Owner[2]',
XMLType('<Owner>ThirdOwner</Owner>')),
INSERTCHILDXMLBEFORE(warehouse_spec, '/Warehouse/Building','Owner[2]',
XMLType('<Owner>ThirdOwner</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>