You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by pa...@apache.org on 2022/04/09 12:43:48 UTC

[shardingsphere] branch master updated: Refactor QueryHeaderBuilder to impl StatelessTypedSPI (#16701)

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

panjuan 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 0aa073b7921 Refactor QueryHeaderBuilder to impl StatelessTypedSPI (#16701)
0aa073b7921 is described below

commit 0aa073b7921a2c761bc9fa9b6bcb9bfe03bf210f
Author: Liang Zhang <zh...@apache.org>
AuthorDate: Sat Apr 9 20:43:42 2022 +0800

    Refactor QueryHeaderBuilder to impl StatelessTypedSPI (#16701)
---
 .../communication/DatabaseCommunicationEngine.java |  15 ++-
 .../jdbc/JDBCDatabaseCommunicationEngine.java      |   7 +-
 .../response/header/query/QueryHeaderBuilder.java  |  51 ++-------
 ...rBuilder.java => QueryHeaderBuilderEngine.java} |  23 ++--
 .../header/query/QueryHeaderBuilderFactory.java    |  24 ++---
 .../header/query/impl/MySQLQueryHeaderBuilder.java |  22 ++--
 .../query/impl/OpenGaussQueryHeaderBuilder.java    |  13 ++-
 .../query/impl/PostgreSQLQueryHeaderBuilder.java   |  17 ++-
 .../admin/DatabaseAdminQueryBackendHandler.java    |   7 +-
 ...ackend.response.header.query.QueryHeaderBuilder |   2 +-
 .../jdbc/JDBCDatabaseCommunicationEngineTest.java  |  14 ++-
 .../query/QueryHeaderBuilderFactoryTest.java       |   4 +-
 .../query/impl/MySQLQueryHeaderBuilderTest.java    | 118 ++++-----------------
 .../impl/OpenGaussQueryHeaderBuilderTest.java      |  10 +-
 .../impl/PostgreSQLQueryHeaderBuilderTest.java     |   8 +-
 15 files changed, 100 insertions(+), 235 deletions(-)

diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/DatabaseCommunicationEngine.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/DatabaseCommunicationEngine.java
index b1531f0a426..aeb37d6744f 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/DatabaseCommunicationEngine.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/DatabaseCommunicationEngine.java
@@ -28,7 +28,6 @@ import org.apache.shardingsphere.infra.binder.statement.dml.SelectStatementConte
 import org.apache.shardingsphere.infra.context.kernel.KernelProcessor;
 import org.apache.shardingsphere.infra.context.refresher.MetaDataRefreshEngine;
 import org.apache.shardingsphere.infra.database.DefaultSchema;
-import org.apache.shardingsphere.infra.database.type.DatabaseType;
 import org.apache.shardingsphere.infra.executor.sql.context.ExecutionContext;
 import org.apache.shardingsphere.infra.executor.sql.execute.result.query.QueryResult;
 import org.apache.shardingsphere.infra.executor.sql.execute.result.update.UpdateResult;
@@ -44,8 +43,7 @@ import org.apache.shardingsphere.proxy.backend.response.data.QueryResponseCell;
 import org.apache.shardingsphere.proxy.backend.response.data.QueryResponseRow;
 import org.apache.shardingsphere.proxy.backend.response.data.impl.BinaryQueryResponseCell;
 import org.apache.shardingsphere.proxy.backend.response.data.impl.TextQueryResponseCell;
-import org.apache.shardingsphere.proxy.backend.response.header.query.QueryHeaderBuilder;
-import org.apache.shardingsphere.proxy.backend.response.header.query.QueryHeaderBuilderFactory;
+import org.apache.shardingsphere.proxy.backend.response.header.query.QueryHeaderBuilderEngine;
 import org.apache.shardingsphere.proxy.backend.response.header.query.QueryResponseHeader;
 import org.apache.shardingsphere.proxy.backend.response.header.query.impl.QueryHeader;
 import org.apache.shardingsphere.proxy.backend.response.header.update.UpdateResponseHeader;
@@ -120,10 +118,9 @@ public abstract class DatabaseCommunicationEngine<T> {
         int columnCount = getColumnCount(executionContext, queryResultSample);
         List<QueryHeader> result = new ArrayList<>(columnCount);
         LazyInitializer<DataNodeContainedRule> dataNodeContainedRule = getDataNodeContainedRuleLazyInitializer(metaData);
-        DatabaseType databaseType = metaData.getResource().getDatabaseType();
-        QueryHeaderBuilder queryHeaderBuilder = QueryHeaderBuilderFactory.getQueryHeaderBuilder(databaseType);
+        QueryHeaderBuilderEngine queryHeaderBuilderEngine = new QueryHeaderBuilderEngine(metaData.getResource().getDatabaseType());
         for (int columnIndex = 1; columnIndex <= columnCount; columnIndex++) {
-            result.add(createQueryHeader(queryHeaderBuilder, executionContext, queryResultSample, metaData, columnIndex, dataNodeContainedRule));
+            result.add(createQueryHeader(queryHeaderBuilderEngine, executionContext, queryResultSample, metaData, columnIndex, dataNodeContainedRule));
         }
         return result;
     }
@@ -138,11 +135,11 @@ public abstract class DatabaseCommunicationEngine<T> {
         };
     }
     
-    protected QueryHeader createQueryHeader(final QueryHeaderBuilder queryHeaderBuilder, final ExecutionContext executionContext, final QueryResult queryResultSample,
+    protected QueryHeader createQueryHeader(final QueryHeaderBuilderEngine queryHeaderBuilderEngine, final ExecutionContext executionContext, final QueryResult queryResultSample,
                                             final ShardingSphereMetaData metaData, final int columnIndex, final LazyInitializer<DataNodeContainedRule> dataNodeContainedRule) throws SQLException {
-        return hasSelectExpandProjections(executionContext.getSqlStatementContext()) ? queryHeaderBuilder.build(
+        return hasSelectExpandProjections(executionContext.getSqlStatementContext()) ? queryHeaderBuilderEngine.build(
                 ((SelectStatementContext) executionContext.getSqlStatementContext()).getProjectionsContext(), queryResultSample.getMetaData(), metaData, columnIndex, dataNodeContainedRule)
-                : queryHeaderBuilder.build(queryResultSample.getMetaData(), metaData, columnIndex, dataNodeContainedRule);
+                : queryHeaderBuilderEngine.build(queryResultSample.getMetaData(), metaData, columnIndex, dataNodeContainedRule);
     }
     
     protected int getColumnCount(final ExecutionContext executionContext, final QueryResult queryResultSample) throws SQLException {
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/JDBCDatabaseCommunicationEngine.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/JDBCDatabaseCommunicationEngine.java
index 113fda36334..f51d0f7d375 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/JDBCDatabaseCommunicationEngine.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/JDBCDatabaseCommunicationEngine.java
@@ -49,8 +49,7 @@ import org.apache.shardingsphere.proxy.backend.communication.jdbc.statement.JDBC
 import org.apache.shardingsphere.proxy.backend.context.BackendExecutorContext;
 import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
 import org.apache.shardingsphere.proxy.backend.response.header.ResponseHeader;
-import org.apache.shardingsphere.proxy.backend.response.header.query.QueryHeaderBuilder;
-import org.apache.shardingsphere.proxy.backend.response.header.query.QueryHeaderBuilderFactory;
+import org.apache.shardingsphere.proxy.backend.response.header.query.QueryHeaderBuilderEngine;
 import org.apache.shardingsphere.proxy.backend.response.header.query.QueryResponseHeader;
 import org.apache.shardingsphere.proxy.backend.response.header.update.UpdateResponseHeader;
 import org.apache.shardingsphere.sharding.merge.dql.iterator.IteratorStreamMergedResult;
@@ -167,9 +166,9 @@ public final class JDBCDatabaseCommunicationEngine extends DatabaseCommunication
         setQueryHeaders(new ArrayList<>(columnCount));
         ShardingSphereMetaData metaData = metaDataContexts.getMetaData(backendConnection.getConnectionSession().getSchemaName());
         LazyInitializer<DataNodeContainedRule> dataNodeContainedRule = getDataNodeContainedRuleLazyInitializer(metaData);
-        QueryHeaderBuilder queryHeaderBuilder = QueryHeaderBuilderFactory.getQueryHeaderBuilder(null == metaData ? null : metaData.getResource().getDatabaseType());
+        QueryHeaderBuilderEngine queryHeaderBuilderEngine = new QueryHeaderBuilderEngine(null == metaData ? null : metaData.getResource().getDatabaseType());
         for (int columnIndex = 1; columnIndex <= columnCount; columnIndex++) {
-            getQueryHeaders().add(queryHeaderBuilder.build(new JDBCQueryResultMetaData(resultSet.getMetaData()), metaData, columnIndex, dataNodeContainedRule));
+            getQueryHeaders().add(queryHeaderBuilderEngine.build(new JDBCQueryResultMetaData(resultSet.getMetaData()), metaData, columnIndex, dataNodeContainedRule));
         }
         setMergedResult(new IteratorStreamMergedResult(Collections.singletonList(new JDBCStreamQueryResult(resultSet))));
         return new QueryResponseHeader(getQueryHeaders());
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/response/header/query/QueryHeaderBuilder.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/response/header/query/QueryHeaderBuilder.java
index 3ac738560ed..c71e96c07cb 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/response/header/query/QueryHeaderBuilder.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/response/header/query/QueryHeaderBuilder.java
@@ -18,65 +18,32 @@
 package org.apache.shardingsphere.proxy.backend.response.header.query;
 
 import org.apache.commons.lang3.concurrent.LazyInitializer;
-import org.apache.shardingsphere.infra.binder.segment.select.projection.DerivedColumn;
-import org.apache.shardingsphere.infra.binder.segment.select.projection.Projection;
-import org.apache.shardingsphere.infra.binder.segment.select.projection.ProjectionsContext;
-import org.apache.shardingsphere.infra.binder.segment.select.projection.impl.ColumnProjection;
-import org.apache.shardingsphere.infra.database.type.DatabaseTypeAwareSPI;
 import org.apache.shardingsphere.infra.executor.sql.execute.result.query.QueryResultMetaData;
 import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import org.apache.shardingsphere.infra.rule.identifier.type.DataNodeContainedRule;
 import org.apache.shardingsphere.proxy.backend.response.header.query.impl.QueryHeader;
+import org.apache.shardingsphere.spi.type.required.RequiredSPI;
+import org.apache.shardingsphere.spi.type.typed.StatelessTypedSPI;
 
 import java.sql.SQLException;
 
 /**
  * Query header builder.
  */
-public abstract class QueryHeaderBuilder implements DatabaseTypeAwareSPI {
+public interface QueryHeaderBuilder extends StatelessTypedSPI, RequiredSPI {
     
     /**
-     * Build query header builder.
-     *
-     * @param queryResultMetaData query result meta data
-     * @param metaData ShardingSphere meta data
-     * @param columnIndex column index 
-     * @param dataNodeContainedRule data node contained rule
-     * @return query header
-     * @throws SQLException SQL exception
-     */
-    public final QueryHeader build(final QueryResultMetaData queryResultMetaData, final ShardingSphereMetaData metaData,
-                                   final int columnIndex, final LazyInitializer<DataNodeContainedRule> dataNodeContainedRule) throws SQLException {
-        return doBuild(queryResultMetaData, metaData, queryResultMetaData.getColumnName(columnIndex), queryResultMetaData.getColumnLabel(columnIndex), columnIndex, dataNodeContainedRule);
-    }
-    
-    /**
-     * Build query header builder.
-     *
-     * @param projectionsContext projections context
+     * Build query header.
+     * 
      * @param queryResultMetaData query result meta data
      * @param metaData ShardingSphere meta data
+     * @param columnName column name
+     * @param columnLabel column label
      * @param columnIndex column index
      * @param dataNodeContainedRule data node contained rule
      * @return query header
      * @throws SQLException SQL exception
      */
-    public final QueryHeader build(final ProjectionsContext projectionsContext, final QueryResultMetaData queryResultMetaData,
-                                    final ShardingSphereMetaData metaData, final int columnIndex, final LazyInitializer<DataNodeContainedRule> dataNodeContainedRule) throws SQLException {
-        return doBuild(queryResultMetaData, metaData, getColumnName(projectionsContext, queryResultMetaData, columnIndex), 
-                getColumnLabel(projectionsContext, queryResultMetaData, columnIndex), columnIndex, dataNodeContainedRule);
-    }
-    
-    private String getColumnLabel(final ProjectionsContext projectionsContext, final QueryResultMetaData queryResultMetaData, final int columnIndex) throws SQLException {
-        Projection projection = projectionsContext.getExpandProjections().get(columnIndex - 1);
-        return DerivedColumn.isDerivedColumnName(projection.getColumnLabel()) ? projection.getExpression() : queryResultMetaData.getColumnLabel(columnIndex);
-    }
-    
-    private String getColumnName(final ProjectionsContext projectionsContext, final QueryResultMetaData queryResultMetaData, final int columnIndex) throws SQLException {
-        Projection projection = projectionsContext.getExpandProjections().get(columnIndex - 1);
-        return projection instanceof ColumnProjection ? ((ColumnProjection) projection).getName() : queryResultMetaData.getColumnName(columnIndex);
-    }
-    
-    protected abstract QueryHeader doBuild(QueryResultMetaData queryResultMetaData, ShardingSphereMetaData metaData, String columnName, String columnLabel, int columnIndex,
-                                           LazyInitializer<DataNodeContainedRule> dataNodeContainedRule) throws SQLException;
+    QueryHeader build(QueryResultMetaData queryResultMetaData, ShardingSphereMetaData metaData,
+                      String columnName, String columnLabel, int columnIndex, LazyInitializer<DataNodeContainedRule> dataNodeContainedRule) throws SQLException;
 }
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/response/header/query/QueryHeaderBuilder.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/response/header/query/QueryHeaderBuilderEngine.java
similarity index 79%
copy from shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/response/header/query/QueryHeaderBuilder.java
copy to shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/response/header/query/QueryHeaderBuilderEngine.java
index 3ac738560ed..509dc56234f 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/response/header/query/QueryHeaderBuilder.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/response/header/query/QueryHeaderBuilderEngine.java
@@ -17,12 +17,13 @@
 
 package org.apache.shardingsphere.proxy.backend.response.header.query;
 
+import lombok.RequiredArgsConstructor;
 import org.apache.commons.lang3.concurrent.LazyInitializer;
 import org.apache.shardingsphere.infra.binder.segment.select.projection.DerivedColumn;
 import org.apache.shardingsphere.infra.binder.segment.select.projection.Projection;
 import org.apache.shardingsphere.infra.binder.segment.select.projection.ProjectionsContext;
 import org.apache.shardingsphere.infra.binder.segment.select.projection.impl.ColumnProjection;
-import org.apache.shardingsphere.infra.database.type.DatabaseTypeAwareSPI;
+import org.apache.shardingsphere.infra.database.type.DatabaseType;
 import org.apache.shardingsphere.infra.executor.sql.execute.result.query.QueryResultMetaData;
 import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import org.apache.shardingsphere.infra.rule.identifier.type.DataNodeContainedRule;
@@ -31,9 +32,12 @@ import org.apache.shardingsphere.proxy.backend.response.header.query.impl.QueryH
 import java.sql.SQLException;
 
 /**
- * Query header builder.
+ * Query header builder engine.
  */
-public abstract class QueryHeaderBuilder implements DatabaseTypeAwareSPI {
+@RequiredArgsConstructor
+public final class QueryHeaderBuilderEngine {
+    
+    private final DatabaseType databaseType;
     
     /**
      * Build query header builder.
@@ -45,9 +49,10 @@ public abstract class QueryHeaderBuilder implements DatabaseTypeAwareSPI {
      * @return query header
      * @throws SQLException SQL exception
      */
-    public final QueryHeader build(final QueryResultMetaData queryResultMetaData, final ShardingSphereMetaData metaData,
+    public QueryHeader build(final QueryResultMetaData queryResultMetaData, final ShardingSphereMetaData metaData,
                                    final int columnIndex, final LazyInitializer<DataNodeContainedRule> dataNodeContainedRule) throws SQLException {
-        return doBuild(queryResultMetaData, metaData, queryResultMetaData.getColumnName(columnIndex), queryResultMetaData.getColumnLabel(columnIndex), columnIndex, dataNodeContainedRule);
+        QueryHeaderBuilder builder = QueryHeaderBuilderFactory.newInstance(databaseType);
+        return builder.build(queryResultMetaData, metaData, queryResultMetaData.getColumnName(columnIndex), queryResultMetaData.getColumnLabel(columnIndex), columnIndex, dataNodeContainedRule);
     }
     
     /**
@@ -61,9 +66,10 @@ public abstract class QueryHeaderBuilder implements DatabaseTypeAwareSPI {
      * @return query header
      * @throws SQLException SQL exception
      */
-    public final QueryHeader build(final ProjectionsContext projectionsContext, final QueryResultMetaData queryResultMetaData,
+    public QueryHeader build(final ProjectionsContext projectionsContext, final QueryResultMetaData queryResultMetaData,
                                     final ShardingSphereMetaData metaData, final int columnIndex, final LazyInitializer<DataNodeContainedRule> dataNodeContainedRule) throws SQLException {
-        return doBuild(queryResultMetaData, metaData, getColumnName(projectionsContext, queryResultMetaData, columnIndex), 
+        QueryHeaderBuilder builder = QueryHeaderBuilderFactory.newInstance(databaseType);
+        return builder.build(queryResultMetaData, metaData, getColumnName(projectionsContext, queryResultMetaData, columnIndex), 
                 getColumnLabel(projectionsContext, queryResultMetaData, columnIndex), columnIndex, dataNodeContainedRule);
     }
     
@@ -76,7 +82,4 @@ public abstract class QueryHeaderBuilder implements DatabaseTypeAwareSPI {
         Projection projection = projectionsContext.getExpandProjections().get(columnIndex - 1);
         return projection instanceof ColumnProjection ? ((ColumnProjection) projection).getName() : queryResultMetaData.getColumnName(columnIndex);
     }
-    
-    protected abstract QueryHeader doBuild(QueryResultMetaData queryResultMetaData, ShardingSphereMetaData metaData, String columnName, String columnLabel, int columnIndex,
-                                           LazyInitializer<DataNodeContainedRule> dataNodeContainedRule) throws SQLException;
 }
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/response/header/query/QueryHeaderBuilderFactory.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/response/header/query/QueryHeaderBuilderFactory.java
index b9ce435475e..a08831149f5 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/response/header/query/QueryHeaderBuilderFactory.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/response/header/query/QueryHeaderBuilderFactory.java
@@ -20,33 +20,27 @@ package org.apache.shardingsphere.proxy.backend.response.header.query;
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
 import org.apache.shardingsphere.infra.database.type.DatabaseType;
-import org.apache.shardingsphere.proxy.backend.response.header.query.impl.MySQLQueryHeaderBuilder;
-
-import java.util.HashMap;
-import java.util.Map;
-import java.util.ServiceLoader;
+import org.apache.shardingsphere.spi.ShardingSphereServiceLoader;
+import org.apache.shardingsphere.spi.type.required.RequiredSPIRegistry;
+import org.apache.shardingsphere.spi.type.typed.TypedSPIRegistry;
 
 /**
- * Factory for {@link QueryHeaderBuilder}.
+ * Query header builder factory.
  */
 @NoArgsConstructor(access = AccessLevel.PRIVATE)
 public final class QueryHeaderBuilderFactory {
     
-    private static final Map<String, QueryHeaderBuilder> QUERY_HEADER_BUILDERS = new HashMap<>();
-    
-    private static final QueryHeaderBuilder DEFAULT_QUERY_HEADER_BUILDER = new MySQLQueryHeaderBuilder();
-    
     static {
-        ServiceLoader.load(QueryHeaderBuilder.class).forEach(each -> QUERY_HEADER_BUILDERS.put(each.getDatabaseType(), each));
+        ShardingSphereServiceLoader.register(QueryHeaderBuilder.class);
     }
     
     /**
-     * Get {@link QueryHeaderBuilder} for specified database type.
+     * Create new instance of query header builder.
      *
      * @param databaseType database type
-     * @return query header builder
+     * @return new instance of query header builder
      */
-    public static QueryHeaderBuilder getQueryHeaderBuilder(final DatabaseType databaseType) {
-        return QUERY_HEADER_BUILDERS.getOrDefault(null == databaseType ? null : databaseType.getName(), DEFAULT_QUERY_HEADER_BUILDER);
+    public static QueryHeaderBuilder newInstance(final DatabaseType databaseType) {
+        return TypedSPIRegistry.findRegisteredService(QueryHeaderBuilder.class, databaseType.getName()).orElseGet(() -> RequiredSPIRegistry.getRegisteredService(QueryHeaderBuilder.class));
     }
 }
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/response/header/query/impl/MySQLQueryHeaderBuilder.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/response/header/query/impl/MySQLQueryHeaderBuilder.java
index 1ca80230d4f..5548a294f0e 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/response/header/query/impl/MySQLQueryHeaderBuilder.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/response/header/query/impl/MySQLQueryHeaderBuilder.java
@@ -20,7 +20,6 @@ package org.apache.shardingsphere.proxy.backend.response.header.query.impl;
 import lombok.SneakyThrows;
 import org.apache.commons.lang3.concurrent.ConcurrentException;
 import org.apache.commons.lang3.concurrent.LazyInitializer;
-import org.apache.shardingsphere.infra.database.type.dialect.MySQLDatabaseType;
 import org.apache.shardingsphere.infra.executor.sql.execute.result.query.QueryResultMetaData;
 import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import org.apache.shardingsphere.infra.metadata.schema.model.ColumnMetaData;
@@ -34,17 +33,12 @@ import java.util.Optional;
 /**
  * QueryHeaderBuilder for MySQL.
  */
-public final class MySQLQueryHeaderBuilder extends QueryHeaderBuilder {
-    
-    @Override
-    public String getDatabaseType() {
-        return new MySQLDatabaseType().getName();
-    }
+public final class MySQLQueryHeaderBuilder implements QueryHeaderBuilder {
     
     @SneakyThrows(ConcurrentException.class)
     @Override
-    protected QueryHeader doBuild(final QueryResultMetaData queryResultMetaData, final ShardingSphereMetaData metaData, final String columnName, final String columnLabel, 
-                                  final int columnIndex, final LazyInitializer<DataNodeContainedRule> dataNodeContainedRule) throws SQLException {
+    public QueryHeader build(final QueryResultMetaData queryResultMetaData, final ShardingSphereMetaData metaData, final String columnName, final String columnLabel,
+                             final int columnIndex, final LazyInitializer<DataNodeContainedRule> dataNodeContainedRule) throws SQLException {
         String schemaName = null == metaData ? "" : metaData.getName();
         String actualTableName = queryResultMetaData.getTableName(columnIndex);
         String tableName;
@@ -66,4 +60,14 @@ public final class MySQLQueryHeaderBuilder extends QueryHeaderBuilder {
         boolean autoIncrement = queryResultMetaData.isAutoIncrement(columnIndex);
         return new QueryHeader(schemaName, tableName, columnLabel, columnName, columnType, columnTypeName, columnLength, decimals, signed, primaryKey, notNull, autoIncrement);
     }
+    
+    @Override
+    public String getType() {
+        return "MySQL";
+    }
+    
+    @Override
+    public boolean isDefault() {
+        return true;
+    }
 }
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/response/header/query/impl/OpenGaussQueryHeaderBuilder.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/response/header/query/impl/OpenGaussQueryHeaderBuilder.java
index 680789f002a..e17f82aef2c 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/response/header/query/impl/OpenGaussQueryHeaderBuilder.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/response/header/query/impl/OpenGaussQueryHeaderBuilder.java
@@ -18,7 +18,6 @@
 package org.apache.shardingsphere.proxy.backend.response.header.query.impl;
 
 import org.apache.commons.lang3.concurrent.LazyInitializer;
-import org.apache.shardingsphere.infra.database.type.dialect.OpenGaussDatabaseType;
 import org.apache.shardingsphere.infra.executor.sql.execute.result.query.QueryResultMetaData;
 import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import org.apache.shardingsphere.infra.rule.identifier.type.DataNodeContainedRule;
@@ -29,18 +28,18 @@ import java.sql.SQLException;
 /**
  * QueryHeaderBuilder for openGauss.
  */
-public final class OpenGaussQueryHeaderBuilder extends QueryHeaderBuilder {
+public final class OpenGaussQueryHeaderBuilder implements QueryHeaderBuilder {
     
     private final PostgreSQLQueryHeaderBuilder delegated = new PostgreSQLQueryHeaderBuilder();
     
     @Override
-    public String getDatabaseType() {
-        return new OpenGaussDatabaseType().getName();
+    public QueryHeader build(final QueryResultMetaData queryResultMetaData, final ShardingSphereMetaData metaData, final String columnName, final String columnLabel,
+                             final int columnIndex, final LazyInitializer<DataNodeContainedRule> dataNodeContainedRule) throws SQLException {
+        return delegated.build(queryResultMetaData, metaData, columnName, columnLabel, columnIndex, dataNodeContainedRule);
     }
     
     @Override
-    protected QueryHeader doBuild(final QueryResultMetaData queryResultMetaData, final ShardingSphereMetaData metaData, final String columnName, final String columnLabel, 
-                                  final int columnIndex, final LazyInitializer<DataNodeContainedRule> dataNodeContainedRule) throws SQLException {
-        return delegated.doBuild(queryResultMetaData, metaData, columnName, columnLabel, columnIndex, dataNodeContainedRule);
+    public String getType() {
+        return "openGauss";
     }
 }
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/response/header/query/impl/PostgreSQLQueryHeaderBuilder.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/response/header/query/impl/PostgreSQLQueryHeaderBuilder.java
index f15b8d5d767..76570c4f891 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/response/header/query/impl/PostgreSQLQueryHeaderBuilder.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/response/header/query/impl/PostgreSQLQueryHeaderBuilder.java
@@ -18,7 +18,6 @@
 package org.apache.shardingsphere.proxy.backend.response.header.query.impl;
 
 import org.apache.commons.lang3.concurrent.LazyInitializer;
-import org.apache.shardingsphere.infra.database.type.dialect.PostgreSQLDatabaseType;
 import org.apache.shardingsphere.infra.executor.sql.execute.result.query.QueryResultMetaData;
 import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import org.apache.shardingsphere.infra.rule.identifier.type.DataNodeContainedRule;
@@ -29,7 +28,7 @@ import java.sql.SQLException;
 /**
  * QueryHeaderBuilder for PostgreSQL.
  */
-public final class PostgreSQLQueryHeaderBuilder extends QueryHeaderBuilder {
+public final class PostgreSQLQueryHeaderBuilder implements QueryHeaderBuilder {
     
     private static final int UNUSED_INT_FIELD = 0;
     
@@ -38,17 +37,17 @@ public final class PostgreSQLQueryHeaderBuilder extends QueryHeaderBuilder {
     private static final boolean UNUSED_BOOLEAN_FIELD = false;
     
     @Override
-    public String getDatabaseType() {
-        return new PostgreSQLDatabaseType().getName();
-    }
-    
-    @Override
-    protected QueryHeader doBuild(final QueryResultMetaData queryResultMetaData, final ShardingSphereMetaData metaData, final String columnName, final String columnLabel,
-                                  final int columnIndex, final LazyInitializer<DataNodeContainedRule> unused) throws SQLException {
+    public QueryHeader build(final QueryResultMetaData queryResultMetaData, final ShardingSphereMetaData metaData, final String columnName, final String columnLabel,
+                             final int columnIndex, final LazyInitializer<DataNodeContainedRule> unused) throws SQLException {
         int columnType = queryResultMetaData.getColumnType(columnIndex);
         String columnTypeName = queryResultMetaData.getColumnTypeName(columnIndex);
         int columnLength = queryResultMetaData.getColumnLength(columnIndex);
         return new QueryHeader(UNUSED_STRING_FIELD, UNUSED_STRING_FIELD, columnLabel, UNUSED_STRING_FIELD, columnType, columnTypeName, columnLength,
                 UNUSED_INT_FIELD, UNUSED_BOOLEAN_FIELD, UNUSED_BOOLEAN_FIELD, UNUSED_BOOLEAN_FIELD, UNUSED_BOOLEAN_FIELD);
     }
+    
+    @Override
+    public String getType() {
+        return "PostgreSQL";
+    }
 }
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/DatabaseAdminQueryBackendHandler.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/DatabaseAdminQueryBackendHandler.java
index 3b76c40fd00..3b59defcd04 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/DatabaseAdminQueryBackendHandler.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/DatabaseAdminQueryBackendHandler.java
@@ -26,8 +26,7 @@ import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import org.apache.shardingsphere.infra.rule.identifier.type.DataNodeContainedRule;
 import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
 import org.apache.shardingsphere.proxy.backend.response.header.ResponseHeader;
-import org.apache.shardingsphere.proxy.backend.response.header.query.QueryHeaderBuilder;
-import org.apache.shardingsphere.proxy.backend.response.header.query.QueryHeaderBuilderFactory;
+import org.apache.shardingsphere.proxy.backend.response.header.query.QueryHeaderBuilderEngine;
 import org.apache.shardingsphere.proxy.backend.response.header.query.QueryResponseHeader;
 import org.apache.shardingsphere.proxy.backend.response.header.query.impl.QueryHeader;
 import org.apache.shardingsphere.proxy.backend.session.ConnectionSession;
@@ -66,10 +65,10 @@ public final class DatabaseAdminQueryBackendHandler implements TextProtocolBacke
         List<QueryHeader> result = new ArrayList<>(queryResultMetaData.getColumnCount());
         ShardingSphereMetaData metaData = null == connectionSession.getSchemaName() ? null : ProxyContext.getInstance().getMetaData(connectionSession.getSchemaName());
         DatabaseType databaseType = null == metaData ? null : ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaData(metaData.getName()).getResource().getDatabaseType();
-        QueryHeaderBuilder queryHeaderBuilder = QueryHeaderBuilderFactory.getQueryHeaderBuilder(databaseType);
+        QueryHeaderBuilderEngine queryHeaderBuilderEngine = new QueryHeaderBuilderEngine(databaseType);
         LazyInitializer<DataNodeContainedRule> dataNodeContainedRule = getDataNodeContainedRuleLazyInitializer(metaData);
         for (int columnIndex = 1; columnIndex <= queryResultMetaData.getColumnCount(); columnIndex++) {
-            result.add(queryHeaderBuilder.build(queryResultMetaData, metaData, columnIndex, dataNodeContainedRule));
+            result.add(queryHeaderBuilderEngine.build(queryResultMetaData, metaData, columnIndex, dataNodeContainedRule));
         }
         return result;
     }
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/resources/META-INF/services/org.apache.shardingsphere.proxy.backend.response.header.query.QueryHeaderBuilder b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/resources/META-INF/services/org.apache.shardingsphere.proxy.backend.response.header.query.QueryHeaderBuilder
index 2911a5e05fb..bed1e967f37 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/resources/META-INF/services/org.apache.shardingsphere.proxy.backend.response.header.query.QueryHeaderBuilder
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/resources/META-INF/services/org.apache.shardingsphere.proxy.backend.response.header.query.QueryHeaderBuilder
@@ -15,6 +15,6 @@
 # limitations under the License.
 #
 
-org.apache.shardingsphere.proxy.backend.response.header.query.impl.MySQLQueryHeaderBuilder
 org.apache.shardingsphere.proxy.backend.response.header.query.impl.PostgreSQLQueryHeaderBuilder
+org.apache.shardingsphere.proxy.backend.response.header.query.impl.MySQLQueryHeaderBuilder
 org.apache.shardingsphere.proxy.backend.response.header.query.impl.OpenGaussQueryHeaderBuilder
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/JDBCDatabaseCommunicationEngineTest.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/JDBCDatabaseCommunicationEngineTest.java
index 78952ec44d8..7a68ce83e03 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/JDBCDatabaseCommunicationEngineTest.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/JDBCDatabaseCommunicationEngineTest.java
@@ -18,11 +18,11 @@
 package org.apache.shardingsphere.proxy.backend.communication.jdbc;
 
 import lombok.SneakyThrows;
-import org.apache.commons.lang3.concurrent.ConcurrentException;
 import org.apache.commons.lang3.concurrent.LazyInitializer;
 import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
 import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
 import org.apache.shardingsphere.infra.database.type.dialect.H2DatabaseType;
+import org.apache.shardingsphere.infra.database.type.dialect.MySQLDatabaseType;
 import org.apache.shardingsphere.infra.executor.kernel.ExecutorEngine;
 import org.apache.shardingsphere.infra.executor.sql.execute.result.query.QueryResult;
 import org.apache.shardingsphere.infra.executor.sql.execute.result.query.QueryResultMetaData;
@@ -44,7 +44,7 @@ import org.apache.shardingsphere.proxy.backend.communication.DatabaseCommunicati
 import org.apache.shardingsphere.proxy.backend.communication.DatabaseCommunicationEngineFactory;
 import org.apache.shardingsphere.proxy.backend.communication.jdbc.connection.JDBCBackendConnection;
 import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
-import org.apache.shardingsphere.proxy.backend.response.header.query.impl.MySQLQueryHeaderBuilder;
+import org.apache.shardingsphere.proxy.backend.response.header.query.QueryHeaderBuilderEngine;
 import org.apache.shardingsphere.sharding.rule.ShardingRule;
 import org.junit.Before;
 import org.junit.Test;
@@ -118,17 +118,15 @@ public final class JDBCDatabaseCommunicationEngineTest {
         assertThat(engine, instanceOf(DatabaseCommunicationEngine.class));
         Field queryHeadersField = DatabaseCommunicationEngine.class.getDeclaredField("queryHeaders");
         ShardingSphereMetaData metaData = createMetaData();
-        FieldSetter.setField(engine, queryHeadersField, Collections.singletonList(new MySQLQueryHeaderBuilder().build(createQueryResultMetaData(), metaData, 1, getDataNodeContainedRule(metaData))));
+        FieldSetter.setField(engine, queryHeadersField, Collections.singletonList(
+                new QueryHeaderBuilderEngine(new MySQLDatabaseType()).build(createQueryResultMetaData(), metaData, 1, getDataNodeContainedRule(metaData))));
         Field mergedResultField = DatabaseCommunicationEngine.class.getDeclaredField("mergedResult");
         FieldSetter.setField(engine, mergedResultField, new MemoryMergedResult<ShardingSphereRule>(null, null, null, Collections.emptyList()) {
             
-            private MemoryQueryResultRow memoryQueryResultRow;
-            
             @Override
             protected List<MemoryQueryResultRow> init(final ShardingSphereRule rule, final ShardingSphereSchema schema,
                                                       final SQLStatementContext<?> sqlStatementContext, final List<QueryResult> queryResults) {
-                memoryQueryResultRow = mock(MemoryQueryResultRow.class);
-                return Collections.singletonList(memoryQueryResultRow);
+                return Collections.singletonList(mock(MemoryQueryResultRow.class));
             }
         });
         Exception ex = null;
@@ -171,7 +169,7 @@ public final class JDBCDatabaseCommunicationEngineTest {
         return new LazyInitializer<DataNodeContainedRule>() {
             
             @Override
-            protected DataNodeContainedRule initialize() throws ConcurrentException {
+            protected DataNodeContainedRule initialize() {
                 return (DataNodeContainedRule) metaData.getRuleMetaData().getRules().stream().filter(each -> each instanceof DataNodeContainedRule).findFirst().orElse(null);
             }
         };
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/response/header/query/QueryHeaderBuilderFactoryTest.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/response/header/query/QueryHeaderBuilderFactoryTest.java
index 67f7961fa2b..18f3a53f907 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/response/header/query/QueryHeaderBuilderFactoryTest.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/response/header/query/QueryHeaderBuilderFactoryTest.java
@@ -29,13 +29,13 @@ public final class QueryHeaderBuilderFactoryTest {
     
     @Test
     public void assertImplementedDatabaseType() {
-        QueryHeaderBuilder actual = QueryHeaderBuilderFactory.getQueryHeaderBuilder(new PostgreSQLDatabaseType());
+        QueryHeaderBuilder actual = QueryHeaderBuilderFactory.newInstance(new PostgreSQLDatabaseType());
         assertTrue(actual instanceof PostgreSQLQueryHeaderBuilder);
     }
     
     @Test
     public void assertUnsupportedDatabaseType() {
-        QueryHeaderBuilder actual = QueryHeaderBuilderFactory.getQueryHeaderBuilder(new OracleDatabaseType());
+        QueryHeaderBuilder actual = QueryHeaderBuilderFactory.newInstance(new OracleDatabaseType());
         assertTrue(actual instanceof MySQLQueryHeaderBuilder);
     }
 }
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/response/header/query/impl/MySQLQueryHeaderBuilderTest.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/response/header/query/impl/MySQLQueryHeaderBuilderTest.java
index 3641d39d67a..d00944a782a 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/response/header/query/impl/MySQLQueryHeaderBuilderTest.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/response/header/query/impl/MySQLQueryHeaderBuilderTest.java
@@ -18,11 +18,7 @@
 package org.apache.shardingsphere.proxy.backend.response.header.query.impl;
 
 import org.apache.commons.lang3.concurrent.LazyInitializer;
-import org.apache.shardingsphere.infra.binder.segment.select.projection.ProjectionsContext;
-import org.apache.shardingsphere.infra.binder.segment.select.projection.impl.ColumnProjection;
-import org.apache.shardingsphere.infra.binder.segment.select.projection.impl.ExpressionProjection;
 import org.apache.shardingsphere.infra.database.metadata.DataSourceMetaData;
-import org.apache.shardingsphere.infra.database.type.dialect.MySQLDatabaseType;
 import org.apache.shardingsphere.infra.executor.sql.execute.result.query.QueryResultMetaData;
 import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import org.apache.shardingsphere.infra.metadata.resource.DataSourcesMetaData;
@@ -37,7 +33,6 @@ import org.junit.Test;
 
 import java.sql.SQLException;
 import java.sql.Types;
-import java.util.Arrays;
 import java.util.Collections;
 import java.util.Optional;
 
@@ -54,118 +49,45 @@ public final class MySQLQueryHeaderBuilderTest {
     private final QueryHeaderBuilder queryHeaderBuilder = new MySQLQueryHeaderBuilder();
     
     @Test
-    public void assertGetDatabaseType() {
-        assertThat(queryHeaderBuilder.getDatabaseType(), is(new MySQLDatabaseType().getName()));
-    }
-    
-    @Test
-    public void assertQueryHeaderSchema() throws SQLException {
+    public void assertBuild() throws SQLException {
+        QueryResultMetaData queryResultMetaData = createQueryResultMetaData();
         ShardingSphereMetaData metaData = createMetaData();
-        QueryHeader actual = queryHeaderBuilder.build(createQueryResultMetaData(), metaData, 1, getDataNodeContainedRule(metaData));
+        QueryHeader actual = queryHeaderBuilder.build(
+                queryResultMetaData, metaData, queryResultMetaData.getColumnName(1), queryResultMetaData.getColumnLabel(1), 1, getDataNodeContainedRule(metaData));
         assertThat(actual.getSchema(), is("sharding_schema"));
-    }
-    
-    @Test
-    public void assertQueryHeaderTable() throws SQLException {
-        ShardingSphereMetaData metaData = createMetaData();
-        QueryHeader actual = queryHeaderBuilder.build(createQueryResultMetaData(), metaData, 1, getDataNodeContainedRule(metaData));
         assertThat(actual.getTable(), is("t_logic_order"));
-    }
-    
-    @Test
-    public void assertQueryHeaderColumnLabel() throws SQLException {
-        ShardingSphereMetaData metaData = createMetaData();
-        QueryHeader actual = queryHeaderBuilder.build(createQueryResultMetaData(), metaData, 1, getDataNodeContainedRule(metaData));
         assertThat(actual.getColumnLabel(), is("order_id"));
-    }
-    
-    @Test
-    public void assertQueryHeaderColumnNameWithoutProjectionsContext() throws SQLException {
-        ShardingSphereMetaData metaData = createMetaData();
-        QueryHeader actual = queryHeaderBuilder.build(createQueryResultMetaData(), metaData, 1, getDataNodeContainedRule(metaData));
         assertThat(actual.getColumnName(), is("order_id"));
-    }
-    
-    @Test
-    public void assertQueryHeaderColumnNameFromProjectionsContext() throws SQLException {
-        ShardingSphereMetaData metaData = createMetaData();
-        QueryHeader actual = queryHeaderBuilder.build(createProjectionsContext(), createQueryResultMetaData(), metaData, 1, getDataNodeContainedRule(metaData));
-        assertThat(actual.getColumnName(), is("order_id"));
-    }
-    
-    @Test
-    public void assertQueryHeaderColumnNameFromMetaData() throws SQLException {
-        ShardingSphereMetaData metaData = createMetaData();
-        QueryHeader actual = queryHeaderBuilder.build(createProjectionsContext(), createQueryResultMetaData(), metaData, 2, getDataNodeContainedRule(metaData));
-        assertThat(actual.getColumnName(), is("expr"));
-    }
-    
-    @Test
-    public void assertQueryHeaderColumnLength() throws SQLException {
-        ShardingSphereMetaData metaData = createMetaData();
-        QueryHeader actual = queryHeaderBuilder.build(createQueryResultMetaData(), metaData, 1, getDataNodeContainedRule(metaData));
         assertThat(actual.getColumnLength(), is(1));
-    }
-    
-    @Test
-    public void assertQueryHeaderColumnType() throws SQLException {
-        ShardingSphereMetaData metaData = createMetaData();
-        QueryHeader actual = queryHeaderBuilder.build(createQueryResultMetaData(), metaData, 1, getDataNodeContainedRule(metaData));
         assertThat(actual.getColumnType(), is(Types.INTEGER));
-    }
-    
-    @Test
-    public void assertQueryHeaderDecimals() throws SQLException {
-        ShardingSphereMetaData metaData = createMetaData();
-        QueryHeader actual = queryHeaderBuilder.build(createQueryResultMetaData(), metaData, 1, getDataNodeContainedRule(metaData));
         assertThat(actual.getDecimals(), is(1));
-    }
-    
-    @Test
-    public void assertQueryHeaderSigned() throws SQLException {
-        ShardingSphereMetaData metaData = createMetaData();
-        QueryHeader actual = queryHeaderBuilder.build(createQueryResultMetaData(), metaData, 1, getDataNodeContainedRule(metaData));
         assertTrue(actual.isSigned());
-    }
-    
-    @Test
-    public void assertQueryHeaderPrimaryKey() throws SQLException {
-        ShardingSphereMetaData metaData = createMetaData();
-        QueryHeader actual = queryHeaderBuilder.build(createQueryResultMetaData(), metaData, 1, getDataNodeContainedRule(metaData));
         assertTrue(actual.isPrimaryKey());
+        assertTrue(actual.isNotNull());
+        assertTrue(actual.isAutoIncrement());
     }
     
     @Test
     public void assertQueryHeaderPrimaryKeyWithoutColumn() throws SQLException {
+        QueryResultMetaData queryResultMetaData = createQueryResultMetaData();
         ShardingSphereMetaData metaData = createMetaData();
-        QueryHeader actual = queryHeaderBuilder.build(createQueryResultMetaData(), metaData, 2, getDataNodeContainedRule(metaData));
+        QueryHeader actual = queryHeaderBuilder.build(
+                queryResultMetaData, metaData, queryResultMetaData.getColumnName(2), queryResultMetaData.getColumnLabel(2), 2, getDataNodeContainedRule(metaData));
         assertFalse(actual.isPrimaryKey());
     }
     
-    @Test
-    public void assertQueryHeaderNotNull() throws SQLException {
-        ShardingSphereMetaData metaData = createMetaData();
-        QueryHeader actual = queryHeaderBuilder.build(createQueryResultMetaData(), metaData, 1, getDataNodeContainedRule(metaData));
-        assertTrue(actual.isNotNull());
-    }
-    
-    @Test
-    public void assertQueryHeaderAutoIncrement() throws SQLException {
-        ShardingSphereMetaData metaData = createMetaData();
-        QueryHeader actual = queryHeaderBuilder.build(createQueryResultMetaData(), metaData, 1, getDataNodeContainedRule(metaData));
-        assertTrue(actual.isAutoIncrement());
-    }
-    
     @Test
     public void assertDataNodeContainedRuleIsNotPresent() throws SQLException {
+        QueryResultMetaData queryResultMetaData = createQueryResultMetaData();
         ShardingSphereMetaData metaData = createMetaData();
-        QueryHeader actual = queryHeaderBuilder.build(createQueryResultMetaData(), metaData, 1, new LazyInitializer<DataNodeContainedRule>() {
-            
-            @Override
-            protected DataNodeContainedRule initialize() {
-                return null;
-            }
-        });
+        QueryHeader actual = queryHeaderBuilder.build(queryResultMetaData, metaData, queryResultMetaData.getColumnName(1), queryResultMetaData.getColumnLabel(1), 1, 
+                new LazyInitializer<DataNodeContainedRule>() {
+                    
+                    @Override
+                    protected DataNodeContainedRule initialize() {
+                        return null;
+                    }
+                });
         assertFalse(actual.isPrimaryKey());
         assertThat(actual.getTable(), is("t_order"));
     }
@@ -187,10 +109,6 @@ public final class MySQLQueryHeaderBuilderTest {
         return result;
     }
     
-    private ProjectionsContext createProjectionsContext() {
-        return new ProjectionsContext(0, 0, false, Arrays.asList(new ColumnProjection("o", "order_id", "id"), new ExpressionProjection("o.order_id + 1", "expr")));
-    }
-    
     private QueryResultMetaData createQueryResultMetaData() throws SQLException {
         QueryResultMetaData result = mock(QueryResultMetaData.class);
         when(result.getTableName(1)).thenReturn("t_order");
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/response/header/query/impl/OpenGaussQueryHeaderBuilderTest.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/response/header/query/impl/OpenGaussQueryHeaderBuilderTest.java
index c4f04e4e7ad..982051a07e9 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/response/header/query/impl/OpenGaussQueryHeaderBuilderTest.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/response/header/query/impl/OpenGaussQueryHeaderBuilderTest.java
@@ -17,7 +17,6 @@
 
 package org.apache.shardingsphere.proxy.backend.response.header.query.impl;
 
-import org.apache.shardingsphere.infra.database.type.dialect.OpenGaussDatabaseType;
 import org.apache.shardingsphere.infra.executor.sql.execute.result.query.QueryResultMetaData;
 import org.junit.Test;
 
@@ -31,11 +30,6 @@ import static org.mockito.Mockito.when;
 
 public final class OpenGaussQueryHeaderBuilderTest {
     
-    @Test
-    public void assertDatabaseType() {
-        assertThat(new OpenGaussQueryHeaderBuilder().getDatabaseType(), is(new OpenGaussDatabaseType().getName()));
-    }
-    
     @Test
     public void assertBuildOpenGaussQueryHeader() throws SQLException {
         final int columnIndex = 1;
@@ -44,8 +38,8 @@ public final class OpenGaussQueryHeaderBuilderTest {
         when(queryResultMetaData.getColumnType(columnIndex)).thenReturn(Types.INTEGER);
         when(queryResultMetaData.getColumnTypeName(columnIndex)).thenReturn("int");
         when(queryResultMetaData.getColumnLength(columnIndex)).thenReturn(11);
-        QueryHeader expected = new PostgreSQLQueryHeaderBuilder().doBuild(queryResultMetaData, null, null, queryResultMetaData.getColumnLabel(columnIndex), columnIndex, null);
-        QueryHeader actual = new OpenGaussQueryHeaderBuilder().doBuild(queryResultMetaData, null, null, queryResultMetaData.getColumnLabel(columnIndex), columnIndex, null);
+        QueryHeader expected = new PostgreSQLQueryHeaderBuilder().build(queryResultMetaData, null, null, queryResultMetaData.getColumnLabel(columnIndex), columnIndex, null);
+        QueryHeader actual = new OpenGaussQueryHeaderBuilder().build(queryResultMetaData, null, null, queryResultMetaData.getColumnLabel(columnIndex), columnIndex, null);
         assertThat(actual.getColumnLabel(), is(expected.getColumnLabel()));
         assertThat(actual.getColumnType(), is(expected.getColumnType()));
         assertThat(actual.getColumnTypeName(), is(expected.getColumnTypeName()));
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/response/header/query/impl/PostgreSQLQueryHeaderBuilderTest.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/response/header/query/impl/PostgreSQLQueryHeaderBuilderTest.java
index 755ff182ec8..8bc9295b224 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/response/header/query/impl/PostgreSQLQueryHeaderBuilderTest.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/response/header/query/impl/PostgreSQLQueryHeaderBuilderTest.java
@@ -17,7 +17,6 @@
 
 package org.apache.shardingsphere.proxy.backend.response.header.query.impl;
 
-import org.apache.shardingsphere.infra.database.type.dialect.PostgreSQLDatabaseType;
 import org.apache.shardingsphere.infra.executor.sql.execute.result.query.QueryResultMetaData;
 import org.junit.Test;
 
@@ -39,15 +38,10 @@ public final class PostgreSQLQueryHeaderBuilderTest {
         when(queryResultMetaData.getColumnType(columnIndex)).thenReturn(Types.INTEGER);
         when(queryResultMetaData.getColumnTypeName(columnIndex)).thenReturn("int");
         when(queryResultMetaData.getColumnLength(columnIndex)).thenReturn(11);
-        QueryHeader actual = new PostgreSQLQueryHeaderBuilder().doBuild(queryResultMetaData, null, null, queryResultMetaData.getColumnLabel(columnIndex), columnIndex, null);
+        QueryHeader actual = new PostgreSQLQueryHeaderBuilder().build(queryResultMetaData, null, null, queryResultMetaData.getColumnLabel(columnIndex), columnIndex, null);
         assertThat(actual.getColumnLabel(), is("label"));
         assertThat(actual.getColumnType(), is(Types.INTEGER));
         assertThat(actual.getColumnTypeName(), is("int"));
         assertThat(actual.getColumnLength(), is(11));
     }
-    
-    @Test
-    public void assertDatabaseType() {
-        assertThat(new PostgreSQLQueryHeaderBuilder().getDatabaseType(), is(new PostgreSQLDatabaseType().getName()));
-    }
 }