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" />