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

totalo 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 5f5253ef08a Support use customize system database (#17956)
5f5253ef08a is described below

commit 5f5253ef08adde8ab1ed5e7c0fa37a9d4e700be3
Author: Zhengqiang Duan <[email protected]>
AuthorDate: Thu May 26 12:04:10 2022 +0800

    Support use customize system database (#17956)
---
 .../database/schema/util/SystemSchemaUtil.java     | 17 ++++++++------
 .../database/schema/util/SystemSchemaUtilTest.java | 26 ++++++++++++++++++----
 .../mode/metadata/MetaDataContextsBuilder.java     |  6 +++--
 .../jdbc/JDBCDatabaseCommunicationEngine.java      |  6 ++---
 .../impl/SchemaAssignedDatabaseBackendHandler.java |  9 ++++----
 5 files changed, 44 insertions(+), 20 deletions(-)

diff --git 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/util/SystemSchemaUtil.java
 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/util/SystemSchemaUtil.java
index bee443f370e..29ccf4429ac 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/util/SystemSchemaUtil.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/util/SystemSchemaUtil.java
@@ -20,6 +20,7 @@ package 
org.apache.shardingsphere.infra.metadata.database.schema.util;
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
 import org.apache.shardingsphere.infra.database.type.DatabaseType;
+import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 
 import java.util.Collection;
 
@@ -31,19 +32,21 @@ public class SystemSchemaUtil {
     
     /**
      * Judge whether sql statement contains system schema or not.
-     * 
+     *
      * @param databaseType databaseType
      * @param schemaNames schema names
-     * @param sessionDatabaseName session database name
+     * @param databaseMetaData database meta data
      * @return whether sql statement contains system schema or not
      */
-    public static boolean containsSystemSchema(final DatabaseType 
databaseType, final Collection<String> schemaNames, final String 
sessionDatabaseName) {
+    public static boolean containsSystemSchema(final DatabaseType 
databaseType, final Collection<String> schemaNames, final 
ShardingSphereDatabase databaseMetaData) {
+        if (databaseMetaData.isComplete()) {
+            return false;
+        }
         for (String each : schemaNames) {
-            if (!databaseType.getSystemSchemas().contains(each)) {
-                continue;
+            if (databaseType.getSystemSchemas().contains(each)) {
+                return true;
             }
-            return true;
         }
-        return databaseType.getSystemSchemas().contains(sessionDatabaseName);
+        return 
databaseType.getSystemSchemas().contains(databaseMetaData.getName());
     }
 }
diff --git 
a/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/util/SystemSchemaUtilTest.java
 
b/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/util/SystemSchemaUtilTest.java
index 428469340b8..8354ece50ea 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/util/SystemSchemaUtilTest.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/util/SystemSchemaUtilTest.java
@@ -19,6 +19,7 @@ package 
org.apache.shardingsphere.infra.metadata.database.schema.util;
 
 import org.apache.shardingsphere.infra.database.type.dialect.MySQLDatabaseType;
 import 
org.apache.shardingsphere.infra.database.type.dialect.PostgreSQLDatabaseType;
+import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import org.junit.Test;
 
 import java.util.Arrays;
@@ -26,18 +27,35 @@ import java.util.Collections;
 
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
 
 public final class SystemSchemaUtilTest {
     
     @Test
     public void assertContainsSystemSchemaForPostgreSQL() {
-        assertTrue(SystemSchemaUtil.containsSystemSchema(new 
PostgreSQLDatabaseType(), Arrays.asList("information_schema", "pg_catalog"), 
"information_schema"));
-        assertFalse(SystemSchemaUtil.containsSystemSchema(new 
PostgreSQLDatabaseType(), Collections.singletonList("sharding_db"), 
"sharding_db"));
+        ShardingSphereDatabase informationSchemaDatabase = 
mockShardingSphereDatabase("information_schema", false);
+        assertTrue(SystemSchemaUtil.containsSystemSchema(new 
PostgreSQLDatabaseType(), Arrays.asList("information_schema", "pg_catalog"), 
informationSchemaDatabase));
+        ShardingSphereDatabase shardingSchemaDatabase = 
mockShardingSphereDatabase("sharding_db", false);
+        assertFalse(SystemSchemaUtil.containsSystemSchema(new 
PostgreSQLDatabaseType(), Collections.singletonList("sharding_db"), 
shardingSchemaDatabase));
+        ShardingSphereDatabase customizedInformationSchemaDatabase = 
mockShardingSphereDatabase("information_schema", true);
+        assertFalse(SystemSchemaUtil.containsSystemSchema(new 
PostgreSQLDatabaseType(), Arrays.asList("information_schema", "pg_catalog"), 
customizedInformationSchemaDatabase));
     }
     
     @Test
     public void assertContainsSystemSchemaForMySQL() {
-        assertTrue(SystemSchemaUtil.containsSystemSchema(new 
MySQLDatabaseType(), Arrays.asList("information_schema", "mysql"), 
"information_schema"));
-        assertFalse(SystemSchemaUtil.containsSystemSchema(new 
MySQLDatabaseType(), Collections.singletonList("sharding_db"), "sharding_db"));
+        ShardingSphereDatabase informationSchemaDatabase = 
mockShardingSphereDatabase("information_schema", false);
+        assertTrue(SystemSchemaUtil.containsSystemSchema(new 
MySQLDatabaseType(), Arrays.asList("information_schema", "mysql"), 
informationSchemaDatabase));
+        ShardingSphereDatabase shardingSchemaDatabase = 
mockShardingSphereDatabase("sharding_db", false);
+        assertFalse(SystemSchemaUtil.containsSystemSchema(new 
MySQLDatabaseType(), Collections.singletonList("sharding_db"), 
shardingSchemaDatabase));
+        ShardingSphereDatabase customizedInformationSchemaDatabase = 
mockShardingSphereDatabase("information_schema", true);
+        assertFalse(SystemSchemaUtil.containsSystemSchema(new 
MySQLDatabaseType(), Arrays.asList("information_schema", "mysql"), 
customizedInformationSchemaDatabase));
+    }
+    
+    private ShardingSphereDatabase mockShardingSphereDatabase(final String 
databaseName, final boolean isComplete) {
+        ShardingSphereDatabase result = mock(ShardingSphereDatabase.class);
+        when(result.getName()).thenReturn(databaseName);
+        when(result.isComplete()).thenReturn(isComplete);
+        return result;
     }
 }
diff --git 
a/shardingsphere-mode/shardingsphere-mode-core/src/main/java/org/apache/shardingsphere/mode/metadata/MetaDataContextsBuilder.java
 
b/shardingsphere-mode/shardingsphere-mode-core/src/main/java/org/apache/shardingsphere/mode/metadata/MetaDataContextsBuilder.java
index b96dd9551fa..d2daead8af8 100644
--- 
a/shardingsphere-mode/shardingsphere-mode-core/src/main/java/org/apache/shardingsphere/mode/metadata/MetaDataContextsBuilder.java
+++ 
b/shardingsphere-mode/shardingsphere-mode-core/src/main/java/org/apache/shardingsphere/mode/metadata/MetaDataContextsBuilder.java
@@ -75,7 +75,7 @@ public final class MetaDataContextsBuilder {
         Map<String, ShardingSphereDatabase> result = new 
HashMap<>(databaseConfigMap.size(), 1);
         for (Entry<String, DatabaseConfiguration> entry : 
databaseConfigMap.entrySet()) {
             String databaseName = entry.getKey();
-            if (!protocolType.getSystemSchemas().contains(databaseName)) {
+            if (!entry.getValue().getDataSources().isEmpty() || 
!protocolType.getSystemSchemas().contains(databaseName)) {
                 result.put(databaseName, 
ShardingSphereDatabase.create(databaseName, protocolType, storageType, 
entry.getValue(), props));
             }
         }
@@ -85,7 +85,9 @@ public final class MetaDataContextsBuilder {
     private Map<String, ShardingSphereDatabase> getSystemDatabaseMap(final 
DatabaseType protocolType) throws SQLException {
         Map<String, ShardingSphereDatabase> result = new 
HashMap<>(protocolType.getSystemDatabaseSchemaMap().size(), 1);
         for (String each : protocolType.getSystemDatabaseSchemaMap().keySet()) 
{
-            result.put(each, ShardingSphereDatabase.create(each, 
protocolType));
+            if (!databaseConfigMap.containsKey(each)) {
+                result.put(each, ShardingSphereDatabase.create(each, 
protocolType));
+            }
         }
         return result;
     }
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/JDBCDatabaseCommunicationEngine.java
 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/JDBCDatabaseCommunicationEngine.java
index 455045fa9f1..ff30a4c32b3 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/JDBCDatabaseCommunicationEngine.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/JDBCDatabaseCommunicationEngine.java
@@ -125,10 +125,10 @@ public final class JDBCDatabaseCommunicationEngine 
extends DatabaseCommunication
                 logicSQL, getDatabase(), 
ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaData().getProps());
         // TODO move federation route logic to binder
         SQLStatementContext<?> sqlStatementContext = 
logicSQL.getSqlStatementContext();
-        String defaultDatabaseName = 
backendConnection.getConnectionSession().getDatabaseName();
+        MetaDataContexts metaDataContexts = 
ProxyContext.getInstance().getContextManager().getMetaDataContexts();
+        ShardingSphereDatabase databaseMetaData = 
metaDataContexts.getDatabaseMetaData(backendConnection.getConnectionSession().getDatabaseName());
         if (executionContext.getRouteContext().isFederated() || 
(sqlStatementContext instanceof SelectStatementContext
-                && 
SystemSchemaUtil.containsSystemSchema(sqlStatementContext.getDatabaseType(), 
sqlStatementContext.getTablesContext().getSchemaNames(), defaultDatabaseName))) 
{
-            MetaDataContexts metaDataContexts = 
ProxyContext.getInstance().getContextManager().getMetaDataContexts();
+                && 
SystemSchemaUtil.containsSystemSchema(sqlStatementContext.getDatabaseType(), 
sqlStatementContext.getTablesContext().getSchemaNames(), databaseMetaData))) {
             ResultSet resultSet = doExecuteFederation(logicSQL, 
metaDataContexts);
             return processExecuteFederation(resultSet, metaDataContexts);
         }
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/data/impl/SchemaAssignedDatabaseBackendHandler.java
 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/data/impl/SchemaAssignedDatabaseBackendHandler.java
index bba7a5bbde8..556759b5616 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/data/impl/SchemaAssignedDatabaseBackendHandler.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/data/impl/SchemaAssignedDatabaseBackendHandler.java
@@ -21,6 +21,7 @@ import io.vertx.core.Future;
 import lombok.RequiredArgsConstructor;
 import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
 import 
org.apache.shardingsphere.infra.distsql.exception.resource.RequiredResourceMissedException;
+import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.util.SystemSchemaUtil;
 import 
org.apache.shardingsphere.proxy.backend.communication.DatabaseCommunicationEngine;
 import 
org.apache.shardingsphere.proxy.backend.communication.DatabaseCommunicationEngineFactory;
@@ -69,12 +70,12 @@ public final class SchemaAssignedDatabaseBackendHandler 
implements DatabaseBacke
     }
     
     private void prepareDatabaseCommunicationEngine() throws 
RequiredResourceMissedException {
-        boolean isSystemSchema = SystemSchemaUtil.containsSystemSchema(
-                sqlStatementContext.getDatabaseType(), 
sqlStatementContext.getTablesContext().getSchemaNames(), 
connectionSession.getDatabaseName());
-        if (!isSystemSchema && 
!ProxyContext.getInstance().getDatabase(connectionSession.getDatabaseName()).hasDataSource())
 {
+        ShardingSphereDatabase databaseMetaData = 
ProxyContext.getInstance().getDatabase(connectionSession.getDatabaseName());
+        boolean isSystemSchema = 
SystemSchemaUtil.containsSystemSchema(sqlStatementContext.getDatabaseType(), 
sqlStatementContext.getTablesContext().getSchemaNames(), databaseMetaData);
+        if (!isSystemSchema && !databaseMetaData.hasDataSource()) {
             throw new 
RequiredResourceMissedException(connectionSession.getDatabaseName());
         }
-        if (!isSystemSchema && 
!ProxyContext.getInstance().getDatabase(connectionSession.getDatabaseName()).isComplete())
 {
+        if (!isSystemSchema && !databaseMetaData.isComplete()) {
             throw new RuleNotExistedException();
         }
         databaseCommunicationEngine = 
databaseCommunicationEngineFactory.newTextProtocolInstance(sqlStatementContext, 
sql, connectionSession.getBackendConnection());

Reply via email to