Skip to content
Merged
10 changes: 8 additions & 2 deletions pkg/container/vector/vector.go
Original file line number Diff line number Diff line change
Expand Up @@ -375,7 +375,7 @@ func GetArrayAt2[T types.RealNumbers](v *Vector, bs []types.Varlena, i int) []T
// WARNING: GetAny() return value with any type will cause memory escape to heap which will result in slow GC.
// If you know the actual type, better use the GetFixedAtWithTypeCheck() to get the values.
// Only use when you have no choice, e.g. you are dealing with column with any type that don't know in advanced.
func GetAny(vec *Vector, i int) any {
func GetAny(vec *Vector, i int, deepCopy bool) any {
switch vec.typ.Oid {
case types.T_bool:
return GetFixedAtNoTypeCheck[bool](vec, i)
Expand Down Expand Up @@ -425,7 +425,13 @@ func GetAny(vec *Vector, i int) any {
return GetFixedAtNoTypeCheck[types.Blockid](vec, i)
case types.T_char, types.T_varchar, types.T_binary, types.T_varbinary, types.T_json, types.T_blob, types.T_text,
types.T_array_float32, types.T_array_float64, types.T_datalink:
return vec.GetBytesAt(i)
ret := vec.GetBytesAt(i)
if deepCopy {
copied := make([]byte, len(ret))
copy(copied, ret)
ret = copied
}
return ret
}
return nil
}
Expand Down
41 changes: 21 additions & 20 deletions pkg/container/vector/vector_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,12 @@ package vector

import (
"fmt"
"golang.org/x/exp/rand"
"slices"
"strings"
"testing"

"golang.org/x/exp/rand"

"github.com/matrixorigin/matrixone/pkg/common/bitmap"
"github.com/matrixorigin/matrixone/pkg/common/mpool"
"github.com/matrixorigin/matrixone/pkg/container/nulls"
Expand Down Expand Up @@ -2414,7 +2415,7 @@ func TestGetAny(t *testing.T) {
v := NewVec(types.T_int8.ToType())
err := AppendFixed(v, int8(0), false, mp)
require.NoError(t, err)
s := GetAny(v, 0)
s := GetAny(v, 0, false)
v.Free(mp)
require.Equal(t, int8(0), s.(int8))
}
Expand All @@ -2423,7 +2424,7 @@ func TestGetAny(t *testing.T) {
w := NewVec(types.T_varchar.ToType())
err := AppendBytes(w, []byte("x"), false, mp)
require.NoError(t, err)
s := GetAny(w, 0)
s := GetAny(w, 0, false)
require.Equal(t, []byte("x"), s.([]byte))
w.Free(mp)
}
Expand All @@ -2432,7 +2433,7 @@ func TestGetAny(t *testing.T) {
w := NewVec(types.T_bool.ToType())
err := AppendFixedList(w, []bool{true, false, true, false}, nil, mp)
require.NoError(t, err)
s := GetAny(w, 0)
s := GetAny(w, 0, false)
require.Equal(t, true, s.(bool))

w.Free(mp)
Expand All @@ -2444,7 +2445,7 @@ func TestGetAny(t *testing.T) {
err := AppendFixedList(w, []int8{1, 2, 3, 4}, nil, mp)
require.NoError(t, err)

s := GetAny(w, 0)
s := GetAny(w, 0, false)
require.Equal(t, int8(1), s.(int8))

w.Free(mp)
Expand All @@ -2456,7 +2457,7 @@ func TestGetAny(t *testing.T) {
err := AppendFixedList(w, []int16{1, 2, 3, 4}, nil, mp)
require.NoError(t, err)

s := GetAny(w, 0)
s := GetAny(w, 0, false)
require.Equal(t, int16(1), s.(int16))

w.Free(mp)
Expand All @@ -2468,7 +2469,7 @@ func TestGetAny(t *testing.T) {
err := AppendFixedList(w, []int32{1, 2, 3, 4}, nil, mp)
require.NoError(t, err)

s := GetAny(w, 0)
s := GetAny(w, 0, false)
require.Equal(t, int32(1), s.(int32))

w.Free(mp)
Expand All @@ -2480,7 +2481,7 @@ func TestGetAny(t *testing.T) {
err := AppendFixedList(w, []int64{1, 2, 3, 4}, nil, mp)
require.NoError(t, err)

s := GetAny(w, 0)
s := GetAny(w, 0, false)
require.Equal(t, int64(1), s.(int64))

w.Free(mp)
Expand All @@ -2492,7 +2493,7 @@ func TestGetAny(t *testing.T) {
err := AppendFixedList(w, []uint8{1, 2, 3, 4}, nil, mp)
require.NoError(t, err)

s := GetAny(w, 0)
s := GetAny(w, 0, false)
require.Equal(t, uint8(1), s.(uint8))

w.Free(mp)
Expand All @@ -2504,7 +2505,7 @@ func TestGetAny(t *testing.T) {
err := AppendFixedList(w, []uint16{1, 2, 3, 4}, nil, mp)
require.NoError(t, err)

s := GetAny(w, 0)
s := GetAny(w, 0, false)
require.Equal(t, uint16(1), s.(uint16))

w.Free(mp)
Expand All @@ -2516,7 +2517,7 @@ func TestGetAny(t *testing.T) {
err := AppendFixedList(w, []uint32{1, 2, 3, 4}, nil, mp)
require.NoError(t, err)

s := GetAny(w, 0)
s := GetAny(w, 0, false)
require.Equal(t, uint32(1), s.(uint32))

w.Free(mp)
Expand All @@ -2528,7 +2529,7 @@ func TestGetAny(t *testing.T) {
err := AppendFixedList(w, []uint64{1, 2, 3, 4}, nil, mp)
require.NoError(t, err)

s := GetAny(w, 0)
s := GetAny(w, 0, false)
require.Equal(t, uint64(1), s.(uint64))

w.Free(mp)
Expand All @@ -2540,7 +2541,7 @@ func TestGetAny(t *testing.T) {
err := AppendBytesList(v, [][]byte{[]byte("1"), []byte("2"), []byte("3"), []byte("4")}, nil, mp)
require.NoError(t, err)

s := GetAny(v, 0)
s := GetAny(v, 0, false)
require.Equal(t, []byte("1"), s.([]byte))

v.Free(mp)
Expand All @@ -2551,7 +2552,7 @@ func TestGetAny(t *testing.T) {
v := NewVec(types.T_time.ToType())
err := AppendFixedList(v, []types.Time{12 * 3600 * 1000 * 1000, 2, 3, 4}, nil, mp)
require.NoError(t, err)
s := GetAny(v, 0)
s := GetAny(v, 0, false)
require.Equal(t, types.Time(12*3600*1000*1000), s.(types.Time))
v.Free(mp)
require.Equal(t, int64(0), mp.CurrNB())
Expand All @@ -2561,7 +2562,7 @@ func TestGetAny(t *testing.T) {
v := NewVec(types.T_timestamp.ToType())
err := AppendFixedList(v, []types.Timestamp{10000000, 2, 3, 4}, nil, mp)
require.NoError(t, err)
s := GetAny(v, 0)
s := GetAny(v, 0, false)
require.Equal(t, types.Timestamp(10000000), s.(types.Timestamp))
v.Free(mp)
require.Equal(t, int64(0), mp.CurrNB())
Expand All @@ -2573,7 +2574,7 @@ func TestGetAny(t *testing.T) {
v := NewVec(typ)
err := AppendFixedList(v, []types.Decimal64{1234, 2000}, nil, mp)
require.NoError(t, err)
s := GetAny(v, 0)
s := GetAny(v, 0, false)
require.Equal(t, types.Decimal64(1234), s.(types.Decimal64))
v.Free(mp)
require.Equal(t, int64(0), mp.CurrNB())
Expand All @@ -2585,7 +2586,7 @@ func TestGetAny(t *testing.T) {
v := NewVec(typ)
err := AppendFixedList(v, []types.Decimal128{{B0_63: 1234, B64_127: 0}, {B0_63: 2345, B64_127: 0}}, nil, mp)
require.NoError(t, err)
s := GetAny(v, 0)
s := GetAny(v, 0, false)
require.Equal(t, types.Decimal128{B0_63: 1234, B64_127: 0}, s.(types.Decimal128))
v.Free(mp)
require.Equal(t, int64(0), mp.CurrNB())
Expand All @@ -2596,7 +2597,7 @@ func TestGetAny(t *testing.T) {
v := NewVec(types.T_uuid.ToType())
err := AppendFixedList(v, vs, nil, mp)
require.NoError(t, err)
s := GetAny(v, 0)
s := GetAny(v, 0, false)
require.Equal(t, "00000000-0000-0000-0000-000000000000", fmt.Sprint(s))
v.Free(mp)
require.Equal(t, int64(0), mp.CurrNB())
Expand All @@ -2607,7 +2608,7 @@ func TestGetAny(t *testing.T) {
v := NewVec(types.T_TS.ToType())
err := AppendFixedList(v, vs, nil, mp)
require.NoError(t, err)
s := GetAny(v, 0)
s := GetAny(v, 0, false)
require.Equal(t, types.TS(types.TS{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}), s)
v.Free(mp)
require.Equal(t, int64(0), mp.CurrNB())
Expand All @@ -2618,7 +2619,7 @@ func TestGetAny(t *testing.T) {
v := NewVec(types.T_Rowid.ToType())
err := AppendFixedList(v, vs, nil, mp)
require.NoError(t, err)
s := GetAny(v, 0)
s := GetAny(v, 0, false)
require.Equal(t, types.Rowid(types.Rowid{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}), s)
v.Free(mp)
require.Equal(t, int64(0), mp.CurrNB())
Expand Down
Loading
Loading