You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by du...@apache.org on 2023/08/17 02:07:33 UTC
[shardingsphere] branch master updated: Refactor the constraintState syntax definition (#28113)
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 <zi...@aliyun.com>
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>