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 bc1d472306e add validate of creating view for broadcast table (#18657)
bc1d472306e is described below

commit bc1d472306eceda355d896181b183a5b71c550c4
Author: Chuxin Chen <[email protected]>
AuthorDate: Wed Jun 29 19:37:18 2022 +0800

    add validate of creating view for broadcast table (#18657)
    
    * update read-write-split doc
    
    * add view check for broadcast table
    
    * add validate for creating view as select of broadcastTable
---
 .../impl/ShardingCreateViewStatementValidator.java | 24 +++++++++++++++++-----
 .../ShardingCreateViewStatementValidatorTest.java  |  7 +++++++
 2 files changed, 26 insertions(+), 5 deletions(-)

diff --git 
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/route/engine/validator/ddl/impl/ShardingCreateViewStatementValidator.java
 
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/route/engine/validator/ddl/impl/ShardingCreateViewStatementValidator.java
index e3513c08b1f..66e5c29fe73 100644
--- 
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/route/engine/validator/ddl/impl/ShardingCreateViewStatementValidator.java
+++ 
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/route/engine/validator/ddl/impl/ShardingCreateViewStatementValidator.java
@@ -34,6 +34,7 @@ import 
org.apache.shardingsphere.sql.parser.sql.dialect.handler.dml.SelectStatem
 
 import java.util.Arrays;
 import java.util.Collection;
+import java.util.LinkedList;
 import java.util.List;
 import java.util.Optional;
 
@@ -49,9 +50,15 @@ public final class ShardingCreateViewStatementValidator 
extends ShardingDDLState
         if (!selectStatement.isPresent()) {
             return;
         }
-        if (isShardingTablesWithoutBinding(shardingRule, sqlStatementContext, 
selectStatement.get())) {
+        TableExtractor extractor = new TableExtractor();
+        extractor.extractTablesFromSelect(selectStatement.get());
+        Collection<SimpleTableSegment> tableSegments = 
extractor.getRewriteTables();
+        if (isShardingTablesWithoutBinding(shardingRule, sqlStatementContext, 
tableSegments)) {
             throw new ShardingSphereException("View name has to bind to 
sharding tables!");
         }
+        if (isAllBroadcastTablesWithoutConfigView(shardingRule, 
sqlStatementContext, tableSegments)) {
+            throw new ShardingSphereException("View name has to config as 
broadcast table!");
+        }
     }
     
     @Override
@@ -66,10 +73,8 @@ public final class ShardingCreateViewStatementValidator 
extends ShardingDDLState
         }
     }
     
-    private boolean isShardingTablesWithoutBinding(final ShardingRule 
shardingRule, final SQLStatementContext<CreateViewStatement> 
sqlStatementContext, final SelectStatement selectStatement) {
-        TableExtractor extractor = new TableExtractor();
-        extractor.extractTablesFromSelect(selectStatement);
-        Collection<SimpleTableSegment> tableSegments = 
extractor.getRewriteTables();
+    private boolean isShardingTablesWithoutBinding(final ShardingRule 
shardingRule, final SQLStatementContext<CreateViewStatement> 
sqlStatementContext,
+                                                   final 
Collection<SimpleTableSegment> tableSegments) {
         for (SimpleTableSegment each : tableSegments) {
             String logicTable = each.getTableName().getIdentifier().getValue();
             if (shardingRule.isShardingTable(logicTable) && 
!isBindingTables(shardingRule, 
sqlStatementContext.getSqlStatement().getView().getTableName().getIdentifier().getValue(),
 logicTable)) {
@@ -84,6 +89,15 @@ public final class ShardingCreateViewStatementValidator 
extends ShardingDDLState
         return shardingRule.isAllBindingTables(bindTables);
     }
     
+    private boolean isAllBroadcastTablesWithoutConfigView(final ShardingRule 
shardingRule, final SQLStatementContext<CreateViewStatement> 
sqlStatementContext,
+                                                          final 
Collection<SimpleTableSegment> tableSegments) {
+        Collection<String> tables = new LinkedList<>();
+        for (SimpleTableSegment each : tableSegments) {
+            tables.add(each.getTableName().getIdentifier().getValue());
+        }
+        return shardingRule.isAllBroadcastTables(tables) && 
!shardingRule.isBroadcastTable(sqlStatementContext.getSqlStatement().getView().getTableName().getIdentifier().getValue());
+    }
+    
     private boolean isContainsNotSupportedViewStatement(final SelectStatement 
selectStatement, final RouteContext routeContext) {
         if (routeContext.getRouteUnits().size() <= 1) {
             return false;
diff --git 
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/route/engine/validator/ddl/ShardingCreateViewStatementValidatorTest.java
 
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/route/engine/validator/ddl/ShardingCreateViewStatementValidatorTest.java
index a8d935924dc..0c0502906e4 100644
--- 
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/route/engine/validator/ddl/ShardingCreateViewStatementValidatorTest.java
+++ 
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/route/engine/validator/ddl/ShardingCreateViewStatementValidatorTest.java
@@ -101,4 +101,11 @@ public final class 
ShardingCreateViewStatementValidatorTest {
         new ShardingCreateViewStatementValidator().postValidate(shardingRule, 
createViewStatementContext, Collections.emptyList(), 
mock(ShardingSphereDatabase.class),
                 mock(ConfigurationProperties.class), routeContext);
     }
+    
+    @Test(expected = ShardingSphereException.class)
+    public void assertPreValidateCreateViewWithBroadcastTable() {
+        when(shardingRule.isAllBroadcastTables(any())).thenReturn(true);
+        when(shardingRule.isBroadcastTable("order_view")).thenReturn(false);
+        new ShardingCreateViewStatementValidator().preValidate(shardingRule, 
createViewStatementContext, Collections.emptyList(), 
mock(ShardingSphereDatabase.class));
+    }
 }

Reply via email to