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 2c2f34aff78 Support oracle isSchemaValid function parsing (#27265) 2c2f34aff78 is described below commit 2c2f34aff78a9d868a20401d28237103d0e766c4 Author: ZhangCheng <chengzh...@apache.org> AuthorDate: Tue Jul 18 16:48:37 2023 +0800 Support oracle isSchemaValid function parsing (#27265) * Support oracle isSchemaValid function parsing * Support oracle isSchemaValid function parsing * Support oracle isSchemaValid function parsing * Support oracle isSchemaValid function parsing * Support oracle isSchemaValid function parsing --- .../src/main/antlr4/imports/oracle/BaseRule.g4 | 5 +++++ .../oracle/src/main/antlr4/imports/oracle/Keyword.g4 | 4 ++++ .../visitor/statement/OracleStatementVisitor.java | 15 +++++++++++++++ .../it/parser/src/main/resources/case/dml/select.xml | 20 ++++++++++++++++++++ .../src/main/resources/sql/supported/dml/select.xml | 1 + 5 files changed, 45 insertions(+) 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 61b7e5ecad2..5f587b91255 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 @@ -1799,6 +1799,7 @@ xmlFunction | xmlRootFunction | xmlSerializeFunction | xmlTableFunction + | xmlIsSchemaValidFunction ; xmlAggFunction @@ -1845,6 +1846,10 @@ xmlTableFunction : XMLTABLE LP_ (xmlNameSpacesClause COMMA_)? STRING_ xmlTableOptions RP_ ; +xmlIsSchemaValidFunction + : (owner DOT_)* name DOT_ ISSCHEMAVALID LP_ expr (COMMA_ expr)* RP_ + ; + xmlNameSpacesClause : XMLNAMESPACES LP_ (defaultString COMMA_)? (xmlNameSpaceStringAsIdentifier | defaultString) (COMMA_ (xmlNameSpaceStringAsIdentifier | defaultString))* RP_ ; diff --git a/parser/sql/dialect/oracle/src/main/antlr4/imports/oracle/Keyword.g4 b/parser/sql/dialect/oracle/src/main/antlr4/imports/oracle/Keyword.g4 index e5690b3ea7e..a73e19ff15f 100644 --- a/parser/sql/dialect/oracle/src/main/antlr4/imports/oracle/Keyword.g4 +++ b/parser/sql/dialect/oracle/src/main/antlr4/imports/oracle/Keyword.g4 @@ -775,6 +775,10 @@ SHOW XMLTABLE : X M L T A B L E ; + +ISSCHEMAVALID + : I S S C H E M A V A L I D + ; XMLNAMESPACES : X M L N A M E S P A C E S 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 54c012a16ec..9901ee5002f 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 @@ -25,6 +25,7 @@ import org.antlr.v4.runtime.misc.Interval; import org.antlr.v4.runtime.tree.TerminalNode; import org.apache.shardingsphere.sql.parser.api.ASTNode; import org.apache.shardingsphere.sql.parser.autogen.OracleStatementBaseVisitor; +import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser; import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.AggregationFunctionContext; import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.AnalyticFunctionContext; import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.BitExprContext; @@ -585,6 +586,9 @@ public abstract class OracleStatementVisitor extends OracleStatementBaseVisitor< if (null != ctx.xmlSerializeFunction()) { return visit(ctx.xmlSerializeFunction()); } + if (null != ctx.xmlIsSchemaValidFunction()) { + return visit(ctx.xmlIsSchemaValidFunction()); + } return visit(ctx.xmlTableFunction()); } @@ -703,6 +707,17 @@ public abstract class OracleStatementVisitor extends OracleStatementBaseVisitor< return new XmlTableColumnSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), ctx.columnName().getText(), dataType, path, defaultExpr, getOriginalText(ctx)); } + @Override + public ASTNode visitXmlIsSchemaValidFunction(final OracleStatementParser.XmlIsSchemaValidFunctionContext ctx) { + FunctionSegment result = new FunctionSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), ctx.ISSCHEMAVALID().getText(), getOriginalText(ctx)); + if (null != ctx.expr()) { + for (ExprContext each : ctx.expr()) { + result.getParameters().add((ExpressionSegment) visit(each)); + } + } + 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/it/parser/src/main/resources/case/dml/select.xml b/test/it/parser/src/main/resources/case/dml/select.xml index e4fe88736e2..1692e5bdf90 100644 --- a/test/it/parser/src/main/resources/case/dml/select.xml +++ b/test/it/parser/src/main/resources/case/dml/select.xml @@ -5556,4 +5556,24 @@ </expression-projection> </projections> </select> + + <select sql-case-id="select_with_xml_is_schema_valid_function"> + <projections start-index="7" stop-index="86" literal-start-index="7" literal-stop-index="86"> + <expression-projection text="x.xmlcol.isSchemaValid('http://www.example.com/schemas/ipo.xsd','purchaseOrder')" start-index="7" stop-index="86" literal-start-index="7" literal-stop-index="86"> + <expr> + <function function-name="isSchemaValid" text="x.xmlcol.isSchemaValid('http://www.example.com/schemas/ipo.xsd','purchaseOrder')" start-index="7" stop-index="86" literal-start-index="7" literal-stop-index="86"> + <parameter> + <literal-expression value="http://www.example.com/schemas/ipo.xsd" start-index="30" stop-index="69" literal-start-index="30" literal-stop-index="69"/> + </parameter> + <parameter> + <literal-expression value="purchaseOrder" start-index="71" stop-index="85" literal-start-index="71" literal-stop-index="85"/> + </parameter> + </function> + </expr> + </expression-projection> + </projections> + <from> + <simple-table alias="x" name="po_tab" start-index="93" stop-index="100" literal-start-index="93" literal-stop-index="100"/> + </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 7a690451f8d..2adba7673aa 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 @@ -185,4 +185,5 @@ <sql-case id="select_with_keyword_system" value="SELECT * FROM vtx_project WHERE system = ?" /> <sql-case id="select_with_keyword_groups_and_rank" value="SELECT t.groups, t.rank FROM t_order t" db-types="MySQL" /> <sql-case id="select_with_format_function" value="SELECT wi.code.format(null,'PURE_IDENTITY') as PURE_IDENTITY FROM warehouse_info wi;" db-types="Oracle" /> + <sql-case id="select_with_xml_is_schema_valid_function" value="SELECT x.xmlcol.isSchemaValid('http://www.example.com/schemas/ipo.xsd','purchaseOrder') FROM po_tab x;" db-types="Oracle" /> </sql-cases>