Skip to content

Commit a7be6fb

Browse files
authored
executor: fix nil buffer in basePartialResult4GroupConcat when hash aggregation is spilled (#61808) (#62125)
close #61749
1 parent 044d04c commit a7be6fb

File tree

3 files changed

+26
-10
lines changed

3 files changed

+26
-10
lines changed

pkg/executor/aggfuncs/spill_deserialize_helper.go

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
package aggfuncs
1616

1717
import (
18+
"bytes"
19+
1820
"github.com/pingcap/tidb/pkg/util/chunk"
1921
"github.com/pingcap/tidb/pkg/util/hack"
2022
util "github.com/pingcap/tidb/pkg/util/serialization"
@@ -216,8 +218,13 @@ func (s *deserializeHelper) deserializePartialResult4SumFloat64(dst *partialResu
216218
func (s *deserializeHelper) deserializeBasePartialResult4GroupConcat(dst *basePartialResult4GroupConcat) bool {
217219
if s.readRowIndex < s.totalRowCnt {
218220
s.pab.Reset(s.column, s.readRowIndex)
219-
dst.valsBuf = util.DeserializeBytesBuffer(s.pab)
220-
dst.buffer = util.DeserializeBytesBuffer(s.pab)
221+
dst.valsBuf = &bytes.Buffer{}
222+
hasBuffer := util.DeserializeBool(s.pab)
223+
if hasBuffer {
224+
dst.buffer = util.DeserializeBytesBuffer(s.pab)
225+
} else {
226+
dst.buffer = nil
227+
}
221228
s.readRowIndex++
222229
return true
223230
}

pkg/executor/aggfuncs/spill_helper_test.go

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@ import (
2525
"github.com/stretchr/testify/require"
2626
)
2727

28-
var testLongStr1 string = getLongString("平p凯k星x辰c")
29-
var testLongStr2 string = getLongString("123aa啊啊aa")
28+
var testLongStr1 string = getLongString("平352p凯额6辰c")
29+
var testLongStr2 string = getLongString("123a啊f24f去rsgvsfg")
3030

3131
func getChunk() *chunk.Chunk {
3232
fieldTypes := make([]*types.FieldType, 1)
@@ -746,13 +746,15 @@ func TestPartialResult4SumFloat64(t *testing.T) {
746746

747747
func TestBasePartialResult4GroupConcat(t *testing.T) {
748748
var serializeHelper = NewSerializeHelper()
749+
serializeHelper.buf = make([]byte, 0)
749750
bufSizeChecker := newBufferSizeChecker()
750751

751752
// Initialize test data
752753
expectData := []basePartialResult4GroupConcat{
754+
{valsBuf: bytes.NewBufferString("123"), buffer: nil},
753755
{valsBuf: bytes.NewBufferString(""), buffer: bytes.NewBufferString("")},
754-
{valsBuf: bytes.NewBufferString("xzxx"), buffer: bytes.NewBufferString(testLongStr2)},
755-
{valsBuf: bytes.NewBufferString(testLongStr1), buffer: bytes.NewBufferString(testLongStr2)},
756+
{valsBuf: bytes.NewBufferString(""), buffer: bytes.NewBufferString(testLongStr1)},
757+
{valsBuf: bytes.NewBufferString(""), buffer: bytes.NewBufferString(testLongStr2)},
756758
}
757759
serializedPartialResults := make([]PartialResult, len(expectData))
758760
testDataNum := len(serializedPartialResults)
@@ -787,8 +789,11 @@ func TestBasePartialResult4GroupConcat(t *testing.T) {
787789
// Check some results
788790
require.Equal(t, testDataNum, index)
789791
for i := 0; i < testDataNum; i++ {
790-
require.Equal(t, (*basePartialResult4GroupConcat)(serializedPartialResults[i]).valsBuf.String(), deserializedPartialResults[i].valsBuf.String())
791-
require.Equal(t, (*basePartialResult4GroupConcat)(serializedPartialResults[i]).buffer.String(), deserializedPartialResults[i].buffer.String())
792+
if (*basePartialResult4GroupConcat)(serializedPartialResults[i]).buffer != nil {
793+
require.Equal(t, (*basePartialResult4GroupConcat)(serializedPartialResults[i]).buffer.String(), deserializedPartialResults[i].buffer.String())
794+
} else {
795+
require.Equal(t, (*bytes.Buffer)(nil), deserializedPartialResults[i].buffer)
796+
}
792797
}
793798
}
794799

pkg/executor/aggfuncs/spill_serialize_helper.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -131,8 +131,12 @@ func (s *SerializeHelper) serializePartialResult4SumFloat64(value partialResult4
131131

132132
func (s *SerializeHelper) serializeBasePartialResult4GroupConcat(value basePartialResult4GroupConcat) []byte {
133133
s.buf = s.buf[:0]
134-
s.buf = util.SerializeBytesBuffer(value.valsBuf, s.buf)
135-
s.buf = util.SerializeBytesBuffer(value.buffer, s.buf)
134+
if value.buffer != nil {
135+
s.buf = util.SerializeBool(true, s.buf)
136+
s.buf = util.SerializeBytesBuffer(value.buffer, s.buf)
137+
} else {
138+
s.buf = util.SerializeBool(false, s.buf)
139+
}
136140
return s.buf
137141
}
138142

0 commit comments

Comments
 (0)