diff --git a/sharding-proxy/sharding-proxy-backend/src/main/java/org/apache/shardingsphere/shardingproxy/backend/communication/jdbc/execute/JDBCExecuteEngine.java b/sharding-proxy/sharding-proxy-backend/src/main/java/org/apache/shardingsphere/shardingproxy/backend/communication/jdbc/execute/JDBCExecuteEngine.java index 9a80dd076af14..3d1352e2252eb 100644 --- a/sharding-proxy/sharding-proxy-backend/src/main/java/org/apache/shardingsphere/shardingproxy/backend/communication/jdbc/execute/JDBCExecuteEngine.java +++ b/sharding-proxy/sharding-proxy-backend/src/main/java/org/apache/shardingsphere/shardingproxy/backend/communication/jdbc/execute/JDBCExecuteEngine.java @@ -18,7 +18,6 @@ package org.apache.shardingsphere.shardingproxy.backend.communication.jdbc.execute; import lombok.Getter; -import org.apache.shardingsphere.underlying.executor.context.ExecutionContext; import org.apache.shardingsphere.sharding.execute.sql.StatementExecuteUnit; import org.apache.shardingsphere.sharding.execute.sql.execute.SQLExecuteTemplate; import org.apache.shardingsphere.sharding.execute.sql.execute.threadlocal.ExecutorExceptionHandler; @@ -36,8 +35,11 @@ import org.apache.shardingsphere.shardingproxy.backend.response.update.UpdateResponse; import org.apache.shardingsphere.shardingproxy.context.ShardingProxyContext; import org.apache.shardingsphere.sql.parser.binder.statement.SQLStatementContext; +import org.apache.shardingsphere.sql.parser.sql.statement.dml.DeleteStatement; import org.apache.shardingsphere.sql.parser.sql.statement.dml.InsertStatement; +import org.apache.shardingsphere.sql.parser.sql.statement.dml.UpdateStatement; import org.apache.shardingsphere.underlying.common.config.properties.ConfigurationPropertyKey; +import org.apache.shardingsphere.underlying.executor.context.ExecutionContext; import org.apache.shardingsphere.underlying.executor.engine.InputGroup; import java.sql.SQLException; @@ -75,12 +77,23 @@ public BackendResponse execute(final ExecutionContext executionContext) throws S boolean isExceptionThrown = ExecutorExceptionHandler.isExceptionThrown(); Collection> inputGroups = sqlExecutePrepareTemplate.getExecuteUnitGroups( executionContext.getExecutionUnits(), new ProxyJDBCExecutePrepareCallback(backendConnection, jdbcExecutorWrapper, isReturnGeneratedKeys)); - Collection executeResponses = sqlExecuteTemplate.execute((Collection) inputGroups, + Collection executeResponses = sqlExecuteTemplate.execute((Collection) inputGroups, new ProxySQLExecuteCallback(sqlStatementContext, backendConnection, jdbcExecutorWrapper, isExceptionThrown, isReturnGeneratedKeys, true), new ProxySQLExecuteCallback(sqlStatementContext, backendConnection, jdbcExecutorWrapper, isExceptionThrown, isReturnGeneratedKeys, false)); ExecuteResponse executeResponse = executeResponses.iterator().next(); - return executeResponse instanceof ExecuteQueryResponse - ? getExecuteQueryResponse(((ExecuteQueryResponse) executeResponse).getQueryHeaders(), executeResponses) : new UpdateResponse(executeResponses); + if (executeResponse instanceof ExecuteQueryResponse) { + return getExecuteQueryResponse(((ExecuteQueryResponse) executeResponse).getQueryHeaders(), executeResponses); + } else { + UpdateResponse updateResponse = new UpdateResponse(executeResponses); + if (sqlStatementContext.getSqlStatement() instanceof InsertStatement) { + updateResponse.setType("INSERT"); + } else if (sqlStatementContext.getSqlStatement() instanceof DeleteStatement) { + updateResponse.setType("DELETE"); + } else if (sqlStatementContext.getSqlStatement() instanceof UpdateStatement) { + updateResponse.setType("UPDATE"); + } + return updateResponse; + } } private BackendResponse getExecuteQueryResponse(final List queryHeaders, final Collection executeResponses) { diff --git a/sharding-proxy/sharding-proxy-backend/src/main/java/org/apache/shardingsphere/shardingproxy/backend/response/update/UpdateResponse.java b/sharding-proxy/sharding-proxy-backend/src/main/java/org/apache/shardingsphere/shardingproxy/backend/response/update/UpdateResponse.java index 9b6962fa3ffe6..f6866c0022a0a 100644 --- a/sharding-proxy/sharding-proxy-backend/src/main/java/org/apache/shardingsphere/shardingproxy/backend/response/update/UpdateResponse.java +++ b/sharding-proxy/sharding-proxy-backend/src/main/java/org/apache/shardingsphere/shardingproxy/backend/response/update/UpdateResponse.java @@ -18,6 +18,7 @@ package org.apache.shardingsphere.shardingproxy.backend.response.update; import lombok.Getter; +import lombok.Setter; import org.apache.shardingsphere.shardingproxy.backend.communication.jdbc.execute.response.ExecuteResponse; import org.apache.shardingsphere.shardingproxy.backend.communication.jdbc.execute.response.ExecuteUpdateResponse; import org.apache.shardingsphere.shardingproxy.backend.response.BackendResponse; @@ -40,6 +41,10 @@ public final class UpdateResponse implements BackendResponse { @Getter private long updateCount; + @Getter + @Setter + private String type; + public UpdateResponse() { this(Collections.emptyList()); } diff --git a/sharding-proxy/sharding-proxy-frontend/sharding-proxy-frontend-postgresql/src/main/java/org/apache/shardingsphere/shardingproxy/frontend/postgresql/command/query/binary/bind/PostgreSQLComBindExecutor.java b/sharding-proxy/sharding-proxy-frontend/sharding-proxy-frontend-postgresql/src/main/java/org/apache/shardingsphere/shardingproxy/frontend/postgresql/command/query/binary/bind/PostgreSQLComBindExecutor.java index 38e6905eca146..ff5d6870d6c7e 100644 --- a/sharding-proxy/sharding-proxy-frontend/sharding-proxy-frontend-postgresql/src/main/java/org/apache/shardingsphere/shardingproxy/frontend/postgresql/command/query/binary/bind/PostgreSQLComBindExecutor.java +++ b/sharding-proxy/sharding-proxy-frontend/sharding-proxy-frontend-postgresql/src/main/java/org/apache/shardingsphere/shardingproxy/frontend/postgresql/command/query/binary/bind/PostgreSQLComBindExecutor.java @@ -97,7 +97,7 @@ private PostgreSQLErrorResponsePacket createErrorPacket(final ErrorResponse erro } private PostgreSQLCommandCompletePacket createUpdatePacket(final UpdateResponse updateResponse) { - return new PostgreSQLCommandCompletePacket(); + return new PostgreSQLCommandCompletePacket(updateResponse.getType(), updateResponse.getUpdateCount()); } private Optional createQueryPacket(final QueryResponse queryResponse) { diff --git a/sharding-proxy/sharding-proxy-frontend/sharding-proxy-frontend-postgresql/src/main/java/org/apache/shardingsphere/shardingproxy/frontend/postgresql/command/query/text/PostgreSQLComQueryExecutor.java b/sharding-proxy/sharding-proxy-frontend/sharding-proxy-frontend-postgresql/src/main/java/org/apache/shardingsphere/shardingproxy/frontend/postgresql/command/query/text/PostgreSQLComQueryExecutor.java index c1743d0e268fc..51d6c1bb3e42d 100644 --- a/sharding-proxy/sharding-proxy-frontend/sharding-proxy-frontend-postgresql/src/main/java/org/apache/shardingsphere/shardingproxy/frontend/postgresql/command/query/text/PostgreSQLComQueryExecutor.java +++ b/sharding-proxy/sharding-proxy-frontend/sharding-proxy-frontend-postgresql/src/main/java/org/apache/shardingsphere/shardingproxy/frontend/postgresql/command/query/text/PostgreSQLComQueryExecutor.java @@ -82,7 +82,7 @@ private PostgreSQLErrorResponsePacket createErrorPacket(final ErrorResponse erro } private PostgreSQLCommandCompletePacket createUpdatePacket(final UpdateResponse updateResponse) { - return new PostgreSQLCommandCompletePacket(); + return new PostgreSQLCommandCompletePacket(updateResponse.getType(), updateResponse.getUpdateCount()); } private Optional createQueryPacket(final QueryResponse queryResponse) { diff --git a/shardingsphere-database-protocol/shardingsphere-database-protocol-postgresql/src/main/java/org/apache/shardingsphere/database/protocol/postgresql/packet/generic/PostgreSQLCommandCompletePacket.java b/shardingsphere-database-protocol/shardingsphere-database-protocol-postgresql/src/main/java/org/apache/shardingsphere/database/protocol/postgresql/packet/generic/PostgreSQLCommandCompletePacket.java index ff6b6387a2238..a2f3ad43194c9 100644 --- a/shardingsphere-database-protocol/shardingsphere-database-protocol-postgresql/src/main/java/org/apache/shardingsphere/database/protocol/postgresql/packet/generic/PostgreSQLCommandCompletePacket.java +++ b/shardingsphere-database-protocol/shardingsphere-database-protocol-postgresql/src/main/java/org/apache/shardingsphere/database/protocol/postgresql/packet/generic/PostgreSQLCommandCompletePacket.java @@ -30,13 +30,22 @@ public final class PostgreSQLCommandCompletePacket implements PostgreSQLPacket { @Getter private final char messageType = PostgreSQLCommandPacketType.COMMAND_COMPLETE.getValue(); - private final String sqlCommand = ""; + private final String sqlCommand; - private final int rowCount = 0; + private final long rowCount; + + public PostgreSQLCommandCompletePacket() { + sqlCommand = ""; + rowCount = 0; + } + + public PostgreSQLCommandCompletePacket(final String sqlCommand, final long rowCount) { + this.sqlCommand = sqlCommand; + this.rowCount = rowCount; + } @Override public void write(final PostgreSQLPacketPayload payload) { - // TODO payload.writeStringNul(sqlCommand + " " + rowCount); - payload.writeStringNul(""); + payload.writeStringNul(sqlCommand + " " + rowCount); } }