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 74ce2f4d595 Support oracle create view parse (#28432)
74ce2f4d595 is described below

commit 74ce2f4d595b4710fac0900134acff85a809c412
Author: niu niu <[email protected]>
AuthorDate: Fri Sep 15 16:37:01 2023 +0800

    Support oracle create view parse (#28432)
    
    * Support oracle create view parse
    
    * Add parameter marker
    
    * Format code
---
 .../src/main/antlr4/imports/oracle/BaseRule.g4     |  4 ++
 .../src/main/antlr4/imports/oracle/DDLStatement.g4 | 23 +++++++
 .../main/antlr4/imports/oracle/OracleKeyword.g4    |  4 ++
 .../sql/parser/autogen/OracleStatement.g4          |  1 +
 .../statement/type/OracleDDLStatementVisitor.java  | 15 +++++
 .../oracle/ddl/OracleCreateViewStatement.java      | 27 ++++++++
 .../src/main/resources/case/ddl/create-view.xml    | 75 ++++++++++++++++++++++
 .../resources/sql/supported/ddl/create-view.xml    |  1 +
 8 files changed, 150 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 ce03a2599b1..327a850c566 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
@@ -2058,3 +2058,7 @@ multisetOperator
     | INTERSECT
     | UNION
     ;
+
+superview
+    : identifier
+    ;
diff --git 
a/parser/sql/dialect/oracle/src/main/antlr4/imports/oracle/DDLStatement.g4 
b/parser/sql/dialect/oracle/src/main/antlr4/imports/oracle/DDLStatement.g4
index 8078460809a..a87aa7a94aa 100644
--- a/parser/sql/dialect/oracle/src/main/antlr4/imports/oracle/DDLStatement.g4
+++ b/parser/sql/dialect/oracle/src/main/antlr4/imports/oracle/DDLStatement.g4
@@ -19,6 +19,15 @@ grammar DDLStatement;
 
 import BaseRule, DCLStatement, DMLStatement;
 
+createView
+    : CREATE (OR REPLACE)? (NO? FORCE)? (EDITIONING | EDITIONABLE EDITIONING? 
| NONEDITIONABLE)? VIEW viewName
+    ( SHARING EQ_ (METADATA | DATA | EXTENDED DATA | NONE))?
+    ( LP_ (alias (VISIBLE | INVISIBLE)? inlineConstraint* (COMMA_ alias 
(VISIBLE | INVISIBLE)? inlineConstraint*)*
+    | outOfLineConstraint) RP_ | objectViewClause | xmlTypeViewClause)?
+    ( DEFAULT COLLATION collationName)? (BEQUEATH (CURRENT_USER | DEFINER))? 
AS select subqueryRestrictionClause?
+    ( CONTAINER_MAP | CONTAINERS_DEFAULT)?
+    ;
+
 createTable
     : CREATE createTableSpecification TABLE tableName createSharingClause 
createDefinitionClause createMemOptimizeClause createParentClause
     ;
@@ -47,6 +56,11 @@ objectTypeDef
     : OBJECT LP_ dataTypeDefinition (COMMA_ dataTypeDefinition)* RP_ 
finalClause? instantiableClause? persistableClause?
     ;
 
+objectViewClause
+    : OF typeName (WITH OBJECT (IDENTIFIER | ID) (DEFAULT | LP_ attribute 
(COMMA_ attribute)* RP_) | UNDER (schemaName DOT_)? superview)
+    ( LP_ outOfLineConstraint | attribute inlineConstraint* (COMMA_ 
outOfLineConstraint | attribute inlineConstraint*)* RP_)?
+    ;
+
 finalClause
     : NOT? FINAL
     ;
@@ -215,6 +229,15 @@ xmlTypeVirtualColumnsClause
     : VIRTUAL COLUMNS LP_ (columnName AS LP_ expr RP_ (COMMA_ columnName AS 
LP_ expr RP_)+) RP_
     ;
 
+xmlTypeViewClause
+    : OF XMLTYPE xmlSchemaSpec? WITH OBJECT (IDENTIFIER | ID) (DEFAULT | LP_ 
expr (COMMA_ expr)* RL_)
+    ;
+
+xmlSchemaSpec
+    : (XMLSCHEMA xmlSchemaURLName)? ELEMENT (elementName | xmlSchemaURLName 
POUND_ elementName)
+    ( STORE ALL VARRAYS AS (LOBS | TABLES))? ((ALLOW | DISALLOW) NONSCHEMA)? 
((ALLOW | DISALLOW) ANYSCHEMA)?
+    ;
+
 oidClause
     : OBJECT IDENTIFIER IS (SYSTEM GENERATED | PRIMARY KEY)
     ;
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 265f7060e62..f9d6f4ca486 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
@@ -19,6 +19,10 @@ lexer grammar OracleKeyword;
 
 import Alphabet;
 
+BEQUEATH
+    : B E Q U E A T H
+    ;
+
 BINARY
     : B I N A R Y
     ;
diff --git 
a/parser/sql/dialect/oracle/src/main/antlr4/org/apache/shardingsphere/sql/parser/autogen/OracleStatement.g4
 
b/parser/sql/dialect/oracle/src/main/antlr4/org/apache/shardingsphere/sql/parser/autogen/OracleStatement.g4
index 91b12da4461..c8a8306d123 100644
--- 
a/parser/sql/dialect/oracle/src/main/antlr4/org/apache/shardingsphere/sql/parser/autogen/OracleStatement.g4
+++ 
b/parser/sql/dialect/oracle/src/main/antlr4/org/apache/shardingsphere/sql/parser/autogen/OracleStatement.g4
@@ -24,6 +24,7 @@ execute
     | insert
     | update
     | delete
+    | createView
     | createTable
     | alterTable
     | dropTable
diff --git 
a/parser/sql/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/type/OracleDDLStatementVisitor.java
 
b/parser/sql/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/type/OracleDDLStatementVisitor.java
index 28518b273c8..84357ff0e2a 100644
--- 
a/parser/sql/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/type/OracleDDLStatementVisitor.java
+++ 
b/parser/sql/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/type/OracleDDLStatementVisitor.java
@@ -95,6 +95,7 @@ import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.Create
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.CreateSynonymContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.CreateTableContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.CreateTablespaceContext;
+import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.CreateViewContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.DisassociateStatisticsContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.DropClusterContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.DropColumnClauseContext;
@@ -179,6 +180,7 @@ import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.column.Column
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.FunctionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.DataTypeSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SimpleTableSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.common.statement.dml.SelectStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.common.value.collection.CollectionValue;
 import 
org.apache.shardingsphere.sql.parser.sql.common.value.identifier.IdentifierValue;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.oracle.ddl.OracleAlterAnalyticViewStatement;
@@ -248,6 +250,7 @@ import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.oracle.ddl.Ora
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.oracle.ddl.OracleCreateSynonymStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.oracle.ddl.OracleCreateTableStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.oracle.ddl.OracleCreateTablespaceStatement;
+import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.oracle.ddl.OracleCreateViewStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.oracle.ddl.OracleCreateVarrayTypeStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.oracle.ddl.OracleDisassociateStatisticsStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.oracle.ddl.OracleDropClusterStatement;
@@ -301,6 +304,18 @@ import java.util.stream.Collectors;
  */
 public final class OracleDDLStatementVisitor extends OracleStatementVisitor 
implements DDLStatementVisitor {
     
+    @Override
+    public ASTNode visitCreateView(final CreateViewContext ctx) {
+        OracleCreateViewStatement result = new OracleCreateViewStatement();
+        OracleDMLStatementVisitor visitor = new OracleDMLStatementVisitor();
+        
visitor.getParameterMarkerSegments().addAll(getParameterMarkerSegments());
+        result.setView((SimpleTableSegment) visit(ctx.viewName()));
+        result.setSelect((SelectStatement) visitor.visit(ctx.select()));
+        result.setViewDefinition(getOriginalText(ctx.select()));
+        result.addParameterMarkerSegments(getParameterMarkerSegments());
+        return result;
+    }
+    
     @SuppressWarnings("unchecked")
     @Override
     public ASTNode visitCreateTable(final CreateTableContext ctx) {
diff --git 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/oracle/ddl/OracleCreateViewStatement.java
 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/oracle/ddl/OracleCreateViewStatement.java
new file mode 100644
index 00000000000..603aaa554ba
--- /dev/null
+++ 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/oracle/ddl/OracleCreateViewStatement.java
@@ -0,0 +1,27 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.sql.parser.sql.dialect.statement.oracle.ddl;
+
+import 
org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.CreateViewStatement;
+import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.oracle.OracleStatement;
+
+/**
+ * Oracle create view statement.
+ */
+public final class OracleCreateViewStatement extends CreateViewStatement 
implements OracleStatement {
+}
diff --git a/test/it/parser/src/main/resources/case/ddl/create-view.xml 
b/test/it/parser/src/main/resources/case/ddl/create-view.xml
index 5a329c52455..0d6972b547b 100644
--- a/test/it/parser/src/main/resources/case/ddl/create-view.xml
+++ b/test/it/parser/src/main/resources/case/ddl/create-view.xml
@@ -167,4 +167,79 @@
             </from>
         </select>
     </create-view>
+
+    <create-view sql-case-id="create_or_replace_view_with_select" 
view-definition="select p.name planet, p.class, m.name moon, m.radius from 
planets p, moons m where p.name = m.planet_name(+) and m.name(+) not like 
'S/%'">
+        <view name="named_moons" start-index="23" stop-index="33" />
+        <select>
+            <projections start-index="45" stop-index="89">
+                <column-projection name="name" alias="planet" start-index="45" 
stop-index="57">
+                    <owner name="p" start-index="45" stop-index="45" />
+                </column-projection>
+                <column-projection name="class" start-index="60" 
stop-index="66">
+                    <owner name="p" start-index="60" stop-index="60" />
+                </column-projection>
+                <column-projection name="name" alias="moon" start-index="69" 
stop-index="79">
+                    <owner name="m" start-index="69" stop-index="69" />
+                </column-projection>
+                <column-projection name="radius" start-index="82" 
stop-index="89">
+                    <owner name="m" start-index="82" stop-index="82" />
+                </column-projection>
+            </projections>
+            <from>
+                <join-table join-type="COMMA">
+                    <left>
+                        <simple-table name="planets" alias="p" 
start-index="96" stop-index="104" />
+                    </left>
+                    <right>
+                        <simple-table name="moons" alias="m" start-index="107" 
stop-index="113" />
+                    </right>
+                </join-table>
+            </from>
+            <where start-index="115" stop-index="174">
+                <expr>
+                    <binary-operation-expression start-index="121" 
stop-index="174">
+                        <left>
+                            <binary-operation-expression start-index="121" 
stop-index="145">
+                                <left>
+                                    <column name="name" start-index="121" 
stop-index="126">
+                                        <owner name="p" start-index="121" 
stop-index="121" />
+                                    </column>
+                                </left>
+                                <right>
+                                    <colum-with-join-operator-segment>
+                                        <column name="planet_name" 
start-index="130" stop-index="142">
+                                            <owner name="m" start-index="130" 
stop-index="130" />
+                                        </column>
+                                        <join-operator>(+)</join-operator>
+                                    </colum-with-join-operator-segment>
+                                </right>
+                                <operator>=</operator>
+                            </binary-operation-expression>
+                        </left>
+                        <right>
+                            <binary-operation-expression start-index="151" 
stop-index="174">
+                                <left>
+                                    <colum-with-join-operator-segment>
+                                        <column name="name" start-index="151" 
stop-index="156">
+                                            <owner name="m" start-index="151" 
stop-index="151" />
+                                        </column>
+                                        <join-operator>(+)</join-operator>
+                                    </colum-with-join-operator-segment>
+                                </left>
+                                <right>
+                                    <list-expression start-index="170" 
stop-index="174">
+                                        <items>
+                                            <literal-expression value="S/%" 
start-index="170" stop-index="174" />
+                                        </items>
+                                    </list-expression>
+                                </right>
+                                <operator>NOT LIKE</operator>
+                            </binary-operation-expression>
+                        </right>
+                        <operator>and</operator>
+                    </binary-operation-expression>
+                </expr>
+            </where>
+        </select>
+    </create-view>
 </sql-parser-test-cases>
diff --git 
a/test/it/parser/src/main/resources/sql/supported/ddl/create-view.xml 
b/test/it/parser/src/main/resources/sql/supported/ddl/create-view.xml
index 2a366f0410f..eec620e4abf 100644
--- a/test/it/parser/src/main/resources/sql/supported/ddl/create-view.xml
+++ b/test/it/parser/src/main/resources/sql/supported/ddl/create-view.xml
@@ -24,4 +24,5 @@
     <sql-case id="create_view_with_check_option" value="CREATE VIEW 
universal_comedies AS SELECT * FROM comedies WHERE classification = 'U' WITH 
LOCAL CHECK OPTION" db-types="PostgreSQL,openGauss" />
     <sql-case id="create_view_with_recursive" value="CREATE RECURSIVE VIEW 
public.nums_1_100 (n) AS VALUES (1) UNION ALL SELECT n+1 FROM nums_1_100 WHERE 
n = 100" db-types="PostgreSQL,openGauss" />
     <sql-case id="create_view_with_option" value="CREATE OR REPLACE TEMP view 
order_view (order_id,user_id) WITH (security_barrier=TRUE) AS SELECT * FROM 
t_order" db-types="PostgreSQL,openGauss" />
+    <sql-case id="create_or_replace_view_with_select" value="create or replace 
view named_moons as select p.name planet, p.class, m.name moon, m.radius from 
planets p, moons m where p.name = m.planet_name(+) and m.name(+) not like 
'S/%'" db-types="Oracle" />
 </sql-cases>

Reply via email to