You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by zh...@apache.org on 2025/10/12 11:25:16 UTC

(shardingsphere) branch master updated: Rename DatabaseMetaDataExecutor (#36856)

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

zhangliang 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 8dd031fcee5 Rename DatabaseMetaDataExecutor (#36856)
8dd031fcee5 is described below

commit 8dd031fcee5bc155a00e88a082a257b230874c52
Author: Liang Zhang <zh...@apache.org>
AuthorDate: Sun Oct 12 19:25:09 2025 +0800

    Rename DatabaseMetaDataExecutor (#36856)
    
    * Rename DatabaseMetaDataExecutor
    
    * Rename DatabaseMetaDataExecutor
    
    * Rename DatabaseMetaDataExecutor
---
 ...Executor.java => DatabaseMetaDataExecutor.java} | 133 ++++++++-------------
 ...Test.java => DatabaseMetaDataExecutorTest.java} |  30 ++---
 .../select/SelectInformationSchemataExecutor.java  |  59 +++++----
 .../MySQLInformationSchemaExecutorFactory.java     |   5 +-
 .../schema/MySQLMySQLSchemaExecutorFactory.java    |   5 +-
 .../MySQLPerformanceSchemaExecutorFactory.java     |   5 +-
 .../schema/MySQLSysSchemaExecutorFactory.java      |   5 +-
 .../admin/MySQLAdminExecutorCreatorTest.java       |  16 +--
 .../OpenGaussSystemTableQueryExecutorCreator.java  |   5 +-
 .../admin/OpenGaussAdminExecutorCreatorTest.java   |   4 +-
 ...enGaussSystemTableQueryExecutorCreatorTest.java |   4 +-
 .../admin/PostgreSQLAdminExecutorCreator.java      |   5 +-
 12 files changed, 115 insertions(+), 161 deletions(-)

diff --git a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/admin/executor/AbstractDatabaseMetaDataExecutor.java b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/admin/executor/DatabaseMetaDataExecutor.java
similarity index 51%
rename from proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/admin/executor/AbstractDatabaseMetaDataExecutor.java
rename to proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/admin/executor/DatabaseMetaDataExecutor.java
index 89942685ce3..5e1d9b9b1e3 100644
--- a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/admin/executor/AbstractDatabaseMetaDataExecutor.java
+++ b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/admin/executor/DatabaseMetaDataExecutor.java
@@ -34,7 +34,6 @@ import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import org.apache.shardingsphere.infra.metadata.database.resource.ResourceMetaData;
 import org.apache.shardingsphere.infra.metadata.database.resource.unit.StorageUnit;
 import org.apache.shardingsphere.infra.metadata.user.Grantee;
-import org.apache.shardingsphere.mode.manager.ContextManager;
 import org.apache.shardingsphere.proxy.backend.session.ConnectionSession;
 
 import java.sql.Connection;
@@ -55,17 +54,19 @@ import java.util.function.Consumer;
 import java.util.stream.Collectors;
 
 /**
- * The abstract class of database meta data, used to define the template.
+ * Database meta data executor.
  */
 @RequiredArgsConstructor
 @Getter
-public abstract class AbstractDatabaseMetaDataExecutor implements DatabaseAdminQueryExecutor {
+public class DatabaseMetaDataExecutor implements DatabaseAdminQueryExecutor {
     
     private QueryResultMetaData queryResultMetaData;
     
     private MergedResult mergedResult;
     
-    private final ContextManager contextManager;
+    private final String sql;
+    
+    private final List<Object> parameters;
     
     private final List<Map<String, Object>> rows = new LinkedList<>();
     
@@ -73,45 +74,77 @@ public abstract class AbstractDatabaseMetaDataExecutor implements DatabaseAdminQ
     
     @Override
     public final void execute(final ConnectionSession connectionSession, final ShardingSphereMetaData metaData) throws SQLException {
-        Collection<String> databaseNames = getDatabaseNames(connectionSession);
-        for (String databaseName : databaseNames) {
-            processMetaData(databaseName, resultSet -> handleResultSet(databaseName, resultSet));
+        Collection<ShardingSphereDatabase> databases = getDatabases(connectionSession, metaData);
+        for (ShardingSphereDatabase each : databases) {
+            processMetaData(each, resultSet -> handleResultSet(each, resultSet));
         }
         postProcess();
         queryResultMetaData = createQueryResultMetaData();
         mergedResult = createMergedResult();
     }
     
+    protected Collection<ShardingSphereDatabase> getDatabases(final ConnectionSession connectionSession, final ShardingSphereMetaData metaData) {
+        String databaseName = connectionSession.getCurrentDatabaseName();
+        ShardingSphereDatabase database = metaData.getDatabase(databaseName);
+        if (null != database && isAuthorized(database.getName(), metaData, connectionSession.getConnectionContext().getGrantee()) && database.containsDataSource()) {
+            return Collections.singleton(database);
+        }
+        Collection<ShardingSphereDatabase> databases = metaData.getAllDatabases().stream()
+                .filter(each -> isAuthorized(each.getName(), metaData, connectionSession.getConnectionContext().getGrantee()))
+                .filter(ShardingSphereDatabase::containsDataSource).collect(Collectors.toList());
+        return databases.isEmpty() ? Collections.emptyList() : Collections.singleton(databases.iterator().next());
+    }
+    
+    private boolean isAuthorized(final String databaseName, final ShardingSphereMetaData metaData, final Grantee grantee) {
+        return new AuthorityChecker(metaData.getGlobalRuleMetaData().getSingleRule(AuthorityRule.class), grantee).isAuthorized(databaseName);
+    }
+    
     @SneakyThrows(SQLException.class)
-    private void handleResultSet(final String databaseName, final ResultSet resultSet) {
-        ResultSetMetaData metaData = resultSet.getMetaData();
+    private void handleResultSet(final ShardingSphereDatabase database, final ResultSet resultSet) {
+        ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
         while (resultSet.next()) {
-            int columnCount = metaData.getColumnCount();
+            int columnCount = resultSetMetaData.getColumnCount();
             Map<String, Object> rowMap = new LinkedHashMap<>(columnCount, 1F);
             Map<String, String> aliasMap = new LinkedHashMap<>(columnCount, 1F);
             for (int i = 1; i < columnCount + 1; i++) {
-                aliasMap.put(metaData.getColumnName(i), metaData.getColumnLabel(i));
-                rowMap.put(metaData.getColumnLabel(i), resultSet.getString(i));
+                aliasMap.put(resultSetMetaData.getColumnName(i), resultSetMetaData.getColumnLabel(i));
+                rowMap.put(resultSetMetaData.getColumnLabel(i), resultSet.getString(i));
             }
-            preProcess(databaseName, rowMap, aliasMap);
+            preProcess(database, rowMap, aliasMap);
             if (!rowMap.isEmpty()) {
                 rows.add(rowMap);
             }
         }
         if (rows.isEmpty()) {
-            for (int i = 1; i < metaData.getColumnCount() + 1; i++) {
-                labels.add(metaData.getColumnLabel(i));
+            for (int i = 1; i < resultSetMetaData.getColumnCount() + 1; i++) {
+                labels.add(resultSetMetaData.getColumnLabel(i));
             }
         }
     }
     
-    protected abstract Collection<String> getDatabaseNames(ConnectionSession connectionSession);
-    
-    protected abstract void preProcess(String databaseName, Map<String, Object> rows, Map<String, String> alias) throws SQLException;
+    protected void preProcess(final ShardingSphereDatabase database, final Map<String, Object> rows, final Map<String, String> alias) throws SQLException {
+    }
     
-    protected abstract void postProcess();
+    protected void postProcess() {
+    }
     
-    protected abstract void processMetaData(String databaseName, Consumer<ResultSet> callback) throws SQLException;
+    protected void processMetaData(final ShardingSphereDatabase database, final Consumer<ResultSet> callback) throws SQLException {
+        ResourceMetaData resourceMetaData = database.getResourceMetaData();
+        Optional<StorageUnit> storageUnit = resourceMetaData.getStorageUnits().values().stream().findFirst();
+        if (!storageUnit.isPresent()) {
+            return;
+        }
+        try (
+                Connection connection = storageUnit.get().getDataSource().getConnection();
+                PreparedStatement preparedStatement = connection.prepareStatement(sql)) {
+            for (int i = 0; i < parameters.size(); i++) {
+                preparedStatement.setObject(i + 1, parameters.get(i));
+            }
+            try (ResultSet resultSet = preparedStatement.executeQuery()) {
+                callback.accept(resultSet);
+            }
+        }
+    }
     
     private MergedResult createMergedResult() {
         List<MemoryQueryResultDataRow> resultDataRows = rows.stream().map(each -> new MemoryQueryResultDataRow(new LinkedList<>(each.values()))).collect(Collectors.toList());
@@ -127,64 +160,4 @@ public abstract class AbstractDatabaseMetaDataExecutor implements DatabaseAdminQ
                 .stream().map(each -> new RawQueryResultColumnMetaData("", each, each, Types.VARCHAR, "VARCHAR", 20, 0)).collect(Collectors.toList());
         return new RawQueryResultMetaData(columns);
     }
-    
-    /**
-     * Default database meta data executor, execute sql directly in the database to obtain the result source data.
-     */
-    public static class DefaultDatabaseMetaDataExecutor extends AbstractDatabaseMetaDataExecutor {
-        
-        private final String sql;
-        
-        private final List<Object> parameters;
-        
-        public DefaultDatabaseMetaDataExecutor(final ContextManager contextManager, final String sql, final List<Object> parameters) {
-            super(contextManager);
-            this.sql = sql;
-            this.parameters = parameters;
-        }
-        
-        @Override
-        protected Collection<String> getDatabaseNames(final ConnectionSession connectionSession) {
-            ShardingSphereDatabase database = getContextManager().getMetaDataContexts().getMetaData().getDatabase(connectionSession.getCurrentDatabaseName());
-            if (null != database && isAuthorized(database.getName(), connectionSession.getConnectionContext().getGrantee())
-                    && getContextManager().getDatabase(database.getName()).containsDataSource()) {
-                return Collections.singleton(database.getName());
-            }
-            Collection<String> databaseNames = getContextManager().getAllDatabaseNames().stream()
-                    .filter(each -> isAuthorized(each, connectionSession.getConnectionContext().getGrantee()))
-                    .filter(each -> getContextManager().getDatabase(each).containsDataSource()).collect(Collectors.toList());
-            return databaseNames.isEmpty() ? Collections.emptyList() : Collections.singletonList(databaseNames.iterator().next());
-        }
-        
-        private boolean isAuthorized(final String databaseName, final Grantee grantee) {
-            return new AuthorityChecker(getContextManager().getMetaDataContexts().getMetaData().getGlobalRuleMetaData().getSingleRule(AuthorityRule.class), grantee).isAuthorized(databaseName);
-        }
-        
-        @Override
-        protected void processMetaData(final String databaseName, final Consumer<ResultSet> callback) throws SQLException {
-            ResourceMetaData resourceMetaData = getContextManager().getMetaDataContexts().getMetaData().getDatabase(databaseName).getResourceMetaData();
-            Optional<StorageUnit> storageUnit = resourceMetaData.getStorageUnits().values().stream().findFirst();
-            if (!storageUnit.isPresent()) {
-                return;
-            }
-            try (
-                    Connection connection = storageUnit.get().getDataSource().getConnection();
-                    PreparedStatement preparedStatement = connection.prepareStatement(sql)) {
-                for (int i = 0; i < parameters.size(); i++) {
-                    preparedStatement.setObject(i + 1, parameters.get(i));
-                }
-                try (ResultSet resultSet = preparedStatement.executeQuery()) {
-                    callback.accept(resultSet);
-                }
-            }
-        }
-        
-        @Override
-        protected void preProcess(final String databaseName, final Map<String, Object> rows, final Map<String, String> alias) throws SQLException {
-        }
-        
-        @Override
-        protected void postProcess() {
-        }
-    }
 }
diff --git a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/admin/executor/DefaultDatabaseMetaDataExecutorTest.java b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/admin/executor/DatabaseMetaDataExecutorTest.java
similarity index 79%
rename from proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/admin/executor/DefaultDatabaseMetaDataExecutorTest.java
rename to proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/admin/executor/DatabaseMetaDataExecutorTest.java
index 64c67b3cf16..8936bd35aae 100644
--- a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/admin/executor/DefaultDatabaseMetaDataExecutorTest.java
+++ b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/admin/executor/DatabaseMetaDataExecutorTest.java
@@ -26,13 +26,8 @@ import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import org.apache.shardingsphere.infra.metadata.database.resource.ResourceMetaData;
 import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData;
 import org.apache.shardingsphere.infra.metadata.database.schema.util.SystemSchemaUtils;
-import org.apache.shardingsphere.infra.metadata.statistics.ShardingSphereStatistics;
-import org.apache.shardingsphere.infra.metadata.statistics.builder.ShardingSphereStatisticsFactory;
 import org.apache.shardingsphere.infra.metadata.user.Grantee;
 import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
-import org.apache.shardingsphere.mode.manager.ContextManager;
-import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
-import org.apache.shardingsphere.proxy.backend.handler.admin.executor.AbstractDatabaseMetaDataExecutor.DefaultDatabaseMetaDataExecutor;
 import org.apache.shardingsphere.proxy.backend.session.ConnectionSession;
 import org.apache.shardingsphere.test.infra.fixture.jdbc.MockedDataSource;
 import org.apache.shardingsphere.test.infra.framework.mock.AutoMockExtension;
@@ -63,7 +58,7 @@ import static org.mockito.Mockito.when;
 
 @ExtendWith(AutoMockExtension.class)
 @StaticMockSettings(SystemSchemaUtils.class)
-class DefaultDatabaseMetaDataExecutorTest {
+class DatabaseMetaDataExecutorTest {
     
     private final DatabaseType databaseType = TypedSPILoader.getService(DatabaseType.class, "FIXTURE");
     
@@ -74,6 +69,7 @@ class DefaultDatabaseMetaDataExecutorTest {
     
     @BeforeEach
     void setUp() {
+        when(connectionSession.getCurrentDatabaseName()).thenReturn("auth_db");
         when(connectionSession.getConnectionContext().getGrantee()).thenReturn(grantee);
     }
     
@@ -84,8 +80,8 @@ class DefaultDatabaseMetaDataExecutorTest {
         expectedResultSetMap.put("DEFAULT_CHARACTER_SET_NAME", "utf8mb4");
         String sql = "SELECT SCHEMA_NAME AS sn, DEFAULT_CHARACTER_SET_NAME FROM information_schema.SCHEMATA";
         ShardingSphereDatabase database = createDatabase(expectedResultSetMap);
-        DefaultDatabaseMetaDataExecutor executor = new DefaultDatabaseMetaDataExecutor(mockContextManager(database), sql, Collections.emptyList());
-        executor.execute(connectionSession, mock());
+        DatabaseMetaDataExecutor executor = new DatabaseMetaDataExecutor(sql, Collections.emptyList());
+        executor.execute(connectionSession, mockMetaData(database));
         assertThat(executor.getRows().get(0).get("sn"), is("foo_ds"));
         assertThat(executor.getRows().get(0).get("DEFAULT_CHARACTER_SET_NAME"), is("utf8mb4"));
     }
@@ -94,8 +90,8 @@ class DefaultDatabaseMetaDataExecutorTest {
     void assertExecuteWithDefaultValue() throws SQLException {
         String sql = "SELECT COUNT(*) AS support_ndb FROM information_schema.ENGINES WHERE Engine = 'ndbcluster'";
         ShardingSphereDatabase database = createDatabase(Collections.singletonMap("support_ndb", "0"));
-        DefaultDatabaseMetaDataExecutor executor = new DefaultDatabaseMetaDataExecutor(mockContextManager(database), sql, Collections.emptyList());
-        executor.execute(connectionSession, mock());
+        DatabaseMetaDataExecutor executor = new DatabaseMetaDataExecutor(sql, Collections.emptyList());
+        executor.execute(connectionSession, mockMetaData(database));
         assertThat(executor.getQueryResultMetaData().getColumnCount(), is(1));
         while (executor.getMergedResult().next()) {
             assertThat(executor.getMergedResult().getValue(1, String.class), is("0"));
@@ -106,8 +102,8 @@ class DefaultDatabaseMetaDataExecutorTest {
     void assertExecuteWithPreparedStatement() throws SQLException {
         String sql = "SELECT COUNT(*) AS support_ndb FROM information_schema.ENGINES WHERE Engine = ?";
         ShardingSphereDatabase database = createDatabase(Collections.singletonMap("support_ndb", "0"));
-        DefaultDatabaseMetaDataExecutor executor = new DefaultDatabaseMetaDataExecutor(mockContextManager(database), sql, Collections.singletonList("ndbcluster"));
-        executor.execute(connectionSession, mock());
+        DatabaseMetaDataExecutor executor = new DatabaseMetaDataExecutor(sql, Collections.singletonList("ndbcluster"));
+        executor.execute(connectionSession, mockMetaData(database));
         assertThat(executor.getQueryResultMetaData().getColumnCount(), is(1));
         while (executor.getMergedResult().next()) {
             assertThat(executor.getMergedResult().getValue(1, String.class), is("0"));
@@ -139,16 +135,10 @@ class DefaultDatabaseMetaDataExecutorTest {
         return result;
     }
     
-    private ContextManager mockContextManager(final ShardingSphereDatabase database) {
+    private ShardingSphereMetaData mockMetaData(final ShardingSphereDatabase database) {
         AuthorityRule authorityRule = mock(AuthorityRule.class);
         when(authorityRule.findPrivileges(grantee)).thenReturn(Optional.of(new DatabasePermittedPrivileges(Collections.singleton("auth_db"))));
-        ContextManager result = mock(ContextManager.class, RETURNS_DEEP_STUBS);
-        ShardingSphereMetaData metaData = new ShardingSphereMetaData(
+        return new ShardingSphereMetaData(
                 Collections.singleton(database), mock(ResourceMetaData.class), new RuleMetaData(Collections.singleton(authorityRule)), new ConfigurationProperties(new Properties()));
-        MetaDataContexts metaDataContexts = new MetaDataContexts(metaData, ShardingSphereStatisticsFactory.create(metaData, new ShardingSphereStatistics()));
-        when(result.getMetaDataContexts()).thenReturn(metaDataContexts);
-        when(result.getDatabase("auth_db")).thenReturn(database);
-        when(result.getAllDatabaseNames()).thenReturn(Collections.singleton("auth_db"));
-        return result;
     }
 }
diff --git a/proxy/backend/dialect/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/select/SelectInformationSchemataExecutor.java b/proxy/backend/dialect/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/select/SelectInformationSchemataExecutor.java
index 324311e1f92..87486a0fdac 100644
--- a/proxy/backend/dialect/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/select/SelectInformationSchemataExecutor.java
+++ b/proxy/backend/dialect/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/select/SelectInformationSchemataExecutor.java
@@ -19,11 +19,11 @@ package org.apache.shardingsphere.proxy.backend.mysql.handler.admin.executor.sel
 
 import org.apache.shardingsphere.authority.checker.AuthorityChecker;
 import org.apache.shardingsphere.authority.rule.AuthorityRule;
+import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
+import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import org.apache.shardingsphere.infra.metadata.database.resource.ResourceMetaData;
 import org.apache.shardingsphere.infra.metadata.database.resource.unit.StorageUnit;
-import org.apache.shardingsphere.mode.manager.ContextManager;
-import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
-import org.apache.shardingsphere.proxy.backend.handler.admin.executor.AbstractDatabaseMetaDataExecutor.DefaultDatabaseMetaDataExecutor;
+import org.apache.shardingsphere.proxy.backend.handler.admin.executor.DatabaseMetaDataExecutor;
 import org.apache.shardingsphere.proxy.backend.session.ConnectionSession;
 import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.ColumnProjectionSegment;
 import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.ProjectionSegment;
@@ -44,9 +44,9 @@ import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
 /**
- * Schemata query executor, used to query the schemata table.
+ * Select information schemata executor.
  */
-public final class SelectInformationSchemataExecutor extends DefaultDatabaseMetaDataExecutor {
+public final class SelectInformationSchemataExecutor extends DatabaseMetaDataExecutor {
     
     public static final String SCHEMA_NAME = "SCHEMA_NAME";
     
@@ -69,32 +69,16 @@ public final class SelectInformationSchemataExecutor extends DefaultDatabaseMeta
     private boolean queryDatabase;
     
     public SelectInformationSchemataExecutor(final SelectStatement sqlStatement, final String sql, final List<Object> parameters) {
-        super(ProxyContext.getInstance().getContextManager(), sql, parameters);
+        super(sql, parameters);
         this.sqlStatement = sqlStatement;
     }
     
     @Override
-    protected void postProcess() {
-        removeDuplicatedRow();
-    }
-    
-    private void removeDuplicatedRow() {
-        if (queryDatabase) {
-            Collection<Map<String, Object>> reservedRow = getRows().stream()
-                    .collect(Collectors.groupingBy(each -> Optional.ofNullable(each.get(schemaNameAlias)), Collectors.toCollection(LinkedList::new)))
-                    .values().stream().map(LinkedList::getFirst).collect(Collectors.toList());
-            reservedRow.forEach(each -> getRows().removeIf(row -> !getRows().contains(each)));
-        }
-    }
-    
-    @Override
-    protected Collection<String> getDatabaseNames(final ConnectionSession connectionSession) {
-        ContextManager contextManager = ProxyContext.getInstance().getContextManager();
-        AuthorityChecker authorityChecker = new AuthorityChecker(
-                contextManager.getMetaDataContexts().getMetaData().getGlobalRuleMetaData().getSingleRule(AuthorityRule.class), connectionSession.getConnectionContext().getGrantee());
-        Collection<String> databaseNames = contextManager.getAllDatabaseNames().stream().filter(authorityChecker::isAuthorized).collect(Collectors.toList());
-        SCHEMA_WITHOUT_DATA_SOURCE.addAll(databaseNames.stream().filter(each -> !contextManager.getDatabase(each).containsDataSource()).collect(Collectors.toSet()));
-        Collection<String> result = databaseNames.stream().filter(each -> contextManager.getDatabase(each).containsDataSource()).collect(Collectors.toList());
+    protected Collection<ShardingSphereDatabase> getDatabases(final ConnectionSession connectionSession, final ShardingSphereMetaData metaData) {
+        AuthorityChecker authorityChecker = new AuthorityChecker(metaData.getGlobalRuleMetaData().getSingleRule(AuthorityRule.class), connectionSession.getConnectionContext().getGrantee());
+        Collection<ShardingSphereDatabase> databases = metaData.getAllDatabases().stream().filter(each -> authorityChecker.isAuthorized(each.getName())).collect(Collectors.toList());
+        SCHEMA_WITHOUT_DATA_SOURCE.addAll(databases.stream().filter(each -> !each.containsDataSource()).map(ShardingSphereDatabase::getName).collect(Collectors.toSet()));
+        Collection<ShardingSphereDatabase> result = databases.stream().filter(ShardingSphereDatabase::containsDataSource).collect(Collectors.toList());
         if (!SCHEMA_WITHOUT_DATA_SOURCE.isEmpty()) {
             fillSchemasWithoutDataSource();
         }
@@ -143,14 +127,13 @@ public final class SelectInformationSchemataExecutor extends DefaultDatabaseMeta
     }
     
     @Override
-    protected void preProcess(final String databaseName, final Map<String, Object> rows, final Map<String, String> alias) throws SQLException {
-        ResourceMetaData resourceMetaData = ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaData().getDatabase(databaseName).getResourceMetaData();
-        Collection<String> catalogs = getCatalogs(resourceMetaData);
+    protected void preProcess(final ShardingSphereDatabase database, final Map<String, Object> rows, final Map<String, String> alias) throws SQLException {
+        Collection<String> catalogs = getCatalogs(database.getResourceMetaData());
         schemaNameAlias = alias.getOrDefault(SCHEMA_NAME, alias.getOrDefault(schemaNameAlias, schemaNameAlias));
         String rowValue = rows.getOrDefault(schemaNameAlias, "").toString();
         queryDatabase = !rowValue.isEmpty();
         if (catalogs.contains(rowValue)) {
-            rows.replace(schemaNameAlias, databaseName);
+            rows.replace(schemaNameAlias, database.getName());
         } else {
             rows.clear();
         }
@@ -165,4 +148,18 @@ public final class SelectInformationSchemataExecutor extends DefaultDatabaseMeta
             return Collections.singleton(connection.getCatalog());
         }
     }
+    
+    @Override
+    protected void postProcess() {
+        removeDuplicatedRow();
+    }
+    
+    private void removeDuplicatedRow() {
+        if (queryDatabase) {
+            Collection<Map<String, Object>> reservedRow = getRows().stream()
+                    .collect(Collectors.groupingBy(each -> Optional.ofNullable(each.get(schemaNameAlias)), Collectors.toCollection(LinkedList::new)))
+                    .values().stream().map(LinkedList::getFirst).collect(Collectors.toList());
+            reservedRow.forEach(each -> getRows().removeIf(row -> !getRows().contains(each)));
+        }
+    }
 }
diff --git a/proxy/backend/dialect/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/factory/schema/MySQLInformationSchemaExecutorFactory.java b/proxy/backend/dialect/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/factory/schema/MySQLInformationSchemaExecutorFactory.java
index 831c21a5f85..74394194631 100644
--- a/proxy/backend/dialect/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/factory/schema/MySQLInformationSchemaExecutorFactory.java
+++ b/proxy/backend/dialect/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/factory/schema/MySQLInformationSchemaExecutorFactory.java
@@ -21,9 +21,8 @@ import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
 import org.apache.shardingsphere.infra.binder.context.statement.type.dml.SelectStatementContext;
 import org.apache.shardingsphere.infra.metadata.database.schema.manager.SystemSchemaManager;
-import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
-import org.apache.shardingsphere.proxy.backend.handler.admin.executor.AbstractDatabaseMetaDataExecutor.DefaultDatabaseMetaDataExecutor;
 import org.apache.shardingsphere.proxy.backend.handler.admin.executor.DatabaseAdminExecutor;
+import org.apache.shardingsphere.proxy.backend.handler.admin.executor.DatabaseMetaDataExecutor;
 import org.apache.shardingsphere.proxy.backend.mysql.handler.admin.executor.select.SelectInformationSchemataExecutor;
 import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SimpleTableSegment;
 import org.apache.shardingsphere.sql.parser.statement.core.statement.type.dml.SelectStatement;
@@ -57,7 +56,7 @@ public final class MySQLInformationSchemaExecutorFactory {
             return Optional.of(new SelectInformationSchemataExecutor(sqlStatement, sql, parameters));
         }
         if (SystemSchemaManager.isSystemTable("mysql", "information_schema", tableName)) {
-            return Optional.of(new DefaultDatabaseMetaDataExecutor(ProxyContext.getInstance().getContextManager(), sql, parameters));
+            return Optional.of(new DatabaseMetaDataExecutor(sql, parameters));
         }
         return Optional.empty();
     }
diff --git a/proxy/backend/dialect/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/factory/schema/MySQLMySQLSchemaExecutorFactory.java b/proxy/backend/dialect/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/factory/schema/MySQLMySQLSchemaExecutorFactory.java
index c742ffab245..2db30b33f48 100644
--- a/proxy/backend/dialect/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/factory/schema/MySQLMySQLSchemaExecutorFactory.java
+++ b/proxy/backend/dialect/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/factory/schema/MySQLMySQLSchemaExecutorFactory.java
@@ -21,9 +21,8 @@ import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
 import org.apache.shardingsphere.infra.binder.context.statement.type.dml.SelectStatementContext;
 import org.apache.shardingsphere.infra.metadata.database.schema.manager.SystemSchemaManager;
-import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
-import org.apache.shardingsphere.proxy.backend.handler.admin.executor.AbstractDatabaseMetaDataExecutor.DefaultDatabaseMetaDataExecutor;
 import org.apache.shardingsphere.proxy.backend.handler.admin.executor.DatabaseAdminExecutor;
+import org.apache.shardingsphere.proxy.backend.handler.admin.executor.DatabaseMetaDataExecutor;
 import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SimpleTableSegment;
 import org.apache.shardingsphere.sql.parser.statement.core.statement.type.dml.SelectStatement;
 
@@ -51,7 +50,7 @@ public final class MySQLMySQLSchemaExecutorFactory {
         }
         String tableName = ((SimpleTableSegment) sqlStatement.getFrom().get()).getTableName().getIdentifier().getValue();
         if (SystemSchemaManager.isSystemTable("mysql", "mysql", tableName)) {
-            return Optional.of(new DefaultDatabaseMetaDataExecutor(ProxyContext.getInstance().getContextManager(), sql, parameters));
+            return Optional.of(new DatabaseMetaDataExecutor(sql, parameters));
         }
         return Optional.empty();
     }
diff --git a/proxy/backend/dialect/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/factory/schema/MySQLPerformanceSchemaExecutorFactory.java b/proxy/backend/dialect/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/factory/schema/MySQLPerformanceSchemaExecutorFactory.java
index 2427ab11f7f..15182cfbe33 100644
--- a/proxy/backend/dialect/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/factory/schema/MySQLPerformanceSchemaExecutorFactory.java
+++ b/proxy/backend/dialect/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/factory/schema/MySQLPerformanceSchemaExecutorFactory.java
@@ -21,9 +21,8 @@ import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
 import org.apache.shardingsphere.infra.binder.context.statement.type.dml.SelectStatementContext;
 import org.apache.shardingsphere.infra.metadata.database.schema.manager.SystemSchemaManager;
-import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
-import org.apache.shardingsphere.proxy.backend.handler.admin.executor.AbstractDatabaseMetaDataExecutor.DefaultDatabaseMetaDataExecutor;
 import org.apache.shardingsphere.proxy.backend.handler.admin.executor.DatabaseAdminExecutor;
+import org.apache.shardingsphere.proxy.backend.handler.admin.executor.DatabaseMetaDataExecutor;
 import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SimpleTableSegment;
 import org.apache.shardingsphere.sql.parser.statement.core.statement.type.dml.SelectStatement;
 
@@ -51,7 +50,7 @@ public final class MySQLPerformanceSchemaExecutorFactory {
         }
         String tableName = ((SimpleTableSegment) sqlStatement.getFrom().get()).getTableName().getIdentifier().getValue();
         if (SystemSchemaManager.isSystemTable("mysql", "performance_schema", tableName)) {
-            return Optional.of(new DefaultDatabaseMetaDataExecutor(ProxyContext.getInstance().getContextManager(), sql, parameters));
+            return Optional.of(new DatabaseMetaDataExecutor(sql, parameters));
         }
         return Optional.empty();
     }
diff --git a/proxy/backend/dialect/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/factory/schema/MySQLSysSchemaExecutorFactory.java b/proxy/backend/dialect/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/factory/schema/MySQLSysSchemaExecutorFactory.java
index 380280acf0d..ca7f3561c8b 100644
--- a/proxy/backend/dialect/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/factory/schema/MySQLSysSchemaExecutorFactory.java
+++ b/proxy/backend/dialect/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/factory/schema/MySQLSysSchemaExecutorFactory.java
@@ -21,9 +21,8 @@ import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
 import org.apache.shardingsphere.infra.binder.context.statement.type.dml.SelectStatementContext;
 import org.apache.shardingsphere.infra.metadata.database.schema.manager.SystemSchemaManager;
-import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
-import org.apache.shardingsphere.proxy.backend.handler.admin.executor.AbstractDatabaseMetaDataExecutor.DefaultDatabaseMetaDataExecutor;
 import org.apache.shardingsphere.proxy.backend.handler.admin.executor.DatabaseAdminExecutor;
+import org.apache.shardingsphere.proxy.backend.handler.admin.executor.DatabaseMetaDataExecutor;
 import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SimpleTableSegment;
 import org.apache.shardingsphere.sql.parser.statement.core.statement.type.dml.SelectStatement;
 
@@ -51,7 +50,7 @@ public final class MySQLSysSchemaExecutorFactory {
         }
         String tableName = ((SimpleTableSegment) sqlStatement.getFrom().get()).getTableName().getIdentifier().getValue();
         if (SystemSchemaManager.isSystemTable("mysql", "sys", tableName)) {
-            return Optional.of(new DefaultDatabaseMetaDataExecutor(ProxyContext.getInstance().getContextManager(), sql, parameters));
+            return Optional.of(new DatabaseMetaDataExecutor(sql, parameters));
         }
         return Optional.empty();
     }
diff --git a/proxy/backend/dialect/mysql/src/test/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/MySQLAdminExecutorCreatorTest.java b/proxy/backend/dialect/mysql/src/test/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/MySQLAdminExecutorCreatorTest.java
index a08030f7685..a7917e5cc26 100644
--- a/proxy/backend/dialect/mysql/src/test/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/MySQLAdminExecutorCreatorTest.java
+++ b/proxy/backend/dialect/mysql/src/test/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/MySQLAdminExecutorCreatorTest.java
@@ -32,24 +32,24 @@ import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
 import org.apache.shardingsphere.mode.manager.ContextManager;
 import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
 import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
-import org.apache.shardingsphere.proxy.backend.handler.admin.executor.AbstractDatabaseMetaDataExecutor.DefaultDatabaseMetaDataExecutor;
+import org.apache.shardingsphere.proxy.backend.handler.admin.executor.DatabaseMetaDataExecutor;
 import org.apache.shardingsphere.proxy.backend.handler.admin.executor.DatabaseAdminExecutor;
 import org.apache.shardingsphere.proxy.backend.mysql.handler.admin.executor.MySQLSetVariableAdminExecutor;
 import org.apache.shardingsphere.proxy.backend.mysql.handler.admin.executor.MySQLSystemVariableQueryExecutor;
-import org.apache.shardingsphere.proxy.backend.mysql.handler.admin.executor.select.NoResourceShowExecutor;
-import org.apache.shardingsphere.proxy.backend.mysql.handler.admin.executor.select.ShowConnectionIdExecutor;
 import org.apache.shardingsphere.proxy.backend.mysql.handler.admin.executor.ShowCreateDatabaseExecutor;
-import org.apache.shardingsphere.proxy.backend.mysql.handler.admin.executor.select.ShowCurrentDatabaseExecutor;
-import org.apache.shardingsphere.proxy.backend.mysql.handler.admin.executor.select.ShowCurrentUserExecutor;
 import org.apache.shardingsphere.proxy.backend.mysql.handler.admin.executor.ShowDatabasesExecutor;
 import org.apache.shardingsphere.proxy.backend.mysql.handler.admin.executor.ShowFunctionStatusExecutor;
 import org.apache.shardingsphere.proxy.backend.mysql.handler.admin.executor.ShowProcedureStatusExecutor;
 import org.apache.shardingsphere.proxy.backend.mysql.handler.admin.executor.ShowProcessListExecutor;
 import org.apache.shardingsphere.proxy.backend.mysql.handler.admin.executor.ShowTablesExecutor;
-import org.apache.shardingsphere.proxy.backend.mysql.handler.admin.executor.select.ShowVersionExecutor;
-import org.apache.shardingsphere.proxy.backend.mysql.handler.admin.executor.select.UnicastResourceShowExecutor;
 import org.apache.shardingsphere.proxy.backend.mysql.handler.admin.executor.UseDatabaseExecutor;
+import org.apache.shardingsphere.proxy.backend.mysql.handler.admin.executor.select.NoResourceShowExecutor;
 import org.apache.shardingsphere.proxy.backend.mysql.handler.admin.executor.select.SelectInformationSchemataExecutor;
+import org.apache.shardingsphere.proxy.backend.mysql.handler.admin.executor.select.ShowConnectionIdExecutor;
+import org.apache.shardingsphere.proxy.backend.mysql.handler.admin.executor.select.ShowCurrentDatabaseExecutor;
+import org.apache.shardingsphere.proxy.backend.mysql.handler.admin.executor.select.ShowCurrentUserExecutor;
+import org.apache.shardingsphere.proxy.backend.mysql.handler.admin.executor.select.ShowVersionExecutor;
+import org.apache.shardingsphere.proxy.backend.mysql.handler.admin.executor.select.UnicastResourceShowExecutor;
 import org.apache.shardingsphere.sql.parser.statement.core.segment.dal.VariableSegment;
 import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.ExpressionProjectionSegment;
 import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.ProjectionsSegment;
@@ -325,7 +325,7 @@ class MySQLAdminExecutorCreatorTest {
         when(sqlStatementContext.getSqlStatement()).thenReturn(selectStatement);
         Optional<DatabaseAdminExecutor> actual = new MySQLAdminExecutorCreator().create(sqlStatementContext, "SELECT ENGINE from ENGINES", "information_schema", Collections.emptyList());
         assertTrue(actual.isPresent());
-        assertThat(actual.get(), isA(DefaultDatabaseMetaDataExecutor.class));
+        assertThat(actual.get(), isA(DatabaseMetaDataExecutor.class));
     }
     
     @Test
diff --git a/proxy/backend/dialect/opengauss/src/main/java/org/apache/shardingsphere/proxy/backend/opengauss/handler/admin/OpenGaussSystemTableQueryExecutorCreator.java b/proxy/backend/dialect/opengauss/src/main/java/org/apache/shardingsphere/proxy/backend/opengauss/handler/admin/OpenGaussSystemTableQueryExecutorCreator.java
index 3322eecaccf..09f257545a7 100644
--- a/proxy/backend/dialect/opengauss/src/main/java/org/apache/shardingsphere/proxy/backend/opengauss/handler/admin/OpenGaussSystemTableQueryExecutorCreator.java
+++ b/proxy/backend/dialect/opengauss/src/main/java/org/apache/shardingsphere/proxy/backend/opengauss/handler/admin/OpenGaussSystemTableQueryExecutorCreator.java
@@ -30,9 +30,8 @@ import org.apache.shardingsphere.infra.binder.context.statement.type.dml.SelectS
 import org.apache.shardingsphere.infra.metadata.database.schema.manager.SystemSchemaManager;
 import org.apache.shardingsphere.infra.metadata.statistics.collector.DialectDatabaseStatisticsCollector;
 import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
-import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
-import org.apache.shardingsphere.proxy.backend.handler.admin.executor.AbstractDatabaseMetaDataExecutor.DefaultDatabaseMetaDataExecutor;
 import org.apache.shardingsphere.proxy.backend.handler.admin.executor.DatabaseAdminExecutor;
+import org.apache.shardingsphere.proxy.backend.handler.admin.executor.DatabaseMetaDataExecutor;
 import org.apache.shardingsphere.proxy.backend.opengauss.handler.admin.executor.OpenGaussSelectDatCompatibilityExecutor;
 import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.bound.ColumnSegmentBoundInfo;
 import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.bound.TableSegmentBoundInfo;
@@ -82,7 +81,7 @@ public final class OpenGaussSystemTableQueryExecutorCreator {
             return Optional.empty();
         }
         if (isSelectSystemTable(selectedSchemaTables)) {
-            return Optional.of(new DefaultDatabaseMetaDataExecutor(ProxyContext.getInstance().getContextManager(), sql, parameters));
+            return Optional.of(new DatabaseMetaDataExecutor(sql, parameters));
         }
         return Optional.empty();
     }
diff --git a/proxy/backend/dialect/opengauss/src/test/java/org/apache/shardingsphere/proxy/backend/opengauss/handler/admin/OpenGaussAdminExecutorCreatorTest.java b/proxy/backend/dialect/opengauss/src/test/java/org/apache/shardingsphere/proxy/backend/opengauss/handler/admin/OpenGaussAdminExecutorCreatorTest.java
index 008e688015b..4a027fb2999 100644
--- a/proxy/backend/dialect/opengauss/src/test/java/org/apache/shardingsphere/proxy/backend/opengauss/handler/admin/OpenGaussAdminExecutorCreatorTest.java
+++ b/proxy/backend/dialect/opengauss/src/test/java/org/apache/shardingsphere/proxy/backend/opengauss/handler/admin/OpenGaussAdminExecutorCreatorTest.java
@@ -24,7 +24,7 @@ import org.apache.shardingsphere.infra.binder.context.segment.table.TablesContex
 import org.apache.shardingsphere.infra.binder.context.statement.type.dml.SelectStatementContext;
 import org.apache.shardingsphere.infra.metadata.statistics.collector.DialectDatabaseStatisticsCollector;
 import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
-import org.apache.shardingsphere.proxy.backend.handler.admin.executor.AbstractDatabaseMetaDataExecutor.DefaultDatabaseMetaDataExecutor;
+import org.apache.shardingsphere.proxy.backend.handler.admin.executor.DatabaseMetaDataExecutor;
 import org.apache.shardingsphere.proxy.backend.handler.admin.executor.DatabaseAdminExecutor;
 import org.apache.shardingsphere.proxy.backend.opengauss.handler.admin.executor.OpenGaussSelectDatCompatibilityExecutor;
 import org.apache.shardingsphere.proxy.backend.opengauss.handler.admin.executor.OpenGaussSelectPasswordDeadlineExecutor;
@@ -85,7 +85,7 @@ class OpenGaussAdminExecutorCreatorTest {
         SelectStatementContext selectStatementContext = mockSelectStatementContext("pg_catalog", "pg_type", null);
         Optional<DatabaseAdminExecutor> actual = new OpenGaussAdminExecutorCreator().create(selectStatementContext, sql, "postgres", Collections.emptyList());
         assertTrue(actual.isPresent());
-        assertThat(actual.get(), isA(DefaultDatabaseMetaDataExecutor.class));
+        assertThat(actual.get(), isA(DatabaseMetaDataExecutor.class));
     }
     
     @Test
diff --git a/proxy/backend/dialect/opengauss/src/test/java/org/apache/shardingsphere/proxy/backend/opengauss/handler/admin/OpenGaussSystemTableQueryExecutorCreatorTest.java b/proxy/backend/dialect/opengauss/src/test/java/org/apache/shardingsphere/proxy/backend/opengauss/handler/admin/OpenGaussSystemTableQueryExecutorCreatorTest.java
index 8c5c016d3db..6377a2f87fc 100644
--- a/proxy/backend/dialect/opengauss/src/test/java/org/apache/shardingsphere/proxy/backend/opengauss/handler/admin/OpenGaussSystemTableQueryExecutorCreatorTest.java
+++ b/proxy/backend/dialect/opengauss/src/test/java/org/apache/shardingsphere/proxy/backend/opengauss/handler/admin/OpenGaussSystemTableQueryExecutorCreatorTest.java
@@ -21,7 +21,7 @@ import org.apache.shardingsphere.infra.binder.context.segment.select.projection.
 import org.apache.shardingsphere.infra.binder.context.segment.table.TablesContext;
 import org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext;
 import org.apache.shardingsphere.infra.binder.context.statement.type.dml.SelectStatementContext;
-import org.apache.shardingsphere.proxy.backend.handler.admin.executor.AbstractDatabaseMetaDataExecutor.DefaultDatabaseMetaDataExecutor;
+import org.apache.shardingsphere.proxy.backend.handler.admin.executor.DatabaseMetaDataExecutor;
 import org.apache.shardingsphere.proxy.backend.handler.admin.executor.DatabaseAdminExecutor;
 import org.apache.shardingsphere.proxy.backend.opengauss.handler.admin.executor.OpenGaussSelectDatCompatibilityExecutor;
 import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.bound.ColumnSegmentBoundInfo;
@@ -62,7 +62,7 @@ class OpenGaussSystemTableQueryExecutorCreatorTest {
         assertTrue(creator.accept());
         Optional<DatabaseAdminExecutor> actual = creator.create();
         assertTrue(actual.isPresent());
-        assertThat(actual.get(), isA(DefaultDatabaseMetaDataExecutor.class));
+        assertThat(actual.get(), isA(DatabaseMetaDataExecutor.class));
     }
     
     private SQLStatementContext mockSelectStatementContext(final String schemaName, final String tableName, final String columnName) {
diff --git a/proxy/backend/dialect/postgresql/src/main/java/org/apache/shardingsphere/proxy/backend/postgresql/handler/admin/PostgreSQLAdminExecutorCreator.java b/proxy/backend/dialect/postgresql/src/main/java/org/apache/shardingsphere/proxy/backend/postgresql/handler/admin/PostgreSQLAdminExecutorCreator.java
index 6e85e8e2702..ecf7b7af248 100644
--- a/proxy/backend/dialect/postgresql/src/main/java/org/apache/shardingsphere/proxy/backend/postgresql/handler/admin/PostgreSQLAdminExecutorCreator.java
+++ b/proxy/backend/dialect/postgresql/src/main/java/org/apache/shardingsphere/proxy/backend/postgresql/handler/admin/PostgreSQLAdminExecutorCreator.java
@@ -25,10 +25,9 @@ import org.apache.shardingsphere.infra.binder.context.statement.SQLStatementCont
 import org.apache.shardingsphere.infra.metadata.database.schema.manager.SystemSchemaManager;
 import org.apache.shardingsphere.infra.metadata.statistics.collector.DialectDatabaseStatisticsCollector;
 import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
-import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
-import org.apache.shardingsphere.proxy.backend.handler.admin.executor.AbstractDatabaseMetaDataExecutor.DefaultDatabaseMetaDataExecutor;
 import org.apache.shardingsphere.proxy.backend.handler.admin.executor.DatabaseAdminExecutor;
 import org.apache.shardingsphere.proxy.backend.handler.admin.executor.DatabaseAdminExecutorCreator;
+import org.apache.shardingsphere.proxy.backend.handler.admin.executor.DatabaseMetaDataExecutor;
 import org.apache.shardingsphere.proxy.backend.postgresql.handler.admin.executor.PostgreSQLResetVariableAdminExecutor;
 import org.apache.shardingsphere.proxy.backend.postgresql.handler.admin.executor.PostgreSQLSetVariableAdminExecutor;
 import org.apache.shardingsphere.proxy.backend.postgresql.handler.admin.executor.PostgreSQLShowVariableExecutor;
@@ -71,7 +70,7 @@ public final class PostgreSQLAdminExecutorCreator implements DatabaseAdminExecut
                 return Optional.empty();
             }
             if (isSelectSystemTable(selectedSchemaTables)) {
-                return Optional.of(new DefaultDatabaseMetaDataExecutor(ProxyContext.getInstance().getContextManager(), sql, parameters));
+                return Optional.of(new DatabaseMetaDataExecutor(sql, parameters));
             }
         }
         if (sqlStatement instanceof SetStatement) {