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

zhangliang 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 f4b9504ec54 Add more test cases on OpenGaussComQueryExecutorTest 
(#37928)
f4b9504ec54 is described below

commit f4b9504ec54d0695f6539da9e18ccfd8844f2362
Author: Liang Zhang <[email protected]>
AuthorDate: Sun Feb 1 20:59:02 2026 +0800

    Add more test cases on OpenGaussComQueryExecutorTest (#37928)
---
 .../simple/OpenGaussComQueryExecutorTest.java      | 138 +++++++++++++++------
 1 file changed, 101 insertions(+), 37 deletions(-)

diff --git 
a/proxy/frontend/dialect/opengauss/src/test/java/org/apache/shardingsphere/proxy/frontend/opengauss/command/query/simple/OpenGaussComQueryExecutorTest.java
 
b/proxy/frontend/dialect/opengauss/src/test/java/org/apache/shardingsphere/proxy/frontend/opengauss/command/query/simple/OpenGaussComQueryExecutorTest.java
index a82692e1ce7..21a91b51d52 100644
--- 
a/proxy/frontend/dialect/opengauss/src/test/java/org/apache/shardingsphere/proxy/frontend/opengauss/command/query/simple/OpenGaussComQueryExecutorTest.java
+++ 
b/proxy/frontend/dialect/opengauss/src/test/java/org/apache/shardingsphere/proxy/frontend/opengauss/command/query/simple/OpenGaussComQueryExecutorTest.java
@@ -17,14 +17,19 @@
 
 package 
org.apache.shardingsphere.proxy.frontend.opengauss.command.query.simple;
 
-import lombok.SneakyThrows;
+import org.apache.shardingsphere.database.connector.core.type.DatabaseType;
 import org.apache.shardingsphere.database.protocol.packet.DatabasePacket;
-import 
org.apache.shardingsphere.database.protocol.postgresql.packet.PostgreSQLPacket;
+import 
org.apache.shardingsphere.database.protocol.postgresql.packet.command.query.PostgreSQLColumnDescription;
 import 
org.apache.shardingsphere.database.protocol.postgresql.packet.command.query.PostgreSQLDataRowPacket;
 import 
org.apache.shardingsphere.database.protocol.postgresql.packet.command.query.PostgreSQLRowDescriptionPacket;
 import 
org.apache.shardingsphere.database.protocol.postgresql.packet.command.query.simple.PostgreSQLComQueryPacket;
 import 
org.apache.shardingsphere.database.protocol.postgresql.packet.generic.PostgreSQLCommandCompletePacket;
+import 
org.apache.shardingsphere.database.protocol.postgresql.packet.handshake.PostgreSQLParameterStatusPacket;
+import org.apache.shardingsphere.infra.hint.HintValueContext;
+import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
 import org.apache.shardingsphere.proxy.backend.handler.ProxyBackendHandler;
+import 
org.apache.shardingsphere.proxy.backend.handler.ProxyBackendHandlerFactory;
+import org.apache.shardingsphere.proxy.backend.handler.ProxySQLComQueryParser;
 import org.apache.shardingsphere.proxy.backend.response.data.QueryResponseRow;
 import 
org.apache.shardingsphere.proxy.backend.response.header.query.QueryHeader;
 import 
org.apache.shardingsphere.proxy.backend.response.header.query.QueryResponseHeader;
@@ -32,28 +37,41 @@ import 
org.apache.shardingsphere.proxy.backend.response.header.update.UpdateResp
 import org.apache.shardingsphere.proxy.backend.session.ConnectionSession;
 import org.apache.shardingsphere.proxy.frontend.command.executor.ResponseType;
 import 
org.apache.shardingsphere.proxy.frontend.postgresql.command.PortalContext;
+import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dal.VariableAssignSegment;
+import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dal.VariableSegment;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.SQLStatement;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.type.dal.EmptyStatement;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.type.dal.SetStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.type.dml.InsertStatement;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.type.tcl.CommitStatement;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.type.tcl.RollbackStatement;
+import 
org.apache.shardingsphere.test.infra.framework.extension.mock.AutoMockExtension;
+import 
org.apache.shardingsphere.test.infra.framework.extension.mock.StaticMockSettings;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.Answers;
 import org.mockito.Mock;
 import org.mockito.internal.configuration.plugins.Plugins;
-import org.mockito.junit.jupiter.MockitoExtension;
 
 import java.sql.SQLException;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.LinkedList;
+import java.util.List;
 
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.isA;
-import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNull;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
-@ExtendWith(MockitoExtension.class)
+@ExtendWith(AutoMockExtension.class)
+@StaticMockSettings({ProxySQLComQueryParser.class, 
ProxyBackendHandlerFactory.class})
 class OpenGaussComQueryExecutorTest {
     
     @Mock
@@ -62,65 +80,111 @@ class OpenGaussComQueryExecutorTest {
     @Mock
     private ProxyBackendHandler proxyBackendHandler;
     
+    @Mock(answer = Answers.RETURNS_DEEP_STUBS)
+    private PostgreSQLComQueryPacket queryPacket;
+    
+    private DatabaseType databaseType;
+    
     private OpenGaussComQueryExecutor queryExecutor;
     
     @BeforeEach
     void setUp() throws SQLException {
-        PostgreSQLComQueryPacket queryPacket = 
mock(PostgreSQLComQueryPacket.class);
+        databaseType = TypedSPILoader.getService(DatabaseType.class, 
"openGauss");
         ConnectionSession connectionSession = mock(ConnectionSession.class);
-        when(queryPacket.getSQL()).thenReturn("");
+        when(queryPacket.getSQL()).thenReturn("sql");
+        when(queryPacket.getHintValueContext()).thenReturn(new 
HintValueContext());
+        SQLStatement sqlStatement = mock(SQLStatement.class);
+        when(ProxySQLComQueryParser.parse("sql", databaseType, 
connectionSession)).thenReturn(sqlStatement);
+        when(ProxyBackendHandlerFactory.newInstance(databaseType, "sql", 
sqlStatement, connectionSession, 
queryPacket.getHintValueContext())).thenReturn(proxyBackendHandler);
         queryExecutor = new OpenGaussComQueryExecutor(portalContext, 
queryPacket, connectionSession);
-        setMockFieldIntoExecutor(queryExecutor);
-    }
-    
-    @SneakyThrows(ReflectiveOperationException.class)
-    private void setMockFieldIntoExecutor(final OpenGaussComQueryExecutor 
executor) {
-        
Plugins.getMemberAccessor().set(OpenGaussComQueryExecutor.class.getDeclaredField("proxyBackendHandler"),
 executor, proxyBackendHandler);
     }
     
     @Test
-    void assertExecuteQueryAndReturnEmptyResult() throws SQLException {
+    void assertExecuteQueryReturnsRowDescription() throws SQLException, 
ReflectiveOperationException {
+        QueryHeader queryHeader = new QueryHeader("schema", "table", "label", 
"column", 1, "type", 2, 3, true, true, true, true);
         QueryResponseHeader queryResponseHeader = 
mock(QueryResponseHeader.class);
+        
when(queryResponseHeader.getQueryHeaders()).thenReturn(Collections.singletonList(queryHeader));
         when(proxyBackendHandler.execute()).thenReturn(queryResponseHeader);
-        Collection<DatabasePacket> actual = queryExecutor.execute();
-        assertThat(actual.size(), is(1));
-        assertThat(actual.iterator().next(), 
is(isA(PostgreSQLRowDescriptionPacket.class)));
+        Collection<DatabasePacket> actualPackets = queryExecutor.execute();
+        List<DatabasePacket> actualPacketList = new 
LinkedList<>(actualPackets);
+        assertThat(actualPacketList.size(), is(1));
+        PostgreSQLRowDescriptionPacket actualPacket = 
(PostgreSQLRowDescriptionPacket) actualPacketList.iterator().next();
         assertThat(queryExecutor.getResponseType(), is(ResponseType.QUERY));
-        verify(queryResponseHeader).getQueryHeaders();
+        Collection<?> columnDescriptions = (Collection<?>) 
Plugins.getMemberAccessor()
+                
.get(PostgreSQLRowDescriptionPacket.class.getDeclaredField("columnDescriptions"),
 actualPacket);
+        PostgreSQLColumnDescription actualColumn = 
(PostgreSQLColumnDescription) columnDescriptions.iterator().next();
+        assertThat(actualColumn.getColumnName(), is("label"));
+        assertThat(actualColumn.getColumnIndex(), is(1));
     }
     
     @Test
-    void assertExecuteQueryAndReturnResult() throws SQLException {
-        QueryResponseHeader queryResponseHeader = 
mock(QueryResponseHeader.class);
-        
when(queryResponseHeader.getQueryHeaders()).thenReturn(Collections.singletonList(new
 QueryHeader("schema", "table", "label", "column", 1, "type", 2, 3, true, true, 
true, true)));
-        when(proxyBackendHandler.execute()).thenReturn(queryResponseHeader);
-        Collection<DatabasePacket> actual = queryExecutor.execute();
-        assertThat(actual.size(), is(1));
-        assertThat(actual.iterator().next(), 
is(isA(PostgreSQLRowDescriptionPacket.class)));
-        assertThat(queryExecutor.getResponseType(), is(ResponseType.QUERY));
-        verify(queryResponseHeader).getQueryHeaders();
+    void assertExecuteUpdateWithCommitClosesPortals() throws SQLException {
+        UpdateResponseHeader updateResponseHeader = new 
UpdateResponseHeader(new CommitStatement(databaseType));
+        when(proxyBackendHandler.execute()).thenReturn(updateResponseHeader);
+        Collection<DatabasePacket> actualPackets = queryExecutor.execute();
+        assertThat(new LinkedList<>(actualPackets).getFirst(), 
is(isA(PostgreSQLCommandCompletePacket.class)));
+        assertThat(queryExecutor.getResponseType(), is(ResponseType.UPDATE));
+        verify(portalContext).closeAll();
+    }
+    
+    @Test
+    void assertExecuteUpdateWithRollbackClosesPortals() throws SQLException {
+        UpdateResponseHeader updateResponseHeader = new 
UpdateResponseHeader(new RollbackStatement(databaseType));
+        when(proxyBackendHandler.execute()).thenReturn(updateResponseHeader);
+        Collection<DatabasePacket> actualPackets = queryExecutor.execute();
+        assertThat(new LinkedList<>(actualPackets).getFirst(), 
is(isA(PostgreSQLCommandCompletePacket.class)));
+        verify(portalContext).closeAll();
     }
     
     @Test
-    void assertExecuteUpdate() throws SQLException {
-        when(proxyBackendHandler.execute()).thenReturn(new 
UpdateResponseHeader(mock(InsertStatement.class)));
-        Collection<DatabasePacket> actual = queryExecutor.execute();
-        assertThat(actual.size(), is(1));
-        assertThat(actual.iterator().next(), 
is(isA(PostgreSQLCommandCompletePacket.class)));
+    void assertExecuteUpdateWithSetStatementReturnsParameterStatus() throws 
SQLException, ReflectiveOperationException {
+        VariableAssignSegment assignWithValue = new VariableAssignSegment(0, 
0, new VariableSegment(0, 0, "timezone"), "'UTC'");
+        VariableAssignSegment assignWithNull = new VariableAssignSegment(0, 0, 
new VariableSegment(0, 0, "work_mem"), null);
+        SetStatement setStatement = new SetStatement(databaseType, 
Arrays.asList(assignWithValue, assignWithNull));
+        when(proxyBackendHandler.execute()).thenReturn(new 
UpdateResponseHeader(setStatement));
+        Collection<DatabasePacket> actualPackets = queryExecutor.execute();
+        List<DatabasePacket> actualPacketList = new 
LinkedList<>(actualPackets);
+        PostgreSQLCommandCompletePacket commandCompletePacket = 
(PostgreSQLCommandCompletePacket) actualPacketList.get(0);
+        PostgreSQLParameterStatusPacket parameterStatusPacket = 
(PostgreSQLParameterStatusPacket) actualPacketList.get(1);
+        PostgreSQLParameterStatusPacket parameterStatusPacketWithNull = 
(PostgreSQLParameterStatusPacket) actualPacketList.get(2);
+        assertThat(commandCompletePacket, 
is(isA(PostgreSQLCommandCompletePacket.class)));
+        Object actualValue = 
Plugins.getMemberAccessor().get(PostgreSQLParameterStatusPacket.class.getDeclaredField("value"),
 parameterStatusPacket);
+        assertThat(actualValue, is("UTC"));
+        Object actualNullValue = 
Plugins.getMemberAccessor().get(PostgreSQLParameterStatusPacket.class.getDeclaredField("value"),
 parameterStatusPacketWithNull);
+        assertNull(actualNullValue);
+    }
+    
+    @Test
+    void assertExecuteUpdateWithEmptyStatementReturnsEmptyQueryResponse() 
throws SQLException {
+        when(proxyBackendHandler.execute()).thenReturn(new 
UpdateResponseHeader(new EmptyStatement(databaseType)));
+        Collection<DatabasePacket> actualPackets = queryExecutor.execute();
+        assertThat(new LinkedList<>(actualPackets).getFirst(), 
is(isA(org.apache.shardingsphere.database.protocol.postgresql.packet.command.query.PostgreSQLEmptyQueryResponsePacket.class)));
+        assertThat(queryExecutor.getResponseType(), is(ResponseType.UPDATE));
+    }
+    
+    @Test
+    void assertExecuteUpdateReturnsCommandCompleteForDML() throws SQLException 
{
+        when(proxyBackendHandler.execute()).thenReturn(new 
UpdateResponseHeader(new InsertStatement(databaseType)));
+        Collection<DatabasePacket> actualPackets = queryExecutor.execute();
+        assertThat(new LinkedList<>(actualPackets).getFirst(), 
is(isA(PostgreSQLCommandCompletePacket.class)));
         assertThat(queryExecutor.getResponseType(), is(ResponseType.UPDATE));
     }
     
     @Test
     void assertNext() throws SQLException {
-        when(proxyBackendHandler.next()).thenReturn(true, false);
+        when(proxyBackendHandler.next()).thenReturn(true);
         assertTrue(queryExecutor.next());
-        assertFalse(queryExecutor.next());
     }
     
     @Test
     void assertGetQueryRowPacket() throws SQLException {
-        when(proxyBackendHandler.getRowData()).thenReturn(new 
QueryResponseRow(Collections.emptyList()));
-        PostgreSQLPacket actual = queryExecutor.getQueryRowPacket();
-        assertThat(actual, is(isA(PostgreSQLDataRowPacket.class)));
+        when(proxyBackendHandler.getRowData()).thenReturn(new 
QueryResponseRow(new LinkedList<>()));
+        assertThat(queryExecutor.getQueryRowPacket(), 
is(isA(PostgreSQLDataRowPacket.class)));
+    }
+    
+    @Test
+    void assertClose() throws SQLException {
+        queryExecutor.close();
+        verify(proxyBackendHandler).close();
     }
 }

Reply via email to