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 b155a0ac8c1 Refactor the constraintState syntax definition (#28113)
b155a0ac8c1 is described below

commit b155a0ac8c1c70f3efd20e075496398cf69f8bbc
Author: niu niu <[email protected]>
AuthorDate: Thu Aug 17 10:07:25 2023 +0800

    Refactor the constraintState syntax definition (#28113)
    
    * Refactor the constraintState syntax definition
    
    * Add oracle alter view constraint definition parse
    
    * Format code
---
 .../src/main/antlr4/imports/oracle/DDLStatement.g4   | 20 +++-----------------
 .../statement/type/OracleDDLStatementVisitor.java    | 12 ++++++++++++
 .../handler/ddl/AlterViewStatementHandler.java       | 16 ++++++++++++++++
 .../oracle/ddl/OracleAlterViewStatement.java         | 18 ++++++++++++++++++
 .../statement/ddl/impl/AlterViewStatementAssert.java | 15 +++++++++++++++
 .../statement/ddl/AlterViewStatementTestCase.java    |  4 ++++
 .../src/main/resources/case/ddl/alter-view.xml       | 20 ++++++++++++++++++++
 .../main/resources/sql/supported/ddl/alter-view.xml  |  3 +++
 8 files changed, 91 insertions(+), 17 deletions(-)

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 98947b90965..ff7ada2ac90 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
@@ -307,21 +307,7 @@ referencesClause
     ;
 
 constraintState
-    : notDeferrable 
-    | initiallyClause 
-    | RELY | NORELY 
-    | usingIndexClause 
-    | ENABLE | DISABLE 
-    | VALIDATE | NOVALIDATE 
-    | exceptionsClause
-    ;
-
-notDeferrable
-    : NOT? DEFERRABLE
-    ;
-
-initiallyClause
-    : INITIALLY (IMMEDIATE | DEFERRED)
+    : (NOT? DEFERRABLE (INITIALLY (DEFERRED | IMMEDIATE))? | INITIALLY 
(DEFERRED | IMMEDIATE) (NOT? DEFERRABLE)?)? (RELY | NORELY)? usingIndexClause? 
(ENABLE | DISABLE)? (VALIDATE | NOVALIDATE)? exceptionsClause?
     ;
 
 exceptionsClause
@@ -538,7 +524,7 @@ addConstraintSpecification
     ;
 
 modifyConstraintClause
-    : MODIFY constraintOption constraintState+ CASCADE?
+    : MODIFY constraintOption constraintState CASCADE?
     ;
 
 constraintWithName
@@ -1342,7 +1328,7 @@ alterMappingTableClauses
 
 alterView
     : ALTER VIEW viewName (
-    | ADD outOfLineConstraint
+    | ADD LP_? outOfLineConstraint RP_?
     | MODIFY CONSTRAINT constraintName (RELY | NORELY) 
     | DROP (CONSTRAINT constraintName | PRIMARY KEY | UNIQUE columnNames) 
     | COMPILE 
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 f0956744ff8..4edeb1b38be 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
@@ -605,6 +605,18 @@ public final class OracleDDLStatementVisitor extends 
OracleStatementVisitor impl
     public ASTNode visitAlterView(final AlterViewContext ctx) {
         OracleAlterViewStatement result = new OracleAlterViewStatement();
         result.setView((SimpleTableSegment) visit(ctx.viewName()));
+        result.setConstraintDefinitionSegment((ConstraintDefinitionSegment) 
getAlterViewConstraintDefinition(ctx));
+        return result;
+    }
+    
+    private ASTNode getAlterViewConstraintDefinition(final AlterViewContext 
ctx) {
+        ConstraintDefinitionSegment result = null;
+        if (null != ctx.outOfLineConstraint()) {
+            result = (ConstraintDefinitionSegment) 
visit(ctx.outOfLineConstraint());
+        } else if (null != ctx.constraintName()) {
+            result = new 
ConstraintDefinitionSegment(ctx.getStart().getStartIndex(), 
ctx.getStop().getStopIndex());
+            result.setConstraintName((ConstraintSegment) 
visit(ctx.constraintName()));
+        }
         return result;
     }
     
diff --git 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/handler/ddl/AlterViewStatementHandler.java
 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/handler/ddl/AlterViewStatementHandler.java
index 9fa9ffdcccb..7dc02680119 100644
--- 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/handler/ddl/AlterViewStatementHandler.java
+++ 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/handler/ddl/AlterViewStatementHandler.java
@@ -19,6 +19,7 @@ package 
org.apache.shardingsphere.sql.parser.sql.dialect.handler.ddl;
 
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.constraint.ConstraintDefinitionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SimpleTableSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.AlterViewStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.common.statement.dml.SelectStatement;
@@ -27,6 +28,8 @@ import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.MySQLSta
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.ddl.MySQLAlterViewStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.opengauss.OpenGaussStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.opengauss.ddl.OpenGaussAlterViewStatement;
+import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.oracle.OracleStatement;
+import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.oracle.ddl.OracleAlterViewStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.postgresql.PostgreSQLStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.postgresql.ddl.PostgreSQLAlterViewStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.sqlserver.SQLServerStatement;
@@ -87,4 +90,17 @@ public final class AlterViewStatementHandler implements 
SQLStatementHandler {
         }
         return Optional.empty();
     }
+    
+    /**
+     * Get constraint definition segment.
+     * 
+     * @param alterViewStatement AlterViewStatement
+     * @return constraint definition
+     */
+    public static Optional<ConstraintDefinitionSegment> 
getConstraintDefinition(final AlterViewStatement alterViewStatement) {
+        if (alterViewStatement instanceof OracleStatement) {
+            return ((OracleAlterViewStatement) 
alterViewStatement).getConstraintDefinitionSegment();
+        }
+        return Optional.empty();
+    }
 }
diff --git 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/oracle/ddl/OracleAlterViewStatement.java
 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/oracle/ddl/OracleAlterViewStatement.java
index f7e547de99b..ca4f3677f7e 100644
--- 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/oracle/ddl/OracleAlterViewStatement.java
+++ 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/oracle/ddl/OracleAlterViewStatement.java
@@ -17,11 +17,29 @@
 
 package org.apache.shardingsphere.sql.parser.sql.dialect.statement.oracle.ddl;
 
+import lombok.Getter;
+import lombok.Setter;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.constraint.ConstraintDefinitionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.AlterViewStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.oracle.OracleStatement;
 
+import java.util.Optional;
+
 /**
  * Oracle alter view statement.
  */
+@Getter
+@Setter
 public final class OracleAlterViewStatement extends AlterViewStatement 
implements OracleStatement {
+    
+    private ConstraintDefinitionSegment constraintDefinitionSegment;
+    
+    /**
+     * Get constraint definition segment.
+     *
+     * @return constraint definition
+     */
+    public Optional<ConstraintDefinitionSegment> 
getConstraintDefinitionSegment() {
+        return Optional.ofNullable(constraintDefinitionSegment);
+    }
 }
diff --git 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/ddl/impl/AlterViewStatementAssert.java
 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/ddl/impl/AlterViewStatementAssert.java
index e024603f557..9d9e8366d9b 100644
--- 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/ddl/impl/AlterViewStatementAssert.java
+++ 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/ddl/impl/AlterViewStatementAssert.java
@@ -19,13 +19,17 @@ package 
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.statement.
 
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.constraint.ConstraintDefinitionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.AlterViewStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.handler.ddl.AlterViewStatementHandler;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.SQLCaseAssertContext;
+import 
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.definition.ConstraintDefinitionAssert;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.table.TableAssert;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.statement.dml.impl.SelectStatementAssert;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.ddl.AlterViewStatementTestCase;
 
+import java.util.Optional;
+
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.jupiter.api.Assertions.assertFalse;
@@ -48,6 +52,7 @@ public final class AlterViewStatementAssert {
         assertView(assertContext, actual, expected);
         assertViewDefinition(assertContext, actual, expected);
         assertSelect(assertContext, actual, expected);
+        assertConstraintDefinition(assertContext, actual, expected);
     }
     
     private static void assertView(final SQLCaseAssertContext assertContext, 
final AlterViewStatement actual, final AlterViewStatementTestCase expected) {
@@ -72,4 +77,14 @@ public final class AlterViewStatementAssert {
             SelectStatementAssert.assertIs(assertContext, 
AlterViewStatementHandler.getSelectStatement(actual).get(), 
expected.getSelectStatement());
         }
     }
+    
+    private static void assertConstraintDefinition(final SQLCaseAssertContext 
assertContext, final AlterViewStatement actual, final 
AlterViewStatementTestCase expected) {
+        Optional<ConstraintDefinitionSegment> constraintDefinition = 
AlterViewStatementHandler.getConstraintDefinition(actual);
+        if (null == expected.getConstraintDefinition()) {
+            assertFalse(constraintDefinition.isPresent(), "actual constraint 
definition should not exist");
+        } else {
+            assertTrue(constraintDefinition.isPresent(), "actual constraint 
definition should exist");
+            ConstraintDefinitionAssert.assertIs(assertContext, 
constraintDefinition.get(), expected.getConstraintDefinition());
+        }
+    }
 }
diff --git 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/ddl/AlterViewStatementTestCase.java
 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/ddl/AlterViewStatementTestCase.java
index d113e03563e..6fc06b5eb18 100644
--- 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/ddl/AlterViewStatementTestCase.java
+++ 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/ddl/AlterViewStatementTestCase.java
@@ -19,6 +19,7 @@ package 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.
 
 import lombok.Getter;
 import lombok.Setter;
+import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.definition.ExpectedConstraintDefinition;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.table.ExpectedSimpleTable;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.SQLParserTestCase;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.dml.SelectStatementTestCase;
@@ -44,4 +45,7 @@ public final class AlterViewStatementTestCase extends 
SQLParserTestCase {
     
     @XmlElement(name = "select")
     private SelectStatementTestCase selectStatement;
+    
+    @XmlElement(name = "constraint-definition")
+    private ExpectedConstraintDefinition constraintDefinition;
 }
diff --git a/test/it/parser/src/main/resources/case/ddl/alter-view.xml 
b/test/it/parser/src/main/resources/case/ddl/alter-view.xml
index edfc0706dd5..205e23ff859 100644
--- a/test/it/parser/src/main/resources/case/ddl/alter-view.xml
+++ b/test/it/parser/src/main/resources/case/ddl/alter-view.xml
@@ -65,4 +65,24 @@
             </from>
         </select>
     </alter-view>
+    
+    <alter-view sql-case-id="alter_view_add_constraint_primary_key1">
+        <view name="time_view" start-index="11" stop-index="19" />
+        <constraint-definition constraint-name="time_view_pk" start-index="26" 
stop-index="89">
+            <primary-key-column name="time_id" start-index="63" 
stop-index="69" />
+        </constraint-definition>
+    </alter-view>
+    
+    <alter-view sql-case-id="alter_view_add_constraint_primary_key2">
+        <view name="time_view" start-index="11" stop-index="19" />
+        <constraint-definition constraint-name="time_view_pk" start-index="26" 
stop-index="95">
+            <primary-key-column name="time_id" start-index="63" 
stop-index="69" />
+            <primary-key-column name="name" start-index="72" stop-index="75" />
+        </constraint-definition>
+    </alter-view>
+    
+    <alter-view sql-case-id="alter_view_modify_constraint_rely">
+        <view name="time_view" start-index="11" stop-index="19" />
+        <constraint-definition constraint-name="time_view_pk" start-index="0" 
stop-index="55" />
+    </alter-view>
 </sql-parser-test-cases>
diff --git a/test/it/parser/src/main/resources/sql/supported/ddl/alter-view.xml 
b/test/it/parser/src/main/resources/sql/supported/ddl/alter-view.xml
index a6cfb5c5a41..1990b3a6ddc 100644
--- a/test/it/parser/src/main/resources/sql/supported/ddl/alter-view.xml
+++ b/test/it/parser/src/main/resources/sql/supported/ddl/alter-view.xml
@@ -27,4 +27,7 @@
     <sql-case id="alter_view_set_view_option" value="ALTER VIEW order_view SET 
(security_barrier=TRUE)" db-types="PostgreSQL,openGauss" />
     <sql-case id="alter_view_reset" value="ALTER VIEW order_view RESET 
(security_barrier)" db-types="PostgreSQL,openGauss" />
     <sql-case id="alter_view_definition" value="ALTER VIEW order_view AS 
SELECT * FROM t_order" db-types="MySQL,SQLServer" />
+    <sql-case id="alter_view_add_constraint_primary_key1" value="ALTER VIEW 
time_view ADD (CONSTRAINT time_view_pk PRIMARY KEY (time_id) DISABLE 
NOVALIDATE)" db-types="Oracle" />
+    <sql-case id="alter_view_add_constraint_primary_key2" value="ALTER VIEW 
time_view ADD (CONSTRAINT time_view_pk PRIMARY KEY (time_id, name) DISABLE 
NOVALIDATE)" db-types="Oracle" />
+    <sql-case id="alter_view_modify_constraint_rely" value="ALTER VIEW 
time_view MODIFY CONSTRAINT time_view_pk RELY" db-types="Oracle" />
 </sql-cases>

Reply via email to