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

duanzhengqiang 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 f4b4af4  Remove useless call for configure() in 
ShardingSphereContainer (#15370)
f4b4af4 is described below

commit f4b4af4cdd7a69ee4f2487f46ad901b972242e7e
Author: Liang Zhang <[email protected]>
AuthorDate: Sat Feb 12 10:08:03 2022 +0800

    Remove useless call for configure() in ShardingSphereContainer (#15370)
    
    * Refactor ShardingSphereJDBCContainer
    
    * Refactor ShardingSphereJDBCContainer
    
    * Refactor H2Container
    
    * Remove useless call for configure() in ShardingSphereContainer
    
    * Refactor ShardingSphereContainer
    
    * Fix todo for PostgreSQLContainer
    
    * Remove StorageContainer.getDriverClassName()
    
    * Refactor H2Container
    
    * Remove StorageContainer.getUrl()
    
    * For checkstyle
    
    * Remove ParameterizedArray dependency on ShardingSphereContainer
    
    * refactor StorageContainer's constructor
    
    * Add StorageContainer.getPrimaryKeyColumnName()
    
    * Refactor StorageContainer
    
    * Refactor AdapterContainer
    
    * Refactor DataSourceEnvironment
    
    * Refactor StorageContainer
    
    * Fix checkstyle
---
 .../test/integration/engine/dml/BaseDMLIT.java     | 27 ++--------
 .../integration/env/DataSourceEnvironment.java     | 20 ++++----
 .../container/atomic/ShardingSphereContainer.java  | 12 ++---
 .../container/atomic/adapter/AdapterContainer.java |  9 ++--
 .../atomic/adapter/AdapterContainerFactory.java    | 16 +++---
 .../adapter/impl/ShardingSphereJDBCContainer.java  | 35 +++++++------
 .../adapter/impl/ShardingSphereProxyContainer.java | 25 ++++++----
 .../atomic/governance/ZookeeperContainer.java      |  5 +-
 .../container/atomic/storage/StorageContainer.java | 35 +++++++------
 .../atomic/storage/StorageContainerFactory.java    | 17 ++++---
 .../container/atomic/storage/impl/H2Container.java | 39 +++++++--------
 .../atomic/storage/impl/MySQLContainer.java        | 27 +++++-----
 .../atomic/storage/impl/PostgreSQLContainer.java   | 57 +++++++++++++---------
 .../compose/mode/ClusterComposedContainer.java     | 14 ++++--
 .../compose/mode/MemoryComposedContainer.java      |  6 ++-
 15 files changed, 172 insertions(+), 172 deletions(-)

diff --git 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/dml/BaseDMLIT.java
 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/dml/BaseDMLIT.java
index c48966b..7503349 100644
--- 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/dml/BaseDMLIT.java
+++ 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/dml/BaseDMLIT.java
@@ -17,7 +17,6 @@
 
 package org.apache.shardingsphere.test.integration.engine.dml;
 
-import 
org.apache.shardingsphere.infra.database.type.dialect.PostgreSQLDatabaseType;
 import org.apache.shardingsphere.infra.datanode.DataNode;
 import org.apache.shardingsphere.sharding.support.InlineExpressionParser;
 import 
org.apache.shardingsphere.test.integration.cases.dataset.metadata.DataSetColumn;
@@ -35,11 +34,11 @@ import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.ResultSetMetaData;
 import java.sql.SQLException;
-import java.sql.Statement;
 import java.sql.Types;
 import java.text.SimpleDateFormat;
 import java.util.Collection;
 import java.util.List;
+import java.util.Optional;
 
 import static org.hamcrest.CoreMatchers.is;
 import static org.junit.Assert.assertThat;
@@ -92,27 +91,9 @@ public abstract class BaseDMLIT extends SingleITCase {
     }
     
     private String generateFetchActualDataSQL(final DataNode dataNode) throws 
SQLException {
-        if (getStorageContainer().getDatabaseType() instanceof 
PostgreSQLDatabaseType) {
-            String primaryKeyColumnName = 
getPrimaryKeyColumnNameForPostgreSQL(dataNode);
-            return String.format("SELECT * FROM %s ORDER BY %s ASC", 
dataNode.getTableName(), primaryKeyColumnName);
-        }
-        return String.format("SELECT * FROM %s", dataNode.getTableName());
-    }
-    
-    private String getPrimaryKeyColumnNameForPostgreSQL(final DataNode 
dataNode) throws SQLException {
-        String sql = String.format("SELECT a.attname, format_type(a.atttypid, 
a.atttypmod) AS data_type "
-                + "FROM pg_index i JOIN pg_attribute a ON a.attrelid = 
i.indrelid AND a.attnum = ANY(i.indkey) WHERE i.indrelid = '%s'::regclass AND 
i.indisprimary", dataNode.getTableName());
-        DataSource dataSource = getComposedContainer() instanceof 
ClusterComposedContainer
-                ? getAnotherClientDataSource() : 
getStorageContainer().getDataSourceMap().get(dataNode.getDataSourceName());
-        try (
-                Connection connection = dataSource.getConnection();
-                Statement statement = connection.createStatement();
-                ResultSet resultSet = statement.executeQuery(sql)) {
-            if (resultSet.next()) {
-                return resultSet.getString("attname");
-            }
-            throw new SQLException(String.format("Can not get primary key of 
`%s`", dataNode.getTableName()));
-        }
+        Optional<String> primaryKeyColumnName = 
getStorageContainer().getPrimaryKeyColumnName(getStorageContainer().getDataSourceMap().get(dataNode.getDataSourceName()),
 dataNode.getTableName());
+        return primaryKeyColumnName.isPresent()
+                ? String.format("SELECT * FROM %s ORDER BY %s ASC", 
dataNode.getTableName(), primaryKeyColumnName.get()) : String.format("SELECT * 
FROM %s", dataNode.getTableName());
     }
     
     private void assertMetaData(final ResultSetMetaData actual, final 
Collection<DataSetColumn> expected) throws SQLException {
diff --git 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/env/DataSourceEnvironment.java
 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/env/DataSourceEnvironment.java
index a3a3e6d..390478a 100644
--- 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/env/DataSourceEnvironment.java
+++ 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/env/DataSourceEnvironment.java
@@ -17,6 +17,8 @@
 
 package org.apache.shardingsphere.test.integration.env;
 
+import org.apache.shardingsphere.infra.database.type.DatabaseType;
+
 /**
  * Data source environment.
  */
@@ -28,8 +30,8 @@ public final class DataSourceEnvironment {
      * @param databaseType database type
      * @return driver class name
      */
-    public static String getDriverClassName(final String databaseType) {
-        switch (databaseType) {
+    public static String getDriverClassName(final DatabaseType databaseType) {
+        switch (databaseType.getName()) {
             case "H2":
                 return "org.h2.Driver";
             case "MySQL":
@@ -41,7 +43,7 @@ public final class DataSourceEnvironment {
             case "Oracle":
                 return "oracle.jdbc.driver.OracleDriver";
             default:
-                throw new UnsupportedOperationException(databaseType);
+                throw new 
UnsupportedOperationException(databaseType.getName());
         }
     }
 
@@ -53,8 +55,8 @@ public final class DataSourceEnvironment {
      * @param port database port
      * @return URL
      */
-    public static String getURL(final String databaseType, final String host, 
final int port) {
-        switch (databaseType) {
+    public static String getURL(final DatabaseType databaseType, final String 
host, final int port) {
+        switch (databaseType.getName()) {
             case "H2":
                 return 
"jdbc:h2:mem:test_db;DB_CLOSE_DELAY=-1;DATABASE_TO_UPPER=false;MODE=MySQL";
             case "MySQL":
@@ -66,7 +68,7 @@ public final class DataSourceEnvironment {
             case "Oracle":
                 return String.format("jdbc:oracle:thin:@%s:%s", host, port);
             default:
-                throw new UnsupportedOperationException(databaseType);
+                throw new 
UnsupportedOperationException(databaseType.getName());
         }
     }
 
@@ -79,8 +81,8 @@ public final class DataSourceEnvironment {
      * @param dataSourceName data source name
      * @return URL
      */
-    public static String getURL(final String databaseType, final String host, 
final int port, final String dataSourceName) {
-        switch (databaseType) {
+    public static String getURL(final DatabaseType databaseType, final String 
host, final int port, final String dataSourceName) {
+        switch (databaseType.getName()) {
             case "H2":
                 return 
String.format("jdbc:h2:mem:%s;DB_CLOSE_DELAY=-1;DATABASE_TO_UPPER=false;MODE=MySQL",
 dataSourceName);
             case "MySQL":
@@ -92,7 +94,7 @@ public final class DataSourceEnvironment {
             case "Oracle":
                 return String.format("jdbc:oracle:thin:@%s:%s/%s", host, port, 
dataSourceName);
             default:
-                throw new UnsupportedOperationException(databaseType);
+                throw new 
UnsupportedOperationException(databaseType.getName());
         }
     }
 }
diff --git 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/ShardingSphereContainer.java
 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/ShardingSphereContainer.java
index b3bc9e7..66a80c0 100644
--- 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/ShardingSphereContainer.java
+++ 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/ShardingSphereContainer.java
@@ -19,7 +19,6 @@ package 
org.apache.shardingsphere.test.integration.framework.container.atomic;
 
 import lombok.Getter;
 import lombok.extern.slf4j.Slf4j;
-import 
org.apache.shardingsphere.test.integration.framework.param.model.ParameterizedArray;
 import org.testcontainers.containers.GenericContainer;
 import 
org.testcontainers.containers.wait.strategy.DockerHealthcheckWaitStrategy;
 import org.testcontainers.images.RemoteDockerImage;
@@ -27,7 +26,7 @@ import org.testcontainers.utility.DockerImageName;
 
 import java.time.Duration;
 import java.time.temporal.ChronoUnit;
-import java.util.List;
+import java.util.Collection;
 import java.util.stream.Collectors;
 
 /**
@@ -41,14 +40,10 @@ public abstract class ShardingSphereContainer extends 
GenericContainer<ShardingS
     
     private final boolean isFakedContainer;
     
-    @Getter
-    private final ParameterizedArray parameterizedArray;
-    
-    public ShardingSphereContainer(final String name, final String 
dockerImageName, final boolean isFakedContainer, final ParameterizedArray 
parameterizedArray) {
+    public ShardingSphereContainer(final String name, final String 
dockerImageName, final boolean isFakedContainer) {
         super(getDockerImage(dockerImageName, isFakedContainer));
         this.name = name;
         this.isFakedContainer = isFakedContainer;
-        this.parameterizedArray = parameterizedArray;
     }
     
     private static RemoteDockerImage getDockerImage(final String imageName, 
final boolean isFakedContainer) {
@@ -58,7 +53,6 @@ public abstract class ShardingSphereContainer extends 
GenericContainer<ShardingS
     
     @Override
     public void start() {
-        configure();
         startDependencies();
         if (!isFakedContainer) {
             super.start();
@@ -67,7 +61,7 @@ public abstract class ShardingSphereContainer extends 
GenericContainer<ShardingS
     }
     
     private void startDependencies() {
-        List<ShardingSphereContainer> dependencies = 
getDependencies().stream().map(each -> (ShardingSphereContainer) 
each).collect(Collectors.toList());
+        Collection<ShardingSphereContainer> dependencies = 
getDependencies().stream().map(each -> (ShardingSphereContainer) 
each).collect(Collectors.toList());
         dependencies.stream().filter(each -> 
!each.isCreated()).forEach(GenericContainer::start);
         dependencies.stream()
                 .filter(each -> {
diff --git 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/adapter/AdapterContainer.java
 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/adapter/AdapterContainer.java
index dd67ad9..95ad4c5 100644
--- 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/adapter/AdapterContainer.java
+++ 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/adapter/AdapterContainer.java
@@ -19,7 +19,6 @@ package 
org.apache.shardingsphere.test.integration.framework.container.atomic.ad
 
 import lombok.SneakyThrows;
 import 
org.apache.shardingsphere.test.integration.framework.container.atomic.ShardingSphereContainer;
-import 
org.apache.shardingsphere.test.integration.framework.param.model.ParameterizedArray;
 
 import javax.sql.DataSource;
 
@@ -28,13 +27,13 @@ import javax.sql.DataSource;
  */
 public abstract class AdapterContainer extends ShardingSphereContainer {
     
-    public AdapterContainer(final String dockerName, final String 
dockerImageName, final ParameterizedArray parameterizedArray) {
-        this(dockerName, dockerImageName, false, parameterizedArray);
+    public AdapterContainer(final String dockerName, final String 
dockerImageName) {
+        this(dockerName, dockerImageName, false);
     }
     
     @SneakyThrows
-    public AdapterContainer(final String name, final String dockerImageName, 
final boolean isFakedContainer, final ParameterizedArray parameterizedArray) {
-        super(name, dockerImageName, isFakedContainer, parameterizedArray);
+    public AdapterContainer(final String name, final String dockerImageName, 
final boolean isFakedContainer) {
+        super(name, dockerImageName, isFakedContainer);
     }
     
     /**
diff --git 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/adapter/AdapterContainerFactory.java
 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/adapter/AdapterContainerFactory.java
index 6342ef4..2cbaceb 100644
--- 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/adapter/AdapterContainerFactory.java
+++ 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/adapter/AdapterContainerFactory.java
@@ -19,9 +19,9 @@ package 
org.apache.shardingsphere.test.integration.framework.container.atomic.ad
 
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
+import org.apache.shardingsphere.infra.database.type.DatabaseType;
 import 
org.apache.shardingsphere.test.integration.framework.container.atomic.adapter.impl.ShardingSphereJDBCContainer;
 import 
org.apache.shardingsphere.test.integration.framework.container.atomic.adapter.impl.ShardingSphereProxyContainer;
-import 
org.apache.shardingsphere.test.integration.framework.param.model.ParameterizedArray;
 
 /**
  * Adapter container factory.
@@ -32,17 +32,19 @@ public final class AdapterContainerFactory {
     /**
      * Create new instance of adapter container.
      *
-     * @param parameterizedArray parameterized array
+     * @param adapter adapter
+     * @param databaseType database type
+     * @param scenario scenario
      * @return new instance of adapter container
      */
-    public static AdapterContainer newInstance(final ParameterizedArray 
parameterizedArray) {
-        switch (parameterizedArray.getAdapter()) {
+    public static AdapterContainer newInstance(final String adapter, final 
DatabaseType databaseType, final String scenario) {
+        switch (adapter) {
             case "proxy":
-                return new ShardingSphereProxyContainer(parameterizedArray);
+                return new ShardingSphereProxyContainer(databaseType, 
scenario);
             case "jdbc":
-                return new ShardingSphereJDBCContainer(parameterizedArray);
+                return new ShardingSphereJDBCContainer(scenario);
             default:
-                throw new RuntimeException(String.format("Adapter [%s] is 
unknown.", parameterizedArray.getAdapter()));
+                throw new RuntimeException(String.format("Adapter [%s] is 
unknown.", adapter));
         }
     }
 }
diff --git 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/adapter/impl/ShardingSphereJDBCContainer.java
 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/adapter/impl/ShardingSphereJDBCContainer.java
index 8921068..f33aeec 100644
--- 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/adapter/impl/ShardingSphereJDBCContainer.java
+++ 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/adapter/impl/ShardingSphereJDBCContainer.java
@@ -19,13 +19,13 @@ package 
org.apache.shardingsphere.test.integration.framework.container.atomic.ad
 
 import com.google.common.base.Preconditions;
 import com.google.common.base.Strings;
+import lombok.SneakyThrows;
 import 
org.apache.shardingsphere.driver.api.yaml.YamlShardingSphereDataSourceFactory;
 import org.apache.shardingsphere.infra.yaml.config.pojo.YamlRootConfiguration;
 import org.apache.shardingsphere.infra.yaml.engine.YamlEngine;
 import org.apache.shardingsphere.test.integration.env.EnvironmentPath;
 import 
org.apache.shardingsphere.test.integration.framework.container.atomic.adapter.AdapterContainer;
 import 
org.apache.shardingsphere.test.integration.framework.container.atomic.storage.StorageContainer;
-import 
org.apache.shardingsphere.test.integration.framework.param.model.ParameterizedArray;
 import org.testcontainers.lifecycle.Startable;
 
 import javax.sql.DataSource;
@@ -44,6 +44,8 @@ import java.util.concurrent.atomic.AtomicReference;
  */
 public final class ShardingSphereJDBCContainer extends AdapterContainer {
     
+    private final String scenario;
+    
     private final AtomicBoolean isHealthy = new AtomicBoolean();
     
     private Map<String, DataSource> dataSourceMap;
@@ -52,8 +54,9 @@ public final class ShardingSphereJDBCContainer extends 
AdapterContainer {
     
     private final AtomicReference<DataSource> anotherClientDataSourceProvider 
= new AtomicReference<>();
     
-    public ShardingSphereJDBCContainer(final ParameterizedArray 
parameterizedArray) {
-        super("ShardingSphere-JDBC", "ShardingSphere-JDBC", true, 
parameterizedArray);
+    public ShardingSphereJDBCContainer(final String scenario) {
+        super("ShardingSphere-JDBC", "ShardingSphere-JDBC", true);
+        this.scenario = scenario;
     }
     
     @Override
@@ -70,7 +73,7 @@ public final class ShardingSphereJDBCContainer extends 
AdapterContainer {
     }
     
     /**
-     * Get data source.
+     * Get client data source.
      *
      * @param serverLists server list
      * @return data source
@@ -80,40 +83,36 @@ public final class ShardingSphereJDBCContainer extends 
AdapterContainer {
         if (Objects.isNull(dataSource)) {
             if (Strings.isNullOrEmpty(serverLists)) {
                 try {
-                    clientDataSourceProvider.set(
-                            
YamlShardingSphereDataSourceFactory.createDataSource(dataSourceMap, new 
File(EnvironmentPath.getRulesConfigurationFile(getParameterizedArray().getScenario()))));
+                    
clientDataSourceProvider.set(YamlShardingSphereDataSourceFactory.createDataSource(dataSourceMap,
 new File(EnvironmentPath.getRulesConfigurationFile(scenario))));
                 } catch (final SQLException | IOException ex) {
                     throw new RuntimeException(ex);
                 }
             } else {
-                
clientDataSourceProvider.set(createGovernanceDataSource(serverLists));
+                
clientDataSourceProvider.set(createGovernanceClientDataSource(serverLists));
             }
         }
         return clientDataSourceProvider.get();
     }
     
     /**
-     * Get governance data source for reader.
+     * Get another client data source.
      *
      * @param serverLists server list
-     * @return data source
+     * @return another client data source
      */
     public DataSource getAnotherClientDataSource(final String serverLists) {
         DataSource dataSource = anotherClientDataSourceProvider.get();
         if (Objects.isNull(dataSource)) {
-            
anotherClientDataSourceProvider.set(createGovernanceDataSource(serverLists));
+            
anotherClientDataSourceProvider.set(createGovernanceClientDataSource(serverLists));
         }
         return anotherClientDataSourceProvider.get();
     }
     
-    private DataSource createGovernanceDataSource(final String serverLists) {
-        try {
-            YamlRootConfiguration rootConfig = YamlEngine.unmarshal(new 
File(EnvironmentPath.getRulesConfigurationFile(getParameterizedArray().getScenario())),
 YamlRootConfiguration.class);
-            
rootConfig.getMode().getRepository().getProps().setProperty("server-lists", 
serverLists);
-            return 
YamlShardingSphereDataSourceFactory.createDataSource(dataSourceMap, 
YamlEngine.marshal(rootConfig).getBytes(StandardCharsets.UTF_8));
-        } catch (final SQLException | IOException ex) {
-            throw new RuntimeException(ex);
-        }
+    @SneakyThrows({SQLException.class, IOException.class})
+    private DataSource createGovernanceClientDataSource(final String 
serverLists) {
+        YamlRootConfiguration rootConfig = YamlEngine.unmarshal(new 
File(EnvironmentPath.getRulesConfigurationFile(scenario)), 
YamlRootConfiguration.class);
+        
rootConfig.getMode().getRepository().getProps().setProperty("server-lists", 
serverLists);
+        return 
YamlShardingSphereDataSourceFactory.createDataSource(dataSourceMap, 
YamlEngine.marshal(rootConfig).getBytes(StandardCharsets.UTF_8));
     }
     
     @Override
diff --git 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/adapter/impl/ShardingSphereProxyContainer.java
 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/adapter/impl/ShardingSphereProxyContainer.java
index f1c3712..12967aa 100644
--- 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/adapter/impl/ShardingSphereProxyContainer.java
+++ 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/adapter/impl/ShardingSphereProxyContainer.java
@@ -22,13 +22,13 @@ import com.zaxxer.hikari.HikariDataSource;
 import lombok.SneakyThrows;
 import lombok.extern.slf4j.Slf4j;
 import 
org.apache.shardingsphere.authority.yaml.config.YamlAuthorityRuleConfiguration;
+import org.apache.shardingsphere.infra.database.type.DatabaseType;
 import 
org.apache.shardingsphere.infra.metadata.user.yaml.config.YamlUserConfiguration;
 import 
org.apache.shardingsphere.infra.metadata.user.yaml.config.YamlUsersConfigurationConverter;
 import org.apache.shardingsphere.infra.yaml.engine.YamlEngine;
 import 
org.apache.shardingsphere.proxy.config.yaml.YamlProxyServerConfiguration;
 import org.apache.shardingsphere.test.integration.env.DataSourceEnvironment;
 import 
org.apache.shardingsphere.test.integration.framework.container.atomic.adapter.AdapterContainer;
-import 
org.apache.shardingsphere.test.integration.framework.param.model.ParameterizedArray;
 import org.testcontainers.containers.BindMode;
 import org.testcontainers.containers.wait.strategy.LogMessageWaitStrategy;
 import org.testcontainers.utility.MountableFile;
@@ -50,14 +50,20 @@ public final class ShardingSphereProxyContainer extends 
AdapterContainer {
     
     private static final String PROPERTY_AGENT_HOME = "AGENT_HOME";
     
+    private final DatabaseType databaseType;
+    
+    private final String scenario;
+    
     private final AtomicReference<DataSource> dataSourceProvider = new 
AtomicReference<>();
     
-    public ShardingSphereProxyContainer(final ParameterizedArray 
parameterizedArray) {
-        this(null, parameterizedArray);
+    public ShardingSphereProxyContainer(final DatabaseType databaseType, final 
String scenario) {
+        this(null, databaseType, scenario);
     }
     
-    public ShardingSphereProxyContainer(final String dockerName, final 
ParameterizedArray parameterizedArray) {
-        super(Objects.isNull(dockerName) ? "ShardingSphere-Proxy" : 
dockerName, "apache/shardingsphere-proxy-test", parameterizedArray);
+    public ShardingSphereProxyContainer(final String dockerName, final 
DatabaseType databaseType, final String scenario) {
+        super(Objects.isNull(dockerName) ? "ShardingSphere-Proxy" : 
dockerName, "apache/shardingsphere-proxy-test");
+        this.databaseType = databaseType;
+        this.scenario = scenario;
     }
     
     /**
@@ -96,7 +102,7 @@ public final class ShardingSphereProxyContainer extends 
AdapterContainer {
     
     @Override
     protected void configure() {
-        withConfMapping("/docker/proxy/conf/" + 
getParameterizedArray().getScenario() + "/" + 
getParameterizedArray().getDatabaseType().getName().toLowerCase());
+        withConfMapping("/docker/proxy/conf/" + scenario + "/" + 
databaseType.getName().toLowerCase());
         setWaitStrategy(new 
LogMessageWaitStrategy().withRegEx(".*ShardingSphere-Proxy .* mode started 
successfully.*"));
         super.configure();
     }
@@ -136,16 +142,15 @@ public final class ShardingSphereProxyContainer extends 
AdapterContainer {
     }
     
     private DataSource createProxyDataSource() {
-        String databaseType = 
getParameterizedArray().getDatabaseType().getName();
         HikariDataSource result = new HikariDataSource();
         
result.setDriverClassName(DataSourceEnvironment.getDriverClassName(databaseType));
-        result.setJdbcUrl(DataSourceEnvironment.getURL(databaseType, 
getHost(), getMappedPort(3307), getParameterizedArray().getScenario()));
+        result.setJdbcUrl(DataSourceEnvironment.getURL(databaseType, 
getHost(), getMappedPort(3307), scenario));
         YamlUserConfiguration userConfig = loadUserConfiguration();
         result.setUsername(userConfig.getUsername());
         result.setPassword(userConfig.getPassword());
         result.setMaximumPoolSize(2);
         result.setTransactionIsolation("TRANSACTION_READ_COMMITTED");
-        if ("MySQL".equals(databaseType)) {
+        if ("MySQL".equals(databaseType.getName())) {
             result.setConnectionInitSql("SET sql_mode=(SELECT 
REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''))");
         }
         return result;
@@ -153,7 +158,7 @@ public final class ShardingSphereProxyContainer extends 
AdapterContainer {
     
     @SneakyThrows(IOException.class)
     private YamlUserConfiguration loadUserConfiguration() {
-        String serverFile = "/docker/proxy/conf/" + 
getParameterizedArray().getScenario() + "/" + 
getParameterizedArray().getDatabaseType().getName().toLowerCase() + 
"/server.yaml";
+        String serverFile = "/docker/proxy/conf/" + scenario + "/" + 
databaseType.getName().toLowerCase() + "/server.yaml";
         YamlProxyServerConfiguration serverConfig = YamlEngine.unmarshal(
                 
ByteStreams.toByteArray(Objects.requireNonNull(this.getClass().getResourceAsStream(serverFile))),
 YamlProxyServerConfiguration.class);
         return 
YamlUsersConfigurationConverter.convertYamlUserConfiguration(getProxyUsers(serverConfig)).stream().findFirst().orElse(new
 YamlUserConfiguration());
diff --git 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/governance/ZookeeperContainer.java
 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/governance/ZookeeperContainer.java
index ee4e5c6..d2a5d9e 100644
--- 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/governance/ZookeeperContainer.java
+++ 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/governance/ZookeeperContainer.java
@@ -18,7 +18,6 @@
 package 
org.apache.shardingsphere.test.integration.framework.container.atomic.governance;
 
 import 
org.apache.shardingsphere.test.integration.framework.container.atomic.ShardingSphereContainer;
-import 
org.apache.shardingsphere.test.integration.framework.param.model.ParameterizedArray;
 import org.testcontainers.containers.wait.strategy.LogMessageWaitStrategy;
 
 /**
@@ -26,8 +25,8 @@ import 
org.testcontainers.containers.wait.strategy.LogMessageWaitStrategy;
  */
 public final class ZookeeperContainer extends ShardingSphereContainer {
     
-    public ZookeeperContainer(final ParameterizedArray parameterizedArray) {
-        super("zookeeper", "zookeeper:3.6.2", false, parameterizedArray);
+    public ZookeeperContainer() {
+        super("zookeeper", "zookeeper:3.6.2", false);
         setWaitStrategy(new 
LogMessageWaitStrategy().withRegEx(".*PrepRequestProcessor \\(sid:[0-9]+\\) 
started.*"));
     }
     
diff --git 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/storage/StorageContainer.java
 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/storage/StorageContainer.java
index 0b05790..e3adc74 100644
--- 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/storage/StorageContainer.java
+++ 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/storage/StorageContainer.java
@@ -25,7 +25,6 @@ import 
org.apache.shardingsphere.infra.database.type.DatabaseType;
 import org.apache.shardingsphere.test.integration.env.DataSourceEnvironment;
 import 
org.apache.shardingsphere.test.integration.env.database.DatabaseEnvironmentManager;
 import 
org.apache.shardingsphere.test.integration.framework.container.atomic.ShardingSphereContainer;
-import 
org.apache.shardingsphere.test.integration.framework.param.model.ParameterizedArray;
 import org.testcontainers.containers.BindMode;
 import org.testcontainers.shaded.com.google.common.collect.ImmutableMap;
 import 
org.testcontainers.shaded.com.google.common.collect.ImmutableMap.Builder;
@@ -33,6 +32,7 @@ import 
org.testcontainers.shaded.com.google.common.collect.ImmutableMap.Builder;
 import javax.sql.DataSource;
 import javax.xml.bind.JAXBException;
 import java.io.IOException;
+import java.sql.SQLException;
 import java.util.Collection;
 import java.util.Map;
 import java.util.Optional;
@@ -42,15 +42,18 @@ import java.util.Optional;
  */
 public abstract class StorageContainer extends ShardingSphereContainer {
     
+    private Map<String, DataSource> dataSourceMap;
+    
     @Getter
     private final DatabaseType databaseType;
     
-    private Map<String, DataSource> dataSourceMap;
+    @Getter
+    private final String scenario;
     
-    public StorageContainer(final String name, final String dockerImageName,
-                            final DatabaseType databaseType, final boolean 
isFakedContainer, final ParameterizedArray parameterizedArray) {
-        super(name, dockerImageName, isFakedContainer, parameterizedArray);
+    public StorageContainer(final DatabaseType databaseType, final String 
dockerImageName, final boolean isFakedContainer, final String scenario) {
+        super(databaseType.getName().toLowerCase(), dockerImageName, 
isFakedContainer);
         this.databaseType = databaseType;
+        this.scenario = scenario;
     }
     
     /**
@@ -72,7 +75,7 @@ public abstract class StorageContainer extends 
ShardingSphereContainer {
     @SneakyThrows({IOException.class, JAXBException.class})
     public synchronized Map<String, DataSource> getDataSourceMap() {
         if (null == dataSourceMap) {
-            Collection<String> dataSourceNames = 
DatabaseEnvironmentManager.getDatabaseNames(getParameterizedArray().getScenario());
+            Collection<String> dataSourceNames = 
DatabaseEnvironmentManager.getDatabaseNames(scenario);
             Builder<String, DataSource> builder = ImmutableMap.builder();
             dataSourceNames.forEach(each -> builder.put(each, 
createDataSource(each)));
             dataSourceMap = builder.build();
@@ -82,8 +85,8 @@ public abstract class StorageContainer extends 
ShardingSphereContainer {
     
     private DataSource createDataSource(final String dataSourceName) {
         HikariConfig config = new HikariConfig();
-        config.setDriverClassName(getDriverClassName());
-        config.setJdbcUrl(getUrl(dataSourceName));
+        
config.setDriverClassName(DataSourceEnvironment.getDriverClassName(databaseType));
+        config.setJdbcUrl(DataSourceEnvironment.getURL(databaseType, 
getHost(), getPort(), dataSourceName));
         config.setUsername(getUsername());
         config.setPassword(getPassword());
         config.setMaximumPoolSize(4);
@@ -92,12 +95,6 @@ public abstract class StorageContainer extends 
ShardingSphereContainer {
         return new HikariDataSource(config);
     }
     
-    protected String getDriverClassName() {
-        return 
DataSourceEnvironment.getDriverClassName(databaseType.getName());
-    }
-    
-    protected abstract String getUrl(String dataSourceName);
-    
     protected abstract String getUsername();
     
     protected abstract String getPassword();
@@ -107,4 +104,14 @@ public abstract class StorageContainer extends 
ShardingSphereContainer {
     }
     
     protected abstract int getPort();
+    
+    /**
+     * Get primary key column name.
+     * 
+     * @param dataSource data source
+     * @param tableName table name
+     * @return primary key column name
+     * @throws SQLException SQL exception
+     */
+    public abstract Optional<String> getPrimaryKeyColumnName(DataSource 
dataSource, String tableName) throws SQLException;
 }
diff --git 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/storage/StorageContainerFactory.java
 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/storage/StorageContainerFactory.java
index fa6a8f6..1d78e97 100644
--- 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/storage/StorageContainerFactory.java
+++ 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/storage/StorageContainerFactory.java
@@ -19,10 +19,10 @@ package 
org.apache.shardingsphere.test.integration.framework.container.atomic.st
 
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
+import org.apache.shardingsphere.infra.database.type.DatabaseType;
 import 
org.apache.shardingsphere.test.integration.framework.container.atomic.storage.impl.H2Container;
 import 
org.apache.shardingsphere.test.integration.framework.container.atomic.storage.impl.MySQLContainer;
 import 
org.apache.shardingsphere.test.integration.framework.container.atomic.storage.impl.PostgreSQLContainer;
-import 
org.apache.shardingsphere.test.integration.framework.param.model.ParameterizedArray;
 
 /**
  * Storage container factory.
@@ -33,19 +33,20 @@ public final class StorageContainerFactory {
     /**
      * Create new instance of storage container.
      * 
-     * @param parameterizedArray parameterized array
+     * @param databaseType database type
+     * @param scenario scenario
      * @return new instance of storage container
      */
-    public static StorageContainer newInstance(final ParameterizedArray 
parameterizedArray) {
-        switch (parameterizedArray.getDatabaseType().getName()) {
+    public static StorageContainer newInstance(final DatabaseType 
databaseType, final String scenario) {
+        switch (databaseType.getName()) {
             case "MySQL":
-                return new MySQLContainer(parameterizedArray);
+                return new MySQLContainer(scenario);
             case "PostgreSQL" :
-                return new PostgreSQLContainer(parameterizedArray);
+                return new PostgreSQLContainer(scenario);
             case "H2":
-                return new H2Container(parameterizedArray);
+                return new H2Container(scenario);
             default:
-                throw new RuntimeException(String.format("Database [%s] is 
unknown.", parameterizedArray.getDatabaseType()));
+                throw new RuntimeException(String.format("Database [%s] is 
unknown.", databaseType.getName()));
         }
     }
 }
diff --git 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/storage/impl/H2Container.java
 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/storage/impl/H2Container.java
index 6177332..2e1e19d 100644
--- 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/storage/impl/H2Container.java
+++ 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/storage/impl/H2Container.java
@@ -18,11 +18,10 @@
 package 
org.apache.shardingsphere.test.integration.framework.container.atomic.storage.impl;
 
 import lombok.SneakyThrows;
-import org.apache.shardingsphere.infra.database.type.dialect.H2DatabaseType;
-import org.apache.shardingsphere.test.integration.env.DataSourceEnvironment;
+import org.apache.shardingsphere.infra.database.type.DatabaseType;
+import org.apache.shardingsphere.infra.database.type.DatabaseTypeRegistry;
 import org.apache.shardingsphere.test.integration.env.EnvironmentPath;
 import 
org.apache.shardingsphere.test.integration.framework.container.atomic.storage.StorageContainer;
-import 
org.apache.shardingsphere.test.integration.framework.param.model.ParameterizedArray;
 import org.h2.tools.RunScript;
 
 import javax.sql.DataSource;
@@ -32,36 +31,35 @@ import java.io.IOException;
 import java.sql.Connection;
 import java.sql.SQLException;
 import java.util.Map.Entry;
-import java.util.Objects;
+import java.util.Optional;
 
 /**
  * H2 container.
  */
 public final class H2Container extends StorageContainer {
     
-    public H2Container(final ParameterizedArray parameterizedArray) {
-        super("h2-embedded", "h2:fake", new H2DatabaseType(), true, 
parameterizedArray);
+    public H2Container(final String scenario) {
+        super(DatabaseTypeRegistry.getActualDatabaseType("H2"), "h2:fake", 
true, scenario);
     }
     
     @Override
     @SneakyThrows({IOException.class, SQLException.class})
     protected void execute() {
-        super.execute();
-        File file = new File(EnvironmentPath.getInitSQLFile(getDatabaseType(), 
getParameterizedArray().getScenario()));
+        File file = new File(EnvironmentPath.getInitSQLFile(getDatabaseType(), 
getScenario()));
         for (Entry<String, DataSource> each : getDataSourceMap().entrySet()) {
             String databaseFileName = "init-" + each.getKey() + ".sql";
-            boolean sqlFileExist = 
EnvironmentPath.checkSQLFileExist(getDatabaseType(), 
getParameterizedArray().getScenario(), databaseFileName);
+            boolean sqlFileExist = 
EnvironmentPath.checkSQLFileExist(getDatabaseType(), getScenario(), 
databaseFileName);
             try (Connection connection = each.getValue().getConnection(); 
FileReader reader = new FileReader(file)) {
                 RunScript.execute(connection, reader);
                 if (sqlFileExist) {
-                    executeDatabaseFile(connection, databaseFileName);
+                    executeDatabaseFile(getDatabaseType(), connection, 
databaseFileName);
                 }
             }
         }
     }
     
-    private void executeDatabaseFile(final Connection connection, final String 
databaseFileName) throws IOException, SQLException {
-        File databaseFile = new 
File(EnvironmentPath.getInitSQLFile(getDatabaseType(), 
getParameterizedArray().getScenario(), databaseFileName));
+    private void executeDatabaseFile(final DatabaseType databaseType, final 
Connection connection, final String databaseFileName) throws IOException, 
SQLException {
+        File databaseFile = new 
File(EnvironmentPath.getInitSQLFile(databaseType, getScenario(), 
databaseFileName));
         try (FileReader databaseFileReader = new FileReader(databaseFile)) {
             RunScript.execute(connection, databaseFileReader);
         }
@@ -73,23 +71,22 @@ public final class H2Container extends StorageContainer {
     }
     
     @Override
-    protected String getUrl(final String dataSourceName) {
-        return DataSourceEnvironment.getURL("H2", null, 0, 
Objects.isNull(dataSourceName) ? "test_db" : dataSourceName);
+    protected String getUsername() {
+        return "sa";
     }
     
     @Override
-    protected int getPort() {
-        return 0;
+    protected String getPassword() {
+        return "";
     }
     
     @Override
-    protected String getUsername() {
-        return "sa";
+    protected int getPort() {
+        return 0;
     }
     
     @Override
-    protected String getPassword() {
-        return "";
+    public Optional<String> getPrimaryKeyColumnName(final DataSource 
dataSource, final String tableName) {
+        return Optional.empty();
     }
-    
 }
diff --git 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/storage/impl/MySQLContainer.java
 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/storage/impl/MySQLContainer.java
index 36008e1..d42aba7 100644
--- 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/storage/impl/MySQLContainer.java
+++ 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/storage/impl/MySQLContainer.java
@@ -17,11 +17,10 @@
 
 package 
org.apache.shardingsphere.test.integration.framework.container.atomic.storage.impl;
 
-import org.apache.shardingsphere.infra.database.type.dialect.MySQLDatabaseType;
-import org.apache.shardingsphere.test.integration.env.DataSourceEnvironment;
+import org.apache.shardingsphere.infra.database.type.DatabaseTypeRegistry;
 import 
org.apache.shardingsphere.test.integration.framework.container.atomic.storage.StorageContainer;
-import 
org.apache.shardingsphere.test.integration.framework.param.model.ParameterizedArray;
 
+import javax.sql.DataSource;
 import java.util.Collections;
 import java.util.Optional;
 
@@ -30,24 +29,25 @@ import java.util.Optional;
  */
 public final class MySQLContainer extends StorageContainer {
     
-    public MySQLContainer(final ParameterizedArray parameterizedArray) {
-        super("mysql-server", "mysql/mysql-server:5.7", new 
MySQLDatabaseType(), false, parameterizedArray);
+    public MySQLContainer(final String scenario) {
+        super(DatabaseTypeRegistry.getActualDatabaseType("MySQL"), 
"mysql/mysql-server:5.7", false, scenario);
     }
     
     @Override
     protected void configure() {
         withCommand("--sql_mode=", 
"--default-authentication-plugin=mysql_native_password");
-        withInitSQLMapping("/env/" + getParameterizedArray().getScenario() + 
"/init-sql/mysql");
+        withInitSQLMapping("/env/" + getScenario() + "/init-sql/mysql");
         setEnv(Collections.singletonList("LANG=C.UTF-8"));
     }
     
     @Override
-    protected void execute() {
+    protected String getUsername() {
+        return "root";
     }
     
     @Override
-    protected String getUrl(final String dataSourceName) {
-        return DataSourceEnvironment.getURL("MySQL", getHost(), getPort(), 
dataSourceName);
+    protected String getPassword() {
+        return "";
     }
     
     @Override
@@ -61,12 +61,7 @@ public final class MySQLContainer extends StorageContainer {
     }
     
     @Override
-    protected String getUsername() {
-        return "root";
-    }
-    
-    @Override
-    protected String getPassword() {
-        return "";
+    public Optional<String> getPrimaryKeyColumnName(final DataSource 
dataSource, final String tableName) {
+        return Optional.empty();
     }
 }
diff --git 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/storage/impl/PostgreSQLContainer.java
 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/storage/impl/PostgreSQLContainer.java
index e0b7c13..c5242b4 100644
--- 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/storage/impl/PostgreSQLContainer.java
+++ 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/storage/impl/PostgreSQLContainer.java
@@ -18,23 +18,26 @@
 package 
org.apache.shardingsphere.test.integration.framework.container.atomic.storage.impl;
 
 import lombok.SneakyThrows;
-import 
org.apache.shardingsphere.infra.database.type.dialect.PostgreSQLDatabaseType;
+import org.apache.shardingsphere.infra.database.type.DatabaseTypeRegistry;
 import org.apache.shardingsphere.test.integration.env.DataSourceEnvironment;
 import 
org.apache.shardingsphere.test.integration.framework.container.atomic.storage.StorageContainer;
-import 
org.apache.shardingsphere.test.integration.framework.param.model.ParameterizedArray;
 import org.postgresql.util.PSQLException;
 
+import javax.sql.DataSource;
 import java.sql.Connection;
 import java.sql.DriverManager;
+import java.sql.ResultSet;
 import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.Optional;
 
 /**
  * PostgreSQL container.
  */
 public final class PostgreSQLContainer extends StorageContainer {
     
-    public PostgreSQLContainer(final ParameterizedArray parameterizedArray) {
-        super("postgres", "postgres:12.6", new PostgreSQLDatabaseType(), 
false, parameterizedArray);
+    public PostgreSQLContainer(final String scenario) {
+        super(DatabaseTypeRegistry.getActualDatabaseType("PostgreSQL"), 
"postgres:12.6", false, scenario);
     }
     
     @Override
@@ -42,42 +45,52 @@ public final class PostgreSQLContainer extends 
StorageContainer {
         withCommand("--max_connections=200");
         addEnv("POSTGRES_USER", "root");
         addEnv("POSTGRES_PASSWORD", "root");
-        withInitSQLMapping("/env/" + getParameterizedArray().getScenario() + 
"/init-sql/postgresql");
+        withInitSQLMapping("/env/" + getScenario() + "/init-sql/postgresql");
     }
-
+    
     @Override
     @SneakyThrows({ClassNotFoundException.class, SQLException.class, 
InterruptedException.class})
     protected void execute() {
-        int time = 0;
-        Class.forName(getDriverClassName());
-        String url = DataSourceEnvironment.getURL("PostgreSQL", getHost(), 
getPort());
-        // TODO logic need prefect
-        while (time++ < 20) {
+        
Class.forName(DataSourceEnvironment.getDriverClassName(getDatabaseType()));
+        String url = DataSourceEnvironment.getURL(getDatabaseType(), 
getHost(), getPort());
+        boolean connected = false;
+        while (!connected) {
             try (Connection ignored = DriverManager.getConnection(url, 
getUsername(), getPassword())) {
+                connected = true;
                 break;
-            } catch (PSQLException ex) {
-                Thread.sleep(1000L);
+            } catch (final PSQLException ex) {
+                Thread.sleep(500L);
             }
         }
     }
-
+    
     @Override
-    protected String getUrl(final String dataSourceName) {
-        return DataSourceEnvironment.getURL("PostgreSQL", getHost(), 
getPort(), dataSourceName);
+    protected String getUsername() {
+        return "root";
     }
     
     @Override
-    protected int getPort() {
-        return getMappedPort(5432);
+    protected String getPassword() {
+        return "root";
     }
     
     @Override
-    protected String getUsername() {
-        return "root";
+    protected int getPort() {
+        return getMappedPort(5432);
     }
     
     @Override
-    protected String getPassword() {
-        return "root";
+    public Optional<String> getPrimaryKeyColumnName(final DataSource 
dataSource, final String tableName) throws SQLException {
+        String sql = String.format("SELECT a.attname, format_type(a.atttypid, 
a.atttypmod) AS data_type "
+                + "FROM pg_index i JOIN pg_attribute a ON a.attrelid = 
i.indrelid AND a.attnum = ANY(i.indkey) WHERE i.indrelid = '%s'::regclass AND 
i.indisprimary", tableName);
+        try (
+                Connection connection = dataSource.getConnection();
+                Statement statement = connection.createStatement();
+                ResultSet resultSet = statement.executeQuery(sql)) {
+            if (resultSet.next()) {
+                return Optional.of(resultSet.getString("attname"));
+            }
+            throw new SQLException(String.format("Can not get primary key of 
`%s`", tableName));
+        }
     }
 }
diff --git 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/compose/mode/ClusterComposedContainer.java
 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/compose/mode/ClusterComposedContainer.java
index 455a022..549e7ef 100644
--- 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/compose/mode/ClusterComposedContainer.java
+++ 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/compose/mode/ClusterComposedContainer.java
@@ -49,15 +49,19 @@ public final class ClusterComposedContainer implements 
ComposedContainer {
     
     public ClusterComposedContainer(final String testSuiteName, final 
ParameterizedArray parameterizedArray) {
         containers = new ShardingSphereContainers(testSuiteName, 
parameterizedArray.getScenario());
-        storageContainer = 
containers.registerContainer(StorageContainerFactory.newInstance(parameterizedArray),
 parameterizedArray.getDatabaseType().getName());
-        adapterContainer = 
containers.registerContainer(AdapterContainerFactory.newInstance(parameterizedArray),
 parameterizedArray.getAdapter());
+        storageContainer = containers.registerContainer(
+                
StorageContainerFactory.newInstance(parameterizedArray.getDatabaseType(), 
parameterizedArray.getScenario()), 
parameterizedArray.getDatabaseType().getName());
+        adapterContainer = 
containers.registerContainer(AdapterContainerFactory.newInstance(
+                parameterizedArray.getAdapter(), 
parameterizedArray.getDatabaseType(), parameterizedArray.getScenario()), 
parameterizedArray.getAdapter());
         // TODO support other types of governance
-        zookeeperContainer = containers.registerContainer(new 
ZookeeperContainer(parameterizedArray), "zk");
+        zookeeperContainer = containers.registerContainer(new 
ZookeeperContainer(), "zk");
         if ("proxy".equals(parameterizedArray.getAdapter())) {
-            adapterContainerForReader = containers.registerContainer(new 
ShardingSphereProxyContainer("ShardingSphere-Proxy-1", parameterizedArray), 
"ShardingSphere-Proxy-1");
+            adapterContainerForReader = containers.registerContainer(
+                    new ShardingSphereProxyContainer("ShardingSphere-Proxy-1", 
parameterizedArray.getDatabaseType(), parameterizedArray.getScenario()), 
"ShardingSphere-Proxy-1");
             adapterContainerForReader.dependsOn(storageContainer, 
zookeeperContainer);
         } else {
-            adapterContainerForReader = 
containers.registerContainer(AdapterContainerFactory.newInstance(parameterizedArray),
 parameterizedArray.getAdapter());
+            adapterContainerForReader = containers.registerContainer(
+                    
AdapterContainerFactory.newInstance(parameterizedArray.getAdapter(), 
parameterizedArray.getDatabaseType(), parameterizedArray.getScenario()), 
parameterizedArray.getAdapter());
             adapterContainerForReader.dependsOn(storageContainer, 
zookeeperContainer);
         }
         adapterContainer.dependsOn(storageContainer, zookeeperContainer);
diff --git 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/compose/mode/MemoryComposedContainer.java
 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/compose/mode/MemoryComposedContainer.java
index a2d4e5b..8c7ade1 100644
--- 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/compose/mode/MemoryComposedContainer.java
+++ 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/compose/mode/MemoryComposedContainer.java
@@ -42,8 +42,10 @@ public final class MemoryComposedContainer implements 
ComposedContainer {
     
     public MemoryComposedContainer(final String testSuiteName, final 
ParameterizedArray parameterizedArray) {
         containers = new ShardingSphereContainers(testSuiteName, 
parameterizedArray.getScenario());
-        storageContainer = 
containers.registerContainer(StorageContainerFactory.newInstance(parameterizedArray),
 parameterizedArray.getDatabaseType().getName());
-        adapterContainer = 
containers.registerContainer(AdapterContainerFactory.newInstance(parameterizedArray),
 parameterizedArray.getAdapter());
+        storageContainer = containers.registerContainer(
+                
StorageContainerFactory.newInstance(parameterizedArray.getDatabaseType(), 
parameterizedArray.getScenario()), 
parameterizedArray.getDatabaseType().getName());
+        adapterContainer = containers.registerContainer(
+                
AdapterContainerFactory.newInstance(parameterizedArray.getAdapter(), 
parameterizedArray.getDatabaseType(), parameterizedArray.getScenario()), 
parameterizedArray.getAdapter());
         adapterContainer.dependsOn(storageContainer);
     }
     

Reply via email to