This is an automated email from the ASF dual-hosted git repository.

chengzhang 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 1304f26654a Enhance create view, alter view, drop view sql parser 
(#34283)
1304f26654a is described below

commit 1304f26654ae460e2332c5877c3973a09470ef10
Author: Zhengqiang Duan <[email protected]>
AuthorDate: Wed Jan 8 16:33:05 2025 +0800

    Enhance create view, alter view, drop view sql parser (#34283)
    
    * Enhance create view, alter view, drop view sql parser
    
    * update release note
---
 RELEASE-NOTES.md                                   |  1 +
 .../EncryptProjectionTokenGenerator.java           |  2 +-
 .../ddl/ShardingAlterViewSupportedCheckerTest.java | 23 +++++++++++--
 .../statement/SQLStatementContextFactory.java      |  4 +--
 .../statement/ddl/AlterViewStatementContext.java   | 38 ++++++++++++++++++----
 .../statement/ddl/CreateViewStatementContext.java  | 12 ++++++-
 .../dml/from/type/SimpleTableSegmentBinder.java    |  8 ++++-
 .../statement/ddl/CreateViewStatementBinder.java   |  1 +
 .../ddl/AlterViewStatementContextTest.java         | 13 +++++++-
 .../ddl/CreateViewStatementContextTest.java        | 18 ++++++++--
 .../statement/type/DorisDDLStatementVisitor.java   |  1 +
 .../statement/type/MySQLDDLStatementVisitor.java   |  2 ++
 .../type/OpenGaussDDLStatementVisitor.java         |  1 +
 .../statement/type/OracleDDLStatementVisitor.java  |  1 +
 .../type/PostgreSQLDDLStatementVisitor.java        |  1 +
 .../statement/type/PrestoDDLStatementVisitor.java  |  1 +
 .../type/SQLServerDDLStatementVisitor.java         |  1 +
 .../parser/statement/core/enums/SubqueryType.java  |  2 +-
 .../core/statement/ddl/CreateViewStatement.java    |  2 ++
 .../core/statement/ddl/DropViewStatement.java      | 17 ++++++++++
 .../mysql/ddl/MySQLDropViewStatement.java          |  6 ++++
 21 files changed, 137 insertions(+), 18 deletions(-)

diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md
index 8c96db616a8..ad0678561db 100644
--- a/RELEASE-NOTES.md
+++ b/RELEASE-NOTES.md
@@ -52,6 +52,7 @@
 1. Encrypt: Support insert statement rewrite use quote 
[#34259](https://github.com/apache/shardingsphere/pull/34259)
 1. SQL Binder: Support optimize table sql bind and add test case - 
[#34242](https://github.com/apache/shardingsphere/pull/34242)
 1. SQL Binder: Support show create table, show columns, show index statement 
bind - [#34271](https://github.com/apache/shardingsphere/pull/34271)
+1. SQL Parser: Enhance create view, alter view, drop view sql parser - 
[#34283](https://github.com/apache/shardingsphere/pull/34283)
 
 ### Bug Fixes
 
diff --git 
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/projection/EncryptProjectionTokenGenerator.java
 
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/projection/EncryptProjectionTokenGenerator.java
index 03bde3d645d..5877e355428 100644
--- 
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/projection/EncryptProjectionTokenGenerator.java
+++ 
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/projection/EncryptProjectionTokenGenerator.java
@@ -162,7 +162,7 @@ public final class EncryptProjectionTokenGenerator {
         if (SubqueryType.PREDICATE == subqueryType) {
             return 
Collections.singleton(generateProjectionInPredicateSubquery(encryptColumn, 
columnProjection));
         }
-        if (SubqueryType.INSERT_SELECT == subqueryType) {
+        if (SubqueryType.INSERT_SELECT == subqueryType || 
SubqueryType.VIEW_DEFINITION == subqueryType) {
             return generateProjectionsInInsertSelectSubquery(encryptColumn, 
columnProjection);
         }
         throw new UnsupportedSQLOperationException(
diff --git 
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/sql/ddl/ShardingAlterViewSupportedCheckerTest.java
 
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/sql/ddl/ShardingAlterViewSupportedCheckerTest.java
index 1acaea3299c..05dd28156e3 100644
--- 
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/sql/ddl/ShardingAlterViewSupportedCheckerTest.java
+++ 
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/sql/ddl/ShardingAlterViewSupportedCheckerTest.java
@@ -18,8 +18,12 @@
 package org.apache.shardingsphere.sharding.checker.sql.ddl;
 
 import 
org.apache.shardingsphere.infra.binder.context.statement.ddl.AlterViewStatementContext;
+import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
+import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
+import 
org.apache.shardingsphere.infra.rule.attribute.table.TableMapperRuleAttribute;
 import 
org.apache.shardingsphere.sharding.exception.metadata.EngagedViewException;
 import org.apache.shardingsphere.sharding.rule.ShardingRule;
+import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.ProjectionsSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SimpleTableSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.TableNameSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue;
@@ -31,8 +35,11 @@ import org.junit.jupiter.api.extension.ExtendWith;
 import org.mockito.Mock;
 import org.mockito.junit.jupiter.MockitoExtension;
 
+import java.util.Collections;
+
 import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
 import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
@@ -46,10 +53,15 @@ class ShardingAlterViewSupportedCheckerTest {
     void assertPreValidateAlterViewForMySQL() {
         MySQLSelectStatement selectStatement = new MySQLSelectStatement();
         selectStatement.setFrom(new SimpleTableSegment(new TableNameSegment(0, 
0, new IdentifierValue("t_order"))));
+        selectStatement.setProjections(new ProjectionsSegment(0, 0));
         MySQLAlterViewStatement sqlStatement = new MySQLAlterViewStatement();
         sqlStatement.setView(new SimpleTableSegment(new TableNameSegment(0, 0, 
new IdentifierValue("t_order_view"))));
         sqlStatement.setSelect(selectStatement);
-        AlterViewStatementContext sqlStatementContext = new 
AlterViewStatementContext(sqlStatement);
+        ShardingSphereMetaData metaData = mock(ShardingSphereMetaData.class);
+        ShardingSphereDatabase database = mock(ShardingSphereDatabase.class, 
RETURNS_DEEP_STUBS);
+        
when(database.getRuleMetaData().getAttributes(TableMapperRuleAttribute.class)).thenReturn(Collections.emptyList());
+        when(metaData.getDatabase("foo_db")).thenReturn(database);
+        AlterViewStatementContext sqlStatementContext = new 
AlterViewStatementContext(metaData, Collections.emptyList(), sqlStatement, 
"foo_db");
         when(rule.isShardingTable("t_order")).thenReturn(false);
         assertDoesNotThrow(() -> new 
ShardingAlterViewSupportedChecker().check(rule, mock(), mock(), 
sqlStatementContext));
     }
@@ -58,10 +70,15 @@ class ShardingAlterViewSupportedCheckerTest {
     void assertPreValidateAlterViewWithShardingTableForMySQL() {
         MySQLSelectStatement selectStatement = new MySQLSelectStatement();
         selectStatement.setFrom(new SimpleTableSegment(new TableNameSegment(0, 
0, new IdentifierValue("t_order"))));
+        selectStatement.setProjections(new ProjectionsSegment(0, 0));
         MySQLAlterViewStatement sqlStatement = new MySQLAlterViewStatement();
         sqlStatement.setView(new SimpleTableSegment(new TableNameSegment(0, 0, 
new IdentifierValue("t_order_view"))));
         sqlStatement.setSelect(selectStatement);
-        AlterViewStatementContext sqlStatementContext = new 
AlterViewStatementContext(sqlStatement);
+        ShardingSphereMetaData metaData = mock(ShardingSphereMetaData.class);
+        ShardingSphereDatabase database = mock(ShardingSphereDatabase.class, 
RETURNS_DEEP_STUBS);
+        
when(database.getRuleMetaData().getAttributes(TableMapperRuleAttribute.class)).thenReturn(Collections.emptyList());
+        when(metaData.getDatabase("foo_db")).thenReturn(database);
+        AlterViewStatementContext sqlStatementContext = new 
AlterViewStatementContext(metaData, Collections.emptyList(), sqlStatement, 
"foo_db");
         when(rule.isShardingTable("t_order")).thenReturn(true);
         assertThrows(EngagedViewException.class, () -> new 
ShardingAlterViewSupportedChecker().check(rule, mock(), mock(), 
sqlStatementContext));
     }
@@ -71,7 +88,7 @@ class ShardingAlterViewSupportedCheckerTest {
         OpenGaussAlterViewStatement sqlStatement = new 
OpenGaussAlterViewStatement();
         sqlStatement.setView(new SimpleTableSegment(new TableNameSegment(0, 0, 
new IdentifierValue("t_order_view"))));
         sqlStatement.setRenameView(new SimpleTableSegment(new 
TableNameSegment(0, 0, new IdentifierValue("t_order_new"))));
-        AlterViewStatementContext sqlStatementContext = new 
AlterViewStatementContext(sqlStatement);
+        AlterViewStatementContext sqlStatementContext = new 
AlterViewStatementContext(mock(ShardingSphereMetaData.class), 
Collections.emptyList(), sqlStatement, "foo_db");
         assertDoesNotThrow(() -> new 
ShardingAlterViewSupportedChecker().check(rule, mock(), mock(), 
sqlStatementContext));
     }
 }
diff --git 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/statement/SQLStatementContextFactory.java
 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/statement/SQLStatementContextFactory.java
index dce944382f9..1ad34d3cf09 100644
--- 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/statement/SQLStatementContextFactory.java
+++ 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/statement/SQLStatementContextFactory.java
@@ -205,10 +205,10 @@ public final class SQLStatementContextFactory {
             return new 
CreateProcedureStatementContext((CreateProcedureStatement) sqlStatement);
         }
         if (sqlStatement instanceof CreateViewStatement) {
-            return new CreateViewStatementContext((CreateViewStatement) 
sqlStatement);
+            return new CreateViewStatementContext(metaData, params, 
(CreateViewStatement) sqlStatement, currentDatabaseName);
         }
         if (sqlStatement instanceof AlterViewStatement) {
-            return new AlterViewStatementContext((AlterViewStatement) 
sqlStatement);
+            return new AlterViewStatementContext(metaData, params, 
(AlterViewStatement) sqlStatement, currentDatabaseName);
         }
         if (sqlStatement instanceof DropViewStatement) {
             return new DropViewStatementContext((DropViewStatement) 
sqlStatement);
diff --git 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/statement/ddl/AlterViewStatementContext.java
 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/statement/ddl/AlterViewStatementContext.java
index 21ed040858f..cef57090226 100644
--- 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/statement/ddl/AlterViewStatementContext.java
+++ 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/statement/ddl/AlterViewStatementContext.java
@@ -20,14 +20,19 @@ package 
org.apache.shardingsphere.infra.binder.context.statement.ddl;
 import lombok.Getter;
 import 
org.apache.shardingsphere.infra.binder.context.segment.table.TablesContext;
 import 
org.apache.shardingsphere.infra.binder.context.statement.CommonSQLStatementContext;
+import 
org.apache.shardingsphere.infra.binder.context.statement.dml.SelectStatementContext;
 import org.apache.shardingsphere.infra.binder.context.type.TableAvailable;
+import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
+import org.apache.shardingsphere.sql.parser.statement.core.enums.SubqueryType;
 import 
org.apache.shardingsphere.sql.parser.statement.core.extractor.TableExtractor;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SimpleTableSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.AlterViewStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.dml.SelectStatement;
 
 import java.util.Collection;
+import java.util.Collections;
 import java.util.LinkedList;
+import java.util.List;
 import java.util.Optional;
 
 /**
@@ -38,18 +43,39 @@ public final class AlterViewStatementContext extends 
CommonSQLStatementContext i
     
     private final TablesContext tablesContext;
     
-    public AlterViewStatementContext(final AlterViewStatement sqlStatement) {
+    private final SelectStatementContext selectStatementContext;
+    
+    public AlterViewStatementContext(final ShardingSphereMetaData metaData, 
final List<Object> params, final AlterViewStatement sqlStatement, final String 
currentDatabaseName) {
         super(sqlStatement);
         Collection<SimpleTableSegment> tables = new LinkedList<>();
         tables.add(sqlStatement.getView());
         Optional<SelectStatement> selectStatement = sqlStatement.getSelect();
-        selectStatement.ifPresent(optional -> {
-            TableExtractor extractor = new TableExtractor();
-            extractor.extractTablesFromSelect(optional);
-            tables.addAll(extractor.getRewriteTables());
-        });
+        selectStatement.ifPresent(optional -> extractTables(optional, tables));
         sqlStatement.getRenameView().ifPresent(tables::add);
         tablesContext = new TablesContext(tables);
+        selectStatementContext = selectStatement.map(optional -> 
createSelectStatementContext(metaData, params, optional, 
currentDatabaseName)).orElse(null);
+    }
+    
+    private SelectStatementContext createSelectStatementContext(final 
ShardingSphereMetaData metaData, final List<Object> params, final 
SelectStatement selectStatement,
+                                                                final String 
currentDatabaseName) {
+        SelectStatementContext result = new SelectStatementContext(metaData, 
params, selectStatement, currentDatabaseName, Collections.emptyList());
+        result.setSubqueryType(SubqueryType.VIEW_DEFINITION);
+        return result;
+    }
+    
+    private void extractTables(final SelectStatement selectStatement, final 
Collection<SimpleTableSegment> tables) {
+        TableExtractor extractor = new TableExtractor();
+        extractor.extractTablesFromSelect(selectStatement);
+        tables.addAll(extractor.getRewriteTables());
+    }
+    
+    /**
+     * Get select statement context.
+     *
+     * @return select statement context
+     */
+    public Optional<SelectStatementContext> getSelectStatementContext() {
+        return Optional.ofNullable(selectStatementContext);
     }
     
     @Override
diff --git 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/statement/ddl/CreateViewStatementContext.java
 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/statement/ddl/CreateViewStatementContext.java
index 730d89b76db..c829761b25b 100644
--- 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/statement/ddl/CreateViewStatementContext.java
+++ 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/statement/ddl/CreateViewStatementContext.java
@@ -20,10 +20,16 @@ package 
org.apache.shardingsphere.infra.binder.context.statement.ddl;
 import lombok.Getter;
 import 
org.apache.shardingsphere.infra.binder.context.segment.table.TablesContext;
 import 
org.apache.shardingsphere.infra.binder.context.statement.CommonSQLStatementContext;
+import 
org.apache.shardingsphere.infra.binder.context.statement.dml.SelectStatementContext;
 import org.apache.shardingsphere.infra.binder.context.type.TableAvailable;
+import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
+import org.apache.shardingsphere.sql.parser.statement.core.enums.SubqueryType;
 import 
org.apache.shardingsphere.sql.parser.statement.core.extractor.TableExtractor;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.CreateViewStatement;
 
+import java.util.Collections;
+import java.util.List;
+
 /**
  * Create view statement context.
  */
@@ -32,11 +38,15 @@ public final class CreateViewStatementContext extends 
CommonSQLStatementContext
     
     private final TablesContext tablesContext;
     
-    public CreateViewStatementContext(final CreateViewStatement sqlStatement) {
+    private final SelectStatementContext selectStatementContext;
+    
+    public CreateViewStatementContext(final ShardingSphereMetaData metaData, 
final List<Object> params, final CreateViewStatement sqlStatement, final String 
currentDatabaseName) {
         super(sqlStatement);
         TableExtractor extractor = new TableExtractor();
         extractor.extractTablesFromCreateViewStatement(sqlStatement);
         tablesContext = new TablesContext(extractor.getRewriteTables());
+        selectStatementContext = new SelectStatementContext(metaData, params, 
sqlStatement.getSelect(), currentDatabaseName, Collections.emptyList());
+        selectStatementContext.setSubqueryType(SubqueryType.VIEW_DEFINITION);
     }
     
     @Override
diff --git 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/from/type/SimpleTableSegmentBinder.java
 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/from/type/SimpleTableSegmentBinder.java
index 3ed26ac9e99..ebe77511e21 100644
--- 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/from/type/SimpleTableSegmentBinder.java
+++ 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/from/type/SimpleTableSegmentBinder.java
@@ -55,6 +55,7 @@ import 
org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.AlterVi
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.CreateTableStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.CreateViewStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.DropTableStatement;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.DropViewStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.RenameTableStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue;
 
@@ -150,13 +151,18 @@ public final class SimpleTableSegmentBinder {
             return;
         }
         if (binderContext.getSqlStatement() instanceof CreateViewStatement && 
isCreateTable(((CreateViewStatement) 
binderContext.getSqlStatement()).getView(), tableName)) {
-            
ShardingSpherePreconditions.checkState(binderContext.getHintValueContext().isSkipMetadataValidate()
 || !schema.containsTable(tableName), () -> new 
TableExistsException(tableName));
+            
ShardingSpherePreconditions.checkState(binderContext.getHintValueContext().isSkipMetadataValidate()
+                    || ((CreateViewStatement) 
binderContext.getSqlStatement()).isReplaceView() || 
!schema.containsTable(tableName), () -> new TableExistsException(tableName));
             return;
         }
         if (binderContext.getSqlStatement() instanceof AlterViewStatement && 
isRenameView((AlterViewStatement) binderContext.getSqlStatement(), tableName)) {
             
ShardingSpherePreconditions.checkState(binderContext.getHintValueContext().isSkipMetadataValidate()
 || !schema.containsTable(tableName), () -> new 
TableExistsException(tableName));
             return;
         }
+        if (binderContext.getSqlStatement() instanceof DropViewStatement) {
+            ShardingSpherePreconditions.checkState(((DropViewStatement) 
binderContext.getSqlStatement()).isIfExists() || 
schema.containsTable(tableName), () -> new TableNotFoundException(tableName));
+            return;
+        }
         if ("DUAL".equalsIgnoreCase(tableName)) {
             return;
         }
diff --git 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/CreateViewStatementBinder.java
 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/CreateViewStatementBinder.java
index 91befad6c2f..0526097d9f1 100644
--- 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/CreateViewStatementBinder.java
+++ 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/CreateViewStatementBinder.java
@@ -37,6 +37,7 @@ public final class CreateViewStatementBinder implements 
SQLStatementBinder<Creat
     public CreateViewStatement bind(final CreateViewStatement sqlStatement, 
final SQLStatementBinderContext binderContext) {
         CreateViewStatement result = copy(sqlStatement);
         Multimap<CaseInsensitiveString, TableSegmentBinderContext> 
tableBinderContexts = LinkedHashMultimap.create();
+        result.setReplaceView(sqlStatement.isReplaceView());
         result.setView(SimpleTableSegmentBinder.bind(sqlStatement.getView(), 
binderContext, tableBinderContexts));
         result.setSelect(new 
SelectStatementBinder().bind(sqlStatement.getSelect(), binderContext));
         return result;
diff --git 
a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/context/statement/ddl/AlterViewStatementContextTest.java
 
b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/context/statement/ddl/AlterViewStatementContextTest.java
index 0feea9fbedd..c47841bbe5e 100644
--- 
a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/context/statement/ddl/AlterViewStatementContextTest.java
+++ 
b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/context/statement/ddl/AlterViewStatementContextTest.java
@@ -18,6 +18,10 @@
 package org.apache.shardingsphere.infra.binder.context.statement.ddl;
 
 import 
org.apache.shardingsphere.infra.binder.context.statement.CommonSQLStatementContext;
+import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
+import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
+import 
org.apache.shardingsphere.infra.rule.attribute.table.TableMapperRuleAttribute;
+import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.ProjectionsSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.bound.TableSegmentBoundInfo;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SimpleTableSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.TableNameSegment;
@@ -30,11 +34,13 @@ import 
org.apache.shardingsphere.sql.parser.statement.postgresql.ddl.PostgreSQLA
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
+import java.util.Collections;
 import java.util.Optional;
 
 import static org.hamcrest.CoreMatchers.instanceOf;
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.MatcherAssert.assertThat;
+import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
@@ -53,6 +59,7 @@ class AlterViewStatementContextTest {
     void assertMySQLNewInstance() {
         SelectStatement select = mock(MySQLSelectStatement.class);
         when(select.getFrom()).thenReturn(Optional.of(view));
+        when(select.getProjections()).thenReturn(new ProjectionsSegment(0, 0));
         MySQLAlterViewStatement alterViewStatement = new 
MySQLAlterViewStatement();
         alterViewStatement.setView(view);
         alterViewStatement.setSelect(select);
@@ -70,7 +77,11 @@ class AlterViewStatementContextTest {
     }
     
     private void assertNewInstance(final AlterViewStatement 
alterViewStatement) {
-        AlterViewStatementContext actual = new 
AlterViewStatementContext(alterViewStatement);
+        ShardingSphereMetaData metaData = mock(ShardingSphereMetaData.class);
+        ShardingSphereDatabase database = mock(ShardingSphereDatabase.class, 
RETURNS_DEEP_STUBS);
+        
when(database.getRuleMetaData().getAttributes(TableMapperRuleAttribute.class)).thenReturn(Collections.emptyList());
+        when(metaData.getDatabase("foo_db")).thenReturn(database);
+        AlterViewStatementContext actual = new 
AlterViewStatementContext(metaData, Collections.emptyList(), 
alterViewStatement, "foo_db");
         assertThat(actual, instanceOf(CommonSQLStatementContext.class));
         assertThat(actual.getSqlStatement(), is(alterViewStatement));
         assertThat(actual.getTablesContext().getSimpleTables().size(), is(2));
diff --git 
a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/context/statement/ddl/CreateViewStatementContextTest.java
 
b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/context/statement/ddl/CreateViewStatementContextTest.java
index 5a59b58cc00..5741e889c84 100644
--- 
a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/context/statement/ddl/CreateViewStatementContextTest.java
+++ 
b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/context/statement/ddl/CreateViewStatementContextTest.java
@@ -18,6 +18,10 @@
 package org.apache.shardingsphere.infra.binder.context.statement.ddl;
 
 import 
org.apache.shardingsphere.infra.binder.context.statement.CommonSQLStatementContext;
+import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
+import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
+import 
org.apache.shardingsphere.infra.rule.attribute.table.TableMapperRuleAttribute;
+import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.ProjectionsSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.bound.TableSegmentBoundInfo;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SimpleTableSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.TableNameSegment;
@@ -28,10 +32,14 @@ import 
org.apache.shardingsphere.sql.parser.statement.mysql.ddl.MySQLCreateViewS
 import 
org.apache.shardingsphere.sql.parser.statement.postgresql.ddl.PostgreSQLCreateViewStatement;
 import org.junit.jupiter.api.Test;
 
+import java.util.Collections;
+
 import static org.hamcrest.CoreMatchers.instanceOf;
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.MatcherAssert.assertThat;
+import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
 import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
 
 class CreateViewStatementContextTest {
     
@@ -50,8 +58,14 @@ class CreateViewStatementContextTest {
         tableNameSegment.setTableBoundInfo(new TableSegmentBoundInfo(new 
IdentifierValue("foo_db"), new IdentifierValue("foo_schema")));
         SimpleTableSegment view = new SimpleTableSegment(tableNameSegment);
         createViewStatement.setView(view);
-        createViewStatement.setSelect(mock(SelectStatement.class));
-        CreateViewStatementContext actual = new 
CreateViewStatementContext(createViewStatement);
+        SelectStatement selectStatement = mock(SelectStatement.class);
+        when(selectStatement.getProjections()).thenReturn(new 
ProjectionsSegment(0, 0));
+        createViewStatement.setSelect(selectStatement);
+        ShardingSphereMetaData metaData = mock(ShardingSphereMetaData.class);
+        ShardingSphereDatabase database = mock(ShardingSphereDatabase.class, 
RETURNS_DEEP_STUBS);
+        
when(database.getRuleMetaData().getAttributes(TableMapperRuleAttribute.class)).thenReturn(Collections.emptyList());
+        when(metaData.getDatabase("foo_db")).thenReturn(database);
+        CreateViewStatementContext actual = new 
CreateViewStatementContext(metaData, Collections.emptyList(), 
createViewStatement, "foo_db");
         assertThat(actual, instanceOf(CommonSQLStatementContext.class));
         assertThat(actual.getSqlStatement(), is(createViewStatement));
     }
diff --git 
a/parser/sql/dialect/doris/src/main/java/org/apache/shardingsphere/sql/parser/doris/visitor/statement/type/DorisDDLStatementVisitor.java
 
b/parser/sql/dialect/doris/src/main/java/org/apache/shardingsphere/sql/parser/doris/visitor/statement/type/DorisDDLStatementVisitor.java
index 9c18804dcf9..5acd3f672be 100644
--- 
a/parser/sql/dialect/doris/src/main/java/org/apache/shardingsphere/sql/parser/doris/visitor/statement/type/DorisDDLStatementVisitor.java
+++ 
b/parser/sql/dialect/doris/src/main/java/org/apache/shardingsphere/sql/parser/doris/visitor/statement/type/DorisDDLStatementVisitor.java
@@ -206,6 +206,7 @@ public final class DorisDDLStatementVisitor extends 
DorisStatementVisitor implem
     @Override
     public ASTNode visitCreateView(final CreateViewContext ctx) {
         DorisCreateViewStatement result = new DorisCreateViewStatement();
+        result.setReplaceView(null != ctx.REPLACE());
         result.setView((SimpleTableSegment) visit(ctx.viewName()));
         result.setViewDefinition(getOriginalText(ctx.select()));
         result.setSelect((DorisSelectStatement) visit(ctx.select()));
diff --git 
a/parser/sql/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/type/MySQLDDLStatementVisitor.java
 
b/parser/sql/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/type/MySQLDDLStatementVisitor.java
index 9f6e311a4b5..550b3e5afd7 100644
--- 
a/parser/sql/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/type/MySQLDDLStatementVisitor.java
+++ 
b/parser/sql/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/type/MySQLDDLStatementVisitor.java
@@ -207,6 +207,7 @@ public final class MySQLDDLStatementVisitor extends 
MySQLStatementVisitor implem
     @Override
     public ASTNode visitCreateView(final CreateViewContext ctx) {
         MySQLCreateViewStatement result = new MySQLCreateViewStatement();
+        result.setReplaceView(null != ctx.REPLACE());
         result.setView((SimpleTableSegment) visit(ctx.viewName()));
         result.setViewDefinition(getOriginalText(ctx.select()));
         result.setSelect((MySQLSelectStatement) visit(ctx.select()));
@@ -226,6 +227,7 @@ public final class MySQLDDLStatementVisitor extends 
MySQLStatementVisitor implem
     @Override
     public ASTNode visitDropView(final DropViewContext ctx) {
         MySQLDropViewStatement result = new MySQLDropViewStatement();
+        result.setIfExists(null != ctx.ifExists());
         result.getViews().addAll(((CollectionValue<SimpleTableSegment>) 
visit(ctx.viewNames())).getValue());
         return result;
     }
diff --git 
a/parser/sql/dialect/opengauss/src/main/java/org/apache/shardingsphere/sql/parser/opengauss/visitor/statement/type/OpenGaussDDLStatementVisitor.java
 
b/parser/sql/dialect/opengauss/src/main/java/org/apache/shardingsphere/sql/parser/opengauss/visitor/statement/type/OpenGaussDDLStatementVisitor.java
index 7fad41cc99f..cfba7147d0d 100644
--- 
a/parser/sql/dialect/opengauss/src/main/java/org/apache/shardingsphere/sql/parser/opengauss/visitor/statement/type/OpenGaussDDLStatementVisitor.java
+++ 
b/parser/sql/dialect/opengauss/src/main/java/org/apache/shardingsphere/sql/parser/opengauss/visitor/statement/type/OpenGaussDDLStatementVisitor.java
@@ -673,6 +673,7 @@ public final class OpenGaussDDLStatementVisitor extends 
OpenGaussStatementVisito
     @Override
     public ASTNode visitCreateView(final CreateViewContext ctx) {
         OpenGaussCreateViewStatement result = new 
OpenGaussCreateViewStatement();
+        result.setReplaceView(null != ctx.REPLACE());
         result.setView((SimpleTableSegment) visit(ctx.qualifiedName()));
         result.setViewDefinition(getOriginalText(ctx.select()));
         result.setSelect((SelectStatement) visit(ctx.select()));
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 422659d4bd1..cc0258fbdcb 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
@@ -373,6 +373,7 @@ public final class OracleDDLStatementVisitor extends 
OracleStatementVisitor impl
     @Override
     public ASTNode visitCreateView(final CreateViewContext ctx) {
         OracleCreateViewStatement result = new OracleCreateViewStatement();
+        result.setReplaceView(null != ctx.REPLACE());
         OracleDMLStatementVisitor visitor = new OracleDMLStatementVisitor();
         
getGlobalParameterMarkerSegments().addAll(visitor.getGlobalParameterMarkerSegments());
         
getStatementParameterMarkerSegments().addAll(visitor.getStatementParameterMarkerSegments());
diff --git 
a/parser/sql/dialect/postgresql/src/main/java/org/apache/shardingsphere/sql/parser/postgresql/visitor/statement/type/PostgreSQLDDLStatementVisitor.java
 
b/parser/sql/dialect/postgresql/src/main/java/org/apache/shardingsphere/sql/parser/postgresql/visitor/statement/type/PostgreSQLDDLStatementVisitor.java
index 5bf935cb3ff..dcc1477fbe0 100644
--- 
a/parser/sql/dialect/postgresql/src/main/java/org/apache/shardingsphere/sql/parser/postgresql/visitor/statement/type/PostgreSQLDDLStatementVisitor.java
+++ 
b/parser/sql/dialect/postgresql/src/main/java/org/apache/shardingsphere/sql/parser/postgresql/visitor/statement/type/PostgreSQLDDLStatementVisitor.java
@@ -818,6 +818,7 @@ public final class PostgreSQLDDLStatementVisitor extends 
PostgreSQLStatementVisi
     @Override
     public ASTNode visitCreateView(final CreateViewContext ctx) {
         PostgreSQLCreateViewStatement result = new 
PostgreSQLCreateViewStatement();
+        result.setReplaceView(null != ctx.REPLACE());
         result.setView((SimpleTableSegment) visit(ctx.qualifiedName()));
         result.setViewDefinition(getOriginalText(ctx.select()));
         result.setSelect((SelectStatement) visit(ctx.select()));
diff --git 
a/parser/sql/dialect/presto/src/main/java/org/apache/shardingsphere/sql/parser/presto/visitor/statement/type/PrestoDDLStatementVisitor.java
 
b/parser/sql/dialect/presto/src/main/java/org/apache/shardingsphere/sql/parser/presto/visitor/statement/type/PrestoDDLStatementVisitor.java
index d2b73e1c0be..f18720967b9 100644
--- 
a/parser/sql/dialect/presto/src/main/java/org/apache/shardingsphere/sql/parser/presto/visitor/statement/type/PrestoDDLStatementVisitor.java
+++ 
b/parser/sql/dialect/presto/src/main/java/org/apache/shardingsphere/sql/parser/presto/visitor/statement/type/PrestoDDLStatementVisitor.java
@@ -56,6 +56,7 @@ public final class PrestoDDLStatementVisitor extends 
PrestoStatementVisitor impl
     @Override
     public ASTNode visitCreateView(final CreateViewContext ctx) {
         PrestoCreateViewStatement result = new PrestoCreateViewStatement();
+        result.setReplaceView(null != ctx.REPLACE());
         result.setView((SimpleTableSegment) visit(ctx.viewName()));
         result.setViewDefinition(getOriginalText(ctx.select()));
         result.setSelect((PrestoSelectStatement) visit(ctx.select()));
diff --git 
a/parser/sql/dialect/sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/statement/type/SQLServerDDLStatementVisitor.java
 
b/parser/sql/dialect/sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/statement/type/SQLServerDDLStatementVisitor.java
index 8d589a494af..f6f6c4e494c 100644
--- 
a/parser/sql/dialect/sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/statement/type/SQLServerDDLStatementVisitor.java
+++ 
b/parser/sql/dialect/sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/statement/type/SQLServerDDLStatementVisitor.java
@@ -389,6 +389,7 @@ public final class SQLServerDDLStatementVisitor extends 
SQLServerStatementVisito
     @Override
     public ASTNode visitCreateView(final CreateViewContext ctx) {
         SQLServerCreateViewStatement result = new 
SQLServerCreateViewStatement();
+        result.setReplaceView(null != ctx.ALTER());
         result.setView((SimpleTableSegment) visit(ctx.viewName()));
         
result.setViewDefinition(getOriginalText(ctx.createOrAlterViewClause().select()));
         result.setSelect((SQLServerSelectStatement) 
visit(ctx.createOrAlterViewClause().select()));
diff --git 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/enums/SubqueryType.java
 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/enums/SubqueryType.java
index a0751b0a805..5a711674575 100644
--- 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/enums/SubqueryType.java
+++ 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/enums/SubqueryType.java
@@ -22,5 +22,5 @@ package 
org.apache.shardingsphere.sql.parser.statement.core.enums;
  */
 public enum SubqueryType {
     
-    PROJECTION, TABLE, JOIN, PREDICATE, INSERT_SELECT, EXISTS, WITH
+    PROJECTION, TABLE, JOIN, PREDICATE, INSERT_SELECT, EXISTS, WITH, 
VIEW_DEFINITION
 }
diff --git 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/ddl/CreateViewStatement.java
 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/ddl/CreateViewStatement.java
index 0d7b24e0f18..66af70cc762 100644
--- 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/ddl/CreateViewStatement.java
+++ 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/ddl/CreateViewStatement.java
@@ -30,6 +30,8 @@ import 
org.apache.shardingsphere.sql.parser.statement.core.statement.dml.SelectS
 @Setter
 public abstract class CreateViewStatement extends AbstractSQLStatement 
implements DDLStatement {
     
+    private boolean replaceView;
+    
     private SimpleTableSegment view;
     
     private String viewDefinition;
diff --git 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/ddl/DropViewStatement.java
 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/ddl/DropViewStatement.java
index 07e68107182..658bdc4768f 100644
--- 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/ddl/DropViewStatement.java
+++ 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/ddl/DropViewStatement.java
@@ -31,4 +31,21 @@ import java.util.LinkedList;
 public abstract class DropViewStatement extends AbstractSQLStatement 
implements DDLStatement {
     
     private final Collection<SimpleTableSegment> views = new LinkedList<>();
+    
+    /**
+     * Set if exists.
+     *
+     * @param ifExists if exists or not
+     */
+    public void setIfExists(final boolean ifExists) {
+    }
+    
+    /**
+     * Judge whether contains if exists.
+     *
+     * @return contains contains if exists or not
+     */
+    public boolean isIfExists() {
+        return false;
+    }
 }
diff --git 
a/parser/sql/statement/type/mysql/src/main/java/org/apache/shardingsphere/sql/parser/statement/mysql/ddl/MySQLDropViewStatement.java
 
b/parser/sql/statement/type/mysql/src/main/java/org/apache/shardingsphere/sql/parser/statement/mysql/ddl/MySQLDropViewStatement.java
index 90294988cbe..4f39ccff41d 100644
--- 
a/parser/sql/statement/type/mysql/src/main/java/org/apache/shardingsphere/sql/parser/statement/mysql/ddl/MySQLDropViewStatement.java
+++ 
b/parser/sql/statement/type/mysql/src/main/java/org/apache/shardingsphere/sql/parser/statement/mysql/ddl/MySQLDropViewStatement.java
@@ -17,11 +17,17 @@
 
 package org.apache.shardingsphere.sql.parser.statement.mysql.ddl;
 
+import lombok.Getter;
+import lombok.Setter;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.DropViewStatement;
 import org.apache.shardingsphere.sql.parser.statement.mysql.MySQLStatement;
 
 /**
  * MySQL drop view statement.
  */
+@Getter
+@Setter
 public final class MySQLDropViewStatement extends DropViewStatement implements 
MySQLStatement {
+    
+    private boolean ifExists;
 }


Reply via email to