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>