github.com/matrixorigin/matrixone@v0.7.0/pkg/container/vector/vector_test.go (about)

     1  // Copyright 2021 Matrix Origin
     2  //
     3  // Licensed under the Apache License, Version 2.0 (the "License");
     4  // you may not use this file except in compliance with the License.
     5  // You may obtain a copy of the License at
     6  //
     7  //      http://www.apache.org/licenses/LICENSE-2.0
     8  //
     9  // Unless required by applicable law or agreed to in writing, software
    10  // distributed under the License is distributed on an "AS IS" BASIS,
    11  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    12  // See the License for the specific language governing permissions and
    13  // limitations under the License.
    14  
    15  package vector
    16  
    17  import (
    18  	"testing"
    19  
    20  	"github.com/matrixorigin/matrixone/pkg/common/mpool"
    21  	"github.com/matrixorigin/matrixone/pkg/container/nulls"
    22  	"github.com/matrixorigin/matrixone/pkg/container/types"
    23  	"github.com/stretchr/testify/require"
    24  )
    25  
    26  var testMp = mpool.MustNewZero()
    27  
    28  func TestReset(t *testing.T) {
    29  	v0 := New(types.Type{Oid: types.T(types.T_varchar)})
    30  	Reset(v0)
    31  	require.Equal(t, 0, len(v0.data))
    32  }
    33  
    34  func TestClean(t *testing.T) {
    35  	v0 := New(types.Type{Oid: types.T(types.T_int8)})
    36  	AppendFixed(v0, []int8{1, 2, 3}, testMp)
    37  	Clean(v0, testMp)
    38  	require.Equal(t, 0, len(v0.data))
    39  }
    40  
    41  func TestSetCol(t *testing.T) {
    42  	v0 := New(types.Type{Oid: types.T(types.T_int8)})
    43  	SetCol(v0, []int8{1, 2, 3})
    44  	require.Equal(t, v0.Col, []int8{1, 2, 3})
    45  }
    46  
    47  func TestLength(t *testing.T) {
    48  	v0 := New(types.Type{Oid: types.T(types.T_int8)})
    49  	v0.Col = []int8{1, 2, 3, 4, 5}
    50  	require.Equal(t, 5, Length(v0))
    51  	v1 := New(types.Type{Oid: types.T(types.T_char)})
    52  	va1, _, _ := types.BuildVarlena([]byte("foo"), nil, testMp)
    53  	va2, _, _ := types.BuildVarlena([]byte("bar"), nil, testMp)
    54  	v1.Col = []types.Varlena{va1, va2}
    55  	require.Equal(t, 2, Length(v1))
    56  }
    57  
    58  func setLenTest[T any](t *testing.T, tt types.T, mp *mpool.MPool, arg []T) {
    59  	v0 := New(types.Type{Oid: types.T(tt)})
    60  	v0.Col = arg
    61  	FillVectorData[T](v0, mp)
    62  	SetLength(v0, 3)
    63  	require.Equal(t, 3, len(v0.Col.([]T)))
    64  }
    65  
    66  func TestSetLength(t *testing.T) {
    67  	mp := mpool.MustNewZero()
    68  	setLenTest(t, types.T_int8, mp, []int8{1, 2, 3, 4, 5, 6, 7, 8})
    69  	setLenTest(t, types.T_int16, mp, []int16{1, 2, 3, 4, 5, 6, 7, 8})
    70  	setLenTest(t, types.T_int32, mp, []int32{1, 2, 3, 4, 5, 6, 7, 8})
    71  	setLenTest(t, types.T_int64, mp, []int64{1, 2, 3, 4, 5, 6, 7, 8})
    72  
    73  	setLenTest(t, types.T_uint8, mp, []uint8{1, 2, 3, 4, 5, 6, 7, 8})
    74  	setLenTest(t, types.T_uint16, mp, []uint16{1, 2, 3, 4, 5, 6, 7, 8})
    75  	setLenTest(t, types.T_uint32, mp, []uint32{1, 2, 3, 4, 5, 6, 7, 8})
    76  	setLenTest(t, types.T_uint64, mp, []uint64{1, 2, 3, 4, 5, 6, 7, 8})
    77  
    78  	setLenTest(t, types.T_float32, mp, []float32{1, 2, 3, 4, 5, 6, 7, 8})
    79  	setLenTest(t, types.T_float64, mp, []float64{1, 2, 3, 4, 5, 6, 7, 8})
    80  
    81  	setLenTest(t, types.T_date, mp, []types.Date{1, 2, 3, 4, 5, 6, 7, 8})
    82  	setLenTest(t, types.T_datetime, mp, []types.Datetime{1, 2, 3, 4, 5, 6, 7, 8})
    83  }
    84  
    85  func mustMakeSliceArgsAsBytes[T any](mp *mpool.MPool, args ...T) []byte {
    86  	ret, err := mpool.MakeSliceArgs(mp, args...)
    87  	if err != nil {
    88  		panic(err)
    89  	}
    90  	return types.EncodeSlice(ret)
    91  }
    92  
    93  func dupTest[T any](t *testing.T, tt types.T, mp *mpool.MPool, args ...T) {
    94  	v0 := New(types.Type{Oid: types.T(tt)})
    95  	v0.data = mustMakeSliceArgsAsBytes(mp, args...)
    96  	v0.Col = types.DecodeSlice[T](v0.data)
    97  	v0Duplicate, _ := Dup(v0, mp)
    98  	require.Equal(t, v0, v0Duplicate)
    99  }
   100  
   101  func TestDup(t *testing.T) {
   102  	mp := mpool.MustNewZero()
   103  	dupTest[int8](t, types.T_int8, mp, 1, 2, 3, 4)
   104  	dupTest[int16](t, types.T_int16, mp, 1, 2, 3, 4)
   105  	dupTest[int32](t, types.T_int32, mp, 1, 2, 3, 4)
   106  	dupTest[int64](t, types.T_int64, mp, 1, 2, 3, 4)
   107  	dupTest[uint8](t, types.T_uint8, mp, 1, 2, 3, 4)
   108  	dupTest[uint16](t, types.T_uint16, mp, 1, 2, 3, 4)
   109  	dupTest[uint32](t, types.T_uint32, mp, 1, 2, 3, 4)
   110  	dupTest[uint64](t, types.T_uint64, mp, 1, 2, 3, 4)
   111  	dupTest[types.Date](t, types.T_date, mp, 1, 2, 3, 4)
   112  	dupTest[types.Datetime](t, types.T_datetime, mp, 1, 2, 3, 4)
   113  
   114  	v10 := New(types.Type{Oid: types.T(types.T_char)})
   115  	AppendBytes(v10, [][]byte{
   116  		[]byte("hello"),
   117  		[]byte("Gut"),
   118  		[]byte("knoichiwa"),
   119  		[]byte("nihao"),
   120  	}, mp)
   121  	v10Duplicate, err := Dup(v10, mp)
   122  	require.Equal(t, err, nil)
   123  	require.Equal(t, v10.data, v10Duplicate.data)
   124  	require.Equal(t, v10.area, v10Duplicate.area)
   125  	require.Equal(t, MustStrCols(v10), MustStrCols(v10Duplicate))
   126  	require.Equal(t, v10.GetString(0), v10Duplicate.GetString(0))
   127  	require.Equal(t, v10.GetString(1), v10Duplicate.GetString(1))
   128  	require.Equal(t, v10.GetString(2), v10Duplicate.GetString(2))
   129  	require.Equal(t, v10.GetString(3), v10Duplicate.GetString(3))
   130  }
   131  
   132  func TestWindow(t *testing.T) {
   133  	mp := mpool.MustNewZero()
   134  	v0 := New(types.Type{Oid: types.T(types.T_int8)})
   135  	v0.data = mustMakeSliceArgsAsBytes[int8](mp, 1, 2, 3, 4, 5, 6, 7, 8)
   136  	v0.Col = types.DecodeSlice[int8](v0.data)
   137  	v0Window := New(types.Type{Oid: types.T(types.T_int8)})
   138  	start, end := 1, 3
   139  	v0Window = Window(v0, start, end, v0Window)
   140  	require.Equal(t, v0.Col.([]int8)[start:end], v0Window.Col)
   141  
   142  	v1 := New(types.Type{Oid: types.T(types.T_int16)})
   143  	v1.data = mustMakeSliceArgsAsBytes[int16](mp, 1, 2, 3, 4, 5, 6, 7, 8)
   144  	v1.Col = types.DecodeSlice[int16](v1.data)
   145  	v1Window := New(types.Type{Oid: types.T(types.T_int16)})
   146  	v1Window = Window(v1, start, end, v1Window)
   147  	require.Equal(t, v1.Col.([]int16)[start:end], v1Window.Col)
   148  
   149  	v2 := New(types.Type{Oid: types.T(types.T_int32)})
   150  	v2.data = mustMakeSliceArgsAsBytes[int32](mp, 1, 2, 3, 4, 5, 6, 7, 8)
   151  	v2.Col = types.DecodeSlice[int32](v2.data)
   152  	v2Window := New(types.Type{Oid: types.T(types.T_int32)})
   153  	v2Window = Window(v2, start, end, v2Window)
   154  	require.Equal(t, v2.Col.([]int32)[start:end], v2Window.Col)
   155  
   156  	v3 := New(types.Type{Oid: types.T(types.T_int64)})
   157  	v3.data = mustMakeSliceArgsAsBytes[int64](mp, 1, 2, 3, 4, 5, 6, 7, 8)
   158  	v3.Col = types.DecodeSlice[int64](v3.data)
   159  	v3Window := New(types.Type{Oid: types.T(types.T_int64)})
   160  	v3Window = Window(v3, start, end, v3Window)
   161  	require.Equal(t, v3.Col.([]int64)[start:end], v3Window.Col)
   162  
   163  	v4 := New(types.Type{Oid: types.T(types.T_uint8)})
   164  	v4.data = mustMakeSliceArgsAsBytes[uint8](mp, 1, 2, 3, 4, 5, 6, 7, 8)
   165  	v4.Col = types.DecodeSlice[uint8](v4.data)
   166  	v4Window := New(types.Type{Oid: types.T(types.T_uint8)})
   167  	v4Window = Window(v4, start, end, v4Window)
   168  	require.Equal(t, v4.Col.([]uint8)[start:end], v4Window.Col)
   169  
   170  	v5 := New(types.Type{Oid: types.T(types.T_uint16)})
   171  	v5.data = mustMakeSliceArgsAsBytes[uint16](mp, 1, 2, 3, 4, 5, 6, 7, 8)
   172  	v5.Col = types.DecodeSlice[uint16](v5.data)
   173  	v5Window := New(types.Type{Oid: types.T(types.T_uint16)})
   174  	v5Window = Window(v5, start, end, v5Window)
   175  	require.Equal(t, v5.Col.([]uint16)[start:end], v5Window.Col)
   176  
   177  	v6 := New(types.Type{Oid: types.T(types.T_uint32)})
   178  	v6.data = mustMakeSliceArgsAsBytes[uint32](mp, 1, 2, 3, 4, 5, 6, 7, 8)
   179  	v6.Col = types.DecodeSlice[uint32](v6.data)
   180  	v6Window := New(types.Type{Oid: types.T(types.T_uint32)})
   181  	v6Window = Window(v6, start, end, v6Window)
   182  	require.Equal(t, v6.Col.([]uint32)[start:end], v6Window.Col)
   183  
   184  	v7 := New(types.Type{Oid: types.T(types.T_uint64)})
   185  	v7.data = mustMakeSliceArgsAsBytes[uint64](mp, 1, 2, 3, 4, 5, 6, 7, 8)
   186  	v7.Col = types.DecodeSlice[uint64](v7.data)
   187  	v7Window := New(types.Type{Oid: types.T(types.T_uint64)})
   188  	v7Window = Window(v7, start, end, v7Window)
   189  	require.Equal(t, v7.Col.([]uint64)[start:end], v7Window.Col)
   190  
   191  	v8 := New(types.Type{Oid: types.T(types.T_float32)})
   192  	v8.data = mustMakeSliceArgsAsBytes[float32](mp, 1, 2, 3, 4, 5, 6, 7, 8)
   193  	v8.Col = types.DecodeSlice[float32](v8.data)
   194  	v8Window := New(types.Type{Oid: types.T(types.T_float32)})
   195  	v8Window = Window(v8, start, end, v8Window)
   196  	require.Equal(t, v8.Col.([]float32)[start:end], v8Window.Col)
   197  
   198  	v9 := New(types.Type{Oid: types.T(types.T_float64)})
   199  	v9.data = mustMakeSliceArgsAsBytes[float64](mp, 1, 2, 3, 4, 5, 6, 7, 8)
   200  	v9.Col = types.DecodeSlice[float64](v9.data)
   201  	v9Window := New(types.Type{Oid: types.T(types.T_float64)})
   202  	v9Window = Window(v9, start, end, v9Window)
   203  	require.Equal(t, v9.Col.([]float64)[start:end], v9Window.Col)
   204  
   205  	v11 := New(types.Type{Oid: types.T(types.T_char)})
   206  	AppendBytes(v11, [][]byte{
   207  		[]byte("hello"),
   208  		[]byte("Gut"),
   209  		[]byte("konichiwa"),
   210  		[]byte("nihao"),
   211  	}, mp)
   212  	v11Window := New(types.Type{Oid: types.T(types.T_char)})
   213  	v11Window = Window(v11, start, end, v11Window)
   214  	vs11 := MustStrCols(v11)
   215  	ws11 := MustStrCols(v11Window)
   216  	require.Equal(t, vs11[start:end], ws11)
   217  
   218  	v12 := New(types.Type{Oid: types.T(types.T_date)})
   219  	v12.data = mustMakeSliceArgsAsBytes[types.Date](mp, 1, 2, 3, 4, 5, 6, 7, 8)
   220  	v12.Col = types.DecodeSlice[types.Date](v12.data)
   221  	v12Window := New(types.Type{Oid: types.T(types.T_date)})
   222  	v12Window = Window(v12, start, end, v12Window)
   223  	require.Equal(t, v12.Col.([]types.Date)[start:end], v12Window.Col)
   224  
   225  	v13 := New(types.Type{Oid: types.T(types.T_datetime)})
   226  	v13.data = mustMakeSliceArgsAsBytes[types.Datetime](mp, 1, 2, 3, 4, 5, 6, 7, 8)
   227  	v13.Col = types.DecodeSlice[types.Datetime](v13.data)
   228  	v13Window := New(types.Type{Oid: types.T(types.T_datetime)})
   229  	v13Window = Window(v13, start, end, v13Window)
   230  	require.Equal(t, v13.Col.([]types.Datetime)[start:end], v13Window.Col)
   231  }
   232  
   233  func TestWindowWithNulls(t *testing.T) {
   234  	v0 := New(types.T_int8.ToType())
   235  	mp := mpool.MustNewZero()
   236  
   237  	_ = v0.Append(int8(0), false, mp)
   238  	_ = v0.Append(int8(1), false, mp)
   239  	_ = v0.Append(int8(2), false, mp)
   240  	_ = v0.Append(int8(-1), true, mp) // v0[3] = null
   241  	_ = v0.Append(int8(6), false, mp)
   242  	_ = v0.Append(int8(-1), true, mp) // v0[5] = null
   243  	_ = v0.Append(int8(-1), true, mp) // v0[6] = null
   244  	_ = v0.Append(int8(6), false, mp)
   245  	_ = v0.Append(int8(7), false, mp)
   246  	_ = v0.Append(int8(8), false, mp)
   247  
   248  	require.Equal(t, []uint64{3, 5, 6}, v0.Nsp.Np.ToArray())
   249  
   250  	start, end := 1, 7
   251  	v0Window := New(types.T_int8.ToType())
   252  	v0Window = Window(v0, start, end, v0Window)
   253  	require.Equal(t, v0.Col.([]int8)[start:end], v0Window.Col)
   254  	require.Equal(t, []uint64{2, 4, 5}, v0Window.Nsp.Np.ToArray())
   255  
   256  	//t.Log(v0.String())
   257  	//t.Log(v0Window.String())
   258  }
   259  
   260  func TestAppend(t *testing.T) {
   261  	mp := mpool.MustNewZero()
   262  	v0 := New(types.Type{Oid: types.T(types.T_int8)})
   263  	int8Slice := []int8{1, 2, 3, 4, 5, 6, 7, 8}
   264  	v0.data = mustMakeSliceArgsAsBytes(mp, int8Slice...)
   265  	v0.Col = types.DecodeSlice[int8](v0.data)
   266  	appendInt8Slice := []int8{21, 22, 23}
   267  	err := AppendFixed(v0, appendInt8Slice, mp)
   268  	require.NoError(t, err)
   269  	require.Equal(t, append(int8Slice, appendInt8Slice...), v0.Col.([]int8))
   270  
   271  	v1 := New(types.Type{Oid: types.T(types.T_int16)})
   272  	int16Slice := []int16{1, 2, 3, 4, 5, 6, 7, 8}
   273  	v1.data = mustMakeSliceArgsAsBytes(mp, int16Slice...)
   274  	v1.Col = types.DecodeSlice[int16](v1.data)
   275  	appendInt16Slice := []int16{21, 22, 23}
   276  	err = AppendFixed(v1, appendInt16Slice, mp)
   277  	require.NoError(t, err)
   278  	require.Equal(t, append(int16Slice, appendInt16Slice...), v1.Col.([]int16))
   279  
   280  	v2 := New(types.Type{Oid: types.T(types.T_int32)})
   281  	int32Slice := []int32{1, 2, 3, 4, 5, 6, 7, 8}
   282  	v2.data = mustMakeSliceArgsAsBytes(mp, int32Slice...)
   283  	v2.Col = types.DecodeSlice[int32](v2.data)
   284  	appendInt32Slice := []int32{21, 22, 23}
   285  	err = AppendFixed(v2, appendInt32Slice, mp)
   286  	require.NoError(t, err)
   287  	require.Equal(t, append(int32Slice, appendInt32Slice...), v2.Col.([]int32))
   288  
   289  	v3 := New(types.Type{Oid: types.T(types.T_int64)})
   290  	int64Slice := []int64{1, 2, 3, 4, 5, 6, 7, 8}
   291  	v3.data = mustMakeSliceArgsAsBytes(mp, int64Slice...)
   292  	v3.Col = types.DecodeSlice[int64](v3.data)
   293  	appendInt64Slice := []int64{21, 22, 23}
   294  	err = AppendFixed(v3, appendInt64Slice, mp)
   295  	require.NoError(t, err)
   296  	require.Equal(t, append(int64Slice, appendInt64Slice...), v3.Col.([]int64))
   297  
   298  	v4 := New(types.Type{Oid: types.T(types.T_uint8)})
   299  	uint8Slice := []uint8{1, 2, 3, 4, 5, 6, 7, 8}
   300  	v4.data = mustMakeSliceArgsAsBytes(mp, uint8Slice...)
   301  	v4.Col = types.DecodeSlice[uint8](v4.data)
   302  	appendUint8Slice := []uint8{21, 22, 23}
   303  	err = AppendFixed(v4, appendUint8Slice, mp)
   304  	require.NoError(t, err)
   305  	require.Equal(t, append(uint8Slice, appendUint8Slice...), v4.Col.([]uint8))
   306  
   307  	v5 := New(types.Type{Oid: types.T(types.T_uint16)})
   308  	uint16Slice := []uint16{1, 2, 3, 4, 5, 6, 7, 8}
   309  	v5.data = mustMakeSliceArgsAsBytes(mp, uint16Slice...)
   310  	v5.Col = types.DecodeSlice[uint16](v5.data)
   311  	appendUint16Slice := []uint16{21, 22, 23}
   312  	err = AppendFixed(v5, appendUint16Slice, mp)
   313  	require.NoError(t, err)
   314  	require.Equal(t, append(uint16Slice, appendUint16Slice...), v5.Col.([]uint16))
   315  
   316  	v6 := New(types.Type{Oid: types.T(types.T_uint32)})
   317  	uint32Slice := []uint32{1, 2, 3, 4, 5, 6, 7, 8}
   318  	v6.data = mustMakeSliceArgsAsBytes(mp, uint32Slice...)
   319  	v6.Col = types.DecodeSlice[uint32](v6.data)
   320  	appendUint32Slice := []uint32{21, 22, 23}
   321  	err = AppendFixed(v6, appendUint32Slice, mp)
   322  	require.NoError(t, err)
   323  	require.Equal(t, append(uint32Slice, appendUint32Slice...), v6.Col.([]uint32))
   324  
   325  	v7 := New(types.Type{Oid: types.T(types.T_uint64)})
   326  	uint64Slice := []uint64{1, 2, 3, 4, 5, 6, 7, 8}
   327  	v7.data = mustMakeSliceArgsAsBytes(mp, uint64Slice...)
   328  	v7.Col = types.DecodeSlice[uint64](v7.data)
   329  	appendUint64Slice := []uint64{21, 22, 23}
   330  	err = AppendFixed(v7, appendUint64Slice, mp)
   331  	require.NoError(t, err)
   332  	require.Equal(t, append(uint64Slice, appendUint64Slice...), v7.Col.([]uint64))
   333  
   334  	v8 := New(types.Type{Oid: types.T(types.T_float32)})
   335  	float32Slice := []float32{1, 2, 3, 4, 5, 6, 7, 8}
   336  	v8.data = mustMakeSliceArgsAsBytes(mp, float32Slice...)
   337  	v8.Col = types.DecodeSlice[float32](v8.data)
   338  	appendFloat32Slice := []float32{21, 22, 23}
   339  	err = AppendFixed(v8, appendFloat32Slice, mp)
   340  	require.NoError(t, err)
   341  	require.Equal(t, append(float32Slice, appendFloat32Slice...), v8.Col.([]float32))
   342  
   343  	v9 := New(types.Type{Oid: types.T(types.T_float64)})
   344  	float64Slice := []float64{1, 2, 3, 4, 5, 6, 7, 8}
   345  	v9.data = mustMakeSliceArgsAsBytes(mp, float64Slice...)
   346  	v9.Col = types.DecodeSlice[float64](v9.data)
   347  	appendFloat64Slice := []float64{21, 22, 23}
   348  	err = AppendFixed(v9, appendFloat64Slice, mp)
   349  	require.NoError(t, err)
   350  	require.Equal(t, append(float64Slice, appendFloat64Slice...), v9.Col.([]float64))
   351  
   352  	v10 := New(types.Type{Oid: types.T(types.T_date)})
   353  	dateSlice := []types.Date{1, 2, 3, 4, 5, 6, 7, 8}
   354  	v10.data = mustMakeSliceArgsAsBytes(mp, dateSlice...)
   355  	v10.Col = types.DecodeSlice[types.Date](v10.data)
   356  	appendDateSlice := []types.Date{21, 22, 23}
   357  	err = AppendFixed(v10, appendDateSlice, mp)
   358  	require.NoError(t, err)
   359  	require.Equal(t, append(dateSlice, appendDateSlice...), v10.Col.([]types.Date))
   360  
   361  	v11 := New(types.Type{Oid: types.T(types.T_datetime)})
   362  	datetimeSlice := []types.Datetime{1, 2, 3, 4, 5, 6, 7, 8}
   363  	v11.data = mustMakeSliceArgsAsBytes(mp, datetimeSlice...)
   364  	v11.Col = types.DecodeSlice[types.Datetime](v11.data)
   365  	appendDatetimeSlice := []types.Datetime{21, 22, 23}
   366  	err = AppendFixed(v11, appendDatetimeSlice, mp)
   367  	require.NoError(t, err)
   368  	require.Equal(t, append(datetimeSlice, appendDatetimeSlice...), v11.Col.([]types.Datetime))
   369  }
   370  
   371  func shrinkTest[T any](t *testing.T, tt types.T, mp *mpool.MPool, args ...T) {
   372  	v0 := New(types.Type{Oid: tt})
   373  	v0.data = mustMakeSliceArgsAsBytes(mp, args...)
   374  	v0.Col = types.DecodeSlice[T](v0.data)
   375  	sels := []int64{1, 3, 5}
   376  	Shrink(v0, sels)
   377  
   378  	st := v0.Col.([]T)
   379  	require.Equal(t, 3, len(st))
   380  	require.Equal(t, args[1], st[0])
   381  	require.Equal(t, args[3], st[1])
   382  	require.Equal(t, args[5], st[2])
   383  }
   384  
   385  func TestShrink(t *testing.T) {
   386  	mp := mpool.MustNewZero()
   387  
   388  	shrinkTest[int8](t, types.T_int8, mp, 0, 1, 2, 3, 4, 5, 6, 7, 8)
   389  	shrinkTest[int16](t, types.T_int16, mp, 0, 1, 2, 3, 4, 5, 6, 7, 8)
   390  	shrinkTest[int32](t, types.T_int32, mp, 0, 1, 2, 3, 4, 5, 6, 7, 8)
   391  	shrinkTest[int64](t, types.T_int64, mp, 0, 1, 2, 3, 4, 5, 6, 7, 8)
   392  
   393  	shrinkTest[uint8](t, types.T_uint8, mp, 0, 1, 2, 3, 4, 5, 6, 7, 8)
   394  	shrinkTest[uint16](t, types.T_uint16, mp, 0, 1, 2, 3, 4, 5, 6, 7, 8)
   395  	shrinkTest[uint32](t, types.T_uint32, mp, 0, 1, 2, 3, 4, 5, 6, 7, 8)
   396  	shrinkTest[uint64](t, types.T_uint64, mp, 0, 1, 2, 3, 4, 5, 6, 7, 8)
   397  
   398  	shrinkTest[float32](t, types.T_float32, mp, 0, 1, 2, 3, 4, 5, 6, 7, 8)
   399  	shrinkTest[float64](t, types.T_float64, mp, 0, 1, 2, 3, 4, 5, 6, 7, 8)
   400  
   401  	shrinkTest[types.Date](t, types.T_date, mp, 0, 1, 2, 3, 4, 5, 6, 7, 8)
   402  	shrinkTest[types.Datetime](t, types.T_datetime, mp, 0, 1, 2, 3, 4, 5, 6, 7, 8)
   403  }
   404  
   405  func shuffleTest[T any](t *testing.T, tt types.T, mp *mpool.MPool, args ...T) {
   406  	v0 := New(types.Type{Oid: tt})
   407  	v0.data = mustMakeSliceArgsAsBytes(mp, args...)
   408  	v0.Col = types.DecodeSlice[T](v0.data)
   409  	sels := []int64{1, 3, 5}
   410  	err := Shuffle(v0, sels, mp)
   411  	require.NoError(t, err)
   412  	st := v0.Col.([]T)
   413  	require.Equal(t, 3, len(st))
   414  	require.Equal(t, args[1], st[0])
   415  	require.Equal(t, args[3], st[1])
   416  	require.Equal(t, args[5], st[2])
   417  }
   418  
   419  func TestShuffle(t *testing.T) {
   420  	mp := mpool.MustNewZero()
   421  
   422  	shuffleTest[int8](t, types.T_int8, mp, 0, 1, 2, 3, 4, 5, 6, 7, 8)
   423  	shuffleTest[int16](t, types.T_int16, mp, 0, 1, 2, 3, 4, 5, 6, 7, 8)
   424  	shuffleTest[int32](t, types.T_int32, mp, 0, 1, 2, 3, 4, 5, 6, 7, 8)
   425  	shuffleTest[int64](t, types.T_int64, mp, 0, 1, 2, 3, 4, 5, 6, 7, 8)
   426  
   427  	shuffleTest[uint8](t, types.T_uint8, mp, 0, 1, 2, 3, 4, 5, 6, 7, 8)
   428  	shuffleTest[uint16](t, types.T_uint16, mp, 0, 1, 2, 3, 4, 5, 6, 7, 8)
   429  	shuffleTest[uint32](t, types.T_uint32, mp, 0, 1, 2, 3, 4, 5, 6, 7, 8)
   430  	shuffleTest[uint64](t, types.T_uint64, mp, 0, 1, 2, 3, 4, 5, 6, 7, 8)
   431  
   432  	shuffleTest[float32](t, types.T_float32, mp, 0, 1, 2, 3, 4, 5, 6, 7, 8)
   433  	shuffleTest[float64](t, types.T_float64, mp, 0, 1, 2, 3, 4, 5, 6, 7, 8)
   434  
   435  	shuffleTest[types.Date](t, types.T_date, mp, 0, 1, 2, 3, 4, 5, 6, 7, 8)
   436  	shuffleTest[types.Datetime](t, types.T_datetime, mp, 0, 1, 2, 3, 4, 5, 6, 7, 8)
   437  }
   438  
   439  func TestCopy(t *testing.T) {
   440  	mp := mpool.MustNewZero()
   441  	w0 := New(types.Type{Oid: types.T(types.T_char)})
   442  	AppendBytes(w0, [][]byte{
   443  		[]byte("nihao"),
   444  		[]byte("nihao"),
   445  		[]byte("nihao"),
   446  		[]byte("nihao"),
   447  	}, mp)
   448  	v0 := New(types.Type{Oid: types.T(types.T_char)})
   449  	AppendBytes(v0, [][]byte{
   450  		[]byte("hello"),
   451  		[]byte("hello"),
   452  		[]byte("hello"),
   453  		[]byte("hello"),
   454  	}, mp)
   455  	err := Copy(v0, w0, 2, 0, mp)
   456  	require.NoError(t, err)
   457  
   458  	expectvec := New(types.Type{Oid: types.T(types.T_char)})
   459  	AppendBytes(expectvec, [][]byte{
   460  		[]byte("hello"),
   461  		[]byte("hello"),
   462  		[]byte("nihao"),
   463  		[]byte("hello"),
   464  	}, mp)
   465  	require.Equal(t, GetStrVectorValues(expectvec), GetStrVectorValues(v0))
   466  }
   467  
   468  func unionOneTest[T any](t *testing.T, tt types.T, mp *mpool.MPool, arg1 []T, arg2 []T, arg3 []T) {
   469  	w0 := New(types.Type{Oid: types.T(tt)})
   470  	w0.data = mustMakeSliceArgsAsBytes(mp, arg1...)
   471  	w0.Col = types.DecodeSlice[T](w0.data)
   472  	v0 := New(types.Type{Oid: types.T(tt)})
   473  	err := UnionOne(v0, w0, 3, mp)
   474  	require.NoError(t, err)
   475  	require.Equal(t, arg2, v0.Col.([]T))
   476  	v0.data = mustMakeSliceArgsAsBytes(mp, arg1...)
   477  	v0.Col = types.DecodeSlice[T](v0.data)
   478  	err = UnionOne(v0, w0, 3, mp)
   479  	require.NoError(t, err)
   480  	require.Equal(t, arg3, v0.Col.([]T))
   481  }
   482  
   483  func TestUnionOne(t *testing.T) {
   484  	mp := mpool.MustNewZero()
   485  	unionOneTest(t, types.T_int8, mp, []int8{0, 1, 2, 3, 4, 5, 6, 7, 8}, []int8{3}, []int8{0, 1, 2, 3, 4, 5, 6, 7, 8, 3})
   486  	unionOneTest(t, types.T_int16, mp, []int16{0, 1, 2, 3, 4, 5, 6, 7, 8}, []int16{3}, []int16{0, 1, 2, 3, 4, 5, 6, 7, 8, 3})
   487  	unionOneTest(t, types.T_int32, mp, []int32{0, 1, 2, 3, 4, 5, 6, 7, 8}, []int32{3}, []int32{0, 1, 2, 3, 4, 5, 6, 7, 8, 3})
   488  	unionOneTest(t, types.T_int64, mp, []int64{0, 1, 2, 3, 4, 5, 6, 7, 8}, []int64{3}, []int64{0, 1, 2, 3, 4, 5, 6, 7, 8, 3})
   489  
   490  	unionOneTest(t, types.T_uint8, mp, []uint8{0, 1, 2, 3, 4, 5, 6, 7, 8}, []uint8{3}, []uint8{0, 1, 2, 3, 4, 5, 6, 7, 8, 3})
   491  	unionOneTest(t, types.T_uint16, mp, []uint16{0, 1, 2, 3, 4, 5, 6, 7, 8}, []uint16{3}, []uint16{0, 1, 2, 3, 4, 5, 6, 7, 8, 3})
   492  	unionOneTest(t, types.T_uint32, mp, []uint32{0, 1, 2, 3, 4, 5, 6, 7, 8}, []uint32{3}, []uint32{0, 1, 2, 3, 4, 5, 6, 7, 8, 3})
   493  	unionOneTest(t, types.T_uint64, mp, []uint64{0, 1, 2, 3, 4, 5, 6, 7, 8}, []uint64{3}, []uint64{0, 1, 2, 3, 4, 5, 6, 7, 8, 3})
   494  
   495  	unionOneTest(t, types.T_float32, mp, []float32{0, 1, 2, 3, 4, 5, 6, 7, 8}, []float32{3}, []float32{0, 1, 2, 3, 4, 5, 6, 7, 8, 3})
   496  	unionOneTest(t, types.T_float64, mp, []float64{0, 1, 2, 3, 4, 5, 6, 7, 8}, []float64{3}, []float64{0, 1, 2, 3, 4, 5, 6, 7, 8, 3})
   497  
   498  	unionOneTest(t, types.T_date, mp, []types.Date{0, 1, 2, 3, 4, 5, 6, 7, 8}, []types.Date{3}, []types.Date{0, 1, 2, 3, 4, 5, 6, 7, 8, 3})
   499  	unionOneTest(t, types.T_datetime, mp, []types.Datetime{0, 1, 2, 3, 4, 5, 6, 7, 8}, []types.Datetime{3}, []types.Datetime{0, 1, 2, 3, 4, 5, 6, 7, 8, 3})
   500  
   501  	w10 := New(types.Type{Oid: types.T(types.T_char), Width: types.MaxCharLen})
   502  	AppendString(w10, []string{"nihao", "nihao", "nihao", "nihao"}, mp)
   503  	v10 := New(types.Type{Oid: types.T(types.T_char), Width: types.MaxCharLen})
   504  	err := UnionOne(v10, w10, 3, mp)
   505  	require.NoError(t, err)
   506  	v10vals := GetStrVectorValues(v10)
   507  	require.Equal(t, []string{"nihao"}, v10vals)
   508  
   509  	v10 = New(types.Type{Oid: types.T(types.T_char), Width: types.MaxCharLen})
   510  	AppendString(v10, []string{"hello", "hello", "hello"}, mp)
   511  	err = UnionOne(v10, w10, 3, mp)
   512  	require.NoError(t, err)
   513  	v10vals = GetStrVectorValues(v10)
   514  	require.Equal(t, []string{"hello", "hello", "hello", "nihao"}, v10vals)
   515  
   516  	w101 := New(types.Type{Oid: types.T(types.T_char), Width: types.MaxCharLen})
   517  	AppendString(w101, []string{"thanks"}, mp)
   518  	w101.isConst = true
   519  	err = UnionOne(v10, w101, 2, mp)
   520  	require.NoError(t, err)
   521  	v10vals = GetStrVectorValues(v10)
   522  	require.Equal(t, []string{"hello", "hello", "hello", "nihao", "thanks"}, v10vals)
   523  
   524  	// Long string test
   525  	astr := "a123456789012345678901234567890"
   526  	bstr := "b123456789012345678901234567890AKQJ1098765432"
   527  
   528  	w102 := New(types.Type{Oid: types.T(types.T_char), Width: types.MaxCharLen})
   529  	AppendString(w102, []string{astr, astr, astr, astr}, mp)
   530  	v102 := New(types.Type{Oid: types.T(types.T_char), Width: types.MaxCharLen})
   531  	err = UnionOne(v102, w102, 3, mp)
   532  	require.NoError(t, err)
   533  	v102vals := GetStrVectorValues(v102)
   534  	require.Equal(t, []string{astr}, v102vals)
   535  
   536  	v102 = New(types.Type{Oid: types.T(types.T_char), Width: types.MaxCharLen})
   537  	AppendString(v102, []string{bstr, bstr, bstr}, mp)
   538  	err = UnionOne(v102, w102, 3, mp)
   539  	require.NoError(t, err)
   540  	v102vals = GetStrVectorValues(v102)
   541  	require.Equal(t, []string{bstr, bstr, bstr, astr}, v102vals)
   542  }
   543  
   544  func unionBatchTest[T any](t *testing.T, tt types.T, mp *mpool.MPool, arg1 []T, arg2 []T, arg3 []T) {
   545  	w0 := New(types.Type{Oid: types.T(tt)})
   546  	w0.data = mustMakeSliceArgsAsBytes(mp, arg1...)
   547  	w0.Col = types.DecodeSlice[T](w0.data)
   548  	v0 := New(types.Type{Oid: types.T(tt)})
   549  	err := UnionBatch(v0, w0, 3, 2, []uint8{1, 1}, mp)
   550  	require.NoError(t, err)
   551  	require.Equal(t, arg2, v0.Col.([]T))
   552  	v0.data = mustMakeSliceArgsAsBytes(mp, arg1...)
   553  	v0.Col = types.DecodeSlice[T](v0.data)
   554  	err = UnionBatch(v0, w0, 3, 2, []uint8{1, 1}, mp)
   555  	require.NoError(t, err)
   556  	require.Equal(t, arg3, v0.Col.([]T))
   557  }
   558  
   559  func TestUnionBatch(t *testing.T) {
   560  	mp := mpool.MustNewZero()
   561  	unionBatchTest(t, types.T_int8, mp, []int8{0, 1, 2, 3, 4, 5, 6, 7, 8}, []int8{3, 4}, []int8{0, 1, 2, 3, 4, 5, 6, 7, 8, 3, 4})
   562  	unionBatchTest(t, types.T_int16, mp, []int16{0, 1, 2, 3, 4, 5, 6, 7, 8}, []int16{3, 4}, []int16{0, 1, 2, 3, 4, 5, 6, 7, 8, 3, 4})
   563  	unionBatchTest(t, types.T_int32, mp, []int32{0, 1, 2, 3, 4, 5, 6, 7, 8}, []int32{3, 4}, []int32{0, 1, 2, 3, 4, 5, 6, 7, 8, 3, 4})
   564  	unionBatchTest(t, types.T_int64, mp, []int64{0, 1, 2, 3, 4, 5, 6, 7, 8}, []int64{3, 4}, []int64{0, 1, 2, 3, 4, 5, 6, 7, 8, 3, 4})
   565  
   566  	unionBatchTest(t, types.T_uint8, mp, []uint8{0, 1, 2, 3, 4, 5, 6, 7, 8}, []uint8{3, 4}, []uint8{0, 1, 2, 3, 4, 5, 6, 7, 8, 3, 4})
   567  	unionBatchTest(t, types.T_uint16, mp, []uint16{0, 1, 2, 3, 4, 5, 6, 7, 8}, []uint16{3, 4}, []uint16{0, 1, 2, 3, 4, 5, 6, 7, 8, 3, 4})
   568  	unionBatchTest(t, types.T_uint32, mp, []uint32{0, 1, 2, 3, 4, 5, 6, 7, 8}, []uint32{3, 4}, []uint32{0, 1, 2, 3, 4, 5, 6, 7, 8, 3, 4})
   569  	unionBatchTest(t, types.T_uint64, mp, []uint64{0, 1, 2, 3, 4, 5, 6, 7, 8}, []uint64{3, 4}, []uint64{0, 1, 2, 3, 4, 5, 6, 7, 8, 3, 4})
   570  
   571  	unionBatchTest(t, types.T_float32, mp, []float32{0, 1, 2, 3, 4, 5, 6, 7, 8}, []float32{3, 4}, []float32{0, 1, 2, 3, 4, 5, 6, 7, 8, 3, 4})
   572  	unionBatchTest(t, types.T_float64, mp, []float64{0, 1, 2, 3, 4, 5, 6, 7, 8}, []float64{3, 4}, []float64{0, 1, 2, 3, 4, 5, 6, 7, 8, 3, 4})
   573  
   574  	unionBatchTest(t, types.T_date, mp, []types.Date{0, 1, 2, 3, 4, 5, 6, 7, 8}, []types.Date{3, 4}, []types.Date{0, 1, 2, 3, 4, 5, 6, 7, 8, 3, 4})
   575  	unionBatchTest(t, types.T_datetime, mp, []types.Datetime{0, 1, 2, 3, 4, 5, 6, 7, 8}, []types.Datetime{3, 4}, []types.Datetime{0, 1, 2, 3, 4, 5, 6, 7, 8, 3, 4})
   576  
   577  	w10 := New(types.Type{Oid: types.T(types.T_char), Width: types.MaxCharLen})
   578  	AppendString(w10, []string{"nihao", "nihao", "nihao", "nihao"}, mp)
   579  	v10 := New(types.Type{Oid: types.T(types.T_char), Width: types.MaxCharLen})
   580  	err := UnionBatch(v10, w10, 1, 2, []uint8{1, 1}, mp)
   581  	require.NoError(t, err)
   582  	require.Equal(t, []string{"nihao", "nihao"}, GetStrVectorValues(v10))
   583  
   584  	Clean(v10, mp)
   585  	AppendString(v10, []string{"hello", "hello", "hello", "hello"}, mp)
   586  	err = UnionBatch(v10, w10, 1, 2, []uint8{1, 1}, mp)
   587  	require.NoError(t, err)
   588  	require.Equal(t, []string{"hello", "hello", "hello", "hello", "nihao", "nihao"}, GetStrVectorValues(v10))
   589  }
   590  
   591  func strTest[T any](t *testing.T, tt types.T, mp *mpool.MPool, arg1 ...T) {
   592  	v0 := New(types.Type{Oid: types.T(tt)})
   593  	v0.data = mustMakeSliceArgsAsBytes(mp, arg1...)
   594  	v0.Col = types.DecodeSlice[T](v0.data)
   595  	result := v0.String()
   596  	require.Equal(t, "[0 1 2]-&{<nil>}", result)
   597  }
   598  
   599  func TestVector_String(t *testing.T) {
   600  	mp := mpool.MustNewZero()
   601  	strTest[int8](t, types.T_int8, mp, 0, 1, 2)
   602  	strTest[int16](t, types.T_int16, mp, 0, 1, 2)
   603  	strTest[int32](t, types.T_int32, mp, 0, 1, 2)
   604  	strTest[int64](t, types.T_int64, mp, 0, 1, 2)
   605  }
   606  
   607  func FillVectorData[T any](v *Vector, mp *mpool.MPool) {
   608  	v.data = mustMakeSliceArgsAsBytes(mp, v.Col.([]T)...)
   609  }
   610  
   611  func TestVector_Marshal(t *testing.T) {
   612  	vals := []int64{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
   613  	vec := NewWithFixed(types.T_int64.ToType(), vals, nil, testMp)
   614  	nulls.Add(vec.Nsp, 1)
   615  	nulls.Add(vec.Nsp, 3)
   616  	nulls.Add(vec.Nsp, 5)
   617  	nulls.Add(vec.Nsp, 7)
   618  	nulls.Add(vec.Nsp, 9)
   619  
   620  	bs, err := vec.MarshalBinary()
   621  	require.NoError(t, err)
   622  
   623  	vec2 := New(types.T_int64.ToType())
   624  	err = vec2.UnmarshalBinary(bs)
   625  	require.NoError(t, err)
   626  
   627  	require.Equal(t, vec.Length(), vec2.Length())
   628  	require.True(t, vec2.Nsp.Contains(1))
   629  	require.True(t, vec2.Nsp.Contains(3))
   630  	require.True(t, vec2.Nsp.Contains(5))
   631  	require.True(t, vec2.Nsp.Contains(7))
   632  	require.True(t, vec2.Nsp.Contains(9))
   633  
   634  	tv1 := MustTCols[int64](vec)
   635  	tv2 := MustTCols[int64](vec2)
   636  	for i := 0; i < vec.Length(); i++ {
   637  		ui := uint64(i)
   638  		require.Equal(t, vec2.Nsp.Contains(ui), i%2 != 0)
   639  		require.Equal(t, vec2.Nsp.Contains(ui), vec.Nsp.Contains(ui))
   640  		if !vec2.Nsp.Contains(ui) {
   641  			require.Equal(t, tv1[i], tv2[i])
   642  		}
   643  	}
   644  }