Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

#3556, carry PR#5194 to dev-4.x #5733

Merged
merged 1 commit into from
May 21, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -75,12 +77,23 @@ public BackendResponse execute(final ExecutionContext executionContext) throws S
boolean isExceptionThrown = ExecutorExceptionHandler.isExceptionThrown();
Collection<InputGroup<StatementExecuteUnit>> inputGroups = sqlExecutePrepareTemplate.getExecuteUnitGroups(
executionContext.getExecutionUnits(), new ProxyJDBCExecutePrepareCallback(backendConnection, jdbcExecutorWrapper, isReturnGeneratedKeys));
Collection<ExecuteResponse> executeResponses = sqlExecuteTemplate.execute((Collection) inputGroups,
Collection<ExecuteResponse> 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<QueryHeader> queryHeaders, final Collection<ExecuteResponse> executeResponses) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -40,6 +41,10 @@ public final class UpdateResponse implements BackendResponse {
@Getter
private long updateCount;

@Getter
@Setter
private String type;

public UpdateResponse() {
this(Collections.emptyList());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<PostgreSQLRowDescriptionPacket> createQueryPacket(final QueryResponse queryResponse) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<PostgreSQLRowDescriptionPacket> createQueryPacket(final QueryResponse queryResponse) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
}