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

terrymanu 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 303c378e032 Fix dialect statistics appender resolution (#39322)
303c378e032 is described below

commit 303c378e032c25157c01aeb84ef89941d2002d7b
Author: Liang Zhang <[email protected]>
AuthorDate: Mon Aug 3 20:46:09 2026 +0800

    Fix dialect statistics appender resolution (#39322)
---
 infra/common/pom.xml                               |  6 ++
 .../builder/ShardingSphereStatisticsFactory.java   | 14 +----
 .../dialect/OpenGaussStatisticsAppender.java       | 40 +++++++++++++
 ...ta.statistics.builder.DialectStatisticsAppender |  1 +
 .../ShardingSphereStatisticsFactoryTest.java       | 32 ++++++++--
 .../dialect/OpenGaussStatisticsAppenderTest.java   | 69 ++++++++++++++++++++++
 6 files changed, 144 insertions(+), 18 deletions(-)

diff --git a/infra/common/pom.xml b/infra/common/pom.xml
index 76f6c30efbb..d2bef8e0a00 100644
--- a/infra/common/pom.xml
+++ b/infra/common/pom.xml
@@ -91,6 +91,12 @@
             <version>${project.version}</version>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>org.apache.shardingsphere</groupId>
+            
<artifactId>shardingsphere-database-connector-sqlserver</artifactId>
+            <version>${project.version}</version>
+            <scope>test</scope>
+        </dependency>
         
         <dependency>
             <groupId>com.alibaba</groupId>
diff --git 
a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/statistics/builder/ShardingSphereStatisticsFactory.java
 
b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/statistics/builder/ShardingSphereStatisticsFactory.java
index 6c7a8815170..9737524668c 100644
--- 
a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/statistics/builder/ShardingSphereStatisticsFactory.java
+++ 
b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/statistics/builder/ShardingSphereStatisticsFactory.java
@@ -20,17 +20,13 @@ package 
org.apache.shardingsphere.infra.metadata.statistics.builder;
 import com.cedarsoftware.util.CaseInsensitiveSet;
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
-import 
org.apache.shardingsphere.database.connector.core.metadata.database.metadata.DialectDatabaseMetaData;
 import 
org.apache.shardingsphere.database.connector.core.spi.DatabaseTypedSPILoader;
-import org.apache.shardingsphere.database.connector.core.type.DatabaseType;
-import 
org.apache.shardingsphere.database.connector.core.type.DatabaseTypeRegistry;
 import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import org.apache.shardingsphere.infra.metadata.statistics.DatabaseStatistics;
 import org.apache.shardingsphere.infra.metadata.statistics.SchemaStatistics;
 import 
org.apache.shardingsphere.infra.metadata.statistics.ShardingSphereStatistics;
 import org.apache.shardingsphere.infra.metadata.statistics.TableStatistics;
-import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
 
 import java.util.Collection;
 import java.util.Map.Entry;
@@ -55,7 +51,8 @@ public final class ShardingSphereStatisticsFactory {
         if (metaData.getAllDatabases().isEmpty()) {
             return result;
         }
-        Optional<DialectStatisticsAppender> dialectStatisticsAppender = 
DatabaseTypedSPILoader.findService(DialectStatisticsAppender.class, 
getDatabaseType(metaData));
+        Optional<DialectStatisticsAppender> dialectStatisticsAppender = 
DatabaseTypedSPILoader.findService(
+                DialectStatisticsAppender.class, 
metaData.getAllDatabases().iterator().next().getProtocolType());
         Collection<ShardingSphereDatabase> unloadedDatabases = 
metaData.getAllDatabases().stream()
                 .filter(each -> 
!loadedStatistics.containsDatabaseStatistics(each.getName())).collect(Collectors.toList());
         for (ShardingSphereDatabase each : unloadedDatabases) {
@@ -70,13 +67,6 @@ public final class ShardingSphereStatisticsFactory {
         return result;
     }
     
-    private static DatabaseType getDatabaseType(final ShardingSphereMetaData 
metaData) {
-        DatabaseType protocolType = 
metaData.getAllDatabases().iterator().next().getProtocolType();
-        DialectDatabaseMetaData dialectDatabaseMetaData = new 
DatabaseTypeRegistry(protocolType).getDialectDatabaseMetaData();
-        // TODO can `protocolType instanceof SchemaSupportedDatabaseType ? 
"PostgreSQL" : protocolType.getType()` replace to trunk database type?
-        return 
dialectDatabaseMetaData.getSchemaOption().getDefaultSchema().isPresent() ? 
TypedSPILoader.getService(DatabaseType.class, "PostgreSQL") : protocolType;
-    }
-    
     private static void fillDefaultStatistics(final ShardingSphereMetaData 
metaData, final ShardingSphereStatistics statistics) {
         for (ShardingSphereDatabase database : metaData.getAllDatabases()) {
             DatabaseStatistics defaultDatabaseStatistics = new 
ShardingSphereDefaultStatisticsBuilder().build(database);
diff --git 
a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/statistics/builder/dialect/OpenGaussStatisticsAppender.java
 
b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/statistics/builder/dialect/OpenGaussStatisticsAppender.java
new file mode 100644
index 00000000000..6782a7c02a7
--- /dev/null
+++ 
b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/statistics/builder/dialect/OpenGaussStatisticsAppender.java
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.infra.metadata.statistics.builder.dialect;
+
+import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
+import org.apache.shardingsphere.infra.metadata.statistics.DatabaseStatistics;
+import 
org.apache.shardingsphere.infra.metadata.statistics.builder.DialectStatisticsAppender;
+
+/**
+ * Statistics appender for openGauss.
+ */
+public final class OpenGaussStatisticsAppender implements 
DialectStatisticsAppender {
+    
+    private final PostgreSQLStatisticsAppender delegate = new 
PostgreSQLStatisticsAppender();
+    
+    @Override
+    public void append(final DatabaseStatistics databaseStatistics, final 
ShardingSphereDatabase database) {
+        delegate.append(databaseStatistics, database);
+    }
+    
+    @Override
+    public String getDatabaseType() {
+        return "openGauss";
+    }
+}
diff --git 
a/infra/common/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.statistics.builder.DialectStatisticsAppender
 
b/infra/common/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.statistics.builder.DialectStatisticsAppender
index 54f21e3a806..8e6ad825b86 100644
--- 
a/infra/common/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.statistics.builder.DialectStatisticsAppender
+++ 
b/infra/common/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.statistics.builder.DialectStatisticsAppender
@@ -16,3 +16,4 @@
 #
 
 
org.apache.shardingsphere.infra.metadata.statistics.builder.dialect.PostgreSQLStatisticsAppender
+org.apache.shardingsphere.infra.metadata.statistics.builder.dialect.OpenGaussStatisticsAppender
diff --git 
a/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/statistics/builder/ShardingSphereStatisticsFactoryTest.java
 
b/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/statistics/builder/ShardingSphereStatisticsFactoryTest.java
index 5b95a137e46..274abbdfcaf 100644
--- 
a/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/statistics/builder/ShardingSphereStatisticsFactoryTest.java
+++ 
b/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/statistics/builder/ShardingSphereStatisticsFactoryTest.java
@@ -37,6 +37,7 @@ import static org.hamcrest.Matchers.is;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
+import static org.mockito.Mockito.anyString;
 import static org.mockito.Mockito.lenient;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
@@ -46,8 +47,12 @@ class ShardingSphereStatisticsFactoryTest {
     
     private final DatabaseType postgreSQLDatabaseType = 
TypedSPILoader.getService(DatabaseType.class, "PostgreSQL");
     
+    private final DatabaseType openGaussDatabaseType = 
TypedSPILoader.getService(DatabaseType.class, "openGauss");
+    
     private final DatabaseType h2DatabaseType = 
TypedSPILoader.getService(DatabaseType.class, "H2");
     
+    private final DatabaseType sqlServerDatabaseType = 
TypedSPILoader.getService(DatabaseType.class, "SQLServer");
+    
     @Mock
     private ShardingSphereMetaData metaData;
     
@@ -62,7 +67,16 @@ class ShardingSphereStatisticsFactoryTest {
     
     @Test
     void assertCreateWithPostgreSQLDatabaseAndDialectAppender() {
-        ShardingSphereDatabase database = 
mockPostgreSQLDatabaseWithPgCatalogSchema();
+        ShardingSphereDatabase database = 
mockDatabaseWithPgCatalogSchema(postgreSQLDatabaseType);
+        
when(metaData.getAllDatabases()).thenReturn(Collections.singleton(database));
+        ShardingSphereStatistics actual = 
ShardingSphereStatisticsFactory.create(metaData, statistics);
+        assertThat(actual.getDatabaseStatisticsMap().size(), is(1));
+        assertTrue(actual.getDatabaseStatisticsMap().containsKey("foo_db"));
+    }
+    
+    @Test
+    void assertCreateWithOpenGaussDatabaseAndDialectAppender() {
+        ShardingSphereDatabase database = 
mockDatabaseWithPgCatalogSchema(openGaussDatabaseType);
         
when(metaData.getAllDatabases()).thenReturn(Collections.singleton(database));
         ShardingSphereStatistics actual = 
ShardingSphereStatisticsFactory.create(metaData, statistics);
         assertThat(actual.getDatabaseStatisticsMap().size(), is(1));
@@ -79,12 +93,19 @@ class ShardingSphereStatisticsFactoryTest {
     }
     
     @Test
-    void assertCreateWithH2DatabaseNoDefaultSchema() {
+    void assertCreateWithH2DatabaseNoDialectAppender() {
         ShardingSphereDatabase database = mockH2Database();
         
when(metaData.getAllDatabases()).thenReturn(Collections.singleton(database));
         assertTrue(ShardingSphereStatisticsFactory.create(metaData, 
statistics).getDatabaseStatisticsMap().isEmpty());
     }
     
+    @Test
+    void assertCreateWithSQLServerDatabaseNoDialectAppender() {
+        ShardingSphereDatabase database = 
mockDatabaseWithPgCatalogSchema(sqlServerDatabaseType);
+        
when(metaData.getAllDatabases()).thenReturn(Collections.singleton(database));
+        assertTrue(ShardingSphereStatisticsFactory.create(metaData, 
statistics).getDatabaseStatisticsMap().isEmpty());
+    }
+    
     @Test
     void assertCreateWithStatisticsMerging() {
         ShardingSphereDatabase database = 
mockPostgreSQLDatabaseWithShardingSphereSchema();
@@ -137,14 +158,13 @@ class ShardingSphereStatisticsFactoryTest {
         assertThat(actualSchemaStatistics.getTableStatisticsMap().size(), 
is(1));
     }
     
-    private ShardingSphereDatabase mockPostgreSQLDatabaseWithPgCatalogSchema() 
{
+    private ShardingSphereDatabase mockDatabaseWithPgCatalogSchema(final 
DatabaseType protocolType) {
         ShardingSphereDatabase result = mock(ShardingSphereDatabase.class, 
RETURNS_DEEP_STUBS);
         when(result.getName()).thenReturn("foo_db");
-        when(result.getProtocolType()).thenReturn(postgreSQLDatabaseType);
+        when(result.getProtocolType()).thenReturn(protocolType);
         ShardingSphereSchema schema = new ShardingSphereSchema("pg_catalog", 
mock(DatabaseType.class));
         when(result.getAllSchemas()).thenReturn(Collections.singleton(schema));
-        when(result.containsSchema("pg_catalog")).thenReturn(true);
-        when(result.getSchema("pg_catalog")).thenReturn(schema);
+        when(result.containsSchema(anyString())).thenAnswer(invocation -> 
"pg_catalog".equals(invocation.getArgument(0)));
         return result;
     }
     
diff --git 
a/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/statistics/builder/dialect/OpenGaussStatisticsAppenderTest.java
 
b/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/statistics/builder/dialect/OpenGaussStatisticsAppenderTest.java
new file mode 100644
index 00000000000..0b397ade4ff
--- /dev/null
+++ 
b/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/statistics/builder/dialect/OpenGaussStatisticsAppenderTest.java
@@ -0,0 +1,69 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.infra.metadata.statistics.builder.dialect;
+
+import 
org.apache.shardingsphere.database.connector.core.spi.DatabaseTypedSPILoader;
+import org.apache.shardingsphere.database.connector.core.type.DatabaseType;
+import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
+import org.apache.shardingsphere.infra.metadata.statistics.DatabaseStatistics;
+import 
org.apache.shardingsphere.infra.metadata.statistics.builder.DialectStatisticsAppender;
+import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.Mock;
+import org.mockito.internal.configuration.plugins.Plugins;
+import org.mockito.junit.jupiter.MockitoExtension;
+
+import static org.mockito.Mockito.verify;
+
+@ExtendWith(MockitoExtension.class)
+class OpenGaussStatisticsAppenderTest {
+    
+    private final DialectStatisticsAppender appender = 
DatabaseTypedSPILoader.getService(
+            DialectStatisticsAppender.class, 
TypedSPILoader.getService(DatabaseType.class, "openGauss"));
+    
+    @Mock
+    private PostgreSQLStatisticsAppender delegate;
+    
+    private PostgreSQLStatisticsAppender originalDelegate;
+    
+    @Mock
+    private DatabaseStatistics databaseStatistics;
+    
+    @Mock
+    private ShardingSphereDatabase database;
+    
+    @BeforeEach
+    void setUp() throws NoSuchFieldException, IllegalAccessException {
+        originalDelegate = (PostgreSQLStatisticsAppender) 
Plugins.getMemberAccessor().get(OpenGaussStatisticsAppender.class.getDeclaredField("delegate"),
 appender);
+        
Plugins.getMemberAccessor().set(OpenGaussStatisticsAppender.class.getDeclaredField("delegate"),
 appender, delegate);
+    }
+    
+    @AfterEach
+    void tearDown() throws NoSuchFieldException, IllegalAccessException {
+        
Plugins.getMemberAccessor().set(OpenGaussStatisticsAppender.class.getDeclaredField("delegate"),
 appender, originalDelegate);
+    }
+    
+    @Test
+    void assertAppend() {
+        appender.append(databaseStatistics, database);
+        verify(delegate).append(databaseStatistics, database);
+    }
+}

Reply via email to