diff --git a/pkg/server/conn.go b/pkg/server/conn.go index ee9566dea4448..3a61e31f06d56 100644 --- a/pkg/server/conn.go +++ b/pkg/server/conn.go @@ -2050,11 +2050,7 @@ func (cc *clientConn) handleStmt(ctx context.Context, stmt ast.StmtNode, warns [ execStmt.(*executor.ExecStmt).FinishExecuteStmt(0, err, false) } } - if err != nil { - return false, err - } - - return false, nil + return false, err } func (cc *clientConn) handleFileTransInConn(ctx context.Context, status uint16) (bool, error) { @@ -2282,6 +2278,9 @@ func (cc *clientConn) writeChunks(ctx context.Context, rs resultset.ResultSet, b stmtDetail.WriteSQLRespDuration += time.Since(start) } } + if err := rs.Close(); err != nil { + return false, err + } if stmtDetail != nil { start = time.Now() diff --git a/pkg/session/session.go b/pkg/session/session.go index c405a6b26e5a0..715a29a3a8fd1 100644 --- a/pkg/session/session.go +++ b/pkg/session/session.go @@ -2475,16 +2475,20 @@ const ExecStmtVarKey ExecStmtVarKeyType = 0 // RecordSet, so this struct exists and RecordSet.Close() is overrided handle that. type execStmtResult struct { sqlexec.RecordSet - se *session - sql sqlexec.Statement + se *session + sql sqlexec.Statement + closed bool } func (rs *execStmtResult) Close() error { - se := rs.se - if err := rs.RecordSet.Close(); err != nil { - return finishStmt(context.Background(), se, err, rs.sql) + if rs.closed { + return nil } - return finishStmt(context.Background(), se, nil, rs.sql) + se := rs.se + err := rs.RecordSet.Close() + err = finishStmt(context.Background(), se, err, rs.sql) + rs.closed = true + return err } // rollbackOnError makes sure the next statement starts a new transaction with the latest InfoSchema.