From a1cbdb1c0ee1f34f8aa4d916e0a253a68d2e6f94 Mon Sep 17 00:00:00 2001 From: xhe Date: Tue, 30 Nov 2021 20:36:40 +0800 Subject: [PATCH 1/2] server: fix prepared cursor select Signed-off-by: xhe --- server/conn.go | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/server/conn.go b/server/conn.go index 113efd1d0a8e1..bebb01674edc2 100644 --- a/server/conn.go +++ b/server/conn.go @@ -2190,9 +2190,13 @@ func (cc *clientConn) writeChunks(ctx context.Context, rs ResultSet, binary bool // fetchSize, the desired number of rows to be fetched each time when client uses cursor. func (cc *clientConn) writeChunksWithFetchSize(ctx context.Context, rs ResultSet, serverStatus uint16, fetchSize int) error { fetchedRows := rs.GetFetchedRows() + // if fetchedRows is not enough, getting data from recordSet. for len(fetchedRows) < fetchSize { - // if fetchedRows is not enough, getting data from recordSet. - req := rs.NewChunk(cc.chunkAlloc) + // NOTE: chunk should not be allocated from the allocator + // the allocator will reset every statement + // but it maybe stored in the result set among statements + // ref https://github.com/pingcap/tidb/blob/7fc6ebbda4ddf84c0ba801ca7ebb636b934168cf/server/conn_stmt.go#L233-L239 + req := rs.NewChunk(nil) // Here server.tidbResultSet implements Next method. if err := rs.Next(ctx, req); err != nil { return err @@ -2205,7 +2209,6 @@ func (cc *clientConn) writeChunksWithFetchSize(ctx context.Context, rs ResultSet for i := 0; i < rowCount; i++ { fetchedRows = append(fetchedRows, req.GetRow(i)) } - req = chunk.Renew(req, cc.ctx.GetSessionVars().MaxChunkSize) } // tell the client COM_STMT_FETCH has finished by setting proper serverStatus, From 7855935f7ed85b1ff4f6f008955c9e185287ff75 Mon Sep 17 00:00:00 2001 From: xhe Date: Wed, 8 Dec 2021 11:32:42 +0800 Subject: [PATCH 2/2] server: address comment Signed-off-by: xhe --- server/conn.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/server/conn.go b/server/conn.go index bebb01674edc2..0209ab77171a5 100644 --- a/server/conn.go +++ b/server/conn.go @@ -2191,13 +2191,14 @@ func (cc *clientConn) writeChunks(ctx context.Context, rs ResultSet, binary bool func (cc *clientConn) writeChunksWithFetchSize(ctx context.Context, rs ResultSet, serverStatus uint16, fetchSize int) error { fetchedRows := rs.GetFetchedRows() // if fetchedRows is not enough, getting data from recordSet. + req := rs.NewChunk(nil) for len(fetchedRows) < fetchSize { // NOTE: chunk should not be allocated from the allocator // the allocator will reset every statement // but it maybe stored in the result set among statements // ref https://github.com/pingcap/tidb/blob/7fc6ebbda4ddf84c0ba801ca7ebb636b934168cf/server/conn_stmt.go#L233-L239 - req := rs.NewChunk(nil) // Here server.tidbResultSet implements Next method. + req.Reset() if err := rs.Next(ctx, req); err != nil { return err }