github.com/matrixorigin/matrixone@v1.2.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/types"
    22  	"github.com/stretchr/testify/require"
    23  )
    24  
    25  func TestLength(t *testing.T) {
    26  	mp := mpool.MustNewZero()
    27  	vec := NewVec(types.T_int8.ToType())
    28  	err := AppendFixedList(vec, []int8{0, 1, 2}, nil, mp)
    29  	require.NoError(t, err)
    30  	require.Equal(t, 3, vec.Length())
    31  	vec.SetLength(2)
    32  	require.Equal(t, 2, vec.Length())
    33  	vec.Free(mp)
    34  	require.Equal(t, int64(0), mp.CurrNB())
    35  
    36  	{
    37  		//Array Float32
    38  		mp := mpool.MustNewZero()
    39  		vec := NewVec(types.New(types.T_array_float32, 3, 0))
    40  		err := AppendArrayList[float32](vec, [][]float32{{1, 2, 3}, {4, 5, 6}}, nil, mp)
    41  		require.NoError(t, err)
    42  		require.Equal(t, 2, vec.Length())
    43  		vec.Free(mp)
    44  		require.Equal(t, int64(0), mp.CurrNB())
    45  	}
    46  	{
    47  		//Array Float64
    48  		mp := mpool.MustNewZero()
    49  		vec := NewVec(types.New(types.T_array_float64, 3, 0))
    50  		err := AppendArrayList[float64](vec, [][]float64{{1, 2, 3}, {4, 5, 6}}, nil, mp)
    51  		require.NoError(t, err)
    52  		require.Equal(t, 2, vec.Length())
    53  		vec.Free(mp)
    54  		require.Equal(t, int64(0), mp.CurrNB())
    55  	}
    56  }
    57  
    58  func TestSize(t *testing.T) {
    59  	mp := mpool.MustNewZero()
    60  	vec := NewVec(types.T_int8.ToType())
    61  	require.Equal(t, 0, vec.Size())
    62  	vec.Free(mp)
    63  	require.Equal(t, int64(0), mp.CurrNB())
    64  	{
    65  		//Array Float32
    66  		mp := mpool.MustNewZero()
    67  		vec := NewVec(types.New(types.T_array_float32, 4, 0))
    68  		require.Equal(t, 0, vec.Size())
    69  		vec.Free(mp)
    70  		require.Equal(t, int64(0), mp.CurrNB())
    71  	}
    72  	{
    73  		//Array Float64
    74  		mp := mpool.MustNewZero()
    75  		vec := NewVec(types.New(types.T_array_float64, 4, 0))
    76  		require.Equal(t, 0, vec.Size())
    77  		vec.Free(mp)
    78  		require.Equal(t, int64(0), mp.CurrNB())
    79  	}
    80  }
    81  
    82  func TestGetUnionOneFunction(t *testing.T) {
    83  	{ // test const vector
    84  		mp := mpool.MustNewZero()
    85  		v := NewVec(types.T_int8.ToType())
    86  		w := NewVec(types.T_int8.ToType())
    87  		err := AppendFixed(w, int8(0), false, mp)
    88  		require.NoError(t, err)
    89  		uf := GetUnionOneFunction(*w.GetType(), mp)
    90  		err = uf(v, w, 0)
    91  		require.NoError(t, err)
    92  		w.Free(mp)
    93  		v.Free(mp)
    94  		require.Equal(t, int64(0), mp.CurrNB())
    95  	}
    96  	{ // test const vector
    97  		mp := mpool.MustNewZero()
    98  		v := NewVec(types.T_varchar.ToType())
    99  		w := NewVec(types.T_varchar.ToType())
   100  		err := AppendBytes(w, []byte("x"), false, mp)
   101  		require.NoError(t, err)
   102  		uf := GetUnionOneFunction(*w.GetType(), mp)
   103  		err = uf(v, w, 0)
   104  		require.NoError(t, err)
   105  		w.Free(mp)
   106  		v.Free(mp)
   107  		require.Equal(t, int64(0), mp.CurrNB())
   108  	}
   109  	{ // test const Array Float32 vector
   110  		mp := mpool.MustNewZero()
   111  		v := NewVec(types.New(types.T_array_float32, 4, 0))
   112  		w := NewVec(types.New(types.T_array_float32, 4, 0))
   113  		err := AppendArrayList[float32](w, [][]float32{{1, 2, 3, 0}, {4, 5, 6, 0}}, nil, mp)
   114  		require.NoError(t, err)
   115  		uf := GetUnionOneFunction(*w.GetType(), mp)
   116  		err = uf(v, w, 0)
   117  		require.NoError(t, err)
   118  		w.Free(mp)
   119  		v.Free(mp)
   120  		require.Equal(t, int64(0), mp.CurrNB())
   121  
   122  	}
   123  	{ // test const Array Float64 vector
   124  		mp := mpool.MustNewZero()
   125  		v := NewVec(types.New(types.T_array_float64, 4, 0))
   126  		w := NewVec(types.New(types.T_array_float64, 4, 0))
   127  		err := AppendArrayList[float64](w, [][]float64{{1, 2, 3, 0}, {4, 5, 6, 0}}, nil, mp)
   128  		require.NoError(t, err)
   129  		uf := GetUnionOneFunction(*w.GetType(), mp)
   130  		err = uf(v, w, 0)
   131  		require.NoError(t, err)
   132  		w.Free(mp)
   133  		v.Free(mp)
   134  		require.Equal(t, int64(0), mp.CurrNB())
   135  	}
   136  	{ // test bit vector
   137  		mp := mpool.MustNewZero()
   138  		v := NewVec(types.New(types.T_bit, 10, 0))
   139  		w := NewVec(types.New(types.T_bit, 10, 0))
   140  		err := AppendFixedList[uint64](w, []uint64{1, 2, 3, 4}, nil, mp)
   141  		require.NoError(t, err)
   142  		uf := GetUnionOneFunction(*w.GetType(), mp)
   143  		err = uf(v, w, 0)
   144  		require.NoError(t, err)
   145  		require.Equal(t, 1, v.Length())
   146  		vs := MustFixedCol[uint64](v)
   147  		require.Equal(t, uint64(1), vs[0])
   148  
   149  		w.Free(mp)
   150  		v.Free(mp)
   151  		require.Equal(t, int64(0), mp.CurrNB())
   152  	}
   153  }
   154  
   155  func TestConst(t *testing.T) {
   156  	mp := mpool.MustNewZero()
   157  	vec := NewConstNull(types.T_int8.ToType(), 1, mp)
   158  	require.Equal(t, true, vec.IsConst())
   159  	vec.Free(mp)
   160  	require.Equal(t, int64(0), mp.CurrNB())
   161  }
   162  
   163  /*
   164  func TestWindowWithNulls(t *testing.T) {
   165  	v0 := NewVec(types.T_int8.ToType())
   166  	mp := mpool.MustNewZero()
   167  
   168  	_ = AppendFixed(v0, int8(0), false, mp)
   169  	_ = AppendFixed(v0, int8(1), false, mp)
   170  	_ = AppendFixed(v0, int8(2), false, mp)
   171  	_ = AppendFixed(v0, int8(-1), true, mp) // v0[3] = null
   172  	_ = AppendFixed(v0, int8(6), false, mp)
   173  	_ = AppendFixed(v0, int8(-1), true, mp) // v0[5] = null
   174  	_ = AppendFixed(v0, int8(-1), true, mp) // v0[6] = null
   175  	_ = AppendFixed(v0, int8(6), false, mp)
   176  	_ = AppendFixed(v0, int8(7), false, mp)
   177  	_ = AppendFixed(v0, int8(8), false, mp)
   178  
   179  	require.Equal(t, []uint64{3, 5, 6}, v0.GetNulls().Np.ToArray())
   180  
   181  	start, end := 1, 7
   182  	v0Window := NewVec(types.T_int8.ToType())
   183  	//v0Window = Window(v0, start, end, v0Window)
   184  	require.Equal(t, MustFixedCol[int8](v0)[start:end], MustFixedCol[int8](v0Window))
   185  	require.Equal(t, []uint64{2, 4, 5}, v0Window.GetNulls().Np.ToArray())
   186  
   187  	//t.Log(v0.String())
   188  	//t.Log(v0Window.String())
   189  }
   190  */
   191  
   192  func TestAppend(t *testing.T) {
   193  	mp := mpool.MustNewZero()
   194  	vec := NewVec(types.T_int8.ToType())
   195  	err := AppendFixed(vec, int8(0), false, mp)
   196  	require.NoError(t, err)
   197  	err = AppendFixed(vec, int8(0), true, mp)
   198  	require.NoError(t, err)
   199  	err = AppendFixedList(vec, []int8{0, 1, 2}, nil, mp)
   200  	require.NoError(t, err)
   201  	vec.Free(mp)
   202  	require.Equal(t, int64(0), mp.CurrNB())
   203  
   204  	{
   205  		// Array Float32
   206  		mp := mpool.MustNewZero()
   207  		vec := NewVec(types.New(types.T_array_float32, 4, 0))
   208  		err := AppendArray[float32](vec, []float32{1, 2, 3, 0}, false, mp)
   209  		require.NoError(t, err)
   210  		require.Equal(t, 1, vec.Length())
   211  		err = AppendArray[float32](vec, []float32{2, 4, 5, 6}, true, mp)
   212  		require.NoError(t, err)
   213  		require.Equal(t, 2, vec.Length())
   214  		err = AppendArrayList[float32](vec, [][]float32{{4, 4, 4, 6}, {2, 5, 5, 3}}, nil, mp)
   215  		require.NoError(t, err)
   216  		require.Equal(t, 4, vec.Length())
   217  		vec.Free(mp)
   218  		require.Equal(t, int64(0), mp.CurrNB())
   219  	}
   220  	{
   221  		// Array Float64
   222  		mp := mpool.MustNewZero()
   223  		vec := NewVec(types.New(types.T_array_float64, 4, 0))
   224  		err := AppendArray[float64](vec, []float64{1, 2, 3, 0}, false, mp)
   225  		require.NoError(t, err)
   226  		require.Equal(t, 1, vec.Length())
   227  		err = AppendArray[float64](vec, []float64{2, 4, 5, 6}, true, mp)
   228  		require.NoError(t, err)
   229  		require.Equal(t, 2, vec.Length())
   230  		err = AppendArrayList[float64](vec, [][]float64{{4, 4, 4, 6}, {2, 5, 5, 3}}, nil, mp)
   231  		require.NoError(t, err)
   232  		require.Equal(t, 4, vec.Length())
   233  		vec.Free(mp)
   234  		require.Equal(t, int64(0), mp.CurrNB())
   235  	}
   236  }
   237  
   238  func TestAppendBytes(t *testing.T) {
   239  	mp := mpool.MustNewZero()
   240  	vec := NewVec(types.T_varchar.ToType())
   241  	err := AppendBytes(vec, []byte("x"), false, mp)
   242  	require.NoError(t, err)
   243  	err = AppendBytes(vec, nil, true, mp)
   244  	require.NoError(t, err)
   245  	err = AppendBytesList(vec, [][]byte{[]byte("x"), []byte("y")}, nil, mp)
   246  	require.NoError(t, err)
   247  	vs, data := MustVarlenaRawData(vec)
   248  	for _, v := range vs {
   249  		v.GetByteSlice(data)
   250  	}
   251  	vec.Free(mp)
   252  	require.Equal(t, int64(0), mp.CurrNB())
   253  }
   254  
   255  func TestAppendArray(t *testing.T) {
   256  	{
   257  		// Array Float32
   258  		mp := mpool.MustNewZero()
   259  		vec := NewVec(types.T_array_float32.ToType())
   260  		err := AppendArray[float32](vec, []float32{1, 1, 1}, false, mp)
   261  		require.NoError(t, err)
   262  		err = AppendArray[float32](vec, nil, true, mp)
   263  		require.NoError(t, err)
   264  		err = AppendArrayList[float32](vec, [][]float32{{2, 2, 2}, {3, 3, 3}}, nil, mp)
   265  		require.NoError(t, err)
   266  		vs, data := MustVarlenaRawData(vec)
   267  		for _, v := range vs {
   268  			types.GetArray[float32](&v, data)
   269  		}
   270  		vec.Free(mp)
   271  		require.Equal(t, int64(0), mp.CurrNB())
   272  	}
   273  	{
   274  		// Array Float64
   275  		mp := mpool.MustNewZero()
   276  		vec := NewVec(types.T_array_float64.ToType())
   277  		err := AppendArray[float64](vec, []float64{1, 1, 1}, false, mp)
   278  		require.NoError(t, err)
   279  		err = AppendArray[float64](vec, nil, true, mp)
   280  		require.NoError(t, err)
   281  		err = AppendArrayList[float64](vec, [][]float64{{2, 2, 2}, {3, 3, 3}}, nil, mp)
   282  		require.NoError(t, err)
   283  		vs, data := MustVarlenaRawData(vec)
   284  		for _, v := range vs {
   285  			types.GetArray[float64](&v, data)
   286  		}
   287  		vec.Free(mp)
   288  		require.Equal(t, int64(0), mp.CurrNB())
   289  	}
   290  }
   291  
   292  func TestDup(t *testing.T) {
   293  	mp := mpool.MustNewZero()
   294  	v := NewVec(types.T_int8.ToType())
   295  	err := AppendFixedList(v, []int8{0, 1, 2}, nil, mp)
   296  	require.NoError(t, err)
   297  	w, err := v.Dup(mp)
   298  	require.NoError(t, err)
   299  	vs := MustFixedCol[int8](v)
   300  	ws := MustFixedCol[int8](w)
   301  	require.Equal(t, vs, ws)
   302  	v.Free(mp)
   303  	w.Free(mp)
   304  	require.Equal(t, int64(0), mp.CurrNB())
   305  }
   306  
   307  func TestShrink(t *testing.T) {
   308  	mp := mpool.MustNewZero()
   309  	{ // Array Float32
   310  		v := NewVec(types.T_array_float32.ToType())
   311  		err := AppendArrayList[float32](v, [][]float32{{1, 1, 1}, {2, 2, 2}, {3, 3, 3}}, nil, mp)
   312  		require.NoError(t, err)
   313  		v.Shrink([]int64{1, 2}, false)
   314  		require.Equal(t, [][]float32{{2, 2, 2}, {3, 3, 3}}, MustArrayCol[float32](v))
   315  		v.Free(mp)
   316  		require.Equal(t, int64(0), mp.CurrNB())
   317  	}
   318  	{ // Array Float64
   319  		v := NewVec(types.T_array_float64.ToType())
   320  		err := AppendArrayList[float64](v, [][]float64{{1, 1, 1}, {2, 2, 2}, {3, 3, 3}}, nil, mp)
   321  		require.NoError(t, err)
   322  		v.Shrink([]int64{1, 2}, false)
   323  		require.Equal(t, [][]float64{{2, 2, 2}, {3, 3, 3}}, MustArrayCol[float64](v))
   324  		v.Free(mp)
   325  		require.Equal(t, int64(0), mp.CurrNB())
   326  	}
   327  	{ // bool
   328  		v := NewVec(types.T_bool.ToType())
   329  		err := AppendFixedList(v, []bool{true, false, true, false}, nil, mp)
   330  		require.NoError(t, err)
   331  		v.Shrink([]int64{1, 2}, false)
   332  		vs := MustFixedCol[bool](v)
   333  		require.Equal(t, []bool{false, true}, vs)
   334  		v.Free(mp)
   335  		require.Equal(t, int64(0), mp.CurrNB())
   336  	}
   337  	{ // int8
   338  		v := NewVec(types.T_int8.ToType())
   339  		err := AppendFixedList(v, []int8{1, 2, 3, 4}, nil, mp)
   340  		require.NoError(t, err)
   341  		v.Shrink([]int64{1, 2}, false)
   342  		vs := MustFixedCol[int8](v)
   343  		require.Equal(t, []int8{2, 3}, vs)
   344  		v.Free(mp)
   345  		require.Equal(t, int64(0), mp.CurrNB())
   346  	}
   347  	{ // int16
   348  		v := NewVec(types.T_int16.ToType())
   349  		err := AppendFixedList(v, []int16{1, 2, 3, 4}, nil, mp)
   350  		require.NoError(t, err)
   351  		v.Shrink([]int64{0, 3}, false)
   352  		vs := MustFixedCol[int16](v)
   353  		require.Equal(t, []int16{1, 4}, vs)
   354  		v.Free(mp)
   355  		require.Equal(t, int64(0), mp.CurrNB())
   356  	}
   357  	{ // int32
   358  		v := NewVec(types.T_int32.ToType())
   359  		err := AppendFixedList(v, []int32{1, 2, 3, 4}, nil, mp)
   360  		require.NoError(t, err)
   361  		v.Shrink([]int64{1, 2}, false)
   362  		vs := MustFixedCol[int32](v)
   363  		require.Equal(t, []int32{2, 3}, vs)
   364  		v.Free(mp)
   365  		require.Equal(t, int64(0), mp.CurrNB())
   366  	}
   367  	{ // int64
   368  		v := NewVec(types.T_int64.ToType())
   369  		err := AppendFixedList(v, []int64{1, 2, 3, 4}, nil, mp)
   370  		require.NoError(t, err)
   371  		v.Shrink([]int64{1, 2}, false)
   372  		vs := MustFixedCol[int64](v)
   373  		require.Equal(t, []int64{2, 3}, vs)
   374  		v.Free(mp)
   375  		require.Equal(t, int64(0), mp.CurrNB())
   376  	}
   377  	{ // uint8
   378  		v := NewVec(types.T_uint8.ToType())
   379  		err := AppendFixedList(v, []uint8{1, 2, 3, 4}, nil, mp)
   380  		require.NoError(t, err)
   381  		v.Shrink([]int64{1, 2}, false)
   382  		vs := MustFixedCol[uint8](v)
   383  		require.Equal(t, []uint8{2, 3}, vs)
   384  		v.Free(mp)
   385  		require.Equal(t, int64(0), mp.CurrNB())
   386  	}
   387  	{ // uint16
   388  		v := NewVec(types.T_uint16.ToType())
   389  		err := AppendFixedList(v, []uint16{1, 2, 3, 4}, nil, mp)
   390  		require.NoError(t, err)
   391  		v.Shrink([]int64{0, 3}, false)
   392  		vs := MustFixedCol[uint16](v)
   393  		require.Equal(t, []uint16{1, 4}, vs)
   394  		v.Free(mp)
   395  		require.Equal(t, int64(0), mp.CurrNB())
   396  	}
   397  	{ // uint32
   398  		v := NewVec(types.T_uint32.ToType())
   399  		err := AppendFixedList(v, []uint32{1, 2, 3, 4}, nil, mp)
   400  		require.NoError(t, err)
   401  		v.Shrink([]int64{1, 2}, false)
   402  		vs := MustFixedCol[uint32](v)
   403  		require.Equal(t, []uint32{2, 3}, vs)
   404  		v.Free(mp)
   405  		require.Equal(t, int64(0), mp.CurrNB())
   406  	}
   407  	{ // uint64
   408  		v := NewVec(types.T_uint64.ToType())
   409  		err := AppendFixedList(v, []uint64{1, 2, 3, 4}, nil, mp)
   410  		require.NoError(t, err)
   411  		v.Shrink([]int64{1, 2}, false)
   412  		vs := MustFixedCol[uint64](v)
   413  		require.Equal(t, []uint64{2, 3}, vs)
   414  		v.Free(mp)
   415  		require.Equal(t, int64(0), mp.CurrNB())
   416  	}
   417  	{ // float32
   418  		v := NewVec(types.T_float32.ToType())
   419  		err := AppendFixedList(v, []float32{1, 2, 3, 4}, nil, mp)
   420  		require.NoError(t, err)
   421  		v.Shrink([]int64{1, 2}, false)
   422  		vs := MustFixedCol[float32](v)
   423  		require.Equal(t, []float32{2, 3}, vs)
   424  		v.Free(mp)
   425  		require.Equal(t, int64(0), mp.CurrNB())
   426  	}
   427  	{ // float64
   428  		v := NewVec(types.T_float64.ToType())
   429  		err := AppendFixedList(v, []float64{1, 2, 3, 4}, nil, mp)
   430  		require.NoError(t, err)
   431  		v.Shrink([]int64{1, 2}, false)
   432  		vs := MustFixedCol[float64](v)
   433  		require.Equal(t, []float64{2, 3}, vs)
   434  		v.Free(mp)
   435  		require.Equal(t, int64(0), mp.CurrNB())
   436  	}
   437  	{ // text
   438  		v := NewVec(types.T_text.ToType())
   439  		err := AppendBytesList(v, [][]byte{[]byte("1"), []byte("2"), []byte("3"), []byte("4")}, nil, mp)
   440  		require.NoError(t, err)
   441  		v.Shrink([]int64{1, 2}, false)
   442  		vs := MustStrCol(v)
   443  		require.Equal(t, []string{"2", "3"}, vs)
   444  		require.Equal(t, [][]byte{[]byte("2"), []byte("3")}, MustBytesCol(v))
   445  		v.Free(mp)
   446  		require.Equal(t, int64(0), mp.CurrNB())
   447  	}
   448  	{ // date
   449  		v := NewVec(types.T_date.ToType())
   450  		err := AppendFixedList(v, []types.Date{1, 2, 3, 4}, nil, mp)
   451  		require.NoError(t, err)
   452  		v.Shrink([]int64{1, 2}, false)
   453  		vs := MustFixedCol[types.Date](v)
   454  		require.Equal(t, []types.Date{2, 3}, vs)
   455  		v.Free(mp)
   456  		require.Equal(t, int64(0), mp.CurrNB())
   457  	}
   458  	{ // datetime
   459  		v := NewVec(types.T_datetime.ToType())
   460  		err := AppendFixedList(v, []types.Datetime{1, 2, 3, 4}, nil, mp)
   461  		require.NoError(t, err)
   462  		v.Shrink([]int64{1, 2}, false)
   463  		vs := MustFixedCol[types.Datetime](v)
   464  		require.Equal(t, []types.Datetime{2, 3}, vs)
   465  		v.Free(mp)
   466  		require.Equal(t, int64(0), mp.CurrNB())
   467  	}
   468  	{ // time
   469  		v := NewVec(types.T_time.ToType())
   470  		err := AppendFixedList(v, []types.Time{1, 2, 3, 4}, nil, mp)
   471  		require.NoError(t, err)
   472  		v.Shrink([]int64{1, 2}, false)
   473  		vs := MustFixedCol[types.Time](v)
   474  		require.Equal(t, []types.Time{2, 3}, vs)
   475  		v.Free(mp)
   476  		require.Equal(t, int64(0), mp.CurrNB())
   477  	}
   478  	{ // timestamp
   479  		v := NewVec(types.T_timestamp.ToType())
   480  		err := AppendFixedList(v, []types.Timestamp{1, 2, 3, 4}, nil, mp)
   481  		require.NoError(t, err)
   482  		v.Shrink([]int64{1, 2}, false)
   483  		vs := MustFixedCol[types.Timestamp](v)
   484  		require.Equal(t, []types.Timestamp{2, 3}, vs)
   485  		v.Free(mp)
   486  		require.Equal(t, int64(0), mp.CurrNB())
   487  	}
   488  	{ // decimal64
   489  		vs := make([]types.Decimal64, 4)
   490  		v := NewVec(types.T_decimal64.ToType())
   491  		err := AppendFixedList(v, vs, nil, mp)
   492  		require.NoError(t, err)
   493  		v.Shrink([]int64{1, 2}, false)
   494  		require.Equal(t, vs[1:3], MustFixedCol[types.Decimal64](v))
   495  		v.Free(mp)
   496  		require.Equal(t, int64(0), mp.CurrNB())
   497  	}
   498  	{ // decimal128
   499  		vs := make([]types.Decimal128, 4)
   500  		v := NewVec(types.T_decimal128.ToType())
   501  		err := AppendFixedList(v, vs, nil, mp)
   502  		require.NoError(t, err)
   503  		v.Shrink([]int64{1, 2}, false)
   504  		require.Equal(t, vs[1:3], MustFixedCol[types.Decimal128](v))
   505  		v.Free(mp)
   506  		require.Equal(t, int64(0), mp.CurrNB())
   507  	}
   508  	{ // uuid
   509  		vs := make([]types.Uuid, 4)
   510  		v := NewVec(types.T_uuid.ToType())
   511  		err := AppendFixedList(v, vs, nil, mp)
   512  		require.NoError(t, err)
   513  		v.Shrink([]int64{1, 2}, false)
   514  		require.Equal(t, vs[1:3], MustFixedCol[types.Uuid](v))
   515  		v.Free(mp)
   516  		require.Equal(t, int64(0), mp.CurrNB())
   517  	}
   518  	{ // ts
   519  		vs := make([]types.TS, 4)
   520  		v := NewVec(types.T_TS.ToType())
   521  		err := AppendFixedList(v, vs, nil, mp)
   522  		require.NoError(t, err)
   523  		v.Shrink([]int64{1, 2}, false)
   524  		require.Equal(t, vs[1:3], MustFixedCol[types.TS](v))
   525  		v.Free(mp)
   526  		require.Equal(t, int64(0), mp.CurrNB())
   527  	}
   528  	{ // rowid
   529  		vs := make([]types.Rowid, 4)
   530  		v := NewVec(types.T_Rowid.ToType())
   531  		err := AppendFixedList(v, vs, nil, mp)
   532  		require.NoError(t, err)
   533  		v.Shrink([]int64{1, 2}, false)
   534  		require.Equal(t, vs[1:3], MustFixedCol[types.Rowid](v))
   535  		v.Free(mp)
   536  		require.Equal(t, int64(0), mp.CurrNB())
   537  	}
   538  	{ // blockid
   539  		vs := make([]types.Blockid, 4)
   540  		v := NewVec(types.T_Blockid.ToType())
   541  		err := AppendFixedList(v, vs, nil, mp)
   542  		require.NoError(t, err)
   543  		v.Shrink([]int64{1, 2}, false)
   544  		require.Equal(t, vs[1:3], MustFixedCol[types.Blockid](v))
   545  		v.Free(mp)
   546  		require.Equal(t, int64(0), mp.CurrNB())
   547  	}
   548  	{ // bit
   549  		v := NewVec(types.T_bit.ToType())
   550  		err := AppendFixedList(v, []uint64{1, 2, 3, 4}, nil, mp)
   551  		require.NoError(t, err)
   552  		v.Shrink([]int64{1, 2}, false)
   553  		vs := MustFixedCol[uint64](v)
   554  		require.Equal(t, []uint64{2, 3}, vs)
   555  		v.Free(mp)
   556  		require.Equal(t, int64(0), mp.CurrNB())
   557  	}
   558  }
   559  
   560  func TestShuffle(t *testing.T) {
   561  	mp := mpool.MustNewZero()
   562  
   563  	{ // Array Float32
   564  		v := NewVec(types.T_array_float32.ToType())
   565  		err := AppendArrayList[float32](v, [][]float32{{1, 1}, {2, 2}, {3, 3}}, nil, mp)
   566  		require.NoError(t, err)
   567  		v.Shuffle([]int64{1, 2}, mp)
   568  		require.Equal(t, [][]float32{{2, 2}, {3, 3}}, MustArrayCol[float32](v))
   569  		require.Equal(t, "[2, 2] [3, 3]-[]", v.String())
   570  		v.Free(mp)
   571  		require.Equal(t, int64(0), mp.CurrNB())
   572  	}
   573  	{ // Array Float64
   574  		v := NewVec(types.T_array_float64.ToType())
   575  		err := AppendArrayList[float64](v, [][]float64{{1, 1}, {2, 2}, {3, 3}}, nil, mp)
   576  		require.NoError(t, err)
   577  		v.Shuffle([]int64{1, 2}, mp)
   578  		require.Equal(t, [][]float64{{2, 2}, {3, 3}}, MustArrayCol[float64](v))
   579  		require.Equal(t, "[2, 2] [3, 3]-[]", v.String())
   580  		v.Free(mp)
   581  		require.Equal(t, int64(0), mp.CurrNB())
   582  	}
   583  	{ // bool
   584  		v := NewVec(types.T_bool.ToType())
   585  		err := AppendFixedList(v, []bool{true, false, true, false}, nil, mp)
   586  		require.NoError(t, err)
   587  		v.Shuffle([]int64{2, 1}, mp)
   588  		vs := MustFixedCol[bool](v)
   589  		require.Equal(t, []bool{true, false}, vs)
   590  		require.Equal(t, "[true false]", v.String())
   591  		v.Free(mp)
   592  		require.Equal(t, int64(0), mp.CurrNB())
   593  	}
   594  	{ // int8
   595  		v := NewVec(types.T_int8.ToType())
   596  		err := AppendFixedList(v, []int8{1, 2, 3, 4}, nil, mp)
   597  		require.NoError(t, err)
   598  		v.Shuffle([]int64{1, 2}, mp)
   599  		vs := MustFixedCol[int8](v)
   600  		require.Equal(t, []int8{2, 3}, vs)
   601  		require.Equal(t, "[2 3]", v.String())
   602  		v.Free(mp)
   603  		require.Equal(t, int64(0), mp.CurrNB())
   604  	}
   605  	{ // int16
   606  		v := NewVec(types.T_int16.ToType())
   607  		err := AppendFixedList(v, []int16{1, 2, 3, 4}, nil, mp)
   608  		require.NoError(t, err)
   609  		v.Shuffle([]int64{0, 3}, mp)
   610  		vs := MustFixedCol[int16](v)
   611  		require.Equal(t, []int16{1, 4}, vs)
   612  		require.Equal(t, "[1 4]", v.String())
   613  		v.Free(mp)
   614  		require.Equal(t, int64(0), mp.CurrNB())
   615  	}
   616  	{ // int32
   617  		v := NewVec(types.T_int32.ToType())
   618  		err := AppendFixedList(v, []int32{1, 2, 3, 4}, nil, mp)
   619  		require.NoError(t, err)
   620  		v.Shuffle([]int64{1, 2}, mp)
   621  		vs := MustFixedCol[int32](v)
   622  		require.Equal(t, []int32{2, 3}, vs)
   623  		require.Equal(t, "[2 3]", v.String())
   624  		v.Free(mp)
   625  		require.Equal(t, int64(0), mp.CurrNB())
   626  	}
   627  	{ // int64
   628  		v := NewVec(types.T_int64.ToType())
   629  		err := AppendFixedList(v, []int64{1, 2, 3, 4}, nil, mp)
   630  		require.NoError(t, err)
   631  		v.Shuffle([]int64{1, 2}, mp)
   632  		vs := MustFixedCol[int64](v)
   633  		require.Equal(t, []int64{2, 3}, vs)
   634  		require.Equal(t, "[2 3]", v.String())
   635  		v.Free(mp)
   636  		require.Equal(t, int64(0), mp.CurrNB())
   637  	}
   638  	{ // uint8
   639  		v := NewVec(types.T_uint8.ToType())
   640  		err := AppendFixedList(v, []uint8{1, 2, 3, 4}, nil, mp)
   641  		require.NoError(t, err)
   642  		v.Shuffle([]int64{1, 2}, mp)
   643  		vs := MustFixedCol[uint8](v)
   644  		require.Equal(t, []uint8{2, 3}, vs)
   645  		require.Equal(t, "[2 3]", v.String())
   646  		v.Free(mp)
   647  		require.Equal(t, int64(0), mp.CurrNB())
   648  	}
   649  	{ // uint16
   650  		v := NewVec(types.T_uint16.ToType())
   651  		err := AppendFixedList(v, []uint16{1, 2, 3, 4}, nil, mp)
   652  		require.NoError(t, err)
   653  		v.Shuffle([]int64{0, 3}, mp)
   654  		vs := MustFixedCol[uint16](v)
   655  		require.Equal(t, []uint16{1, 4}, vs)
   656  		require.Equal(t, "[1 4]", v.String())
   657  		v.Free(mp)
   658  		require.Equal(t, int64(0), mp.CurrNB())
   659  	}
   660  	{ // uint32
   661  		v := NewVec(types.T_uint32.ToType())
   662  		err := AppendFixedList(v, []uint32{1, 2, 3, 4}, nil, mp)
   663  		require.NoError(t, err)
   664  		v.Shuffle([]int64{1, 2}, mp)
   665  		vs := MustFixedCol[uint32](v)
   666  		require.Equal(t, []uint32{2, 3}, vs)
   667  		require.Equal(t, "[2 3]", v.String())
   668  		v.Free(mp)
   669  		require.Equal(t, int64(0), mp.CurrNB())
   670  	}
   671  	{ // uint64
   672  		v := NewVec(types.T_uint64.ToType())
   673  		err := AppendFixedList(v, []uint64{1, 2, 3, 4}, nil, mp)
   674  		require.NoError(t, err)
   675  		v.Shuffle([]int64{1, 2}, mp)
   676  		vs := MustFixedCol[uint64](v)
   677  		require.Equal(t, []uint64{2, 3}, vs)
   678  		require.Equal(t, "[2 3]", v.String())
   679  		v.Free(mp)
   680  		require.Equal(t, int64(0), mp.CurrNB())
   681  	}
   682  	{ // float32
   683  		v := NewVec(types.T_float32.ToType())
   684  		err := AppendFixedList(v, []float32{1, 2, 3, 4}, nil, mp)
   685  		require.NoError(t, err)
   686  		v.Shuffle([]int64{1, 2}, mp)
   687  		vs := MustFixedCol[float32](v)
   688  		require.Equal(t, []float32{2, 3}, vs)
   689  		require.Equal(t, "[2 3]", v.String())
   690  		v.Free(mp)
   691  		require.Equal(t, int64(0), mp.CurrNB())
   692  	}
   693  	{ // float64
   694  		v := NewVec(types.T_float64.ToType())
   695  		err := AppendFixedList(v, []float64{1, 2, 3, 4}, nil, mp)
   696  		require.NoError(t, err)
   697  		v.Shuffle([]int64{1, 2}, mp)
   698  		vs := MustFixedCol[float64](v)
   699  		require.Equal(t, []float64{2, 3}, vs)
   700  		require.Equal(t, "[2 3]", v.String())
   701  		v.Free(mp)
   702  		require.Equal(t, int64(0), mp.CurrNB())
   703  	}
   704  	{ // text
   705  		v := NewVec(types.T_text.ToType())
   706  		err := AppendBytesList(v, [][]byte{[]byte("1"), []byte("2"), []byte("3"), []byte("4")}, nil, mp)
   707  		require.NoError(t, err)
   708  		v.Shuffle([]int64{1, 2}, mp)
   709  		vs := MustStrCol(v)
   710  		require.Equal(t, []string{"2", "3"}, vs)
   711  		require.Equal(t, [][]byte{[]byte("2"), []byte("3")}, MustBytesCol(v))
   712  		require.Equal(t, "[2 3]", v.String())
   713  		v.Free(mp)
   714  		require.Equal(t, int64(0), mp.CurrNB())
   715  	}
   716  	{ // date
   717  		v := NewVec(types.T_date.ToType())
   718  		err := AppendFixedList(v, []types.Date{1, 2, 3, 4}, nil, mp)
   719  		require.NoError(t, err)
   720  		v.Shuffle([]int64{1, 2}, mp)
   721  		vs := MustFixedCol[types.Date](v)
   722  		require.Equal(t, []types.Date{2, 3}, vs)
   723  		require.Equal(t, "[0001-01-03 0001-01-04]", v.String())
   724  		v.Free(mp)
   725  		require.Equal(t, int64(0), mp.CurrNB())
   726  	}
   727  	{ // datetime
   728  		v := NewVec(types.T_datetime.ToType())
   729  		err := AppendFixedList(v, []types.Datetime{1, 2, 3, 4}, nil, mp)
   730  		require.NoError(t, err)
   731  		v.Shuffle([]int64{1, 2}, mp)
   732  		vs := MustFixedCol[types.Datetime](v)
   733  		require.Equal(t, []types.Datetime{2, 3}, vs)
   734  		require.Equal(t, "[0001-01-01 00:00:00 0001-01-01 00:00:00]", v.String())
   735  		v.Free(mp)
   736  		require.Equal(t, int64(0), mp.CurrNB())
   737  	}
   738  	{ // time
   739  		v := NewVec(types.T_time.ToType())
   740  		err := AppendFixedList(v, []types.Time{1, 2, 3, 4}, nil, mp)
   741  		require.NoError(t, err)
   742  		v.Shuffle([]int64{1, 2}, mp)
   743  		vs := MustFixedCol[types.Time](v)
   744  		require.Equal(t, []types.Time{2, 3}, vs)
   745  		require.Equal(t, "[00:00:00 00:00:00]", v.String())
   746  		v.Free(mp)
   747  		require.Equal(t, int64(0), mp.CurrNB())
   748  	}
   749  	{ // timestamp
   750  		v := NewVec(types.T_timestamp.ToType())
   751  		err := AppendFixedList(v, []types.Timestamp{1, 2, 3, 4}, nil, mp)
   752  		require.NoError(t, err)
   753  		v.Shuffle([]int64{1, 2}, mp)
   754  		vs := MustFixedCol[types.Timestamp](v)
   755  		require.Equal(t, []types.Timestamp{2, 3}, vs)
   756  		require.Equal(t, "[0001-01-01 00:00:00.000002 UTC 0001-01-01 00:00:00.000003 UTC]", v.String())
   757  		v.Free(mp)
   758  		require.Equal(t, int64(0), mp.CurrNB())
   759  	}
   760  	{ // decimal64
   761  		vs := make([]types.Decimal64, 4)
   762  		v := NewVec(types.T_decimal64.ToType())
   763  		err := AppendFixedList(v, vs, nil, mp)
   764  		require.NoError(t, err)
   765  		v.Shuffle([]int64{1, 2}, mp)
   766  		require.Equal(t, vs[1:3], MustFixedCol[types.Decimal64](v))
   767  		require.Equal(t, "[0 0]", v.String())
   768  		v.Free(mp)
   769  		require.Equal(t, int64(0), mp.CurrNB())
   770  	}
   771  	{ // decimal128
   772  		vs := make([]types.Decimal128, 4)
   773  		v := NewVec(types.T_decimal128.ToType())
   774  		err := AppendFixedList(v, vs, nil, mp)
   775  		require.NoError(t, err)
   776  		v.Shuffle([]int64{1, 2}, mp)
   777  		require.Equal(t, vs[1:3], MustFixedCol[types.Decimal128](v))
   778  		require.Equal(t, "[{0 0} {0 0}]", v.String())
   779  		v.Free(mp)
   780  		require.Equal(t, int64(0), mp.CurrNB())
   781  	}
   782  	{ // uuid
   783  		vs := make([]types.Uuid, 4)
   784  		v := NewVec(types.T_uuid.ToType())
   785  		err := AppendFixedList(v, vs, nil, mp)
   786  		require.NoError(t, err)
   787  		v.Shuffle([]int64{1, 2}, mp)
   788  		require.Equal(t, vs[1:3], MustFixedCol[types.Uuid](v))
   789  		require.Equal(t, "[[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]]", v.String())
   790  		v.Free(mp)
   791  		require.Equal(t, int64(0), mp.CurrNB())
   792  	}
   793  	{ // ts
   794  		vs := make([]types.TS, 4)
   795  		v := NewVec(types.T_TS.ToType())
   796  		err := AppendFixedList(v, vs, nil, mp)
   797  		require.NoError(t, err)
   798  		v.Shuffle([]int64{1, 2}, mp)
   799  		require.Equal(t, vs[1:3], MustFixedCol[types.TS](v))
   800  		require.Equal(t, "[[0 0 0 0 0 0 0 0 0 0 0 0] [0 0 0 0 0 0 0 0 0 0 0 0]]", v.String())
   801  		v.Free(mp)
   802  		require.Equal(t, int64(0), mp.CurrNB())
   803  	}
   804  	{ // rowid
   805  		vs := make([]types.Rowid, 4)
   806  		v := NewVec(types.T_Rowid.ToType())
   807  		err := AppendFixedList(v, vs, nil, mp)
   808  		require.NoError(t, err)
   809  		v.Shuffle([]int64{1, 2}, mp)
   810  		require.Equal(t, vs[1:3], MustFixedCol[types.Rowid](v))
   811  		require.Equal(t, "[[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]]", v.String())
   812  		v.Free(mp)
   813  		require.Equal(t, int64(0), mp.CurrNB())
   814  	}
   815  	{ // blockid
   816  		vs := make([]types.Blockid, 4)
   817  		v := NewVec(types.T_Blockid.ToType())
   818  		err := AppendFixedList(v, vs, nil, mp)
   819  		require.NoError(t, err)
   820  		v.Shuffle([]int64{1, 2}, mp)
   821  		require.Equal(t, vs[1:3], MustFixedCol[types.Blockid](v))
   822  		require.Equal(t, "[[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]]", v.String())
   823  		v.Free(mp)
   824  		require.Equal(t, int64(0), mp.CurrNB())
   825  	}
   826  	{ // bit
   827  		v := NewVec(types.T_bit.ToType())
   828  		err := AppendFixedList(v, []uint64{1, 2, 3, 4}, nil, mp)
   829  		require.NoError(t, err)
   830  		err = v.Shuffle([]int64{1, 2}, mp)
   831  		require.NoError(t, err)
   832  		vs := MustFixedCol[uint64](v)
   833  		require.Equal(t, []uint64{2, 3}, vs)
   834  		require.Equal(t, "[2 3]", v.String())
   835  		v.Free(mp)
   836  		require.Equal(t, int64(0), mp.CurrNB())
   837  	}
   838  }
   839  
   840  func TestCopy(t *testing.T) {
   841  	mp := mpool.MustNewZero()
   842  	{ // fixed
   843  		v := NewVec(types.T_int8.ToType())
   844  		AppendFixedList(v, []int8{0, 0, 1, 0}, nil, mp)
   845  		w := NewVec(types.T_int8.ToType())
   846  		AppendFixedList(w, []int8{0, 0, 0, 0}, nil, mp)
   847  		err := v.Copy(w, 2, 0, mp)
   848  		require.NoError(t, err)
   849  		require.Equal(t, MustFixedCol[int8](v), MustFixedCol[int8](w))
   850  		v.Free(mp)
   851  		w.Free(mp)
   852  		require.Equal(t, int64(0), mp.CurrNB())
   853  	}
   854  	{ // bit
   855  		v := NewVec(types.T_bit.ToType())
   856  		err := AppendFixedList(v, []uint64{0, 0, 1, 0}, nil, mp)
   857  		require.NoError(t, err)
   858  		w := NewVec(types.T_bit.ToType())
   859  		err = AppendFixedList(w, []uint64{0, 0, 0, 0}, nil, mp)
   860  		require.NoError(t, err)
   861  		err = v.Copy(w, 2, 0, mp)
   862  		require.NoError(t, err)
   863  		require.Equal(t, MustFixedCol[uint64](v), MustFixedCol[uint64](w))
   864  		v.Free(mp)
   865  		w.Free(mp)
   866  		require.Equal(t, int64(0), mp.CurrNB())
   867  	}
   868  	{ // Array Float32
   869  		v := NewVec(types.New(types.T_array_float32, 10, 0))
   870  		AppendArrayList[float32](v, [][]float32{{0, 0}, {0, 0}, {1, 1}, {0, 0}}, nil, mp)
   871  		w := NewVec(types.New(types.T_array_float32, 10, 0))
   872  		AppendArrayList[float32](w, [][]float32{{0, 0}, {0, 0}, {0, 0}, {0, 0}}, nil, mp)
   873  		err := v.Copy(w, 2, 0, mp)
   874  		require.NoError(t, err)
   875  		require.Equal(t, MustArrayCol[float32](v), MustArrayCol[float32](w))
   876  		v.Free(mp)
   877  		w.Free(mp)
   878  		require.Equal(t, int64(0), mp.CurrNB())
   879  	}
   880  	{ // Array Float64
   881  		v := NewVec(types.New(types.T_array_float64, 10, 0))
   882  		AppendArrayList[float64](v, [][]float64{{0, 0}, {0, 0}, {1, 1}, {0, 0}}, nil, mp)
   883  		w := NewVec(types.New(types.T_array_float64, 10, 0))
   884  		AppendArrayList[float64](w, [][]float64{{0, 0}, {0, 0}, {0, 0}, {0, 0}}, nil, mp)
   885  		err := v.Copy(w, 2, 0, mp)
   886  		require.NoError(t, err)
   887  		require.Equal(t, MustArrayCol[float32](v), MustArrayCol[float32](w))
   888  		v.Free(mp)
   889  		w.Free(mp)
   890  		require.Equal(t, int64(0), mp.CurrNB())
   891  	}
   892  	{ // string
   893  		v := NewVec(types.New(types.T_char, 10, 0))
   894  		AppendBytesList(v, [][]byte{
   895  			[]byte("hello"),
   896  			[]byte("hello"),
   897  			[]byte("nihao"),
   898  			[]byte("hello"),
   899  		}, nil, mp)
   900  		w := NewVec(types.New(types.T_char, 10, 0))
   901  		AppendBytesList(w, [][]byte{
   902  			[]byte("hello"),
   903  			[]byte("hello"),
   904  			[]byte("hello"),
   905  			[]byte("hello"),
   906  		}, nil, mp)
   907  		err := v.Copy(w, 2, 0, mp)
   908  		require.NoError(t, err)
   909  		require.Equal(t, MustStrCol(v), MustStrCol(w))
   910  		v.Free(mp)
   911  		w.Free(mp)
   912  		require.Equal(t, int64(0), mp.CurrNB())
   913  	}
   914  }
   915  
   916  func TestCloneWindow(t *testing.T) {
   917  	mp := mpool.MustNewZero()
   918  	v1 := NewConstNull(types.T_int32.ToType(), 10, mp)
   919  	defer v1.Free(mp)
   920  	v2, err := v1.CloneWindow(3, 5, mp)
   921  	defer v2.Free(mp)
   922  	require.NoError(t, err)
   923  	require.True(t, v2.IsConstNull())
   924  	require.Equal(t, 2, v2.Length())
   925  
   926  	v3, _ := NewConstFixed[int32](types.T_int32.ToType(), 10, 20, mp)
   927  	defer v3.Free(mp)
   928  	v4, err := v3.CloneWindow(3, 5, mp)
   929  	defer v4.Free(mp)
   930  	require.NoError(t, err)
   931  	require.True(t, v4.IsConst())
   932  	require.Equal(t, 2, v4.Length())
   933  	require.Equal(t, int32(10), GetFixedAt[int32](v4, 0))
   934  	require.Equal(t, int32(10), GetFixedAt[int32](v4, 1))
   935  }
   936  
   937  func TestCloneWindowWithMpNil(t *testing.T) {
   938  	mp := mpool.MustNewZero()
   939  	vec1 := NewVec(types.T_int32.ToType())
   940  	AppendFixed(vec1, int32(1), false, mp)
   941  	AppendFixed(vec1, int32(2), true, mp)
   942  	AppendFixed(vec1, int32(3), false, mp)
   943  	require.False(t, vec1.NeedDup())
   944  
   945  	vec2, err := vec1.CloneWindow(0, vec1.Length(), nil)
   946  	require.NoError(t, err)
   947  	vec1.Free(mp)
   948  
   949  	t.Log(vec2.String())
   950  	require.True(t, vec2.NeedDup())
   951  	require.Equal(t, int32(1), GetFixedAt[int32](vec2, 0))
   952  	require.True(t, vec2.GetNulls().Contains(uint64(1)))
   953  	require.Equal(t, int32(3), GetFixedAt[int32](vec2, 2))
   954  
   955  	vec3 := NewVec(types.T_char.ToType())
   956  	AppendBytes(vec3, []byte("h"), false, mp)
   957  	AppendBytes(vec3, []byte("xx"), true, mp)
   958  	AppendBytes(vec3, []byte("uuu"), false, mp)
   959  	require.False(t, vec3.NeedDup())
   960  
   961  	vec4, err := vec3.CloneWindow(0, vec3.Length(), nil)
   962  	require.NoError(t, err)
   963  	vec3.Free(mp)
   964  
   965  	require.True(t, vec4.NeedDup())
   966  	require.Equal(t, 1, len(vec4.GetBytesAt(0)))
   967  	require.Equal(t, 3, len(vec4.GetBytesAt(2)))
   968  	require.True(t, vec4.GetNulls().Contains(uint64(1)))
   969  
   970  	{ //Array Float32
   971  		mp := mpool.MustNewZero()
   972  		vec5 := NewVec(types.New(types.T_array_float32, 2, 0))
   973  		AppendArray[float32](vec5, []float32{1, 1}, false, mp)
   974  		AppendArray[float32](vec5, []float32{2, 2}, true, mp)
   975  		AppendArray[float32](vec5, []float32{3, 3}, false, mp)
   976  		require.False(t, vec5.NeedDup())
   977  
   978  		vec6, err := vec5.CloneWindow(0, vec5.Length(), nil)
   979  		require.NoError(t, err)
   980  		vec5.Free(mp)
   981  
   982  		t.Log(vec6.String())
   983  		require.True(t, vec6.NeedDup())
   984  		require.Equal(t, []float32{1, 1}, GetArrayAt[float32](vec6, 0))
   985  		require.True(t, vec6.GetNulls().Contains(uint64(1)))
   986  		require.Equal(t, []float32{3, 3}, GetArrayAt[float32](vec6, 2))
   987  	}
   988  	{ //Array Float64
   989  		mp := mpool.MustNewZero()
   990  		vec5 := NewVec(types.New(types.T_array_float64, 2, 0))
   991  		AppendArray(vec5, []float64{1, 1}, false, mp)
   992  		AppendArray(vec5, []float64{2, 2}, true, mp)
   993  		AppendArray(vec5, []float64{3, 3}, false, mp)
   994  		require.False(t, vec5.NeedDup())
   995  
   996  		vec6, err := vec5.CloneWindow(0, vec5.Length(), nil)
   997  		require.NoError(t, err)
   998  		vec5.Free(mp)
   999  
  1000  		t.Log(vec6.String())
  1001  		require.True(t, vec6.NeedDup())
  1002  		require.Equal(t, []float64{1, 1}, GetArrayAt[float64](vec6, 0))
  1003  		require.True(t, vec6.GetNulls().Contains(uint64(1)))
  1004  		require.Equal(t, []float64{3, 3}, GetArrayAt[float64](vec6, 2))
  1005  	}
  1006  }
  1007  
  1008  /*
  1009  func TestUnionOne(t *testing.T) {
  1010  	mp := mpool.MustNewZero()
  1011  	{ // bool
  1012  		v := NewVector(types.T_bool.ToType())
  1013  		err := v.PreExtend(10, mp)
  1014  		require.NoError(t, err)
  1015  		err = AppendList(v, []bool{true, false, true, false}, nil, mp)
  1016  		require.NoError(t, err)
  1017  		w := NewVector(types.T_bool.ToType())
  1018  		w.UnionOne(v, 0, false, mp)
  1019  		require.Equal(t, MustFixedCol[bool](v)[:1], MustFixedCol[bool](w))
  1020  		w.UnionOne(v, 0, true, mp)
  1021  		v.Free(mp)
  1022  		w.Free(mp)
  1023  		require.Equal(t, int64(0), mp.CurrNB())
  1024  	}
  1025  	{ // int8
  1026  		v := NewVector(types.T_int8.ToType())
  1027  		err := v.PreExtend(10, mp)
  1028  		require.NoError(t, err)
  1029  		err = AppendList(v, []int8{1, 2, 3, 4}, nil, mp)
  1030  		require.NoError(t, err)
  1031  		w := NewVector(types.T_int8.ToType())
  1032  		w.UnionOne(v, 0, false, mp)
  1033  		require.Equal(t, MustFixedCol[int8](v)[:1], MustFixedCol[int8](w))
  1034  		w.UnionOne(v, 0, true, mp)
  1035  		v.Free(mp)
  1036  		w.Free(mp)
  1037  		require.Equal(t, int64(0), mp.CurrNB())
  1038  	}
  1039  	{ // int16
  1040  		v := NewVector(types.T_int16.ToType())
  1041  		err := v.PreExtend(10, mp)
  1042  		require.NoError(t, err)
  1043  		err = AppendList(v, []int16{1, 2, 3, 4}, nil, mp)
  1044  		require.NoError(t, err)
  1045  		w := NewVector(types.T_int16.ToType())
  1046  		w.UnionOne(v, 0, false, mp)
  1047  		require.Equal(t, MustFixedCol[int16](v)[:1], MustFixedCol[int16](w))
  1048  		w.UnionOne(v, 0, true, mp)
  1049  		v.Free(mp)
  1050  		w.Free(mp)
  1051  		require.Equal(t, int64(0), mp.CurrNB())
  1052  	}
  1053  	{ // int32
  1054  		v := NewVector(types.T_int32.ToType())
  1055  		err := v.PreExtend(10, mp)
  1056  		require.NoError(t, err)
  1057  		err = AppendList(v, []int32{1, 2, 3, 4}, nil, mp)
  1058  		require.NoError(t, err)
  1059  		w := NewVector(types.T_int32.ToType())
  1060  		w.UnionOne(v, 0, false, mp)
  1061  		require.Equal(t, MustFixedCol[int32](v)[:1], MustFixedCol[int32](w))
  1062  		w.UnionOne(v, 0, true, mp)
  1063  		v.Free(mp)
  1064  		w.Free(mp)
  1065  		require.Equal(t, int64(0), mp.CurrNB())
  1066  	}
  1067  	{ // int64
  1068  		v := NewVector(types.T_int64.ToType())
  1069  		err := v.PreExtend(10, mp)
  1070  		require.NoError(t, err)
  1071  		err = AppendList(v, []int64{1, 2, 3, 4}, nil, mp)
  1072  		require.NoError(t, err)
  1073  		w := NewVector(types.T_int64.ToType())
  1074  		w.UnionOne(v, 0, false, mp)
  1075  		require.Equal(t, MustFixedCol[int64](v)[:1], MustFixedCol[int64](w))
  1076  		w.UnionOne(v, 0, true, mp)
  1077  		v.Free(mp)
  1078  		w.Free(mp)
  1079  		require.Equal(t, int64(0), mp.CurrNB())
  1080  	}
  1081  	{ // uint8
  1082  		v := NewVector(types.T_uint8.ToType())
  1083  		err := v.PreExtend(10, mp)
  1084  		require.NoError(t, err)
  1085  		err = AppendList(v, []uint8{1, 2, 3, 4}, nil, mp)
  1086  		require.NoError(t, err)
  1087  		w := NewVector(types.T_uint8.ToType())
  1088  		w.UnionOne(v, 0, false, mp)
  1089  		require.Equal(t, MustFixedCol[uint8](v)[:1], MustFixedCol[uint8](w))
  1090  		w.UnionOne(v, 0, true, mp)
  1091  		v.Free(mp)
  1092  		w.Free(mp)
  1093  		require.Equal(t, int64(0), mp.CurrNB())
  1094  	}
  1095  	{ // uint16
  1096  		v := NewVector(types.T_uint16.ToType())
  1097  		err := v.PreExtend(10, mp)
  1098  		require.NoError(t, err)
  1099  		err = AppendList(v, []uint16{1, 2, 3, 4}, nil, mp)
  1100  		require.NoError(t, err)
  1101  		w := NewVector(types.T_uint16.ToType())
  1102  		w.UnionOne(v, 0, false, mp)
  1103  		require.Equal(t, MustFixedCol[uint16](v)[:1], MustFixedCol[uint16](w))
  1104  		w.UnionOne(v, 0, true, mp)
  1105  		v.Free(mp)
  1106  		w.Free(mp)
  1107  		require.Equal(t, int64(0), mp.CurrNB())
  1108  	}
  1109  	{ // uint32
  1110  		v := NewVector(types.T_uint32.ToType())
  1111  		err := v.PreExtend(10, mp)
  1112  		require.NoError(t, err)
  1113  		err = AppendList(v, []uint32{1, 2, 3, 4}, nil, mp)
  1114  		require.NoError(t, err)
  1115  		w := NewVector(types.T_uint32.ToType())
  1116  		w.UnionOne(v, 0, false, mp)
  1117  		require.Equal(t, MustFixedCol[uint32](v)[:1], MustFixedCol[uint32](w))
  1118  		w.UnionOne(v, 0, true, mp)
  1119  		v.Free(mp)
  1120  		w.Free(mp)
  1121  		require.Equal(t, int64(0), mp.CurrNB())
  1122  	}
  1123  	{ // uint64
  1124  		v := NewVector(types.T_uint64.ToType())
  1125  		err := v.PreExtend(10, mp)
  1126  		require.NoError(t, err)
  1127  		err = AppendList(v, []uint64{1, 2, 3, 4}, nil, mp)
  1128  		require.NoError(t, err)
  1129  		w := NewVector(types.T_uint64.ToType())
  1130  		w.UnionOne(v, 0, false, mp)
  1131  		require.Equal(t, MustFixedCol[uint64](v)[:1], MustFixedCol[uint64](w))
  1132  		w.UnionOne(v, 0, true, mp)
  1133  		v.Free(mp)
  1134  		w.Free(mp)
  1135  		require.Equal(t, int64(0), mp.CurrNB())
  1136  	}
  1137  	{ // float32
  1138  		v := NewVector(types.T_float32.ToType())
  1139  		err := v.PreExtend(10, mp)
  1140  		require.NoError(t, err)
  1141  		err = AppendList(v, []float32{1, 2, 3, 4}, nil, mp)
  1142  		require.NoError(t, err)
  1143  		w := NewVector(types.T_float32.ToType())
  1144  		w.UnionOne(v, 0, false, mp)
  1145  		require.Equal(t, MustFixedCol[float32](v)[:1], MustFixedCol[float32](w))
  1146  		w.UnionOne(v, 0, true, mp)
  1147  		v.Free(mp)
  1148  		w.Free(mp)
  1149  		require.Equal(t, int64(0), mp.CurrNB())
  1150  	}
  1151  	{ // float64
  1152  		v := NewVector(types.T_float64.ToType())
  1153  		err := v.PreExtend(10, mp)
  1154  		require.NoError(t, err)
  1155  		err = AppendList(v, []float64{1, 2, 3, 4}, nil, mp)
  1156  		require.NoError(t, err)
  1157  		w := NewVector(types.T_float64.ToType())
  1158  		w.UnionOne(v, 0, false, mp)
  1159  		require.Equal(t, MustFixedCol[float64](v)[:1], MustFixedCol[float64](w))
  1160  		w.UnionOne(v, 0, true, mp)
  1161  		v.Free(mp)
  1162  		w.Free(mp)
  1163  		require.Equal(t, int64(0), mp.CurrNB())
  1164  	}
  1165  	{ // text
  1166  		v := NewVector(types.T_text.ToType())
  1167  		err := v.PreExtend(10, mp)
  1168  		require.NoError(t, err)
  1169  		err = AppendBytesList(v, [][]byte{[]byte("1"), []byte("2"), []byte("3"), []byte("4")}, nil, mp)
  1170  		require.NoError(t, err)
  1171  		w := NewVector(types.T_text.ToType())
  1172  		w.UnionOne(v, 0, false, mp)
  1173  		require.Equal(t, MustStrCols(v)[:1], MustStrCols(w))
  1174  		w.UnionOne(v, 0, true, mp)
  1175  		v.Free(mp)
  1176  		w.Free(mp)
  1177  		require.Equal(t, int64(0), mp.CurrNB())
  1178  	}
  1179  	{ // date
  1180  		v := NewVector(types.T_date.ToType())
  1181  		err := v.PreExtend(10, mp)
  1182  		require.NoError(t, err)
  1183  		err = AppendList(v, []types.Date{1, 2, 3, 4}, nil, mp)
  1184  		require.NoError(t, err)
  1185  		w := NewVector(types.T_date.ToType())
  1186  		w.UnionOne(v, 0, false, mp)
  1187  		require.Equal(t, MustFixedCol[types.Date](v)[:1], MustFixedCol[types.Date](w))
  1188  		w.UnionOne(v, 0, true, mp)
  1189  		v.Free(mp)
  1190  		w.Free(mp)
  1191  		require.Equal(t, int64(0), mp.CurrNB())
  1192  	}
  1193  	{ // datetime
  1194  		v := NewVector(types.T_datetime.ToType())
  1195  		err := v.PreExtend(10, mp)
  1196  		require.NoError(t, err)
  1197  		err = AppendList(v, []types.Datetime{1, 2, 3, 4}, nil, mp)
  1198  		require.NoError(t, err)
  1199  		w := NewVector(types.T_datetime.ToType())
  1200  		w.UnionOne(v, 0, false, mp)
  1201  		require.Equal(t, MustFixedCol[types.Datetime](v)[:1], MustFixedCol[types.Datetime](w))
  1202  		w.UnionOne(v, 0, true, mp)
  1203  		v.Free(mp)
  1204  		w.Free(mp)
  1205  		require.Equal(t, int64(0), mp.CurrNB())
  1206  	}
  1207  	{ // time
  1208  		v := NewVector(types.T_time.ToType())
  1209  		err := v.PreExtend(10, mp)
  1210  		require.NoError(t, err)
  1211  		err = AppendList(v, []types.Time{1, 2, 3, 4}, nil, mp)
  1212  		require.NoError(t, err)
  1213  		w := NewVector(types.T_time.ToType())
  1214  		w.UnionOne(v, 0, false, mp)
  1215  		require.Equal(t, MustFixedCol[types.Time](v)[:1], MustFixedCol[types.Time](w))
  1216  		w.UnionOne(v, 0, true, mp)
  1217  		v.Free(mp)
  1218  		w.Free(mp)
  1219  		require.Equal(t, int64(0), mp.CurrNB())
  1220  	}
  1221  	{ // timestamp
  1222  		v := NewVector(types.T_timestamp.ToType())
  1223  		err := v.PreExtend(10, mp)
  1224  		require.NoError(t, err)
  1225  		err = AppendList(v, []types.Timestamp{1, 2, 3, 4}, nil, mp)
  1226  		require.NoError(t, err)
  1227  		w := NewVector(types.T_timestamp.ToType())
  1228  		w.UnionOne(v, 0, false, mp)
  1229  		require.Equal(t, MustFixedCol[types.Timestamp](v)[:1], MustFixedCol[types.Timestamp](w))
  1230  		w.UnionOne(v, 0, true, mp)
  1231  		v.Free(mp)
  1232  		w.Free(mp)
  1233  		require.Equal(t, int64(0), mp.CurrNB())
  1234  	}
  1235  	{ // decimal64
  1236  		vs := make([]types.Decimal64, 4)
  1237  		v := NewVector(types.T_decimal64.ToType())
  1238  		err := v.PreExtend(10, mp)
  1239  		require.NoError(t, err)
  1240  		err = AppendList(v, vs, nil, mp)
  1241  		require.NoError(t, err)
  1242  		w := NewVector(types.T_decimal64.ToType())
  1243  		w.UnionOne(v, 0, false, mp)
  1244  		require.Equal(t, MustFixedCol[types.Decimal64](v)[:1], MustFixedCol[types.Decimal64](w))
  1245  		w.UnionOne(v, 0, true, mp)
  1246  		v.Free(mp)
  1247  		w.Free(mp)
  1248  		require.Equal(t, int64(0), mp.CurrNB())
  1249  	}
  1250  	{ // decimal128
  1251  		vs := make([]types.Decimal128, 4)
  1252  		v := NewVector(types.T_decimal128.ToType())
  1253  		err := v.PreExtend(10, mp)
  1254  		require.NoError(t, err)
  1255  		err = AppendList(v, vs, nil, mp)
  1256  		require.NoError(t, err)
  1257  		w := NewVector(types.T_decimal128.ToType())
  1258  		w.UnionOne(v, 0, false, mp)
  1259  		require.Equal(t, MustFixedCol[types.Decimal128](v)[:1], MustFixedCol[types.Decimal128](w))
  1260  		w.UnionOne(v, 0, true, mp)
  1261  		v.Free(mp)
  1262  		w.Free(mp)
  1263  		require.Equal(t, int64(0), mp.CurrNB())
  1264  	}
  1265  	{ // uuid
  1266  		vs := make([]types.Uuid, 4)
  1267  		v := NewVector(types.T_uuid.ToType())
  1268  		err := v.PreExtend(10, mp)
  1269  		require.NoError(t, err)
  1270  		err = AppendList(v, vs, nil, mp)
  1271  		require.NoError(t, err)
  1272  		w := NewVector(types.T_uuid.ToType())
  1273  		w.UnionOne(v, 0, false, mp)
  1274  		require.Equal(t, MustFixedCol[types.Uuid](v)[:1], MustFixedCol[types.Uuid](w))
  1275  		w.UnionOne(v, 0, true, mp)
  1276  		v.Free(mp)
  1277  		w.Free(mp)
  1278  		require.Equal(t, int64(0), mp.CurrNB())
  1279  	}
  1280  	{ // ts
  1281  		vs := make([]types.TS, 4)
  1282  		v := NewVector(types.T_TS.ToType())
  1283  		err := v.PreExtend(10, mp)
  1284  		require.NoError(t, err)
  1285  		err = AppendList(v, vs, nil, mp)
  1286  		require.NoError(t, err)
  1287  		w := NewVector(types.T_TS.ToType())
  1288  		w.UnionOne(v, 0, false, mp)
  1289  		require.Equal(t, MustFixedCol[types.TS](v)[:1], MustFixedCol[types.TS](w))
  1290  		w.UnionOne(v, 0, true, mp)
  1291  		v.Free(mp)
  1292  		w.Free(mp)
  1293  		require.Equal(t, int64(0), mp.CurrNB())
  1294  	}
  1295  	{ // rowid
  1296  		vs := make([]types.Rowid, 4)
  1297  		v := NewVector(types.T_Rowid.ToType())
  1298  		err := v.PreExtend(10, mp)
  1299  		require.NoError(t, err)
  1300  		err = AppendList(v, vs, nil, mp)
  1301  		require.NoError(t, err)
  1302  		w := NewVector(types.T_Rowid.ToType())
  1303  		w.UnionOne(v, 0, false, mp)
  1304  		require.Equal(t, MustFixedCol[types.Rowid](v)[:1], MustFixedCol[types.Rowid](w))
  1305  		w.UnionOne(v, 0, true, mp)
  1306  		v.Free(mp)
  1307  		w.Free(mp)
  1308  		require.Equal(t, int64(0), mp.CurrNB())
  1309  	}
  1310  }
  1311  */
  1312  
  1313  func TestMarshalAndUnMarshal(t *testing.T) {
  1314  	mp := mpool.MustNewZero()
  1315  	v := NewVec(types.T_int8.ToType())
  1316  	err := AppendFixedList(v, []int8{0, 1, 2}, nil, mp)
  1317  	require.NoError(t, err)
  1318  	data, err := v.MarshalBinary()
  1319  	require.NoError(t, err)
  1320  	w := new(Vector)
  1321  	err = w.UnmarshalBinary(data)
  1322  	require.NoError(t, err)
  1323  	require.Equal(t, MustFixedCol[int8](v), MustFixedCol[int8](w))
  1324  	w = new(Vector)
  1325  	err = w.UnmarshalBinaryWithCopy(data, mp)
  1326  	require.NoError(t, err)
  1327  	require.Equal(t, MustFixedCol[int8](v), MustFixedCol[int8](w))
  1328  	require.NoError(t, err)
  1329  	v.Free(mp)
  1330  	w.Free(mp)
  1331  	require.Equal(t, int64(0), mp.CurrNB())
  1332  }
  1333  
  1334  func TestStrMarshalAndUnMarshal(t *testing.T) {
  1335  	mp := mpool.MustNewZero()
  1336  	v := NewVec(types.T_text.ToType())
  1337  	err := AppendBytesList(v, [][]byte{[]byte("x"), []byte("y")}, nil, mp)
  1338  	require.NoError(t, err)
  1339  	data, err := v.MarshalBinary()
  1340  	require.NoError(t, err)
  1341  	w := new(Vector)
  1342  	err = w.UnmarshalBinary(data)
  1343  	require.NoError(t, err)
  1344  	require.Equal(t, MustStrCol(v), MustStrCol(w))
  1345  	w = new(Vector)
  1346  	err = w.UnmarshalBinaryWithCopy(data, mp)
  1347  	require.NoError(t, err)
  1348  	require.Equal(t, MustStrCol(v), MustStrCol(w))
  1349  	v.Free(mp)
  1350  	w.Free(mp)
  1351  	require.Equal(t, int64(0), mp.CurrNB())
  1352  }
  1353  
  1354  func TestArrayMarshalAndUnMarshal(t *testing.T) {
  1355  
  1356  	{
  1357  		// Array Float32
  1358  		mp := mpool.MustNewZero()
  1359  		v := NewVec(types.New(types.T_array_float32, 2, 0))
  1360  		err := AppendArrayList(v, [][]float32{{0, 0}, {1, 1}, {2, 2}}, nil, mp)
  1361  		require.NoError(t, err)
  1362  		data, err := v.MarshalBinary()
  1363  		require.NoError(t, err)
  1364  		w := new(Vector)
  1365  		err = w.UnmarshalBinary(data)
  1366  		require.NoError(t, err)
  1367  		require.Equal(t, MustArrayCol[float32](v), MustArrayCol[float32](w))
  1368  		w = new(Vector)
  1369  		err = w.UnmarshalBinaryWithCopy(data, mp)
  1370  		require.NoError(t, err)
  1371  		require.Equal(t, MustArrayCol[float32](v), MustArrayCol[float32](w))
  1372  		require.NoError(t, err)
  1373  		v.Free(mp)
  1374  		w.Free(mp)
  1375  		require.Equal(t, int64(0), mp.CurrNB())
  1376  	}
  1377  
  1378  	{
  1379  		// Array Float64
  1380  		mp := mpool.MustNewZero()
  1381  		v := NewVec(types.New(types.T_array_float64, 2, 0))
  1382  		err := AppendArrayList(v, [][]float64{{0, 0}, {1, 1}, {2, 2}}, nil, mp)
  1383  		require.NoError(t, err)
  1384  		data, err := v.MarshalBinary()
  1385  		require.NoError(t, err)
  1386  		w := new(Vector)
  1387  		err = w.UnmarshalBinary(data)
  1388  		require.NoError(t, err)
  1389  		require.Equal(t, MustArrayCol[float64](v), MustArrayCol[float64](w))
  1390  		w = new(Vector)
  1391  		err = w.UnmarshalBinaryWithCopy(data, mp)
  1392  		require.NoError(t, err)
  1393  		require.Equal(t, MustArrayCol[float64](v), MustArrayCol[float64](w))
  1394  		require.NoError(t, err)
  1395  		v.Free(mp)
  1396  		w.Free(mp)
  1397  		require.Equal(t, int64(0), mp.CurrNB())
  1398  	}
  1399  }
  1400  
  1401  func TestWindowWith(t *testing.T) {
  1402  	mp := mpool.MustNewZero()
  1403  	vec1 := NewVec(types.T_int32.ToType())
  1404  	AppendFixed(vec1, int32(1), false, mp)
  1405  	AppendFixed(vec1, int32(2), true, mp)
  1406  	AppendFixed(vec1, int32(3), false, mp)
  1407  	require.False(t, vec1.NeedDup())
  1408  
  1409  	vec2, err := vec1.Window(0, vec1.Length())
  1410  	require.NoError(t, err)
  1411  
  1412  	t.Log(vec2.String())
  1413  	require.True(t, vec2.NeedDup())
  1414  	require.Equal(t, int32(1), GetFixedAt[int32](vec2, 0))
  1415  	require.True(t, vec2.GetNulls().Contains(uint64(1)))
  1416  	require.Equal(t, int32(3), GetFixedAt[int32](vec2, 2))
  1417  	vec2.Free(mp)
  1418  
  1419  	vec6, err := vec1.Window(1, vec1.Length())
  1420  	require.NoError(t, err)
  1421  
  1422  	t.Log(vec6.String())
  1423  	require.True(t, vec6.NeedDup())
  1424  	require.True(t, vec6.GetNulls().Contains(uint64(0)))
  1425  	require.Equal(t, int32(3), GetFixedAt[int32](vec6, 1))
  1426  	vec6.Free(mp)
  1427  
  1428  	require.False(t, vec1.NeedDup())
  1429  	require.Equal(t, int32(1), GetFixedAt[int32](vec1, 0))
  1430  	require.True(t, vec1.GetNulls().Contains(uint64(1)))
  1431  	require.Equal(t, int32(3), GetFixedAt[int32](vec1, 2))
  1432  	vec1.Free(mp)
  1433  
  1434  	vec3 := NewVec(types.T_char.ToType())
  1435  	AppendBytes(vec3, []byte("h"), false, mp)
  1436  	AppendBytes(vec3, []byte("xx"), true, mp)
  1437  	AppendBytes(vec3, []byte("uuu"), false, mp)
  1438  	require.False(t, vec3.NeedDup())
  1439  
  1440  	vec4, err := vec3.Window(0, vec3.Length())
  1441  	require.NoError(t, err)
  1442  
  1443  	require.True(t, vec4.NeedDup())
  1444  	require.Equal(t, "h", string(vec4.GetBytesAt(0)))
  1445  	require.Equal(t, "uuu", string(vec4.GetBytesAt(2)))
  1446  	require.True(t, vec4.GetNulls().Contains(uint64(1)))
  1447  	vec4.Free(mp)
  1448  
  1449  	vec5, err := vec3.Window(1, vec3.Length())
  1450  	require.NoError(t, err)
  1451  
  1452  	require.True(t, vec5.NeedDup())
  1453  	require.Equal(t, "uuu", string(vec5.GetBytesAt(1)))
  1454  	require.True(t, vec5.GetNulls().Contains(uint64(0)))
  1455  	vec5.Free(mp)
  1456  
  1457  	require.False(t, vec3.NeedDup())
  1458  	require.Equal(t, "h", string(vec3.GetBytesAt(0)))
  1459  	require.Equal(t, "uuu", string(vec3.GetBytesAt(2)))
  1460  	require.True(t, vec3.GetNulls().Contains(uint64(1)))
  1461  	vec3.Free(mp)
  1462  
  1463  	{
  1464  		//Array Float32
  1465  
  1466  		vec7 := NewVec(types.T_array_float32.ToType())
  1467  		AppendArray(vec7, []float32{1, 1, 1}, false, mp)
  1468  		AppendArray(vec7, []float32{2, 2, 2}, true, mp)
  1469  		AppendArray(vec7, []float32{3, 3, 3}, false, mp)
  1470  		require.False(t, vec7.NeedDup())
  1471  
  1472  		vec8, err := vec7.Window(0, vec7.Length())
  1473  		require.NoError(t, err)
  1474  
  1475  		require.True(t, vec8.NeedDup())
  1476  		require.Equal(t, []float32{1, 1, 1}, GetArrayAt[float32](vec8, 0))
  1477  		require.Equal(t, []float32{3, 3, 3}, GetArrayAt[float32](vec8, 2))
  1478  		require.True(t, vec8.GetNulls().Contains(uint64(1)))
  1479  		vec8.Free(mp)
  1480  
  1481  		vec9, err := vec7.Window(1, vec7.Length())
  1482  		require.NoError(t, err)
  1483  
  1484  		require.True(t, vec9.NeedDup())
  1485  		require.Equal(t, []float32{3, 3, 3}, GetArrayAt[float32](vec9, 1))
  1486  		require.True(t, vec9.GetNulls().Contains(uint64(0)))
  1487  		vec9.Free(mp)
  1488  
  1489  		require.False(t, vec7.NeedDup())
  1490  		require.Equal(t, []float32{1, 1, 1}, GetArrayAt[float32](vec7, 0))
  1491  		require.Equal(t, []float32{3, 3, 3}, GetArrayAt[float32](vec7, 2))
  1492  		require.True(t, vec7.GetNulls().Contains(uint64(1)))
  1493  		vec7.Free(mp)
  1494  	}
  1495  
  1496  	{
  1497  		//Array Float64
  1498  
  1499  		vec7 := NewVec(types.T_array_float64.ToType())
  1500  		AppendArray(vec7, []float64{1, 1, 1}, false, mp)
  1501  		AppendArray(vec7, []float64{2, 2, 2}, true, mp)
  1502  		AppendArray(vec7, []float64{3, 3, 3}, false, mp)
  1503  		require.False(t, vec7.NeedDup())
  1504  
  1505  		vec8, err := vec7.Window(0, vec7.Length())
  1506  		require.NoError(t, err)
  1507  
  1508  		require.True(t, vec8.NeedDup())
  1509  		require.Equal(t, []float64{1, 1, 1}, GetArrayAt[float64](vec8, 0))
  1510  		require.Equal(t, []float64{3, 3, 3}, GetArrayAt[float64](vec8, 2))
  1511  		require.True(t, vec8.GetNulls().Contains(uint64(1)))
  1512  		vec8.Free(mp)
  1513  
  1514  		vec9, err := vec7.Window(1, vec7.Length())
  1515  		require.NoError(t, err)
  1516  
  1517  		require.True(t, vec9.NeedDup())
  1518  		require.Equal(t, []float64{3, 3, 3}, GetArrayAt[float64](vec9, 1))
  1519  		require.True(t, vec9.GetNulls().Contains(uint64(0)))
  1520  		vec9.Free(mp)
  1521  
  1522  		require.False(t, vec7.NeedDup())
  1523  		require.Equal(t, []float64{1, 1, 1}, GetArrayAt[float64](vec7, 0))
  1524  		require.Equal(t, []float64{3, 3, 3}, GetArrayAt[float64](vec7, 2))
  1525  		require.True(t, vec7.GetNulls().Contains(uint64(1)))
  1526  		vec7.Free(mp)
  1527  	}
  1528  }
  1529  
  1530  func TestSetFunction(t *testing.T) {
  1531  	mp := mpool.MustNewZero()
  1532  	{ // bool
  1533  		v := NewVec(types.T_bool.ToType())
  1534  		w := NewConstNull(types.T_bool.ToType(), 0, mp)
  1535  		err := AppendFixedList(v, []bool{true, false, true, false}, nil, mp)
  1536  		require.NoError(t, err)
  1537  		sf := GetConstSetFunction(types.T_bool.ToType(), mp)
  1538  		err = sf(w, v, 1, 1)
  1539  		require.NoError(t, err)
  1540  		ws := MustFixedCol[bool](w)
  1541  		require.Equal(t, []bool{false}, ws)
  1542  		v.Free(mp)
  1543  		w.Free(mp)
  1544  		require.Equal(t, int64(0), mp.CurrNB())
  1545  	}
  1546  	{ // bit
  1547  		v := NewVec(types.T_bit.ToType())
  1548  		w := NewConstNull(types.T_uint64.ToType(), 0, mp)
  1549  		err := AppendFixedList(v, []uint64{1, 2, 3, 4}, nil, mp)
  1550  		require.NoError(t, err)
  1551  		sf := GetConstSetFunction(types.T_uint64.ToType(), mp)
  1552  		err = sf(w, v, 1, 1)
  1553  		require.NoError(t, err)
  1554  		ws := MustFixedCol[uint64](w)
  1555  		require.Equal(t, []uint64{2}, ws)
  1556  		v.Free(mp)
  1557  		w.Free(mp)
  1558  		require.Equal(t, int64(0), mp.CurrNB())
  1559  	}
  1560  	{ // int8
  1561  		v := NewVec(types.T_int8.ToType())
  1562  		w := NewConstNull(types.T_int8.ToType(), 0, mp)
  1563  		err := AppendFixedList(v, []int8{1, 2, 3, 4}, nil, mp)
  1564  		require.NoError(t, err)
  1565  		sf := GetConstSetFunction(types.T_int8.ToType(), mp)
  1566  		err = sf(w, v, 1, 1)
  1567  		require.NoError(t, err)
  1568  		ws := MustFixedCol[int8](w)
  1569  		require.Equal(t, []int8{2}, ws)
  1570  		v.Free(mp)
  1571  		w.Free(mp)
  1572  		require.Equal(t, int64(0), mp.CurrNB())
  1573  	}
  1574  	{ // int16
  1575  		v := NewVec(types.T_int16.ToType())
  1576  		w := NewConstNull(types.T_int16.ToType(), 0, mp)
  1577  		err := AppendFixedList(v, []int16{1, 2, 3, 4}, nil, mp)
  1578  		require.NoError(t, err)
  1579  		sf := GetConstSetFunction(types.T_int16.ToType(), mp)
  1580  		err = sf(w, v, 1, 1)
  1581  		require.NoError(t, err)
  1582  		ws := MustFixedCol[int16](w)
  1583  		require.Equal(t, []int16{2}, ws)
  1584  		v.Free(mp)
  1585  		w.Free(mp)
  1586  		require.Equal(t, int64(0), mp.CurrNB())
  1587  	}
  1588  	{ // int32
  1589  		v := NewVec(types.T_int32.ToType())
  1590  		w := NewConstNull(types.T_int32.ToType(), 0, mp)
  1591  		err := AppendFixedList(v, []int32{1, 2, 3, 4}, nil, mp)
  1592  		require.NoError(t, err)
  1593  		sf := GetConstSetFunction(types.T_int32.ToType(), mp)
  1594  		err = sf(w, v, 1, 1)
  1595  		require.NoError(t, err)
  1596  		ws := MustFixedCol[int32](w)
  1597  		require.Equal(t, []int32{2}, ws)
  1598  		v.Free(mp)
  1599  		w.Free(mp)
  1600  		require.Equal(t, int64(0), mp.CurrNB())
  1601  	}
  1602  	{ // int64
  1603  		v := NewVec(types.T_int64.ToType())
  1604  		w := NewConstNull(types.T_int64.ToType(), 0, mp)
  1605  		err := AppendFixedList(v, []int64{1, 2, 3, 4}, nil, mp)
  1606  		require.NoError(t, err)
  1607  		sf := GetConstSetFunction(types.T_int64.ToType(), mp)
  1608  		err = sf(w, v, 1, 1)
  1609  		require.NoError(t, err)
  1610  		ws := MustFixedCol[int64](w)
  1611  		require.Equal(t, []int64{2}, ws)
  1612  		v.Free(mp)
  1613  		w.Free(mp)
  1614  		require.Equal(t, int64(0), mp.CurrNB())
  1615  	}
  1616  	{ // uint8
  1617  		v := NewVec(types.T_uint8.ToType())
  1618  		w := NewConstNull(types.T_uint8.ToType(), 0, mp)
  1619  		err := AppendFixedList(v, []uint8{1, 2, 3, 4}, nil, mp)
  1620  		require.NoError(t, err)
  1621  		sf := GetConstSetFunction(types.T_uint8.ToType(), mp)
  1622  		err = sf(w, v, 1, 1)
  1623  		require.NoError(t, err)
  1624  		ws := MustFixedCol[uint8](w)
  1625  		require.Equal(t, []uint8{2}, ws)
  1626  		v.Free(mp)
  1627  		w.Free(mp)
  1628  		require.Equal(t, int64(0), mp.CurrNB())
  1629  	}
  1630  	{ // uint16
  1631  		v := NewVec(types.T_uint16.ToType())
  1632  		w := NewConstNull(types.T_uint16.ToType(), 0, mp)
  1633  		err := AppendFixedList(v, []uint16{1, 2, 3, 4}, nil, mp)
  1634  		require.NoError(t, err)
  1635  		sf := GetConstSetFunction(types.T_uint16.ToType(), mp)
  1636  		err = sf(w, v, 1, 1)
  1637  		require.NoError(t, err)
  1638  		ws := MustFixedCol[uint16](w)
  1639  		require.Equal(t, []uint16{2}, ws)
  1640  		v.Free(mp)
  1641  		w.Free(mp)
  1642  		require.Equal(t, int64(0), mp.CurrNB())
  1643  	}
  1644  	{ // uint32
  1645  		v := NewVec(types.T_uint32.ToType())
  1646  		w := NewConstNull(types.T_uint32.ToType(), 0, mp)
  1647  		err := AppendFixedList(v, []uint32{1, 2, 3, 4}, nil, mp)
  1648  		require.NoError(t, err)
  1649  		sf := GetConstSetFunction(types.T_uint32.ToType(), mp)
  1650  		err = sf(w, v, 1, 1)
  1651  		require.NoError(t, err)
  1652  		ws := MustFixedCol[uint32](w)
  1653  		require.Equal(t, []uint32{2}, ws)
  1654  		v.Free(mp)
  1655  		w.Free(mp)
  1656  		require.Equal(t, int64(0), mp.CurrNB())
  1657  	}
  1658  	{ // uint64
  1659  		v := NewVec(types.T_uint64.ToType())
  1660  		w := NewConstNull(types.T_uint64.ToType(), 0, mp)
  1661  		err := AppendFixedList(v, []uint64{1, 2, 3, 4}, nil, mp)
  1662  		require.NoError(t, err)
  1663  		sf := GetConstSetFunction(types.T_uint64.ToType(), mp)
  1664  		err = sf(w, v, 1, 1)
  1665  		require.NoError(t, err)
  1666  		ws := MustFixedCol[uint64](w)
  1667  		require.Equal(t, []uint64{2}, ws)
  1668  		v.Free(mp)
  1669  		w.Free(mp)
  1670  		require.Equal(t, int64(0), mp.CurrNB())
  1671  	}
  1672  	{ // float32
  1673  		v := NewVec(types.T_float32.ToType())
  1674  		w := NewConstNull(types.T_float32.ToType(), 0, mp)
  1675  		err := AppendFixedList(v, []float32{1, 2, 3, 4}, nil, mp)
  1676  		require.NoError(t, err)
  1677  		sf := GetConstSetFunction(types.T_float32.ToType(), mp)
  1678  		err = sf(w, v, 1, 1)
  1679  		require.NoError(t, err)
  1680  		ws := MustFixedCol[float32](w)
  1681  		require.Equal(t, []float32{2}, ws)
  1682  		v.Free(mp)
  1683  		w.Free(mp)
  1684  		require.Equal(t, int64(0), mp.CurrNB())
  1685  	}
  1686  	{ // float64
  1687  		v := NewVec(types.T_float64.ToType())
  1688  		w := NewConstNull(types.T_float64.ToType(), 0, mp)
  1689  		err := AppendFixedList(v, []float64{1, 2, 3, 4}, nil, mp)
  1690  		require.NoError(t, err)
  1691  		sf := GetConstSetFunction(types.T_float64.ToType(), mp)
  1692  		err = sf(w, v, 1, 1)
  1693  		require.NoError(t, err)
  1694  		ws := MustFixedCol[float64](w)
  1695  		require.Equal(t, []float64{2}, ws)
  1696  		v.Free(mp)
  1697  		w.Free(mp)
  1698  		require.Equal(t, int64(0), mp.CurrNB())
  1699  	}
  1700  	{ // text
  1701  		v := NewVec(types.T_text.ToType())
  1702  		w := NewConstNull(types.T_text.ToType(), 0, mp)
  1703  		err := AppendBytesList(v, [][]byte{[]byte("1"), []byte("2"), []byte("3"), []byte("4")}, nil, mp)
  1704  		require.NoError(t, err)
  1705  		sf := GetConstSetFunction(types.T_text.ToType(), mp)
  1706  		err = sf(w, v, 1, 1)
  1707  		require.NoError(t, err)
  1708  		ws := MustStrCol(w)
  1709  		require.Equal(t, []string{"2"}, ws)
  1710  		v.Free(mp)
  1711  		w.Free(mp)
  1712  		require.Equal(t, int64(0), mp.CurrNB())
  1713  	}
  1714  	{ // Array Float32
  1715  		v := NewVec(types.T_array_float32.ToType())
  1716  		w := NewConstNull(types.T_array_float32.ToType(), 0, mp)
  1717  		err := AppendArrayList(v, [][]float32{{1, 1, 1}, {2, 2, 2}, {3, 3, 3}, {4, 4, 4}}, nil, mp)
  1718  		require.NoError(t, err)
  1719  		sf := GetConstSetFunction(types.T_array_float32.ToType(), mp)
  1720  		err = sf(w, v, 1, 1)
  1721  		require.NoError(t, err)
  1722  		ws := MustArrayCol[float32](w)
  1723  		require.Equal(t, [][]float32{{2, 2, 2}}, ws)
  1724  		v.Free(mp)
  1725  		w.Free(mp)
  1726  		require.Equal(t, int64(0), mp.CurrNB())
  1727  	}
  1728  	{ // Array Float64
  1729  		v := NewVec(types.T_array_float64.ToType())
  1730  		w := NewConstNull(types.T_array_float64.ToType(), 0, mp)
  1731  		err := AppendArrayList(v, [][]float64{{1, 1, 1}, {2, 2, 2}, {3, 3, 3}, {4, 4, 4}}, nil, mp)
  1732  		require.NoError(t, err)
  1733  		sf := GetConstSetFunction(types.T_array_float64.ToType(), mp)
  1734  		err = sf(w, v, 1, 1)
  1735  		require.NoError(t, err)
  1736  		ws := MustArrayCol[float64](w)
  1737  		require.Equal(t, [][]float64{{2, 2, 2}}, ws)
  1738  		v.Free(mp)
  1739  		w.Free(mp)
  1740  		require.Equal(t, int64(0), mp.CurrNB())
  1741  	}
  1742  }
  1743  
  1744  func TestSetFunction2(t *testing.T) {
  1745  	// set vec to const value -> const null -> const value -> const null.
  1746  	// bool type
  1747  	{
  1748  		mp := mpool.MustNewZero()
  1749  
  1750  		w := NewConstNull(types.T_bool.ToType(), 0, mp)
  1751  		v := NewVec(types.T_bool.ToType())
  1752  		err := AppendFixedList(v, []bool{true, false, true, false}, []bool{false, false, true, true}, mp)
  1753  		require.NoError(t, err)
  1754  
  1755  		sf := GetConstSetFunction(types.T_bool.ToType(), mp)
  1756  		// set to const value true
  1757  		{
  1758  			err = sf(w, v, 0, 1)
  1759  			require.NoError(t, err)
  1760  			ws := MustFixedCol[bool](w)
  1761  			require.Equal(t, []bool{true}, ws)
  1762  		}
  1763  		// set to const null
  1764  		{
  1765  			err = sf(w, v, 2, 1)
  1766  			require.NoError(t, err)
  1767  			require.True(t, w.IsConstNull())
  1768  		}
  1769  		// set to const value false
  1770  		{
  1771  			err = sf(w, v, 1, 1)
  1772  			require.NoError(t, err)
  1773  			ws := MustFixedCol[bool](w)
  1774  			require.Equal(t, []bool{false}, ws)
  1775  		}
  1776  		// set to const null
  1777  		{
  1778  			err = sf(w, v, 3, 1)
  1779  			require.NoError(t, err)
  1780  			require.True(t, w.IsConstNull())
  1781  		}
  1782  		v.Free(mp)
  1783  		w.Free(mp)
  1784  		require.Equal(t, int64(0), mp.CurrNB())
  1785  	}
  1786  
  1787  	// byte type
  1788  	{
  1789  		mp := mpool.MustNewZero()
  1790  
  1791  		w := NewConstNull(types.T_varchar.ToType(), 0, mp)
  1792  		v := NewVec(types.T_varchar.ToType())
  1793  		err := AppendBytesList(v, [][]byte{
  1794  			[]byte("a"), []byte("abcdefabcdefabcdefabcdef12345"), []byte("c"), []byte("d")},
  1795  			[]bool{false, false, true, true}, mp)
  1796  		require.NoError(t, err)
  1797  
  1798  		sf := GetConstSetFunction(types.T_varchar.ToType(), mp)
  1799  		// set to const value a
  1800  		{
  1801  			err = sf(w, v, 0, 1)
  1802  			require.NoError(t, err)
  1803  			ws := MustBytesCol(w)
  1804  			require.Equal(t, "a", string(ws[0]))
  1805  		}
  1806  		// set to const null
  1807  		{
  1808  			err = sf(w, v, 2, 1)
  1809  			require.NoError(t, err)
  1810  			require.True(t, w.IsConstNull())
  1811  		}
  1812  		// set to const value b
  1813  		{
  1814  			err = sf(w, v, 1, 1)
  1815  			require.NoError(t, err)
  1816  			ws := MustBytesCol(w)
  1817  			require.Equal(t, "abcdefabcdefabcdefabcdef12345", string(ws[0]))
  1818  		}
  1819  		// set to const null
  1820  		{
  1821  			err = sf(w, v, 3, 1)
  1822  			require.NoError(t, err)
  1823  			require.True(t, w.IsConstNull())
  1824  		}
  1825  		v.Free(mp)
  1826  		w.Free(mp)
  1827  		require.Equal(t, int64(0), mp.CurrNB())
  1828  	}
  1829  
  1830  	// Array Float32 type
  1831  	{
  1832  		mp := mpool.MustNewZero()
  1833  
  1834  		w := NewConstNull(types.T_array_float32.ToType(), 0, mp)
  1835  		v := NewVec(types.T_array_float32.ToType())
  1836  		err := AppendArrayList[float32](v, [][]float32{{1, 1, 1}, {2, 2, 2}, {3, 3, 3}, {4, 4, 4}}, []bool{false, false, true, true}, mp)
  1837  		require.NoError(t, err)
  1838  
  1839  		sf := GetConstSetFunction(types.T_array_float32.ToType(), mp)
  1840  		// set to const value a
  1841  		{
  1842  			err = sf(w, v, 0, 1)
  1843  			require.NoError(t, err)
  1844  			ws := MustArrayCol[float32](w)
  1845  			require.Equal(t, []float32{1, 1, 1}, ws[0])
  1846  		}
  1847  		// set to const null
  1848  		{
  1849  			err = sf(w, v, 2, 1)
  1850  			require.NoError(t, err)
  1851  			require.True(t, w.IsConstNull())
  1852  		}
  1853  		// set to const value b
  1854  		{
  1855  			err = sf(w, v, 1, 1)
  1856  			require.NoError(t, err)
  1857  			ws := MustArrayCol[float32](w)
  1858  			require.Equal(t, []float32{2, 2, 2}, ws[0])
  1859  		}
  1860  		// set to const null
  1861  		{
  1862  			err = sf(w, v, 3, 1)
  1863  			require.NoError(t, err)
  1864  			require.True(t, w.IsConstNull())
  1865  		}
  1866  		v.Free(mp)
  1867  		w.Free(mp)
  1868  		require.Equal(t, int64(0), mp.CurrNB())
  1869  	}
  1870  }
  1871  
  1872  func BenchmarkUnmarshal(b *testing.B) {
  1873  	mp := mpool.MustNewZero()
  1874  	vec := NewVec(types.T_int8.ToType())
  1875  	AppendAny(vec, int8(42), false, mp)
  1876  	data, err := vec.MarshalBinary()
  1877  	if err != nil {
  1878  		b.Fatal(err)
  1879  	}
  1880  	b.ResetTimer()
  1881  	for i := 0; i < b.N; i++ {
  1882  		err := vec.UnmarshalBinary(data)
  1883  		if err != nil {
  1884  			b.Fatal(err)
  1885  		}
  1886  	}
  1887  }
  1888  
  1889  func BenchmarkToTypedSlice(b *testing.B) {
  1890  	mp := mpool.MustNewZero()
  1891  	vec := NewVec(types.T_int8.ToType())
  1892  	AppendAny(vec, int8(42), false, mp)
  1893  	var slice []int8
  1894  	b.ResetTimer()
  1895  	for i := 0; i < b.N; i++ {
  1896  		ToSlice(vec, &slice)
  1897  	}
  1898  	if slice[0] != 42 {
  1899  		b.Fatalf("got %v", slice)
  1900  	}
  1901  }
  1902  
  1903  func BenchmarkToFixedCol(b *testing.B) {
  1904  	mp := mpool.MustNewZero()
  1905  	vec := NewVec(types.T_int8.ToType())
  1906  	AppendAny(vec, int8(42), false, mp)
  1907  	b.ResetTimer()
  1908  	var slice []int8
  1909  	for i := 0; i < b.N; i++ {
  1910  		ToFixedCol[int8](vec, &slice)
  1911  	}
  1912  }
  1913  
  1914  func BenchmarkMustFixedCol(b *testing.B) {
  1915  	mp := mpool.MustNewZero()
  1916  	vec := NewVec(types.T_int8.ToType())
  1917  	AppendAny(vec, int8(42), false, mp)
  1918  	b.ResetTimer()
  1919  	for i := 0; i < b.N; i++ {
  1920  		MustFixedCol[int8](vec)
  1921  	}
  1922  }