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>