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 08eb9ebf5cc Use dialect row loader to load resultSet when use JDBCMemoryQueryResult (#15457) 08eb9ebf5cc is described below commit 08eb9ebf5cc5185d7546b84303f43e8a34752c99 Author: SirMin <1064919...@qq.com> AuthorDate: Thu May 19 22:46:52 2022 +0800 Use dialect row loader to load resultSet when use JDBCMemoryQueryResult (#15457) * dialect load jdbc rows * dialect load jdbc rows * dialect load jdbc rows * fix review suggestion Co-authored-by: tuichenchuxin <chuxinche...@qq.com> --- .../engine/driver/jdbc/JDBCExecutorCallback.java | 2 + .../jdbc/type/memory/JDBCMemoryQueryResult.java | 6 ++- .../AbstractJDBCRowsLoader.java} | 42 ++++++--------- .../DefaultRowsLoader.java} | 24 ++++++--- .../loader/DialectJDBCRowsLoaderFactory.java | 46 ++++++++++++++++ .../JDBCRowsLoader.java} | 26 ++++++--- .../MySQLRowsLoader.java} | 29 +++++++--- ...l.driver.jdbc.type.memory.loader.JDBCRowsLoader | 19 +++++++ .../type/memory/JDBCMemoryQueryResultTest.java | 62 ++++++++++++---------- .../table/FilterableTableScanExecutor.java | 6 +-- .../executor/callback/ExecuteQueryCallback.java | 2 +- .../callback/ProxyJDBCExecutorCallback.java | 2 +- .../opengauss/OpenGaussSelectDatabaseExecutor.java | 2 +- .../OpenGaussSelectDatabaseExecutorTest.java | 6 ++- 14 files changed, 186 insertions(+), 88 deletions(-) diff --git a/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/execute/engine/driver/jdbc/JDBCExecutorCallback.java b/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/execute/engine/driver/jdbc/JDBCExecutorCallback.java index 857b9d84c5d..e6b3d2bdac8 100644 --- a/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/execute/engine/driver/jdbc/JDBCExecutorCallback.java +++ b/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/execute/engine/driver/jdbc/JDBCExecutorCallback.java @@ -17,6 +17,7 @@ package org.apache.shardingsphere.infra.executor.sql.execute.engine.driver.jdbc; +import lombok.Getter; import lombok.RequiredArgsConstructor; import org.apache.shardingsphere.infra.database.metadata.DataSourceMetaData; import org.apache.shardingsphere.infra.database.type.DatabaseType; @@ -50,6 +51,7 @@ public abstract class JDBCExecutorCallback<T> implements ExecutorCallback<JDBCEx private static final Map<String, DataSourceMetaData> CACHED_DATASOURCE_METADATA = new ConcurrentHashMap<>(); + @Getter private final DatabaseType databaseType; private final SQLStatement sqlStatement; diff --git a/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/execute/result/query/impl/driver/jdbc/type/memory/JDBCMemoryQueryResult.java b/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/execute/result/query/impl/driver/jdbc/type/memory/JDBCMemoryQueryResult.java index 1b00f1f8048..f6024989569 100644 --- a/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/execute/result/query/impl/driver/jdbc/type/memory/JDBCMemoryQueryResult.java +++ b/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/execute/result/query/impl/driver/jdbc/type/memory/JDBCMemoryQueryResult.java @@ -17,7 +17,9 @@ package org.apache.shardingsphere.infra.executor.sql.execute.result.query.impl.driver.jdbc.type.memory; +import org.apache.shardingsphere.infra.database.type.DatabaseType; import org.apache.shardingsphere.infra.executor.sql.execute.result.query.impl.driver.jdbc.metadata.JDBCQueryResultMetaData; +import org.apache.shardingsphere.infra.executor.sql.execute.result.query.impl.driver.jdbc.type.memory.loader.DialectJDBCRowsLoaderFactory; import org.apache.shardingsphere.infra.executor.sql.execute.result.query.type.memory.AbstractMemoryQueryResult; import java.sql.ResultSet; @@ -28,7 +30,7 @@ import java.sql.SQLException; */ public final class JDBCMemoryQueryResult extends AbstractMemoryQueryResult { - public JDBCMemoryQueryResult(final ResultSet resultSet) throws SQLException { - super(new JDBCQueryResultMetaData(resultSet.getMetaData()), JDBCRowsLoader.load(resultSet.getMetaData().getColumnCount(), resultSet).iterator()); + public JDBCMemoryQueryResult(final ResultSet resultSet, final DatabaseType databaseType) throws SQLException { + super(new JDBCQueryResultMetaData(resultSet.getMetaData()), DialectJDBCRowsLoaderFactory.getInstance(databaseType).load(resultSet.getMetaData().getColumnCount(), resultSet).iterator()); } } diff --git a/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/execute/result/query/impl/driver/jdbc/type/memory/JDBCRowsLoader.java b/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/execute/result/query/impl/driver/jdbc/type/memory/loader/AbstractJDBCRowsLoader.java similarity index 76% rename from shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/execute/result/query/impl/driver/jdbc/type/memory/JDBCRowsLoader.java rename to shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/execute/result/query/impl/driver/jdbc/type/memory/loader/AbstractJDBCRowsLoader.java index 2ecc55be212..ff94c16cec0 100644 --- a/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/execute/result/query/impl/driver/jdbc/type/memory/JDBCRowsLoader.java +++ b/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/execute/result/query/impl/driver/jdbc/type/memory/loader/AbstractJDBCRowsLoader.java @@ -15,10 +15,8 @@ * limitations under the License. */ -package org.apache.shardingsphere.infra.executor.sql.execute.result.query.impl.driver.jdbc.type.memory; +package org.apache.shardingsphere.infra.executor.sql.execute.result.query.impl.driver.jdbc.type.memory.loader; -import lombok.AccessLevel; -import lombok.NoArgsConstructor; import org.apache.shardingsphere.infra.executor.sql.execute.result.query.type.memory.row.MemoryQueryResultDataRow; import java.math.BigDecimal; @@ -32,22 +30,12 @@ import java.util.LinkedList; import java.util.List; /** - * JDBC rows loader. + * Abstract JDBC rows loader. */ -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public final class JDBCRowsLoader { +public abstract class AbstractJDBCRowsLoader implements JDBCRowsLoader { - private static final String YEAR_DATA_TYPE = "YEAR"; - - /** - * Load rows. - * - * @param columnCount column count - * @param resultSet result set of JDBC - * @return Query result data rows - * @throws SQLException SQL exception - */ - public static Collection<MemoryQueryResultDataRow> load(final int columnCount, final ResultSet resultSet) throws SQLException { + @Override + public Collection<MemoryQueryResultDataRow> load(final int columnCount, final ResultSet resultSet) throws SQLException { Collection<MemoryQueryResultDataRow> result = new LinkedList<>(); while (resultSet.next()) { List<Object> rowData = new ArrayList<>(columnCount); @@ -61,7 +49,7 @@ public final class JDBCRowsLoader { } @SuppressWarnings("ReturnOfNull") - private static Object loadRowValue(final ResultSet resultSet, final int columnIndex) throws SQLException { + private Object loadRowValue(final ResultSet resultSet, final int columnIndex) throws SQLException { ResultSetMetaData metaData = resultSet.getMetaData(); switch (metaData.getColumnType(columnIndex)) { case Types.BOOLEAN: @@ -91,11 +79,7 @@ public final class JDBCRowsLoader { case Types.LONGVARCHAR: return resultSet.getString(columnIndex); case Types.DATE: - if (isYearDataType(resultSet.getMetaData().getColumnTypeName(columnIndex))) { - Object result = resultSet.getObject(columnIndex); - return resultSet.wasNull() ? null : result; - } - return resultSet.getDate(columnIndex); + return getDate(resultSet, columnIndex); case Types.TIME: return resultSet.getTime(columnIndex); case Types.TIMESTAMP: @@ -115,7 +99,13 @@ public final class JDBCRowsLoader { } } - private static boolean isYearDataType(final String columnDataTypeName) { - return YEAR_DATA_TYPE.equalsIgnoreCase(columnDataTypeName); - } + /** + * Get date from result set. + * + * @param resultSet result set + * @param columnIndex column index + * @return date + * @throws SQLException sql exception + */ + protected abstract Object getDate(ResultSet resultSet, int columnIndex) throws SQLException; } diff --git a/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/execute/result/query/impl/driver/jdbc/type/memory/JDBCMemoryQueryResult.java b/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/execute/result/query/impl/driver/jdbc/type/memory/loader/DefaultRowsLoader.java similarity index 60% copy from shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/execute/result/query/impl/driver/jdbc/type/memory/JDBCMemoryQueryResult.java copy to shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/execute/result/query/impl/driver/jdbc/type/memory/loader/DefaultRowsLoader.java index 1b00f1f8048..1204c3d8c80 100644 --- a/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/execute/result/query/impl/driver/jdbc/type/memory/JDBCMemoryQueryResult.java +++ b/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/execute/result/query/impl/driver/jdbc/type/memory/loader/DefaultRowsLoader.java @@ -15,20 +15,28 @@ * limitations under the License. */ -package org.apache.shardingsphere.infra.executor.sql.execute.result.query.impl.driver.jdbc.type.memory; - -import org.apache.shardingsphere.infra.executor.sql.execute.result.query.impl.driver.jdbc.metadata.JDBCQueryResultMetaData; -import org.apache.shardingsphere.infra.executor.sql.execute.result.query.type.memory.AbstractMemoryQueryResult; +package org.apache.shardingsphere.infra.executor.sql.execute.result.query.impl.driver.jdbc.type.memory.loader; import java.sql.ResultSet; import java.sql.SQLException; /** - * JDBC query result for memory loading. + * Default rows loader. */ -public final class JDBCMemoryQueryResult extends AbstractMemoryQueryResult { +public final class DefaultRowsLoader extends AbstractJDBCRowsLoader { + + @Override + protected Object getDate(final ResultSet resultSet, final int columnIndex) throws SQLException { + return resultSet.getDate(columnIndex); + } + + @Override + public String getType() { + return "Default"; + } - public JDBCMemoryQueryResult(final ResultSet resultSet) throws SQLException { - super(new JDBCQueryResultMetaData(resultSet.getMetaData()), JDBCRowsLoader.load(resultSet.getMetaData().getColumnCount(), resultSet).iterator()); + @Override + public boolean isDefault() { + return true; } } diff --git a/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/execute/result/query/impl/driver/jdbc/type/memory/loader/DialectJDBCRowsLoaderFactory.java b/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/execute/result/query/impl/driver/jdbc/type/memory/loader/DialectJDBCRowsLoaderFactory.java new file mode 100644 index 00000000000..8ee99d28de4 --- /dev/null +++ b/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/execute/result/query/impl/driver/jdbc/type/memory/loader/DialectJDBCRowsLoaderFactory.java @@ -0,0 +1,46 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.infra.executor.sql.execute.result.query.impl.driver.jdbc.type.memory.loader; + +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import org.apache.shardingsphere.infra.database.type.DatabaseType; +import org.apache.shardingsphere.spi.ShardingSphereServiceLoader; +import org.apache.shardingsphere.spi.type.required.RequiredSPIRegistry; +import org.apache.shardingsphere.spi.type.typed.TypedSPIRegistry; + +/** + * Dialect JDBC rows loader factory. + */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public final class DialectJDBCRowsLoaderFactory { + + static { + ShardingSphereServiceLoader.register(JDBCRowsLoader.class); + } + + /** + * Find instance of dialect JDBC rows loader factory. + * + * @param databaseType database type + * @return found instance + */ + public static JDBCRowsLoader getInstance(final DatabaseType databaseType) { + return TypedSPIRegistry.findRegisteredService(JDBCRowsLoader.class, databaseType.getType()).orElseGet(() -> RequiredSPIRegistry.getRegisteredService(JDBCRowsLoader.class)); + } +} diff --git a/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/execute/result/query/impl/driver/jdbc/type/memory/JDBCMemoryQueryResult.java b/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/execute/result/query/impl/driver/jdbc/type/memory/loader/JDBCRowsLoader.java similarity index 58% copy from shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/execute/result/query/impl/driver/jdbc/type/memory/JDBCMemoryQueryResult.java copy to shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/execute/result/query/impl/driver/jdbc/type/memory/loader/JDBCRowsLoader.java index 1b00f1f8048..8714f2102da 100644 --- a/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/execute/result/query/impl/driver/jdbc/type/memory/JDBCMemoryQueryResult.java +++ b/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/execute/result/query/impl/driver/jdbc/type/memory/loader/JDBCRowsLoader.java @@ -15,20 +15,30 @@ * limitations under the License. */ -package org.apache.shardingsphere.infra.executor.sql.execute.result.query.impl.driver.jdbc.type.memory; +package org.apache.shardingsphere.infra.executor.sql.execute.result.query.impl.driver.jdbc.type.memory.loader; -import org.apache.shardingsphere.infra.executor.sql.execute.result.query.impl.driver.jdbc.metadata.JDBCQueryResultMetaData; -import org.apache.shardingsphere.infra.executor.sql.execute.result.query.type.memory.AbstractMemoryQueryResult; +import org.apache.shardingsphere.infra.executor.sql.execute.result.query.type.memory.row.MemoryQueryResultDataRow; +import org.apache.shardingsphere.spi.annotation.SingletonSPI; +import org.apache.shardingsphere.spi.type.required.RequiredSPI; +import org.apache.shardingsphere.spi.type.typed.TypedSPI; import java.sql.ResultSet; import java.sql.SQLException; +import java.util.Collection; /** - * JDBC query result for memory loading. + * JDBC rows loader. */ -public final class JDBCMemoryQueryResult extends AbstractMemoryQueryResult { +@SingletonSPI +public interface JDBCRowsLoader extends TypedSPI, RequiredSPI { - public JDBCMemoryQueryResult(final ResultSet resultSet) throws SQLException { - super(new JDBCQueryResultMetaData(resultSet.getMetaData()), JDBCRowsLoader.load(resultSet.getMetaData().getColumnCount(), resultSet).iterator()); - } + /** + * Load rows. + * + * @param columnCount column count + * @param resultSet result set of JDBC + * @return Query result data rows + * @throws SQLException SQL exception + */ + Collection<MemoryQueryResultDataRow> load(int columnCount, ResultSet resultSet) throws SQLException; } diff --git a/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/execute/result/query/impl/driver/jdbc/type/memory/JDBCMemoryQueryResult.java b/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/execute/result/query/impl/driver/jdbc/type/memory/loader/MySQLRowsLoader.java similarity index 53% copy from shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/execute/result/query/impl/driver/jdbc/type/memory/JDBCMemoryQueryResult.java copy to shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/execute/result/query/impl/driver/jdbc/type/memory/loader/MySQLRowsLoader.java index 1b00f1f8048..540ce836352 100644 --- a/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/execute/result/query/impl/driver/jdbc/type/memory/JDBCMemoryQueryResult.java +++ b/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/execute/result/query/impl/driver/jdbc/type/memory/loader/MySQLRowsLoader.java @@ -15,20 +15,33 @@ * limitations under the License. */ -package org.apache.shardingsphere.infra.executor.sql.execute.result.query.impl.driver.jdbc.type.memory; - -import org.apache.shardingsphere.infra.executor.sql.execute.result.query.impl.driver.jdbc.metadata.JDBCQueryResultMetaData; -import org.apache.shardingsphere.infra.executor.sql.execute.result.query.type.memory.AbstractMemoryQueryResult; +package org.apache.shardingsphere.infra.executor.sql.execute.result.query.impl.driver.jdbc.type.memory.loader; import java.sql.ResultSet; import java.sql.SQLException; /** - * JDBC query result for memory loading. + * MySQL rows loader. */ -public final class JDBCMemoryQueryResult extends AbstractMemoryQueryResult { +public final class MySQLRowsLoader extends AbstractJDBCRowsLoader { + + private static final String YEAR_DATA_TYPE = "YEAR"; + + @Override + protected Object getDate(final ResultSet resultSet, final int columnIndex) throws SQLException { + if (isYearDataType(resultSet.getMetaData().getColumnTypeName(columnIndex))) { + Object result = resultSet.getObject(columnIndex); + return resultSet.wasNull() ? null : result; + } + return resultSet.getDate(columnIndex); + } + + private static boolean isYearDataType(final String columnDataTypeName) { + return YEAR_DATA_TYPE.equalsIgnoreCase(columnDataTypeName); + } - public JDBCMemoryQueryResult(final ResultSet resultSet) throws SQLException { - super(new JDBCQueryResultMetaData(resultSet.getMetaData()), JDBCRowsLoader.load(resultSet.getMetaData().getColumnCount(), resultSet).iterator()); + @Override + public String getType() { + return "MySQL"; } } diff --git a/shardingsphere-infra/shardingsphere-infra-executor/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.executor.sql.execute.result.query.impl.driver.jdbc.type.memory.loader.JDBCRowsLoader b/shardingsphere-infra/shardingsphere-infra-executor/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.executor.sql.execute.result.query.impl.driver.jdbc.type.memory.loader.JDBCRowsLoader new file mode 100644 index 00000000000..9b791effc34 --- /dev/null +++ b/shardingsphere-infra/shardingsphere-infra-executor/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.executor.sql.execute.result.query.impl.driver.jdbc.type.memory.loader.JDBCRowsLoader @@ -0,0 +1,19 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +org.apache.shardingsphere.infra.executor.sql.execute.result.query.impl.driver.jdbc.type.memory.loader.DefaultRowsLoader +org.apache.shardingsphere.infra.executor.sql.execute.result.query.impl.driver.jdbc.type.memory.loader.MySQLRowsLoader diff --git a/shardingsphere-infra/shardingsphere-infra-executor/src/test/java/org/apache/shardingsphere/infra/executor/sql/execute/result/query/impl/driver/jdbc/type/memory/JDBCMemoryQueryResultTest.java b/shardingsphere-infra/shardingsphere-infra-executor/src/test/java/org/apache/shardingsphere/infra/executor/sql/execute/result/query/impl/driver/jdbc/type/memory/JDBCMemoryQueryResultTest.java index 7e014bcd624..fa89a901068 100644 --- a/shardingsphere-infra/shardingsphere-infra-executor/src/test/java/org/apache/shardingsphere/infra/executor/sql/execute/result/query/impl/driver/jdbc/type/memory/JDBCMemoryQueryResultTest.java +++ b/shardingsphere-infra/shardingsphere-infra-executor/src/test/java/org/apache/shardingsphere/infra/executor/sql/execute/result/query/impl/driver/jdbc/type/memory/JDBCMemoryQueryResultTest.java @@ -17,6 +17,8 @@ package org.apache.shardingsphere.infra.executor.sql.execute.result.query.impl.driver.jdbc.type.memory; +import org.apache.shardingsphere.infra.database.type.DatabaseType; +import org.apache.shardingsphere.infra.database.type.dialect.MySQLDatabaseType; import org.hamcrest.core.Is; import org.junit.Test; @@ -49,16 +51,18 @@ import static org.mockito.Mockito.when; public final class JDBCMemoryQueryResultTest { + private final DatabaseType databaseType = new MySQLDatabaseType(); + @Test(expected = SQLException.class) public void assertConstructorWithSqlException() throws SQLException { ResultSet resultSet = mockResultSet(); when(resultSet.next()).thenThrow(new SQLException("")); - new JDBCMemoryQueryResult(resultSet); + new JDBCMemoryQueryResult(resultSet, databaseType); } @Test public void assertNext() throws SQLException { - JDBCMemoryQueryResult queryResult = new JDBCMemoryQueryResult(mockResultSet()); + JDBCMemoryQueryResult queryResult = new JDBCMemoryQueryResult(mockResultSet(), databaseType); assertTrue(queryResult.next()); assertFalse(queryResult.next()); } @@ -71,7 +75,7 @@ public final class JDBCMemoryQueryResultTest { ResultSetMetaData resultSetMetaData = mock(ResultSetMetaData.class); when(resultSetMetaData.getColumnCount()).thenReturn(1); when(resultSet.getMetaData()).thenReturn(resultSetMetaData); - JDBCMemoryQueryResult actual = new JDBCMemoryQueryResult(resultSet); + JDBCMemoryQueryResult actual = new JDBCMemoryQueryResult(resultSet, databaseType); assertTrue(actual.next()); assertNull(actual.getValue(1, boolean.class)); assertFalse(actual.next()); @@ -81,7 +85,7 @@ public final class JDBCMemoryQueryResultTest { public void assertGetValueByBoolean() throws SQLException { ResultSet resultSet = getMockedResultSet(Types.BOOLEAN); when(resultSet.getBoolean(1)).thenReturn(true); - JDBCMemoryQueryResult actual = new JDBCMemoryQueryResult(resultSet); + JDBCMemoryQueryResult actual = new JDBCMemoryQueryResult(resultSet, databaseType); assertTrue(actual.next()); assertTrue((boolean) actual.getValue(1, boolean.class)); assertFalse(actual.next()); @@ -91,7 +95,7 @@ public final class JDBCMemoryQueryResultTest { public void assertGetValueByTinyInt() throws SQLException { ResultSet resultSet = getMockedResultSet(Types.TINYINT); when(resultSet.getInt(1)).thenReturn(1); - JDBCMemoryQueryResult actual = new JDBCMemoryQueryResult(resultSet); + JDBCMemoryQueryResult actual = new JDBCMemoryQueryResult(resultSet, databaseType); assertTrue(actual.next()); assertThat(actual.getValue(1, int.class), is(1)); assertFalse(actual.next()); @@ -101,7 +105,7 @@ public final class JDBCMemoryQueryResultTest { public void assertGetValueBySmallInt() throws SQLException { ResultSet resultSet = getMockedResultSet(Types.SMALLINT); when(resultSet.getInt(1)).thenReturn(1); - JDBCMemoryQueryResult actual = new JDBCMemoryQueryResult(resultSet); + JDBCMemoryQueryResult actual = new JDBCMemoryQueryResult(resultSet, databaseType); assertTrue(actual.next()); assertThat(actual.getValue(1, int.class), is(1)); assertFalse(actual.next()); @@ -112,7 +116,7 @@ public final class JDBCMemoryQueryResultTest { ResultSet resultSet = getMockedResultSet(Types.INTEGER); when(resultSet.getInt(1)).thenReturn(1); when(resultSet.getMetaData().isSigned(1)).thenReturn(true); - JDBCMemoryQueryResult actual = new JDBCMemoryQueryResult(resultSet); + JDBCMemoryQueryResult actual = new JDBCMemoryQueryResult(resultSet, databaseType); assertTrue(actual.next()); assertThat(actual.getValue(1, int.class), is(1)); assertFalse(actual.next()); @@ -123,7 +127,7 @@ public final class JDBCMemoryQueryResultTest { ResultSet resultSet = getMockedResultSet(Types.INTEGER); when(resultSet.getLong(1)).thenReturn(1L); when(resultSet.getMetaData().isSigned(1)).thenReturn(false); - JDBCMemoryQueryResult actual = new JDBCMemoryQueryResult(resultSet); + JDBCMemoryQueryResult actual = new JDBCMemoryQueryResult(resultSet, databaseType); assertTrue(actual.next()); assertThat(actual.getValue(1, int.class), is(1L)); assertFalse(actual.next()); @@ -134,7 +138,7 @@ public final class JDBCMemoryQueryResultTest { ResultSet resultSet = getMockedResultSet(Types.BIGINT); when(resultSet.getLong(1)).thenReturn(1L); when(resultSet.getMetaData().isSigned(1)).thenReturn(true); - JDBCMemoryQueryResult actual = new JDBCMemoryQueryResult(resultSet); + JDBCMemoryQueryResult actual = new JDBCMemoryQueryResult(resultSet, databaseType); assertTrue(actual.next()); assertThat(actual.getValue(1, long.class), is(1L)); assertFalse(actual.next()); @@ -145,7 +149,7 @@ public final class JDBCMemoryQueryResultTest { ResultSet resultSet = getMockedResultSet(Types.BIGINT); when(resultSet.getBigDecimal(1)).thenReturn(new BigDecimal("1")); when(resultSet.getMetaData().isSigned(1)).thenReturn(false); - JDBCMemoryQueryResult actual = new JDBCMemoryQueryResult(resultSet); + JDBCMemoryQueryResult actual = new JDBCMemoryQueryResult(resultSet, databaseType); assertTrue(actual.next()); assertThat(actual.getValue(1, long.class), is(new BigDecimal("1").toBigInteger())); assertFalse(actual.next()); @@ -155,7 +159,7 @@ public final class JDBCMemoryQueryResultTest { public void assertGetValueByNumeric() throws SQLException { ResultSet resultSet = getMockedResultSet(Types.NUMERIC); when(resultSet.getBigDecimal(1)).thenReturn(new BigDecimal("1")); - JDBCMemoryQueryResult actual = new JDBCMemoryQueryResult(resultSet); + JDBCMemoryQueryResult actual = new JDBCMemoryQueryResult(resultSet, databaseType); assertTrue(actual.next()); assertThat(actual.getValue(1, BigDecimal.class), is(new BigDecimal("1"))); assertFalse(actual.next()); @@ -165,7 +169,7 @@ public final class JDBCMemoryQueryResultTest { public void assertGetValueByDecimal() throws SQLException { ResultSet resultSet = getMockedResultSet(Types.DECIMAL); when(resultSet.getBigDecimal(1)).thenReturn(new BigDecimal("1")); - JDBCMemoryQueryResult actual = new JDBCMemoryQueryResult(resultSet); + JDBCMemoryQueryResult actual = new JDBCMemoryQueryResult(resultSet, databaseType); assertTrue(actual.next()); assertThat(actual.getValue(1, BigDecimal.class), is(new BigDecimal("1"))); assertFalse(actual.next()); @@ -175,7 +179,7 @@ public final class JDBCMemoryQueryResultTest { public void assertGetValueByFloat() throws SQLException { ResultSet resultSet = getMockedResultSet(Types.FLOAT); when(resultSet.getDouble(1)).thenReturn(1.0D); - JDBCMemoryQueryResult actual = new JDBCMemoryQueryResult(resultSet); + JDBCMemoryQueryResult actual = new JDBCMemoryQueryResult(resultSet, databaseType); assertTrue(actual.next()); assertThat(actual.getValue(1, double.class), is(1.0D)); assertFalse(actual.next()); @@ -185,7 +189,7 @@ public final class JDBCMemoryQueryResultTest { public void assertGetValueByDouble() throws SQLException { ResultSet resultSet = getMockedResultSet(Types.DOUBLE); when(resultSet.getDouble(1)).thenReturn(1.0D); - JDBCMemoryQueryResult actual = new JDBCMemoryQueryResult(resultSet); + JDBCMemoryQueryResult actual = new JDBCMemoryQueryResult(resultSet, databaseType); assertTrue(actual.next()); assertThat(actual.getValue(1, double.class), is(1.0D)); assertFalse(actual.next()); @@ -195,7 +199,7 @@ public final class JDBCMemoryQueryResultTest { public void assertGetValueByChar() throws SQLException { ResultSet resultSet = getMockedResultSet(Types.CHAR); when(resultSet.getString(1)).thenReturn("value"); - JDBCMemoryQueryResult actual = new JDBCMemoryQueryResult(resultSet); + JDBCMemoryQueryResult actual = new JDBCMemoryQueryResult(resultSet, databaseType); assertTrue(actual.next()); assertThat(actual.getValue(1, String.class), is("value")); assertFalse(actual.next()); @@ -205,7 +209,7 @@ public final class JDBCMemoryQueryResultTest { public void assertGetValueByVarchar() throws SQLException { ResultSet resultSet = getMockedResultSet(Types.VARCHAR); when(resultSet.getString(1)).thenReturn("value"); - JDBCMemoryQueryResult actual = new JDBCMemoryQueryResult(resultSet); + JDBCMemoryQueryResult actual = new JDBCMemoryQueryResult(resultSet, databaseType); assertTrue(actual.next()); assertThat(actual.getValue(1, String.class), is("value")); assertFalse(actual.next()); @@ -215,7 +219,7 @@ public final class JDBCMemoryQueryResultTest { public void assertGetValueByLongVarchar() throws SQLException { ResultSet resultSet = getMockedResultSet(Types.LONGVARCHAR); when(resultSet.getString(1)).thenReturn("value"); - JDBCMemoryQueryResult actual = new JDBCMemoryQueryResult(resultSet); + JDBCMemoryQueryResult actual = new JDBCMemoryQueryResult(resultSet, databaseType); assertTrue(actual.next()); assertThat(actual.getValue(1, String.class), is("value")); assertFalse(actual.next()); @@ -225,7 +229,7 @@ public final class JDBCMemoryQueryResultTest { public void assertGetValueByDate() throws SQLException { ResultSet resultSet = getMockedResultSet(Types.DATE); when(resultSet.getDate(1)).thenReturn(new Date(0L)); - JDBCMemoryQueryResult actual = new JDBCMemoryQueryResult(resultSet); + JDBCMemoryQueryResult actual = new JDBCMemoryQueryResult(resultSet, databaseType); assertTrue(actual.next()); assertThat(actual.getValue(1, Date.class), is(new Date(0L))); assertFalse(actual.next()); @@ -235,7 +239,7 @@ public final class JDBCMemoryQueryResultTest { public void assertGetValueByTime() throws SQLException { ResultSet resultSet = getMockedResultSet(Types.TIME); when(resultSet.getTime(1)).thenReturn(new Time(0L)); - JDBCMemoryQueryResult actual = new JDBCMemoryQueryResult(resultSet); + JDBCMemoryQueryResult actual = new JDBCMemoryQueryResult(resultSet, databaseType); assertTrue(actual.next()); assertThat(actual.getValue(1, Time.class), is(new Time(0L))); assertFalse(actual.next()); @@ -245,7 +249,7 @@ public final class JDBCMemoryQueryResultTest { public void assertGetValueByTimestamp() throws SQLException { ResultSet resultSet = getMockedResultSet(Types.TIMESTAMP); when(resultSet.getTimestamp(1)).thenReturn(new Timestamp(0L)); - JDBCMemoryQueryResult actual = new JDBCMemoryQueryResult(resultSet); + JDBCMemoryQueryResult actual = new JDBCMemoryQueryResult(resultSet, databaseType); assertTrue(actual.next()); assertThat(actual.getValue(1, Timestamp.class), is(new Timestamp(0L))); assertFalse(actual.next()); @@ -256,7 +260,7 @@ public final class JDBCMemoryQueryResultTest { ResultSet resultSet = getMockedResultSet(Types.CLOB); Clob value = mock(Clob.class); when(resultSet.getClob(1)).thenReturn(value); - JDBCMemoryQueryResult actual = new JDBCMemoryQueryResult(resultSet); + JDBCMemoryQueryResult actual = new JDBCMemoryQueryResult(resultSet, databaseType); assertTrue(actual.next()); assertThat(actual.getValue(1, Clob.class), is(value)); assertFalse(actual.next()); @@ -267,7 +271,7 @@ public final class JDBCMemoryQueryResultTest { ResultSet resultSet = getMockedResultSet(Types.BLOB); Blob value = mock(Blob.class); when(resultSet.getBlob(1)).thenReturn(value); - JDBCMemoryQueryResult actual = new JDBCMemoryQueryResult(resultSet); + JDBCMemoryQueryResult actual = new JDBCMemoryQueryResult(resultSet, databaseType); assertTrue(actual.next()); assertThat(actual.getValue(1, Blob.class), is(value)); assertFalse(actual.next()); @@ -278,7 +282,7 @@ public final class JDBCMemoryQueryResultTest { ResultSet resultSet = getMockedResultSet(Types.BINARY); byte[] value = new byte[10]; when(resultSet.getBytes(1)).thenReturn(value); - JDBCMemoryQueryResult actual = new JDBCMemoryQueryResult(resultSet); + JDBCMemoryQueryResult actual = new JDBCMemoryQueryResult(resultSet, databaseType); assertTrue(actual.next()); assertThat(actual.getValue(1, byte[].class), is(value)); assertFalse(actual.next()); @@ -289,7 +293,7 @@ public final class JDBCMemoryQueryResultTest { ResultSet resultSet = getMockedResultSet(Types.VARBINARY); byte[] value = new byte[10]; when(resultSet.getBytes(1)).thenReturn(value); - JDBCMemoryQueryResult actual = new JDBCMemoryQueryResult(resultSet); + JDBCMemoryQueryResult actual = new JDBCMemoryQueryResult(resultSet, databaseType); assertTrue(actual.next()); assertThat(actual.getValue(1, byte[].class), is(value)); assertFalse(actual.next()); @@ -300,7 +304,7 @@ public final class JDBCMemoryQueryResultTest { ResultSet resultSet = getMockedResultSet(Types.LONGVARBINARY); byte[] value = new byte[10]; when(resultSet.getBytes(1)).thenReturn(value); - JDBCMemoryQueryResult actual = new JDBCMemoryQueryResult(resultSet); + JDBCMemoryQueryResult actual = new JDBCMemoryQueryResult(resultSet, databaseType); assertTrue(actual.next()); assertThat(actual.getValue(1, byte[].class), is(value)); assertFalse(actual.next()); @@ -311,7 +315,7 @@ public final class JDBCMemoryQueryResultTest { ResultSet resultSet = getMockedResultSet(Types.ARRAY); Array value = mock(Array.class); when(resultSet.getArray(1)).thenReturn(value); - JDBCMemoryQueryResult actual = new JDBCMemoryQueryResult(resultSet); + JDBCMemoryQueryResult actual = new JDBCMemoryQueryResult(resultSet, databaseType); assertTrue(actual.next()); assertThat(actual.getValue(1, Array.class), is(value)); assertFalse(actual.next()); @@ -329,14 +333,14 @@ public final class JDBCMemoryQueryResultTest { @Test public void assertGetCalendarValue() throws SQLException { - JDBCMemoryQueryResult queryResult = new JDBCMemoryQueryResult(mockResultSet()); + JDBCMemoryQueryResult queryResult = new JDBCMemoryQueryResult(mockResultSet(), databaseType); queryResult.next(); assertThat(queryResult.getCalendarValue(1, Integer.class, Calendar.getInstance()), Is.is(1)); } @Test public void assertGetInputStream() throws SQLException, IOException { - JDBCMemoryQueryResult queryResult = new JDBCMemoryQueryResult(mockResultSet()); + JDBCMemoryQueryResult queryResult = new JDBCMemoryQueryResult(mockResultSet(), databaseType); queryResult.next(); InputStream inputStream = queryResult.getInputStream(1, "Unicode"); assertThat(inputStream.read(), is(getInputStream(1).read())); @@ -353,7 +357,7 @@ public final class JDBCMemoryQueryResultTest { @Test public void assertWasNull() throws SQLException { - JDBCMemoryQueryResult queryResult = new JDBCMemoryQueryResult(mockResultSet()); + JDBCMemoryQueryResult queryResult = new JDBCMemoryQueryResult(mockResultSet(), databaseType); queryResult.next(); assertFalse(queryResult.wasNull()); queryResult.next(); diff --git a/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-executor/src/main/java/org/apache/shardingsphere/infra/federation/executor/original/table/FilterableTableScanExecutor.java b/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-executor/src/main/java/org/apache/shardingsphere/infra/federation/executor/original/table/FilterableTableScanExecutor.java index 823f701cac7..3a4ee90f600 100644 --- a/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-executor/src/main/java/org/apache/shardingsphere/infra/federation/executor/original/table/FilterableTableScanExecutor.java +++ b/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-executor/src/main/java/org/apache/shardingsphere/infra/federation/executor/original/table/FilterableTableScanExecutor.java @@ -153,7 +153,7 @@ public final class FilterableTableScanExecutor { ExecutionGroupContext<JDBCExecutionUnit> executionGroupContext = prepareEngine.prepare(context.getRouteContext(), context.getExecutionUnits()); setParameters(executionGroupContext.getInputGroups()); ExecuteProcessEngine.initialize(context.getLogicSQL(), executionGroupContext, executorContext.getProps()); - List<QueryResult> queryResults = execute(executionGroupContext); + List<QueryResult> queryResults = execute(executionGroupContext, databaseType); ExecuteProcessEngine.finish(executionGroupContext.getExecutionID()); MergeEngine mergeEngine = new MergeEngine(schemaName, databaseType, databaseMetaData, executorContext.getProps(), databaseMetaData.getRuleMetaData().getRules()); MergedResult mergedResult = mergeEngine.merge(queryResults, logicSQL.getSqlStatementContext()); @@ -166,12 +166,12 @@ public final class FilterableTableScanExecutor { } } - private List<QueryResult> execute(final ExecutionGroupContext<JDBCExecutionUnit> executionGroupContext) throws SQLException { + private List<QueryResult> execute(final ExecutionGroupContext<JDBCExecutionUnit> executionGroupContext, final DatabaseType databaseType) throws SQLException { Collection<QueryResult> queryResults = jdbcExecutor.execute(executionGroupContext, callback).stream().map(each -> (QueryResult) each).collect(Collectors.toList()); List<QueryResult> result = new LinkedList<>(); for (QueryResult each : queryResults) { QueryResult queryResult = each instanceof JDBCStreamQueryResult - ? new JDBCMemoryQueryResult(((JDBCStreamQueryResult) each).getResultSet()) + ? new JDBCMemoryQueryResult(((JDBCStreamQueryResult) each).getResultSet(), databaseType) : each; result.add(queryResult); } diff --git a/shardingsphere-jdbc/shardingsphere-jdbc-core/src/main/java/org/apache/shardingsphere/driver/executor/callback/ExecuteQueryCallback.java b/shardingsphere-jdbc/shardingsphere-jdbc-core/src/main/java/org/apache/shardingsphere/driver/executor/callback/ExecuteQueryCallback.java index bc2f5437523..1488228446b 100644 --- a/shardingsphere-jdbc/shardingsphere-jdbc-core/src/main/java/org/apache/shardingsphere/driver/executor/callback/ExecuteQueryCallback.java +++ b/shardingsphere-jdbc/shardingsphere-jdbc-core/src/main/java/org/apache/shardingsphere/driver/executor/callback/ExecuteQueryCallback.java @@ -42,7 +42,7 @@ public abstract class ExecuteQueryCallback extends JDBCExecutorCallback<QueryRes @Override protected final QueryResult executeSQL(final String sql, final Statement statement, final ConnectionMode connectionMode) throws SQLException { ResultSet resultSet = executeQuery(sql, statement); - return ConnectionMode.MEMORY_STRICTLY == connectionMode ? new JDBCStreamQueryResult(resultSet) : new JDBCMemoryQueryResult(resultSet); + return ConnectionMode.MEMORY_STRICTLY == connectionMode ? new JDBCStreamQueryResult(resultSet) : new JDBCMemoryQueryResult(resultSet, getDatabaseType()); } @Override diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/executor/callback/ProxyJDBCExecutorCallback.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/executor/callback/ProxyJDBCExecutorCallback.java index 2d757233eb8..0c84d3bedeb 100644 --- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/executor/callback/ProxyJDBCExecutorCallback.java +++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/executor/callback/ProxyJDBCExecutorCallback.java @@ -81,7 +81,7 @@ public abstract class ProxyJDBCExecutorCallback extends JDBCExecutorCallback<Exe protected abstract boolean execute(String sql, Statement statement, boolean isReturnGeneratedKeys) throws SQLException; private QueryResult createQueryResult(final ResultSet resultSet, final ConnectionMode connectionMode) throws SQLException { - return ConnectionMode.MEMORY_STRICTLY == connectionMode ? new JDBCStreamQueryResult(resultSet) : new JDBCMemoryQueryResult(resultSet); + return ConnectionMode.MEMORY_STRICTLY == connectionMode ? new JDBCStreamQueryResult(resultSet) : new JDBCMemoryQueryResult(resultSet, getDatabaseType()); } private long getGeneratedKey(final Statement statement) throws SQLException { diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/opengauss/OpenGaussSelectDatabaseExecutor.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/opengauss/OpenGaussSelectDatabaseExecutor.java index 9d198d6667f..73f4e57822f 100644 --- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/opengauss/OpenGaussSelectDatabaseExecutor.java +++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/opengauss/OpenGaussSelectDatabaseExecutor.java @@ -67,7 +67,7 @@ public final class OpenGaussSelectDatabaseExecutor implements DatabaseAdminQuery connection.setSchema(PG_CATALOG); try (Statement statement = connection.createStatement(); ResultSet resultSet = statement.executeQuery(sql)) { queryResultMetaData = new JDBCQueryResultMetaData(resultSet.getMetaData()); - mergedResult = new IteratorStreamMergedResult(Collections.singletonList(new JDBCMemoryQueryResult(resultSet))); + mergedResult = new IteratorStreamMergedResult(Collections.singletonList(new JDBCMemoryQueryResult(resultSet, connectionSession.getDatabaseType()))); } } } diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/opengauss/OpenGaussSelectDatabaseExecutorTest.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/opengauss/OpenGaussSelectDatabaseExecutorTest.java index e2fcee4ea54..3311865469b 100644 --- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/opengauss/OpenGaussSelectDatabaseExecutorTest.java +++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/opengauss/OpenGaussSelectDatabaseExecutorTest.java @@ -17,9 +17,11 @@ package org.apache.shardingsphere.proxy.backend.text.admin.opengauss; +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.merge.result.MergedResult; import org.apache.shardingsphere.proxy.backend.context.ProxyContext; +import org.apache.shardingsphere.proxy.backend.session.ConnectionSession; import org.junit.Test; import org.mockito.MockedStatic; @@ -49,7 +51,9 @@ public final class OpenGaussSelectDatabaseExecutorTest { private void assertExecute0() throws SQLException { when(ProxyContext.getInstance().getAllDatabaseNames()).thenReturn(Arrays.asList("foo", "bar", "sharding_db", "other_db")); OpenGaussSelectDatabaseExecutor executor = new OpenGaussSelectDatabaseExecutor(SQL); - executor.execute(null); + ConnectionSession connectionSession = mock(ConnectionSession.class); + when(connectionSession.getDatabaseType()).thenReturn(new OpenGaussDatabaseType()); + executor.execute(connectionSession); QueryResultMetaData actualMetaData = executor.getQueryResultMetaData(); assertThat(actualMetaData.getColumnCount(), is(2)); assertThat(actualMetaData.getColumnName(1), is("datname"));