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>

Reply via email to