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

zhaojinchao 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 41d66a2476b Fixes #29467, Enhance REFRESH DATABASE METADATA implements 
(#29484)
41d66a2476b is described below

commit 41d66a2476b461a36fa6890759184c341bc2f7a7
Author: ChenJiaHao <[email protected]>
AuthorDate: Thu Dec 21 14:48:14 2023 +0800

    Fixes #29467, Enhance REFRESH DATABASE METADATA implements (#29484)
---
 .../syntax/ral/refresh-database-metadata.cn.md     | 24 +++++++++------
 .../syntax/ral/refresh-database-metadata.en.md     | 20 +++++++-----
 .../database/schema/util/SystemSchemaUtils.java    | 16 +++++++++-
 .../engine/src/main/antlr4/imports/Keyword.g4      | 10 +++++-
 .../engine/src/main/antlr4/imports/RALStatement.g4 |  2 +-
 .../core/kernel/KernelDistSQLStatementVisitor.java |  2 +-
 .../RefreshDatabaseMetaDataStatement.java          |  2 ++
 .../updatable/RefreshDatabaseMetaDataUpdater.java  | 36 ++++++++++++++++------
 .../RefreshDatabaseMetaDataUpdaterTest.java        | 13 +++++---
 .../cases/ral/ral-integration-refresh.xml          |  2 +-
 10 files changed, 92 insertions(+), 35 deletions(-)

diff --git 
a/docs/document/content/user-manual/shardingsphere-proxy/distsql/syntax/ral/refresh-database-metadata.cn.md
 
b/docs/document/content/user-manual/shardingsphere-proxy/distsql/syntax/ral/refresh-database-metadata.cn.md
index c66660bd743..c6f51fa804d 100644
--- 
a/docs/document/content/user-manual/shardingsphere-proxy/distsql/syntax/ral/refresh-database-metadata.cn.md
+++ 
b/docs/document/content/user-manual/shardingsphere-proxy/distsql/syntax/ral/refresh-database-metadata.cn.md
@@ -1,19 +1,19 @@
 +++
-title = "REFRESH DATABASE METADATA FROM GOVERNANCE CENTER"
+title = "REFRESH DATABASE METADATA"
 weight = 9
 +++
 
 ### 描述
 
-`REFRESH DATABASE METADATA FROM GOVERNANCE CENTER` 语法用于从治理中心拉取最新配置,刷新本地逻辑库元数据。
+`REFRESH DATABASE METADATA` 语法用于刷新本地逻辑库元数据。
 
 ### 语法
 
 {{< tabs >}}
 {{% tab name="语法" %}}
 ```sql
-RefreshDatabaseMetadataFromGovernanceCenter ::=
-  'REFRESH' 'DATABASE' 'METADATA' databaseName? 'FROM' 'GOVERNANCE' 'CENTER'
+RefreshDatabaseMetadata ::=
+  'FORCE'? 'REFRESH' 'DATABASE' 'METADATA' databaseName?
 
 databaseName ::=
   identifier
@@ -28,26 +28,32 @@ databaseName ::=
 
 - 未指定 `databaseName` 时,默认刷新所有逻辑库的元数据
 
-- 刷新元数据需要使用 `DATABASE` 如果未使用 `DATABASE` 则会提示 `No database selected`
+- 刷新元数据使用 `FORCE` 时,将会从本地获取最新元数据,并写入到治理中心,未开启 `FORCE` 则会从治理中心拉取最新配置
 
 ### 示例
 
 - 刷新指定逻辑库的元数据
 
 ```sql
-REFRESH DATABASE METADATA sharding_db FROM GOVERNANCE CENTER;
+REFRESH DATABASE METADATA sharding_db;
 ```
 
 - 刷新所有逻辑库的元数据
 
 ```sql
-REFRESH DATABASE METADATA FROM GOVERNANCE CENTER;
+REFRESH DATABASE METADATA;
+```
+
+- 强制刷新所有逻辑库的元数据
+
+```sql
+FORCE REFRESH DATABASE METADATA;
 ```
 
 ### 保留字
 
-`REFRESH`、`DATABASE`、`METADATA`、`FROM`、`GOVERNANCE`、`CENTER`
+`FORCE`、`REFRESH`、`DATABASE`、`METADATA`
 
 ### 相关链接
 
-- [保留字](/cn/user-manual/shardingsphere-proxy/distsql/syntax/reserved-word/)
\ No newline at end of file
+- [保留字](/cn/user-manual/shardingsphere-proxy/distsql/syntax/reserved-word/)
diff --git 
a/docs/document/content/user-manual/shardingsphere-proxy/distsql/syntax/ral/refresh-database-metadata.en.md
 
b/docs/document/content/user-manual/shardingsphere-proxy/distsql/syntax/ral/refresh-database-metadata.en.md
index 0667aacbf57..274ebd7512e 100644
--- 
a/docs/document/content/user-manual/shardingsphere-proxy/distsql/syntax/ral/refresh-database-metadata.en.md
+++ 
b/docs/document/content/user-manual/shardingsphere-proxy/distsql/syntax/ral/refresh-database-metadata.en.md
@@ -5,15 +5,15 @@ weight = 9
 
 ### Description
 
-The `REFRESH DATABASE METADATA FROM GOVERNANCE CENTER` syntax is used to pull 
the latest configuration from the governance center and refresh the metadata of 
the local logic database.
+The `REFRESH DATABASE METADATA` syntax is used to refresh the metadata of the 
local logic database.
 
 ### Syntax
 
 {{< tabs >}}
 {{% tab name="Grammar" %}}
 ```sql
-RefreshDatabaseMetadataFromGovernanceCenter ::=
-  'REFRESH' 'DATABASE' 'METADATA' databaseName? 'FROM' 'GOVERNANCE' 'CENTER'
+RefreshDatabaseMetadata ::=
+  'FORCE'? 'REFRESH' 'DATABASE' 'METADATA' databaseName?
 
 databaseName ::=
   identifier
@@ -28,25 +28,31 @@ databaseName ::=
 
 - When `databaseName` is not specified, the default is to refresh all database 
metadata.
 
-- refresh table metadata need to use `DATABASE`. If `DATABASE` is not used, 
`No database selected` will be prompted.
+- When using `FORCE` to refresh metadata, the latest metadata will be obtained 
locally and written to the governance center. If without `FORCE`, it will be 
pulled from the governance center.
 
 ### Example
 
 - Refresh metadata for specified database
 
 ```sql
-REFRESH DATABASE METADATA sharding_db FROM GOVERNANCE CENTER;
+REFRESH DATABASE METADATA sharding_db;
 ```
 
 - Refresh all database metadata
 
 ```sql
-REFRESH DATABASE METADATA FROM GOVERNANCE CENTER;
+REFRESH DATABASE METADATA;
+```
+
+- Force refresh all database metadata
+
+```sql
+FORCE REFRESH DATABASE METADATA;
 ```
 
 ### Reserved word
 
-`REFRESH`, `DATABASE`, `METADATA`, `FROM`, `GOVERNANCE`, `CENTER`
+`FORCE`, `REFRESH`, `DATABASE`, `METADATA`
 
 ### Related links
 
diff --git 
a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/util/SystemSchemaUtils.java
 
b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/util/SystemSchemaUtils.java
index fb0776042a5..a63ba38dd0c 100644
--- 
a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/util/SystemSchemaUtils.java
+++ 
b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/util/SystemSchemaUtils.java
@@ -69,7 +69,7 @@ public final class SystemSchemaUtils {
     
     /**
      * Judge whether query is openGauss system catalog query or not.
-     * 
+     *
      * @param databaseType database type
      * @param projections projections
      * @return whether query is openGauss system catalog query or not
@@ -81,4 +81,18 @@ public final class SystemSchemaUtils {
         return 1 == projections.size() && projections.iterator().next() 
instanceof ExpressionProjectionSegment
                 && 
SYSTEM_CATALOG_QUERY_EXPRESSIONS.contains(((ExpressionProjectionSegment) 
projections.iterator().next()).getText().toLowerCase());
     }
+    
+    /**
+     * Judge schema is system schema or not.
+     *
+     * @param database database
+     * @return whether schema is system schema or not
+     */
+    public static boolean isSystemSchema(final ShardingSphereDatabase 
database) {
+        DialectDatabaseMetaData dialectDatabaseMetaData = new 
DatabaseTypeRegistry(database.getProtocolType()).getDialectDatabaseMetaData();
+        if (database.isComplete() && 
!dialectDatabaseMetaData.getDefaultSchema().isPresent()) {
+            return false;
+        }
+        return new 
SystemDatabase(database.getProtocolType()).getSystemSchemas().contains(database.getName());
+    }
 }
diff --git a/parser/distsql/engine/src/main/antlr4/imports/Keyword.g4 
b/parser/distsql/engine/src/main/antlr4/imports/Keyword.g4
index 29b1428edcb..a0c6844959c 100644
--- a/parser/distsql/engine/src/main/antlr4/imports/Keyword.g4
+++ b/parser/distsql/engine/src/main/antlr4/imports/Keyword.g4
@@ -51,6 +51,10 @@ SHOW
     : S H O W
     ;
 
+FOR
+    : F O R
+    ;
+
 FROM
     : F R O M
     ;
@@ -167,7 +171,7 @@ FALSE
     : F A L S E
     ;
 
-IF  
+IF
     : I F
     ;
 
@@ -366,3 +370,7 @@ GENERATE
 ALGORITHM
     : A L G O R I T H M
     ;
+
+FORCE
+    : F O R C E
+    ;
diff --git a/parser/distsql/engine/src/main/antlr4/imports/RALStatement.g4 
b/parser/distsql/engine/src/main/antlr4/imports/RALStatement.g4
index a6beedb0fd4..a74701033fd 100644
--- a/parser/distsql/engine/src/main/antlr4/imports/RALStatement.g4
+++ b/parser/distsql/engine/src/main/antlr4/imports/RALStatement.g4
@@ -48,7 +48,7 @@ showComputeNodes
     ;
 
 refreshDatabaseMetadata
-    : REFRESH DATABASE METADATA databaseName? FROM GOVERNANCE CENTER
+    : FORCE? REFRESH DATABASE METADATA databaseName?
     ;
 
 refreshTableMetadata
diff --git 
a/parser/distsql/engine/src/main/java/org/apache/shardingsphere/distsql/parser/core/kernel/KernelDistSQLStatementVisitor.java
 
b/parser/distsql/engine/src/main/java/org/apache/shardingsphere/distsql/parser/core/kernel/KernelDistSQLStatementVisitor.java
index f132ba3ab87..3529b732876 100644
--- 
a/parser/distsql/engine/src/main/java/org/apache/shardingsphere/distsql/parser/core/kernel/KernelDistSQLStatementVisitor.java
+++ 
b/parser/distsql/engine/src/main/java/org/apache/shardingsphere/distsql/parser/core/kernel/KernelDistSQLStatementVisitor.java
@@ -255,7 +255,7 @@ public final class KernelDistSQLStatementVisitor extends 
KernelDistSQLStatementB
     
     @Override
     public ASTNode visitRefreshDatabaseMetadata(final 
RefreshDatabaseMetadataContext ctx) {
-        return new RefreshDatabaseMetaDataStatement(null == ctx.databaseName() 
? null : getIdentifierValue(ctx.databaseName()));
+        return new RefreshDatabaseMetaDataStatement(null == ctx.databaseName() 
? null : getIdentifierValue(ctx.databaseName()), null != ctx.FORCE());
     }
     
     @Override
diff --git 
a/parser/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/statement/ral/updatable/RefreshDatabaseMetaDataStatement.java
 
b/parser/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/statement/ral/updatable/RefreshDatabaseMetaDataStatement.java
index fd6c325fdc5..02883d3ea04 100644
--- 
a/parser/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/statement/ral/updatable/RefreshDatabaseMetaDataStatement.java
+++ 
b/parser/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/statement/ral/updatable/RefreshDatabaseMetaDataStatement.java
@@ -32,6 +32,8 @@ public final class RefreshDatabaseMetaDataStatement extends 
UpdatableRALStatemen
     
     private final String databaseName;
     
+    private final boolean force;
+    
     /**
      * Get database name.
      *
diff --git 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/RefreshDatabaseMetaDataUpdater.java
 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/RefreshDatabaseMetaDataUpdater.java
index 7a2bb8e7969..498ad1f4d5a 100644
--- 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/RefreshDatabaseMetaDataUpdater.java
+++ 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/RefreshDatabaseMetaDataUpdater.java
@@ -18,31 +18,47 @@
 package org.apache.shardingsphere.proxy.backend.handler.distsql.ral.updatable;
 
 import com.google.common.base.Strings;
-import org.apache.shardingsphere.distsql.handler.ral.update.RALUpdater;
 import 
org.apache.shardingsphere.distsql.statement.ral.updatable.RefreshDatabaseMetaDataStatement;
 import 
org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions;
 import 
org.apache.shardingsphere.infra.exception.dialect.exception.syntax.database.NoDatabaseSelectedException;
 import 
org.apache.shardingsphere.infra.exception.dialect.exception.syntax.database.UnknownDatabaseException;
+import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.util.SystemSchemaUtils;
 import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
+import 
org.apache.shardingsphere.proxy.backend.handler.distsql.ral.updatable.updater.ConnectionSessionRequiredRALUpdater;
+import org.apache.shardingsphere.proxy.backend.session.ConnectionSession;
 
+import java.sql.SQLException;
+import java.util.Map;
 import java.util.Optional;
 
 /**
  * Refresh database meta data updater.
  */
-public final class RefreshDatabaseMetaDataUpdater implements 
RALUpdater<RefreshDatabaseMetaDataStatement> {
+public final class RefreshDatabaseMetaDataUpdater implements 
ConnectionSessionRequiredRALUpdater<RefreshDatabaseMetaDataStatement> {
     
     @Override
-    public void executeUpdate(final String databaseName, final 
RefreshDatabaseMetaDataStatement sqlStatement) {
-        
ProxyContext.getInstance().getContextManager().refreshDatabaseMetaData(getDatabaseName(databaseName,
 sqlStatement), true);
+    public void executeUpdate(final ConnectionSession connectionSession, final 
RefreshDatabaseMetaDataStatement sqlStatement) throws SQLException {
+        Optional<String> toBeRefreshedDatabaseName = 
sqlStatement.getDatabaseName();
+        if (toBeRefreshedDatabaseName.isPresent()) {
+            String databaseName = toBeRefreshedDatabaseName.get();
+            
ShardingSpherePreconditions.checkState(!Strings.isNullOrEmpty(databaseName), 
NoDatabaseSelectedException::new);
+            
ShardingSpherePreconditions.checkState(ProxyContext.getInstance().databaseExists(databaseName),
 () -> new UnknownDatabaseException(databaseName));
+            reloadDatabaseMetaData(databaseName, sqlStatement.isForce());
+            return;
+        }
+        Map<String, ShardingSphereDatabase> databases = 
ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaData().getDatabases();
+        databases.values().forEach(each -> checkAndRefresh(each, 
sqlStatement.isForce()));
     }
     
-    private String getDatabaseName(final String databaseName, final 
RefreshDatabaseMetaDataStatement sqlStatement) {
-        Optional<String> toBeRefreshedDatabaseName = 
sqlStatement.getDatabaseName();
-        String result = toBeRefreshedDatabaseName.orElse(databaseName);
-        ShardingSpherePreconditions.checkState(!Strings.isNullOrEmpty(result), 
NoDatabaseSelectedException::new);
-        
ShardingSpherePreconditions.checkState(ProxyContext.getInstance().databaseExists(result),
 () -> new UnknownDatabaseException(result));
-        return result;
+    private void checkAndRefresh(final ShardingSphereDatabase each, final 
boolean force) {
+        if (!SystemSchemaUtils.isSystemSchema(each)) {
+            reloadDatabaseMetaData(each.getName(), force);
+        }
+    }
+    
+    private void reloadDatabaseMetaData(final String databaseName, final 
boolean force) {
+        
ProxyContext.getInstance().getContextManager().refreshDatabaseMetaData(databaseName,
 force);
     }
     
     @Override
diff --git 
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/RefreshDatabaseMetaDataUpdaterTest.java
 
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/RefreshDatabaseMetaDataUpdaterTest.java
index e36bf0d9f13..7852a12648c 100644
--- 
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/RefreshDatabaseMetaDataUpdaterTest.java
+++ 
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/RefreshDatabaseMetaDataUpdaterTest.java
@@ -17,16 +17,18 @@
 
 package org.apache.shardingsphere.proxy.backend.handler.distsql.ral.updatable;
 
-import 
org.apache.shardingsphere.infra.exception.dialect.exception.syntax.database.UnknownDatabaseException;
 import 
org.apache.shardingsphere.distsql.statement.ral.updatable.RefreshDatabaseMetaDataStatement;
 import org.apache.shardingsphere.mode.manager.ContextManager;
 import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
+import org.apache.shardingsphere.proxy.backend.session.ConnectionSession;
 import org.apache.shardingsphere.test.mock.AutoMockExtension;
 import org.apache.shardingsphere.test.mock.StaticMockSettings;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.Mock;
+
+import java.sql.SQLException;
 
-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;
@@ -35,10 +37,13 @@ import static org.mockito.Mockito.when;
 @StaticMockSettings(ProxyContext.class)
 class RefreshDatabaseMetaDataUpdaterTest {
     
+    @Mock
+    private ConnectionSession connectionSession;
+    
     @Test
-    void assertExecuteWithNoDatabase() {
+    void assertExecuteWithNoDatabase() throws SQLException {
         RefreshDatabaseMetaDataUpdater updater = new 
RefreshDatabaseMetaDataUpdater();
         
when(ProxyContext.getInstance().getContextManager()).thenReturn(mock(ContextManager.class,
 RETURNS_DEEP_STUBS));
-        assertThrows(UnknownDatabaseException.class, () -> 
updater.executeUpdate("foo_db", mock(RefreshDatabaseMetaDataStatement.class)));
+        updater.executeUpdate(connectionSession, 
mock(RefreshDatabaseMetaDataStatement.class));
     }
 }
diff --git 
a/test/e2e/sql/src/test/resources/cases/ral/ral-integration-refresh.xml 
b/test/e2e/sql/src/test/resources/cases/ral/ral-integration-refresh.xml
index a148ebdfd8a..b7c9731c3af 100644
--- a/test/e2e/sql/src/test/resources/cases/ral/ral-integration-refresh.xml
+++ b/test/e2e/sql/src/test/resources/cases/ral/ral-integration-refresh.xml
@@ -17,7 +17,7 @@
   -->
 
 <integration-test-cases>
-    <test-case sql="REFRESH DATABASE METADATA FROM GOVERNANCE CENTER" 
db-types="MySQL">
+    <test-case sql="REFRESH DATABASE METADATA" db-types="MySQL">
         <assertion expected-data-file="show_sharding_table_rule.xml">
             <assertion-sql sql="SHOW SHARDING TABLE RULES" />
         </assertion>

Reply via email to