You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by ji...@apache.org on 2022/05/30 10:29:51 UTC
[shardingsphere] branch master updated: Support Postgres schema in DistSQL REFRESH TABLE METADATA FROM resource ds_0 SCHEMA public. (#18066)
This is an automated email from the ASF dual-hosted git repository.
jianglongtao 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 ee448e58747 Support Postgres schema in DistSQL REFRESH TABLE METADATA FROM resource ds_0 SCHEMA public. (#18066)
ee448e58747 is described below
commit ee448e58747a471f80e6d985d8126cc471ba43d4
Author: zhaojinchao <zh...@apache.org>
AuthorDate: Mon May 30 18:29:42 2022 +0800
Support Postgres schema in DistSQL REFRESH TABLE METADATA FROM resource ds_0 SCHEMA public. (#18066)
* Add refresh schema all tables feature
* Change syntax
* Adjust
---
.../src/main/antlr4/imports/RALStatement.g4 | 2 +-
.../core/common/CommonDistSQLStatementVisitor.java | 2 +-
.../mode/manager/ContextManager.java | 33 ++++++++++++++++++++--
.../updatable/RefreshTableMetadataHandler.java | 6 +++-
.../src/main/resources/case/ral/common.xml | 3 +-
.../main/resources/sql/supported/ral/common.xml | 3 +-
6 files changed, 42 insertions(+), 7 deletions(-)
diff --git a/shardingsphere-distsql/shardingsphere-distsql-parser/src/main/antlr4/imports/RALStatement.g4 b/shardingsphere-distsql/shardingsphere-distsql-parser/src/main/antlr4/imports/RALStatement.g4
index df7021d7402..cab7f269bba 100644
--- a/shardingsphere-distsql/shardingsphere-distsql-parser/src/main/antlr4/imports/RALStatement.g4
+++ b/shardingsphere-distsql/shardingsphere-distsql-parser/src/main/antlr4/imports/RALStatement.g4
@@ -184,7 +184,7 @@ instanceId
;
refreshScope
- : tableName fromSegment?
+ : tableName? fromSegment?
;
fromSegment
diff --git a/shardingsphere-distsql/shardingsphere-distsql-parser/src/main/java/org/apache/shardingsphere/distsql/parser/core/common/CommonDistSQLStatementVisitor.java b/shardingsphere-distsql/shardingsphere-distsql-parser/src/main/java/org/apache/shardingsphere/distsql/parser/core/common/CommonDistSQLStatementVisitor.java
index 7f339d9248a..2e69e7c4695 100644
--- a/shardingsphere-distsql/shardingsphere-distsql-parser/src/main/java/org/apache/shardingsphere/distsql/parser/core/common/CommonDistSQLStatementVisitor.java
+++ b/shardingsphere-distsql/shardingsphere-distsql-parser/src/main/java/org/apache/shardingsphere/distsql/parser/core/common/CommonDistSQLStatementVisitor.java
@@ -308,9 +308,9 @@ public final class CommonDistSQLStatementVisitor extends CommonDistSQLStatementB
if (null == ctx.refreshScope()) {
return new RefreshTableMetadataStatement();
}
- String tableName = getIdentifierValue(ctx.refreshScope().tableName());
String resourceName = null;
String schemaName = null;
+ String tableName = getIdentifierValue(ctx.refreshScope().tableName());
if (null != ctx.refreshScope().fromSegment()) {
FromSegmentContext fromSegment = ctx.refreshScope().fromSegment();
resourceName = getIdentifierValue(fromSegment.resourceName());
diff --git a/shardingsphere-mode/shardingsphere-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java b/shardingsphere-mode/shardingsphere-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java
index 45388647e1a..e60bbcd974a 100644
--- a/shardingsphere-mode/shardingsphere-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java
+++ b/shardingsphere-mode/shardingsphere-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java
@@ -425,10 +425,10 @@ public final class ContextManager implements AutoCloseable {
*
* @param databaseName database name
* @param schemaName schema name
- * @param tableName logic table name
* @param dataSourceName data source name
+ * @param tableName logic table name
*/
- public void reloadMetaData(final String databaseName, final String schemaName, final String tableName, final String dataSourceName) {
+ public void reloadMetaData(final String databaseName, final String schemaName, final String dataSourceName, final String tableName) {
try {
ShardingSphereDatabase database = metaDataContexts.getMetaData().getDatabases().get(databaseName);
GenericSchemaBuilderMaterials materials = new GenericSchemaBuilderMaterials(database.getProtocolType(), database.getResource().getDatabaseType(),
@@ -440,6 +440,26 @@ public final class ContextManager implements AutoCloseable {
}
}
+ /**
+ * Reload table meta data.
+ *
+ * @param databaseName database name
+ * @param schemaName schema name
+ * @param dataSourceName data source name
+ */
+ public void reloadSchemaMetaData(final String databaseName, final String schemaName, final String dataSourceName) {
+ try {
+ ShardingSphereDatabase database = metaDataContexts.getMetaData().getDatabases().get(databaseName);
+ refreshRules(databaseName, database);
+ GenericSchemaBuilderMaterials materials = new GenericSchemaBuilderMaterials(database.getProtocolType(), database.getResource().getDatabaseType(),
+ Collections.singletonMap(dataSourceName, database.getResource().getDataSources().get(dataSourceName)),
+ database.getRuleMetaData().getRules(), metaDataContexts.getMetaData().getProps(), schemaName);
+ loadTableMetaData(databaseName, schemaName, materials);
+ } catch (final SQLException ex) {
+ log.error("Reload meta data of database:{} schema:{} with data source:{} failed", databaseName, schemaName, dataSourceName, ex);
+ }
+ }
+
private void deleteSchemas(final String databaseName, final Map<String, ShardingSphereSchema> actualSchemas) {
Map<String, ShardingSphereSchema> originalSchemas = metaDataContexts.getMetaData().getDatabases().get(databaseName).getSchemas();
if (originalSchemas.isEmpty()) {
@@ -452,6 +472,15 @@ public final class ContextManager implements AutoCloseable {
});
}
+ private void loadTableMetaData(final String databaseName, final String schemaName, final GenericSchemaBuilderMaterials materials) throws SQLException {
+ Map<String, ShardingSphereSchema> schemaMap = GenericSchemaBuilder.build(materials);
+ if (schemaMap.containsKey(schemaName)) {
+ metaDataContexts.getMetaData().getDatabases().get(databaseName).getSchemas().put(schemaName, schemaMap.get(schemaName));
+ metaDataContexts.getPersistService().ifPresent(optional -> optional.getSchemaMetaDataService()
+ .persistMetaData(databaseName, schemaName, metaDataContexts.getMetaData().getDatabases().get(databaseName).getSchemas().get(schemaName)));
+ }
+ }
+
private void loadTableMetaData(final String databaseName, final String schemaName, final String tableName, final GenericSchemaBuilderMaterials materials) throws SQLException {
ShardingSphereSchema schema = GenericSchemaBuilder.build(Collections.singletonList(tableName), materials).getOrDefault(schemaName, new ShardingSphereSchema());
if (schema.getTables().containsKey(tableName)) {
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/ral/common/updatable/RefreshTableMetadataHandler.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/ral/common/updatable/RefreshTableMetadataHandler.java
index 0825cfc8f42..af3731a1c9b 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/ral/common/updatable/RefreshTableMetadataHandler.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/ral/common/updatable/RefreshTableMetadataHandler.java
@@ -47,7 +47,11 @@ public final class RefreshTableMetadataHandler extends UpdatableRALBackendHandle
String databaseName = getDatabaseName();
String schemaName = getSchemaName(sqlStatement, databaseName);
if (sqlStatement.getResourceName().isPresent()) {
- contextManager.reloadMetaData(databaseName, schemaName, sqlStatement.getTableName().get(), sqlStatement.getResourceName().get());
+ if (sqlStatement.getTableName().isPresent()) {
+ contextManager.reloadMetaData(databaseName, schemaName, sqlStatement.getResourceName().get(), sqlStatement.getTableName().get());
+ } else {
+ contextManager.reloadSchemaMetaData(databaseName, schemaName, sqlStatement.getResourceName().get());
+ }
return;
}
if (sqlStatement.getTableName().isPresent()) {
diff --git a/shardingsphere-test/shardingsphere-parser-test/src/main/resources/case/ral/common.xml b/shardingsphere-test/shardingsphere-parser-test/src/main/resources/case/ral/common.xml
index 762f07fa8a6..8379684f454 100644
--- a/shardingsphere-test/shardingsphere-parser-test/src/main/resources/case/ral/common.xml
+++ b/shardingsphere-test/shardingsphere-parser-test/src/main/resources/case/ral/common.xml
@@ -39,7 +39,8 @@
<refresh-table-metadata sql-case-id="refresh-table-metadata" />
<refresh-table-metadata sql-case-id="refresh-table-metadata-with-table-name" table-name="t_order" />
<refresh-table-metadata sql-case-id="refresh-table-metadata-with-resource" table-name="t_order" resource-name="ds_0" />
- <refresh-table-metadata sql-case-id="refresh-table-metadata-with-schema" table-name="t_order" resource-name="ds_0" schema-name="public" />
+ <refresh-table-metadata sql-case-id="refresh-table-metadata-with-schema" resource-name="ds_0" schema-name="public" />
+ <refresh-table-metadata sql-case-id="refresh-table-metadata-table-with-schema" table-name="t_order" resource-name="ds_0" schema-name="public" />
<show-authority-rule sql-case-id="show-authority-rule" />
<show-transaction-rule sql-case-id="show-transaction-rule" />
<show-sql-parser-rule sql-case-id="show-sql-parser-rule" />
diff --git a/shardingsphere-test/shardingsphere-parser-test/src/main/resources/sql/supported/ral/common.xml b/shardingsphere-test/shardingsphere-parser-test/src/main/resources/sql/supported/ral/common.xml
index 9c4e568b2b9..ce47cbea1ce 100644
--- a/shardingsphere-test/shardingsphere-parser-test/src/main/resources/sql/supported/ral/common.xml
+++ b/shardingsphere-test/shardingsphere-parser-test/src/main/resources/sql/supported/ral/common.xml
@@ -36,7 +36,8 @@
<distsql-case id="refresh-table-metadata" value="REFRESH TABLE METADATA" />
<distsql-case id="refresh-table-metadata-with-table-name" value="REFRESH TABLE METADATA t_order" />
<distsql-case id="refresh-table-metadata-with-resource" value="REFRESH TABLE METADATA t_order FROM RESOURCE ds_0" />
- <distsql-case id="refresh-table-metadata-with-schema" value="REFRESH TABLE METADATA t_order FROM RESOURCE ds_0 SCHEMA public" />
+ <distsql-case id="refresh-table-metadata-with-schema" value="REFRESH TABLE METADATA FROM RESOURCE ds_0 SCHEMA public" />
+ <distsql-case id="refresh-table-metadata-table-with-schema" value="REFRESH TABLE METADATA t_order FROM RESOURCE ds_0 SCHEMA public" />
<distsql-case id="show-authority-rule" value="SHOW AUTHORITY RULE" />
<distsql-case id="show-transaction-rule" value="SHOW TRANSACTION RULE" />
<distsql-case id="show-sql-parser-rule" value="SHOW SQL_PARSER RULE" />