github.com/matrixorigin/matrixone@v1.2.0/pkg/container/vector/vector.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  	"bytes"
    19  	"fmt"
    20  	"slices"
    21  	"sort"
    22  	"unsafe"
    23  
    24  	"github.com/matrixorigin/matrixone/pkg/common/moerr"
    25  	"github.com/matrixorigin/matrixone/pkg/common/mpool"
    26  	"github.com/matrixorigin/matrixone/pkg/container/nulls"
    27  	"github.com/matrixorigin/matrixone/pkg/container/types"
    28  	"github.com/matrixorigin/matrixone/pkg/vectorize/moarray"
    29  	"github.com/matrixorigin/matrixone/pkg/vectorize/shuffle"
    30  )
    31  
    32  const (
    33  	FLAT     = iota // flat vector represent a uncompressed vector
    34  	CONSTANT        // const vector
    35  	DIST            // dictionary vector
    36  )
    37  
    38  // Vector represent a column
    39  type Vector struct {
    40  	// vector's class
    41  	class int
    42  	// type represent the type of column
    43  	typ types.Type
    44  
    45  	// data of fixed length element, in case of varlen, the Varlena
    46  	col  typedSlice
    47  	data []byte
    48  
    49  	// area for holding large strings.
    50  	area []byte
    51  
    52  	capacity int
    53  	length   int
    54  
    55  	nsp nulls.Nulls // nulls list
    56  
    57  	cantFreeData bool
    58  	cantFreeArea bool
    59  
    60  	sorted bool // for some optimization
    61  
    62  	// FIXME: Bad design! Will be deleted soon.
    63  	isBin bool
    64  }
    65  
    66  type typedSlice struct {
    67  	Ptr unsafe.Pointer
    68  	Cap int
    69  }
    70  
    71  func (t *typedSlice) setFromVector(v *Vector) {
    72  	sz := v.typ.TypeSize()
    73  	if cap(v.data) >= sz {
    74  		t.Ptr = unsafe.Pointer(&v.data[0])
    75  		t.Cap = cap(v.data) / sz
    76  	}
    77  }
    78  
    79  func ToSlice[T any](vec *Vector, ret *[]T) {
    80  	//if (uintptr(unsafe.Pointer(vec))^uintptr(unsafe.Pointer(ret)))&0xffff == 0 {
    81  	if !typeCompatible[T](vec.typ) {
    82  		panic(fmt.Sprintf("type mismatch: %T %v", []T{}, vec.typ.String()))
    83  	}
    84  	//}
    85  	*ret = unsafe.Slice((*T)(vec.col.Ptr), vec.col.Cap)
    86  }
    87  
    88  func (v *Vector) GetSorted() bool {
    89  	return v.sorted
    90  }
    91  
    92  func (v *Vector) SetSorted(b bool) {
    93  	v.sorted = b
    94  }
    95  
    96  func (v *Vector) Reset(typ types.Type) {
    97  	v.typ = typ
    98  	v.class = FLAT
    99  	if v.area != nil {
   100  		v.area = v.area[:0]
   101  	}
   102  
   103  	v.length = 0
   104  	v.nsp.Reset()
   105  	v.sorted = false
   106  }
   107  
   108  func (v *Vector) ResetArea() {
   109  	v.area = v.area[:0]
   110  }
   111  
   112  // TODO: It is semantically same as Reset, need to merge them later.
   113  func (v *Vector) ResetWithNewType(t *types.Type) {
   114  	oldTyp := v.typ
   115  	v.typ = *t
   116  	v.class = FLAT
   117  	if v.area != nil {
   118  		v.area = v.area[:0]
   119  	}
   120  	v.nsp = nulls.Nulls{}
   121  	v.length = 0
   122  	v.capacity = cap(v.data) / v.typ.TypeSize()
   123  	v.sorted = false
   124  	if oldTyp.Oid != t.Oid {
   125  		v.setupColFromData()
   126  	}
   127  }
   128  
   129  func (v *Vector) UnsafeGetRawData() []byte {
   130  	length := 1
   131  	if !v.IsConst() {
   132  		length = v.length
   133  	}
   134  	return v.data[:length*v.typ.TypeSize()]
   135  }
   136  
   137  func (v *Vector) Length() int {
   138  	return v.length
   139  }
   140  
   141  func (v *Vector) Capacity() int {
   142  	return v.capacity
   143  }
   144  
   145  // Allocated returns the total allocated memory size of the vector.
   146  // it can be used to estimate the memory usage of the vector.
   147  func (v *Vector) Allocated() int {
   148  	return cap(v.data) + cap(v.area)
   149  }
   150  
   151  func (v *Vector) SetLength(n int) {
   152  	v.length = n
   153  }
   154  
   155  // Size of data, I think this function is inherently broken.  This
   156  // Size is not meaningful other than used in (approximate) memory accounting.
   157  func (v *Vector) Size() int {
   158  	return v.length*v.typ.TypeSize() + len(v.area)
   159  }
   160  
   161  func (v *Vector) GetType() *types.Type {
   162  	return &v.typ
   163  }
   164  
   165  func (v *Vector) SetType(typ types.Type) {
   166  	v.typ = typ
   167  }
   168  
   169  func (v *Vector) SetTypeScale(scale int32) {
   170  	v.typ.Scale = scale
   171  }
   172  
   173  func (v *Vector) GetNulls() *nulls.Nulls {
   174  	return &v.nsp
   175  }
   176  
   177  func (v *Vector) SetNulls(nsp *nulls.Nulls) {
   178  	if nsp != nil {
   179  		v.nsp.InitWith(nsp)
   180  	} else {
   181  		v.nsp.Reset()
   182  	}
   183  }
   184  
   185  func (v *Vector) HasNull() bool {
   186  	return v.IsConstNull() || !v.nsp.IsEmpty()
   187  }
   188  
   189  func (v *Vector) AllNull() bool {
   190  	return v.IsConstNull() || (v.length != 0 && v.nsp.Count() == v.length)
   191  }
   192  
   193  func (v *Vector) GetIsBin() bool {
   194  	return v.isBin
   195  }
   196  
   197  func (v *Vector) SetIsBin(isBin bool) {
   198  	v.isBin = isBin
   199  }
   200  
   201  func (v *Vector) NeedDup() bool {
   202  	return v.cantFreeArea || v.cantFreeData
   203  }
   204  
   205  func GetFixedAt[T any](v *Vector, idx int) T {
   206  	if v.IsConst() {
   207  		idx = 0
   208  	}
   209  	var slice []T
   210  	ToSlice(v, &slice)
   211  	return slice[idx]
   212  }
   213  
   214  func (v *Vector) GetBytesAt(i int) []byte {
   215  	if v.IsConst() {
   216  		i = 0
   217  	}
   218  	var bs []types.Varlena
   219  	ToSlice(v, &bs)
   220  	return bs[i].GetByteSlice(v.area)
   221  }
   222  
   223  func (v *Vector) GetRawBytesAt(i int) []byte {
   224  	if v.typ.IsVarlen() {
   225  		return v.GetBytesAt(i)
   226  	} else {
   227  		if v.IsConst() {
   228  			i = 0
   229  		} else {
   230  			i *= v.GetType().TypeSize()
   231  		}
   232  		return v.data[i : i+v.GetType().TypeSize()]
   233  	}
   234  }
   235  
   236  func (v *Vector) CleanOnlyData() {
   237  	if v.data != nil {
   238  		v.length = 0
   239  	}
   240  	if v.area != nil {
   241  		v.area = v.area[:0]
   242  	}
   243  	v.nsp.Reset()
   244  	v.sorted = false
   245  }
   246  
   247  func (v *Vector) GetStringAt(i int) string {
   248  	if v.IsConst() {
   249  		i = 0
   250  	}
   251  	var bs []types.Varlena
   252  	ToSlice(v, &bs)
   253  	return bs[i].GetString(v.area)
   254  }
   255  
   256  // GetArrayAt Returns []T at the specific index of the vector
   257  func GetArrayAt[T types.RealNumbers](v *Vector, i int) []T {
   258  	if v.IsConst() {
   259  		i = 0
   260  	}
   261  	var bs []types.Varlena
   262  	ToSlice(v, &bs)
   263  	return types.GetArray[T](&bs[i], v.area)
   264  }
   265  
   266  func NewVec(typ types.Type) *Vector {
   267  	vec := &Vector{
   268  		typ:   typ,
   269  		class: FLAT,
   270  	}
   271  
   272  	return vec
   273  }
   274  
   275  func NewConstNull(typ types.Type, length int, mp *mpool.MPool) *Vector {
   276  	vec := &Vector{
   277  		typ:    typ,
   278  		class:  CONSTANT,
   279  		length: length,
   280  	}
   281  
   282  	return vec
   283  }
   284  
   285  func NewConstFixed[T any](typ types.Type, val T, length int, mp *mpool.MPool) (vec *Vector, err error) {
   286  	vec = &Vector{
   287  		typ:   typ,
   288  		class: CONSTANT,
   289  	}
   290  
   291  	if length > 0 {
   292  		err = SetConstFixed(vec, val, length, mp)
   293  	}
   294  
   295  	return vec, err
   296  }
   297  
   298  func NewConstBytes(typ types.Type, val []byte, length int, mp *mpool.MPool) (vec *Vector, err error) {
   299  	vec = &Vector{
   300  		typ:   typ,
   301  		class: CONSTANT,
   302  	}
   303  
   304  	if length > 0 {
   305  		err = SetConstBytes(vec, val, length, mp)
   306  	}
   307  
   308  	return vec, err
   309  }
   310  
   311  // NewConstArray Creates a Const_Array Vector
   312  func NewConstArray[T types.RealNumbers](typ types.Type, val []T, length int, mp *mpool.MPool) (vec *Vector, err error) {
   313  	vec = &Vector{
   314  		typ:   typ,
   315  		class: CONSTANT,
   316  	}
   317  
   318  	if length > 0 {
   319  		err = SetConstArray[T](vec, val, length, mp)
   320  	}
   321  
   322  	return vec, err
   323  }
   324  
   325  func (v *Vector) IsConst() bool {
   326  	return v.class == CONSTANT
   327  }
   328  
   329  func (v *Vector) SetClass(class int) {
   330  	v.class = class
   331  }
   332  
   333  func (v *Vector) IsNull(i uint64) bool {
   334  	if v.IsConstNull() {
   335  		return true
   336  	}
   337  	if v.IsConst() {
   338  		return false
   339  	}
   340  	return v.nsp.Contains(i)
   341  }
   342  
   343  func DecodeFixedCol[T types.FixedSizeT](v *Vector) []T {
   344  	sz := v.typ.TypeSize()
   345  
   346  	//if cap(v.data)%sz != 0 {
   347  	//	panic(moerr.NewInternalErrorNoCtx("decode slice that is not a multiple of element size"))
   348  	//}
   349  
   350  	if cap(v.data) >= sz {
   351  		return unsafe.Slice((*T)(unsafe.Pointer(&v.data[0])), cap(v.data)/sz)
   352  	}
   353  	return nil
   354  }
   355  
   356  func SetFixedAt[T types.FixedSizeT](v *Vector, idx int, t T) error {
   357  	// Let it panic if v is not a varlena vec
   358  	vacol := MustFixedCol[T](v)
   359  
   360  	if idx < 0 {
   361  		idx = len(vacol) + idx
   362  	}
   363  	if idx < 0 || idx >= len(vacol) {
   364  		return moerr.NewInternalErrorNoCtx("vector idx out of range: %d > %d", idx, len(vacol))
   365  	}
   366  	vacol[idx] = t
   367  	return nil
   368  }
   369  
   370  func SetBytesAt(v *Vector, idx int, bs []byte, mp *mpool.MPool) error {
   371  	var va types.Varlena
   372  	err := BuildVarlenaFromByteSlice(v, &va, &bs, mp)
   373  	if err != nil {
   374  		return err
   375  	}
   376  	return SetFixedAt(v, idx, va)
   377  }
   378  
   379  func SetStringAt(v *Vector, idx int, bs string, mp *mpool.MPool) error {
   380  	return SetBytesAt(v, idx, []byte(bs), mp)
   381  }
   382  
   383  // IsConstNull return true if the vector means a scalar Null.
   384  // e.g.
   385  //
   386  //	a + Null, and the vector of right part will return true
   387  func (v *Vector) IsConstNull() bool {
   388  	return v.IsConst() && len(v.data) == 0
   389  }
   390  
   391  func (v *Vector) GetArea() []byte {
   392  	return v.area
   393  }
   394  func (v *Vector) SetArea(a []byte) {
   395  	v.area = a
   396  }
   397  
   398  func GetPtrAt[T any](v *Vector, idx int64) *T {
   399  	if v.IsConst() {
   400  		idx = 0
   401  	} else {
   402  		idx *= int64(v.GetType().TypeSize())
   403  	}
   404  	return (*T)(unsafe.Pointer(&v.data[idx]))
   405  }
   406  
   407  func (v *Vector) Free(mp *mpool.MPool) {
   408  	if !v.cantFreeData {
   409  		mp.Free(v.data)
   410  	}
   411  	if !v.cantFreeArea {
   412  		mp.Free(v.area)
   413  	}
   414  	v.class = FLAT
   415  	v.col = typedSlice{}
   416  	v.data = nil
   417  	v.area = nil
   418  	v.capacity = 0
   419  	v.length = 0
   420  	v.cantFreeData = false
   421  	v.cantFreeArea = false
   422  
   423  	v.nsp.Reset()
   424  	v.sorted = false
   425  }
   426  
   427  func (v *Vector) MarshalBinary() ([]byte, error) {
   428  	var buf bytes.Buffer
   429  	err := v.MarshalBinaryWithBuffer(&buf)
   430  	if err != nil {
   431  		return nil, err
   432  	}
   433  	return buf.Bytes(), nil
   434  }
   435  
   436  func (v *Vector) MarshalBinaryWithBuffer(buf *bytes.Buffer) error {
   437  
   438  	// write class
   439  	buf.WriteByte(uint8(v.class))
   440  
   441  	// write type
   442  	data := types.EncodeType(&v.typ)
   443  	buf.Write(data)
   444  
   445  	// write length
   446  	length := uint32(v.length)
   447  	buf.Write(types.EncodeUint32(&length))
   448  
   449  	// write dataLen, data
   450  	dataLen := uint32(v.typ.TypeSize())
   451  	if !v.IsConst() {
   452  		dataLen *= uint32(v.length)
   453  	} else if v.IsConstNull() {
   454  		dataLen = 0
   455  	}
   456  	buf.Write(types.EncodeUint32(&dataLen))
   457  	if dataLen > 0 {
   458  		buf.Write(v.data[:dataLen])
   459  	}
   460  
   461  	// write areaLen, area
   462  	areaLen := uint32(len(v.area))
   463  	buf.Write(types.EncodeUint32(&areaLen))
   464  	if areaLen > 0 {
   465  		buf.Write(v.area)
   466  	}
   467  
   468  	// write nspLen, nsp
   469  	nspData, err := v.nsp.Show()
   470  	if err != nil {
   471  		return err
   472  	}
   473  	nspLen := uint32(len(nspData))
   474  	buf.Write(types.EncodeUint32(&nspLen))
   475  	if nspLen > 0 {
   476  		buf.Write(nspData)
   477  	}
   478  
   479  	buf.Write(types.EncodeBool(&v.sorted))
   480  
   481  	return nil
   482  }
   483  
   484  func (v *Vector) UnmarshalBinary(data []byte) error {
   485  	// read class
   486  	v.class = int(data[0])
   487  	data = data[1:]
   488  
   489  	// read typ
   490  	v.typ = types.DecodeType(data[:types.TSize])
   491  	data = data[types.TSize:]
   492  
   493  	// read length
   494  	v.length = int(types.DecodeUint32(data[:4]))
   495  	data = data[4:]
   496  
   497  	// read data
   498  	dataLen := types.DecodeUint32(data[:4])
   499  	data = data[4:]
   500  	if dataLen > 0 {
   501  		v.data = data[:dataLen]
   502  		v.setupColFromData()
   503  		data = data[dataLen:]
   504  	}
   505  
   506  	// read area
   507  	areaLen := types.DecodeUint32(data[:4])
   508  	data = data[4:]
   509  	if areaLen > 0 {
   510  		v.area = data[:areaLen]
   511  		data = data[areaLen:]
   512  	}
   513  
   514  	// read nsp
   515  	nspLen := types.DecodeUint32(data[:4])
   516  	data = data[4:]
   517  	if nspLen > 0 {
   518  		if err := v.nsp.ReadNoCopy(data[:nspLen]); err != nil {
   519  			return err
   520  		}
   521  		data = data[nspLen:]
   522  	} else {
   523  		v.nsp.Reset()
   524  	}
   525  
   526  	v.sorted = types.DecodeBool(data[:1])
   527  	//data = data[1:]
   528  
   529  	v.cantFreeData = true
   530  	v.cantFreeArea = true
   531  
   532  	return nil
   533  }
   534  
   535  func (v *Vector) UnmarshalBinaryWithCopy(data []byte, mp *mpool.MPool) error {
   536  	var err error
   537  
   538  	// read class
   539  	v.class = int(data[0])
   540  	data = data[1:]
   541  
   542  	// read typ
   543  	v.typ = types.DecodeType(data[:types.TSize])
   544  	data = data[types.TSize:]
   545  
   546  	// read length
   547  	v.length = int(types.DecodeUint32(data[:4]))
   548  	data = data[4:]
   549  
   550  	// read data
   551  	dataLen := int(types.DecodeUint32(data[:4]))
   552  	data = data[4:]
   553  	if dataLen > 0 {
   554  		v.data, err = mp.Alloc(dataLen)
   555  		if err != nil {
   556  			return err
   557  		}
   558  		copy(v.data, data[:dataLen])
   559  		v.setupColFromData()
   560  		data = data[dataLen:]
   561  	}
   562  
   563  	// read area
   564  	areaLen := int(types.DecodeUint32(data[:4]))
   565  	data = data[4:]
   566  	if areaLen > 0 {
   567  		v.area, err = mp.Alloc(areaLen)
   568  		if err != nil {
   569  			return err
   570  		}
   571  		copy(v.area, data[:areaLen])
   572  		data = data[areaLen:]
   573  	}
   574  
   575  	// read nsp
   576  	nspLen := types.DecodeUint32(data[:4])
   577  	data = data[4:]
   578  	if nspLen > 0 {
   579  		if err := v.nsp.Read(data[:nspLen]); err != nil {
   580  			return err
   581  		}
   582  		data = data[nspLen:]
   583  	} else {
   584  		v.nsp.Reset()
   585  	}
   586  
   587  	v.sorted = types.DecodeBool(data[:1])
   588  	//data = data[1:]
   589  
   590  	return nil
   591  }
   592  
   593  func (v *Vector) ToConst(row, length int, mp *mpool.MPool) *Vector {
   594  	w := NewConstNull(v.typ, length, mp)
   595  	if v.IsConstNull() || v.nsp.Contains(uint64(row)) {
   596  		return w
   597  	}
   598  
   599  	if v.IsConst() {
   600  		row = 0
   601  	}
   602  
   603  	sz := v.typ.TypeSize()
   604  	w.data = v.data[row*sz : (row+1)*sz]
   605  	w.setupColFromData()
   606  	if v.typ.IsVarlen() {
   607  		w.area = v.area
   608  	}
   609  	w.cantFreeData = true
   610  	w.cantFreeArea = true
   611  
   612  	return w
   613  }
   614  
   615  // PreExtend use to expand the capacity of the vector
   616  func (v *Vector) PreExtend(rows int, mp *mpool.MPool) error {
   617  	if v.class == CONSTANT {
   618  		return nil
   619  	}
   620  
   621  	return extend(v, rows, mp)
   622  }
   623  
   624  // Dup use to copy an identical vector
   625  func (v *Vector) Dup(mp *mpool.MPool) (*Vector, error) {
   626  	if v.IsConstNull() {
   627  		return NewConstNull(v.typ, v.Length(), mp), nil
   628  	}
   629  
   630  	var err error
   631  
   632  	w := &Vector{
   633  		class:  v.class,
   634  		typ:    v.typ,
   635  		length: v.length,
   636  		sorted: v.sorted,
   637  	}
   638  	w.GetNulls().InitWith(v.GetNulls())
   639  
   640  	dataLen := v.typ.TypeSize()
   641  	if v.IsConst() {
   642  		if err := extend(w, 1, mp); err != nil {
   643  			return nil, err
   644  		}
   645  	} else {
   646  		if err := extend(w, v.length, mp); err != nil {
   647  			return nil, err
   648  		}
   649  		dataLen *= v.length
   650  	}
   651  	copy(w.data, v.data[:dataLen])
   652  
   653  	if len(v.area) > 0 {
   654  		if w.area, err = mp.Alloc(len(v.area)); err != nil {
   655  			return nil, err
   656  		}
   657  		copy(w.area, v.area)
   658  	}
   659  	return w, nil
   660  }
   661  
   662  // Shrink use to shrink vectors, sels must be guaranteed to be ordered
   663  func (v *Vector) Shrink(sels []int64, negate bool) {
   664  	if v.IsConst() {
   665  		if negate {
   666  			v.length -= len(sels)
   667  		} else {
   668  			v.length = len(sels)
   669  		}
   670  		return
   671  	}
   672  
   673  	switch v.typ.Oid {
   674  	case types.T_bool:
   675  		shrinkFixed[bool](v, sels, negate)
   676  	case types.T_bit:
   677  		shrinkFixed[uint64](v, sels, negate)
   678  	case types.T_int8:
   679  		shrinkFixed[int8](v, sels, negate)
   680  	case types.T_int16:
   681  		shrinkFixed[int16](v, sels, negate)
   682  	case types.T_int32:
   683  		shrinkFixed[int32](v, sels, negate)
   684  	case types.T_int64:
   685  		shrinkFixed[int64](v, sels, negate)
   686  	case types.T_uint8:
   687  		shrinkFixed[uint8](v, sels, negate)
   688  	case types.T_uint16:
   689  		shrinkFixed[uint16](v, sels, negate)
   690  	case types.T_uint32:
   691  		shrinkFixed[uint32](v, sels, negate)
   692  	case types.T_uint64:
   693  		shrinkFixed[uint64](v, sels, negate)
   694  	case types.T_float32:
   695  		shrinkFixed[float32](v, sels, negate)
   696  	case types.T_float64:
   697  		shrinkFixed[float64](v, sels, negate)
   698  	case types.T_char, types.T_varchar, types.T_binary, types.T_varbinary, types.T_json, types.T_blob, types.T_text,
   699  		types.T_array_float32, types.T_array_float64:
   700  		// XXX shrink varlena, but did not shrink area.  For our vector, this
   701  		// may well be the right thing.  If want to shrink area as well, we
   702  		// have to copy each varlena value and swizzle pointer.
   703  		shrinkFixed[types.Varlena](v, sels, negate)
   704  	case types.T_date:
   705  		shrinkFixed[types.Date](v, sels, negate)
   706  	case types.T_datetime:
   707  		shrinkFixed[types.Datetime](v, sels, negate)
   708  	case types.T_time:
   709  		shrinkFixed[types.Time](v, sels, negate)
   710  	case types.T_timestamp:
   711  		shrinkFixed[types.Timestamp](v, sels, negate)
   712  	case types.T_enum:
   713  		shrinkFixed[types.Enum](v, sels, negate)
   714  	case types.T_decimal64:
   715  		shrinkFixed[types.Decimal64](v, sels, negate)
   716  	case types.T_decimal128:
   717  		shrinkFixed[types.Decimal128](v, sels, negate)
   718  	case types.T_uuid:
   719  		shrinkFixed[types.Uuid](v, sels, negate)
   720  	case types.T_TS:
   721  		shrinkFixed[types.TS](v, sels, negate)
   722  	case types.T_Rowid:
   723  		shrinkFixed[types.Rowid](v, sels, negate)
   724  	case types.T_Blockid:
   725  		shrinkFixed[types.Blockid](v, sels, negate)
   726  	default:
   727  		panic(fmt.Sprintf("unexpect type %s for function vector.Shrink", v.typ))
   728  	}
   729  }
   730  
   731  // Shuffle use to shrink vectors, sels can be disordered
   732  func (v *Vector) Shuffle(sels []int64, mp *mpool.MPool) (err error) {
   733  	if v.IsConst() {
   734  		return nil
   735  	}
   736  
   737  	switch v.typ.Oid {
   738  	case types.T_bool:
   739  		err = shuffleFixed[bool](v, sels, mp)
   740  	case types.T_bit:
   741  		err = shuffleFixed[uint64](v, sels, mp)
   742  	case types.T_int8:
   743  		err = shuffleFixed[int8](v, sels, mp)
   744  	case types.T_int16:
   745  		err = shuffleFixed[int16](v, sels, mp)
   746  	case types.T_int32:
   747  		err = shuffleFixed[int32](v, sels, mp)
   748  	case types.T_int64:
   749  		err = shuffleFixed[int64](v, sels, mp)
   750  	case types.T_uint8:
   751  		err = shuffleFixed[uint8](v, sels, mp)
   752  	case types.T_uint16:
   753  		err = shuffleFixed[uint16](v, sels, mp)
   754  	case types.T_uint32:
   755  		err = shuffleFixed[uint32](v, sels, mp)
   756  	case types.T_uint64:
   757  		err = shuffleFixed[uint64](v, sels, mp)
   758  	case types.T_float32:
   759  		err = shuffleFixed[float32](v, sels, mp)
   760  	case types.T_float64:
   761  		err = shuffleFixed[float64](v, sels, mp)
   762  	case types.T_char, types.T_varchar, types.T_binary, types.T_varbinary, types.T_json, types.T_blob, types.T_text,
   763  		types.T_array_float32, types.T_array_float64:
   764  		err = shuffleFixed[types.Varlena](v, sels, mp)
   765  	case types.T_date:
   766  		err = shuffleFixed[types.Date](v, sels, mp)
   767  	case types.T_datetime:
   768  		err = shuffleFixed[types.Datetime](v, sels, mp)
   769  	case types.T_time:
   770  		err = shuffleFixed[types.Time](v, sels, mp)
   771  	case types.T_timestamp:
   772  		err = shuffleFixed[types.Timestamp](v, sels, mp)
   773  	case types.T_enum:
   774  		err = shuffleFixed[types.Enum](v, sels, mp)
   775  	case types.T_decimal64:
   776  		err = shuffleFixed[types.Decimal64](v, sels, mp)
   777  	case types.T_decimal128:
   778  		err = shuffleFixed[types.Decimal128](v, sels, mp)
   779  	case types.T_uuid:
   780  		err = shuffleFixed[types.Uuid](v, sels, mp)
   781  	case types.T_TS:
   782  		err = shuffleFixed[types.TS](v, sels, mp)
   783  	case types.T_Rowid:
   784  		err = shuffleFixed[types.Rowid](v, sels, mp)
   785  	case types.T_Blockid:
   786  		err = shuffleFixed[types.Blockid](v, sels, mp)
   787  	default:
   788  		panic(fmt.Sprintf("unexpect type %s for function vector.Shuffle", v.typ))
   789  	}
   790  
   791  	return err
   792  }
   793  
   794  // XXX Old Copy is FUBAR.
   795  // Copy simply does v[vi] = w[wi]
   796  func (v *Vector) Copy(w *Vector, vi, wi int64, mp *mpool.MPool) error {
   797  	if w.class == CONSTANT {
   798  		if w.IsConstNull() {
   799  			v.nsp.Set(uint64(vi))
   800  			return nil
   801  		}
   802  		wi = 0
   803  	}
   804  	if v.typ.IsFixedLen() {
   805  		sz := v.typ.TypeSize()
   806  		copy(v.data[vi*int64(sz):(vi+1)*int64(sz)], w.data[wi*int64(sz):(wi+1)*int64(sz)])
   807  	} else {
   808  		var err error
   809  		vva := MustFixedCol[types.Varlena](v)
   810  		wva := MustFixedCol[types.Varlena](w)
   811  		if wva[wi].IsSmall() {
   812  			vva[vi] = wva[wi]
   813  		} else {
   814  			bs := wva[wi].GetByteSlice(w.area)
   815  			err = BuildVarlenaFromByteSlice(v, &vva[vi], &bs, mp)
   816  			if err != nil {
   817  				return err
   818  			}
   819  		}
   820  	}
   821  
   822  	if w.GetNulls().Contains(uint64(wi)) {
   823  		v.GetNulls().Set(uint64(vi))
   824  	} else {
   825  		v.GetNulls().Unset(uint64(vi))
   826  	}
   827  	return nil
   828  }
   829  
   830  // GetUnionAllFunction: A more sensible function for copying vector,
   831  // which avoids having to do type conversions and type judgements every time you append.
   832  func GetUnionAllFunction(typ types.Type, mp *mpool.MPool) func(v, w *Vector) error {
   833  	switch typ.Oid {
   834  	case types.T_bool:
   835  		return func(v, w *Vector) error {
   836  			if w.IsConstNull() {
   837  				if err := appendMultiFixed(v, 0, true, w.length, mp); err != nil {
   838  					return err
   839  				}
   840  				return nil
   841  			}
   842  			if w.IsConst() {
   843  				ws := MustFixedCol[bool](w)
   844  				if err := appendMultiFixed(v, ws[0], false, w.length, mp); err != nil {
   845  					return err
   846  				}
   847  				return nil
   848  			}
   849  			if err := extend(v, w.length, mp); err != nil {
   850  				return err
   851  			}
   852  			if w.nsp.Any() {
   853  				// why loop here, not a range op?
   854  				for i := 0; i < w.length; i++ {
   855  					if w.nsp.Contains(uint64(i)) {
   856  						v.nsp.Set(uint64(i + v.length))
   857  					}
   858  				}
   859  			}
   860  			sz := v.typ.TypeSize()
   861  			copy(v.data[v.length*sz:], w.data[:w.length*sz])
   862  			v.length += w.length
   863  			return nil
   864  		}
   865  	case types.T_bit:
   866  		return func(v, w *Vector) error {
   867  			if w.IsConstNull() {
   868  				if err := appendMultiFixed(v, 0, true, w.length, mp); err != nil {
   869  					return err
   870  				}
   871  				return nil
   872  			}
   873  			if w.IsConst() {
   874  				ws := MustFixedCol[uint64](w)
   875  				if err := appendMultiFixed(v, ws[0], false, w.length, mp); err != nil {
   876  					return err
   877  				}
   878  				return nil
   879  			}
   880  			if err := extend(v, w.length, mp); err != nil {
   881  				return err
   882  			}
   883  			if w.nsp.Any() {
   884  				for i := 0; i < w.length; i++ {
   885  					if nulls.Contains(&w.nsp, uint64(i)) {
   886  						nulls.Add(&v.nsp, uint64(i+v.length))
   887  					}
   888  				}
   889  			}
   890  			sz := v.typ.TypeSize()
   891  			copy(v.data[v.length*sz:], w.data[:w.length*sz])
   892  			v.length += w.length
   893  			return nil
   894  		}
   895  	case types.T_int8:
   896  		return func(v, w *Vector) error {
   897  			if w.IsConstNull() {
   898  				if err := appendMultiFixed(v, 0, true, w.length, mp); err != nil {
   899  					return err
   900  				}
   901  				return nil
   902  			}
   903  			if w.IsConst() {
   904  				ws := MustFixedCol[int8](w)
   905  				if err := appendMultiFixed(v, ws[0], false, w.length, mp); err != nil {
   906  					return err
   907  				}
   908  				return nil
   909  			}
   910  			if err := extend(v, w.length, mp); err != nil {
   911  				return err
   912  			}
   913  			if w.nsp.Any() {
   914  				for i := 0; i < w.length; i++ {
   915  					if nulls.Contains(&w.nsp, uint64(i)) {
   916  						nulls.Add(&v.nsp, uint64(i+v.length))
   917  					}
   918  				}
   919  			}
   920  			sz := v.typ.TypeSize()
   921  			copy(v.data[v.length*sz:], w.data[:w.length*sz])
   922  			v.length += w.length
   923  			return nil
   924  		}
   925  	case types.T_int16:
   926  		return func(v, w *Vector) error {
   927  			if w.IsConstNull() {
   928  				if err := appendMultiFixed(v, 0, true, w.length, mp); err != nil {
   929  					return err
   930  				}
   931  				return nil
   932  			}
   933  			if w.IsConst() {
   934  				ws := MustFixedCol[int16](w)
   935  				if err := appendMultiFixed(v, ws[0], false, w.length, mp); err != nil {
   936  					return err
   937  				}
   938  				return nil
   939  			}
   940  			if err := extend(v, w.length, mp); err != nil {
   941  				return err
   942  			}
   943  			if w.nsp.Any() {
   944  				for i := 0; i < w.length; i++ {
   945  					if nulls.Contains(&w.nsp, uint64(i)) {
   946  						nulls.Add(&v.nsp, uint64(i+v.length))
   947  					}
   948  				}
   949  			}
   950  			sz := v.typ.TypeSize()
   951  			copy(v.data[v.length*sz:], w.data[:w.length*sz])
   952  			v.length += w.length
   953  			return nil
   954  		}
   955  	case types.T_int32:
   956  		return func(v, w *Vector) error {
   957  			if w.IsConstNull() {
   958  				if err := appendMultiFixed(v, 0, true, w.length, mp); err != nil {
   959  					return err
   960  				}
   961  				return nil
   962  			}
   963  			if w.IsConst() {
   964  				ws := MustFixedCol[int32](w)
   965  				if err := appendMultiFixed(v, ws[0], false, w.length, mp); err != nil {
   966  					return err
   967  				}
   968  				return nil
   969  			}
   970  			if err := extend(v, w.length, mp); err != nil {
   971  				return err
   972  			}
   973  			if w.nsp.Any() {
   974  				for i := 0; i < w.length; i++ {
   975  					if nulls.Contains(&w.nsp, uint64(i)) {
   976  						nulls.Add(&v.nsp, uint64(i+v.length))
   977  					}
   978  				}
   979  			}
   980  			sz := v.typ.TypeSize()
   981  			copy(v.data[v.length*sz:], w.data[:w.length*sz])
   982  			v.length += w.length
   983  			return nil
   984  		}
   985  	case types.T_int64:
   986  		return func(v, w *Vector) error {
   987  			if w.IsConstNull() {
   988  				if err := appendMultiFixed(v, 0, true, w.length, mp); err != nil {
   989  					return err
   990  				}
   991  				return nil
   992  			}
   993  			if w.IsConst() {
   994  				ws := MustFixedCol[int64](w)
   995  				if err := appendMultiFixed(v, ws[0], false, w.length, mp); err != nil {
   996  					return err
   997  				}
   998  				return nil
   999  			}
  1000  			if err := extend(v, w.length, mp); err != nil {
  1001  				return err
  1002  			}
  1003  			if w.nsp.Any() {
  1004  				for i := 0; i < w.length; i++ {
  1005  					if nulls.Contains(&w.nsp, uint64(i)) {
  1006  						nulls.Add(&v.nsp, uint64(i+v.length))
  1007  					}
  1008  				}
  1009  			}
  1010  			sz := v.typ.TypeSize()
  1011  			copy(v.data[v.length*sz:], w.data[:w.length*sz])
  1012  			v.length += w.length
  1013  			return nil
  1014  		}
  1015  	case types.T_uint8:
  1016  		return func(v, w *Vector) error {
  1017  			if w.IsConstNull() {
  1018  				if err := appendMultiFixed(v, 0, true, w.length, mp); err != nil {
  1019  					return err
  1020  				}
  1021  				return nil
  1022  			}
  1023  			if w.IsConst() {
  1024  				ws := MustFixedCol[uint8](w)
  1025  				if err := appendMultiFixed(v, ws[0], false, w.length, mp); err != nil {
  1026  					return err
  1027  				}
  1028  				return nil
  1029  			}
  1030  			if err := extend(v, w.length, mp); err != nil {
  1031  				return err
  1032  			}
  1033  			if w.nsp.Any() {
  1034  				for i := 0; i < w.length; i++ {
  1035  					if nulls.Contains(&w.nsp, uint64(i)) {
  1036  						nulls.Add(&v.nsp, uint64(i+v.length))
  1037  					}
  1038  				}
  1039  			}
  1040  			sz := v.typ.TypeSize()
  1041  			copy(v.data[v.length*sz:], w.data[:w.length*sz])
  1042  			v.length += w.length
  1043  			return nil
  1044  		}
  1045  	case types.T_uint16:
  1046  		return func(v, w *Vector) error {
  1047  			if w.IsConstNull() {
  1048  				if err := appendMultiFixed(v, 0, true, w.length, mp); err != nil {
  1049  					return err
  1050  				}
  1051  				return nil
  1052  			}
  1053  			if w.IsConst() {
  1054  				ws := MustFixedCol[uint16](w)
  1055  				if err := appendMultiFixed(v, ws[0], false, w.length, mp); err != nil {
  1056  					return err
  1057  				}
  1058  				return nil
  1059  			}
  1060  			if err := extend(v, w.length, mp); err != nil {
  1061  				return err
  1062  			}
  1063  			if w.nsp.Any() {
  1064  				for i := 0; i < w.length; i++ {
  1065  					if nulls.Contains(&w.nsp, uint64(i)) {
  1066  						nulls.Add(&v.nsp, uint64(i+v.length))
  1067  					}
  1068  				}
  1069  			}
  1070  			sz := v.typ.TypeSize()
  1071  			copy(v.data[v.length*sz:], w.data[:w.length*sz])
  1072  			v.length += w.length
  1073  			return nil
  1074  		}
  1075  	case types.T_uint32:
  1076  		return func(v, w *Vector) error {
  1077  			if w.IsConstNull() {
  1078  				if err := appendMultiFixed(v, 0, true, w.length, mp); err != nil {
  1079  					return err
  1080  				}
  1081  				return nil
  1082  			}
  1083  			if w.IsConst() {
  1084  				ws := MustFixedCol[uint32](w)
  1085  				if err := appendMultiFixed(v, ws[0], false, w.length, mp); err != nil {
  1086  					return err
  1087  				}
  1088  				return nil
  1089  			}
  1090  			if err := extend(v, w.length, mp); err != nil {
  1091  				return err
  1092  			}
  1093  			if w.nsp.Any() {
  1094  				for i := 0; i < w.length; i++ {
  1095  					if nulls.Contains(&w.nsp, uint64(i)) {
  1096  						nulls.Add(&v.nsp, uint64(i+v.length))
  1097  					}
  1098  				}
  1099  			}
  1100  			sz := v.typ.TypeSize()
  1101  			copy(v.data[v.length*sz:], w.data[:w.length*sz])
  1102  			v.length += w.length
  1103  			return nil
  1104  		}
  1105  	case types.T_uint64:
  1106  		return func(v, w *Vector) error {
  1107  			if w.IsConstNull() {
  1108  				if err := appendMultiFixed(v, 0, true, w.length, mp); err != nil {
  1109  					return err
  1110  				}
  1111  				return nil
  1112  			}
  1113  			if w.IsConst() {
  1114  				ws := MustFixedCol[uint64](w)
  1115  				if err := appendMultiFixed(v, ws[0], false, w.length, mp); err != nil {
  1116  					return err
  1117  				}
  1118  				return nil
  1119  			}
  1120  			if err := extend(v, w.length, mp); err != nil {
  1121  				return err
  1122  			}
  1123  			if w.nsp.Any() {
  1124  				for i := 0; i < w.length; i++ {
  1125  					if nulls.Contains(&w.nsp, uint64(i)) {
  1126  						nulls.Add(&v.nsp, uint64(i+v.length))
  1127  					}
  1128  				}
  1129  			}
  1130  			sz := v.typ.TypeSize()
  1131  			copy(v.data[v.length*sz:], w.data[:w.length*sz])
  1132  			v.length += w.length
  1133  			return nil
  1134  		}
  1135  	case types.T_float32:
  1136  		return func(v, w *Vector) error {
  1137  			if w.IsConstNull() {
  1138  				if err := appendMultiFixed(v, 0, true, w.length, mp); err != nil {
  1139  					return err
  1140  				}
  1141  				return nil
  1142  			}
  1143  			if w.IsConst() {
  1144  				ws := MustFixedCol[float32](w)
  1145  				if err := appendMultiFixed(v, ws[0], false, w.length, mp); err != nil {
  1146  					return err
  1147  				}
  1148  				return nil
  1149  			}
  1150  			if err := extend(v, w.length, mp); err != nil {
  1151  				return err
  1152  			}
  1153  			if w.nsp.Any() {
  1154  				for i := 0; i < w.length; i++ {
  1155  					if nulls.Contains(&w.nsp, uint64(i)) {
  1156  						nulls.Add(&v.nsp, uint64(i+v.length))
  1157  					}
  1158  				}
  1159  			}
  1160  			sz := v.typ.TypeSize()
  1161  			copy(v.data[v.length*sz:], w.data[:w.length*sz])
  1162  			v.length += w.length
  1163  			return nil
  1164  		}
  1165  	case types.T_float64:
  1166  		return func(v, w *Vector) error {
  1167  			if w.IsConstNull() {
  1168  				if err := appendMultiFixed(v, 0, true, w.length, mp); err != nil {
  1169  					return err
  1170  				}
  1171  				return nil
  1172  			}
  1173  			if w.IsConst() {
  1174  				ws := MustFixedCol[float64](w)
  1175  				if err := appendMultiFixed(v, ws[0], false, w.length, mp); err != nil {
  1176  					return err
  1177  				}
  1178  				return nil
  1179  			}
  1180  			if err := extend(v, w.length, mp); err != nil {
  1181  				return err
  1182  			}
  1183  			if w.nsp.Any() {
  1184  				for i := 0; i < w.length; i++ {
  1185  					if nulls.Contains(&w.nsp, uint64(i)) {
  1186  						nulls.Add(&v.nsp, uint64(i+v.length))
  1187  					}
  1188  				}
  1189  			}
  1190  			sz := v.typ.TypeSize()
  1191  			copy(v.data[v.length*sz:], w.data[:w.length*sz])
  1192  			v.length += w.length
  1193  			return nil
  1194  		}
  1195  	case types.T_date:
  1196  		return func(v, w *Vector) error {
  1197  			if w.IsConstNull() {
  1198  				if err := appendMultiFixed(v, 0, true, w.length, mp); err != nil {
  1199  					return err
  1200  				}
  1201  				return nil
  1202  			}
  1203  			if w.IsConst() {
  1204  				ws := MustFixedCol[types.Date](w)
  1205  				if err := appendMultiFixed(v, ws[0], false, w.length, mp); err != nil {
  1206  					return err
  1207  				}
  1208  				return nil
  1209  			}
  1210  			if err := extend(v, w.length, mp); err != nil {
  1211  				return err
  1212  			}
  1213  			if w.nsp.Any() {
  1214  				for i := 0; i < w.length; i++ {
  1215  					if nulls.Contains(&w.nsp, uint64(i)) {
  1216  						nulls.Add(&v.nsp, uint64(i+v.length))
  1217  					}
  1218  				}
  1219  			}
  1220  			sz := v.typ.TypeSize()
  1221  			copy(v.data[v.length*sz:], w.data[:w.length*sz])
  1222  			v.length += w.length
  1223  			return nil
  1224  		}
  1225  	case types.T_datetime:
  1226  		return func(v, w *Vector) error {
  1227  			if w.IsConstNull() {
  1228  				if err := appendMultiFixed(v, 0, true, w.length, mp); err != nil {
  1229  					return err
  1230  				}
  1231  				return nil
  1232  			}
  1233  			if w.IsConst() {
  1234  				ws := MustFixedCol[types.Datetime](w)
  1235  				if err := appendMultiFixed(v, ws[0], false, w.length, mp); err != nil {
  1236  					return err
  1237  				}
  1238  				return nil
  1239  			}
  1240  			if err := extend(v, w.length, mp); err != nil {
  1241  				return err
  1242  			}
  1243  			if w.nsp.Any() {
  1244  				for i := 0; i < w.length; i++ {
  1245  					if nulls.Contains(&w.nsp, uint64(i)) {
  1246  						nulls.Add(&v.nsp, uint64(i+v.length))
  1247  					}
  1248  				}
  1249  			}
  1250  			sz := v.typ.TypeSize()
  1251  			copy(v.data[v.length*sz:], w.data[:w.length*sz])
  1252  			v.length += w.length
  1253  			return nil
  1254  		}
  1255  	case types.T_time:
  1256  		return func(v, w *Vector) error {
  1257  			if w.IsConstNull() {
  1258  				if err := appendMultiFixed(v, 0, true, w.length, mp); err != nil {
  1259  					return err
  1260  				}
  1261  				return nil
  1262  			}
  1263  			if w.IsConst() {
  1264  				ws := MustFixedCol[types.Time](w)
  1265  				if err := appendMultiFixed(v, ws[0], false, w.length, mp); err != nil {
  1266  					return err
  1267  				}
  1268  				return nil
  1269  			}
  1270  			if err := extend(v, w.length, mp); err != nil {
  1271  				return err
  1272  			}
  1273  			if w.nsp.Any() {
  1274  				for i := 0; i < w.length; i++ {
  1275  					if nulls.Contains(&w.nsp, uint64(i)) {
  1276  						nulls.Add(&v.nsp, uint64(i+v.length))
  1277  					}
  1278  				}
  1279  			}
  1280  			sz := v.typ.TypeSize()
  1281  			copy(v.data[v.length*sz:], w.data[:w.length*sz])
  1282  			v.length += w.length
  1283  			return nil
  1284  		}
  1285  	case types.T_timestamp:
  1286  		return func(v, w *Vector) error {
  1287  			if w.IsConstNull() {
  1288  				if err := appendMultiFixed(v, 0, true, w.length, mp); err != nil {
  1289  					return err
  1290  				}
  1291  				return nil
  1292  			}
  1293  			if w.IsConst() {
  1294  				ws := MustFixedCol[types.Timestamp](w)
  1295  				if err := appendMultiFixed(v, ws[0], false, w.length, mp); err != nil {
  1296  					return err
  1297  				}
  1298  				return nil
  1299  			}
  1300  			if err := extend(v, w.length, mp); err != nil {
  1301  				return err
  1302  			}
  1303  			if w.nsp.Any() {
  1304  				for i := 0; i < w.length; i++ {
  1305  					if nulls.Contains(&w.nsp, uint64(i)) {
  1306  						nulls.Add(&v.nsp, uint64(i+v.length))
  1307  					}
  1308  				}
  1309  			}
  1310  			sz := v.typ.TypeSize()
  1311  			copy(v.data[v.length*sz:], w.data[:w.length*sz])
  1312  			v.length += w.length
  1313  			return nil
  1314  		}
  1315  	case types.T_enum:
  1316  		return func(v, w *Vector) error {
  1317  			if w.IsConstNull() {
  1318  				if err := appendMultiFixed(v, 0, true, w.length, mp); err != nil {
  1319  					return err
  1320  				}
  1321  				return nil
  1322  			}
  1323  			if w.IsConst() {
  1324  				ws := MustFixedCol[types.Enum](w)
  1325  				if err := appendMultiFixed(v, ws[0], false, w.length, mp); err != nil {
  1326  					return err
  1327  				}
  1328  				return nil
  1329  			}
  1330  			if err := extend(v, w.length, mp); err != nil {
  1331  				return err
  1332  			}
  1333  			if w.nsp.Any() {
  1334  				for i := 0; i < w.length; i++ {
  1335  					if nulls.Contains(&w.nsp, uint64(i)) {
  1336  						nulls.Add(&v.nsp, uint64(i+v.length))
  1337  					}
  1338  				}
  1339  			}
  1340  			sz := v.typ.TypeSize()
  1341  			copy(v.data[v.length*sz:], w.data[:w.length*sz])
  1342  			v.length += w.length
  1343  			return nil
  1344  		}
  1345  	case types.T_decimal64:
  1346  		return func(v, w *Vector) error {
  1347  			if w.IsConstNull() {
  1348  				if err := appendMultiFixed(v, 0, true, w.length, mp); err != nil {
  1349  					return err
  1350  				}
  1351  				return nil
  1352  			}
  1353  			if w.IsConst() {
  1354  				ws := MustFixedCol[types.Decimal64](w)
  1355  				if err := appendMultiFixed(v, ws[0], false, w.length, mp); err != nil {
  1356  					return err
  1357  				}
  1358  				return nil
  1359  			}
  1360  			if err := extend(v, w.length, mp); err != nil {
  1361  				return err
  1362  			}
  1363  			if w.nsp.Any() {
  1364  				for i := 0; i < w.length; i++ {
  1365  					if nulls.Contains(&w.nsp, uint64(i)) {
  1366  						nulls.Add(&v.nsp, uint64(i+v.length))
  1367  					}
  1368  				}
  1369  			}
  1370  			sz := v.typ.TypeSize()
  1371  			copy(v.data[v.length*sz:], w.data[:w.length*sz])
  1372  			v.length += w.length
  1373  			return nil
  1374  		}
  1375  	case types.T_decimal128:
  1376  		return func(v, w *Vector) error {
  1377  			if w.IsConstNull() {
  1378  				if err := appendMultiFixed(v, 0, true, w.length, mp); err != nil {
  1379  					return err
  1380  				}
  1381  				return nil
  1382  			}
  1383  			if w.IsConst() {
  1384  				ws := MustFixedCol[types.Decimal128](w)
  1385  				if err := appendMultiFixed(v, ws[0], false, w.length, mp); err != nil {
  1386  					return err
  1387  				}
  1388  				return nil
  1389  			}
  1390  			if err := extend(v, w.length, mp); err != nil {
  1391  				return err
  1392  			}
  1393  			if w.nsp.Any() {
  1394  				for i := 0; i < w.length; i++ {
  1395  					if nulls.Contains(&w.nsp, uint64(i)) {
  1396  						nulls.Add(&v.nsp, uint64(i+v.length))
  1397  					}
  1398  				}
  1399  			}
  1400  			sz := v.typ.TypeSize()
  1401  			copy(v.data[v.length*sz:], w.data[:w.length*sz])
  1402  			v.length += w.length
  1403  			return nil
  1404  		}
  1405  	case types.T_uuid:
  1406  		return func(v, w *Vector) error {
  1407  			if w.IsConstNull() {
  1408  				if err := appendMultiFixed(v, 0, true, w.length, mp); err != nil {
  1409  					return err
  1410  				}
  1411  				return nil
  1412  			}
  1413  			if w.IsConst() {
  1414  				ws := MustFixedCol[types.Uuid](w)
  1415  				if err := appendMultiFixed(v, ws[0], false, w.length, mp); err != nil {
  1416  					return err
  1417  				}
  1418  				return nil
  1419  			}
  1420  			if err := extend(v, w.length, mp); err != nil {
  1421  				return err
  1422  			}
  1423  			if w.nsp.Any() {
  1424  				for i := 0; i < w.length; i++ {
  1425  					if nulls.Contains(&w.nsp, uint64(i)) {
  1426  						nulls.Add(&v.nsp, uint64(i+v.length))
  1427  					}
  1428  				}
  1429  			}
  1430  			sz := v.typ.TypeSize()
  1431  			copy(v.data[v.length*sz:], w.data[:w.length*sz])
  1432  			v.length += w.length
  1433  			return nil
  1434  		}
  1435  	case types.T_TS:
  1436  		return func(v, w *Vector) error {
  1437  			if w.IsConstNull() {
  1438  				if err := appendMultiFixed(v, 0, true, w.length, mp); err != nil {
  1439  					return err
  1440  				}
  1441  				return nil
  1442  			}
  1443  			if w.IsConst() {
  1444  				ws := MustFixedCol[types.TS](w)
  1445  				if err := appendMultiFixed(v, ws[0], false, w.length, mp); err != nil {
  1446  					return err
  1447  				}
  1448  				return nil
  1449  			}
  1450  			if err := extend(v, w.length, mp); err != nil {
  1451  				return err
  1452  			}
  1453  			if w.nsp.Any() {
  1454  				for i := 0; i < w.length; i++ {
  1455  					if nulls.Contains(&w.nsp, uint64(i)) {
  1456  						nulls.Add(&v.nsp, uint64(i+v.length))
  1457  					}
  1458  				}
  1459  			}
  1460  			sz := v.typ.TypeSize()
  1461  			copy(v.data[v.length*sz:], w.data[:w.length*sz])
  1462  			v.length += w.length
  1463  			return nil
  1464  		}
  1465  	case types.T_Rowid:
  1466  		return func(v, w *Vector) error {
  1467  			if w.IsConstNull() {
  1468  				if err := appendMultiFixed(v, 0, true, w.length, mp); err != nil {
  1469  					return err
  1470  				}
  1471  				return nil
  1472  			}
  1473  			if w.IsConst() {
  1474  				ws := MustFixedCol[types.Rowid](w)
  1475  				if err := appendMultiFixed(v, ws[0], false, w.length, mp); err != nil {
  1476  					return err
  1477  				}
  1478  				return nil
  1479  			}
  1480  			if err := extend(v, w.length, mp); err != nil {
  1481  				return err
  1482  			}
  1483  			if w.nsp.Any() {
  1484  				for i := 0; i < w.length; i++ {
  1485  					if nulls.Contains(&w.nsp, uint64(i)) {
  1486  						nulls.Add(&v.nsp, uint64(i+v.length))
  1487  					}
  1488  				}
  1489  			}
  1490  			sz := v.typ.TypeSize()
  1491  			copy(v.data[v.length*sz:], w.data[:w.length*sz])
  1492  			v.length += w.length
  1493  			return nil
  1494  		}
  1495  	case types.T_char, types.T_varchar, types.T_binary, types.T_varbinary,
  1496  		types.T_json, types.T_blob, types.T_text,
  1497  		types.T_array_float32, types.T_array_float64:
  1498  		return func(v, w *Vector) error {
  1499  			if w.IsConstNull() {
  1500  				if err := appendMultiFixed(v, 0, true, w.length, mp); err != nil {
  1501  					return err
  1502  				}
  1503  				return nil
  1504  			}
  1505  			ws := MustFixedCol[types.Varlena](w)
  1506  			if w.IsConst() {
  1507  				if err := appendMultiBytes(v, ws[0].GetByteSlice(w.area), false, w.length, mp); err != nil {
  1508  					return err
  1509  				}
  1510  				return nil
  1511  			}
  1512  			if err := extend(v, w.length, mp); err != nil {
  1513  				return err
  1514  			}
  1515  			if sz := len(v.area) + len(w.area); sz > cap(v.area) {
  1516  				area, err := mp.Grow(v.area, sz)
  1517  				if err != nil {
  1518  					return err
  1519  				}
  1520  				v.area = area[:len(v.area)]
  1521  			}
  1522  			var vs []types.Varlena
  1523  			ToSlice(v, &vs)
  1524  			var err error
  1525  			for i := range ws {
  1526  				if nulls.Contains(&w.nsp, uint64(i)) {
  1527  					nulls.Add(&v.nsp, uint64(v.length))
  1528  				} else {
  1529  					err = BuildVarlenaFromValena(v, &vs[v.length], &ws[i], &w.area, mp)
  1530  					if err != nil {
  1531  						return err
  1532  					}
  1533  				}
  1534  				v.length++
  1535  			}
  1536  			return nil
  1537  		}
  1538  	case types.T_Blockid:
  1539  		return func(v, w *Vector) error {
  1540  			if w.IsConstNull() {
  1541  				if err := appendMultiFixed(v, 0, true, w.length, mp); err != nil {
  1542  					return err
  1543  				}
  1544  				return nil
  1545  			}
  1546  			if w.IsConst() {
  1547  				ws := MustFixedCol[types.Blockid](w)
  1548  				if err := appendMultiFixed(v, ws[0], false, w.length, mp); err != nil {
  1549  					return err
  1550  				}
  1551  				return nil
  1552  			}
  1553  			if err := extend(v, w.length, mp); err != nil {
  1554  				return err
  1555  			}
  1556  			if w.nsp.Any() {
  1557  				for i := 0; i < w.length; i++ {
  1558  					if nulls.Contains(&w.nsp, uint64(i)) {
  1559  						nulls.Add(&v.nsp, uint64(i+v.length))
  1560  					}
  1561  				}
  1562  			}
  1563  			sz := v.typ.TypeSize()
  1564  			copy(v.data[v.length*sz:], w.data[:w.length*sz])
  1565  			v.length += w.length
  1566  			return nil
  1567  		}
  1568  	default:
  1569  		panic(fmt.Sprintf("unexpect type %s for function vector.GetUnionFunction", typ))
  1570  	}
  1571  }
  1572  
  1573  // GetUnionOneFunction: A more sensible function for copying elements,
  1574  // which avoids having to do type conversions and type judgements every time you append.
  1575  func GetUnionOneFunction(typ types.Type, mp *mpool.MPool) func(v, w *Vector, sel int64) error {
  1576  	switch typ.Oid {
  1577  	case types.T_bool:
  1578  		return func(v, w *Vector, sel int64) error {
  1579  			if w.IsConstNull() {
  1580  				return appendOneFixed(v, true, true, mp)
  1581  			}
  1582  			ws := MustFixedCol[bool](w)
  1583  			if w.IsConst() {
  1584  				return appendOneFixed(v, ws[0], false, mp)
  1585  			}
  1586  			return appendOneFixed(v, ws[sel], nulls.Contains(&w.nsp, uint64(sel)), mp)
  1587  		}
  1588  	case types.T_bit:
  1589  		return func(v, w *Vector, sel int64) error {
  1590  			if w.IsConstNull() {
  1591  				return appendOneFixed(v, uint64(0), true, mp)
  1592  			}
  1593  			ws := MustFixedCol[uint64](w)
  1594  			if w.IsConst() {
  1595  				return appendOneFixed(v, ws[0], false, mp)
  1596  			}
  1597  			return appendOneFixed(v, ws[sel], nulls.Contains(&w.nsp, uint64(sel)), mp)
  1598  		}
  1599  	case types.T_int8:
  1600  		return func(v, w *Vector, sel int64) error {
  1601  			if w.IsConstNull() {
  1602  				return appendOneFixed(v, int8(0), true, mp)
  1603  			}
  1604  			ws := MustFixedCol[int8](w)
  1605  			if w.IsConst() {
  1606  				return appendOneFixed(v, ws[0], false, mp)
  1607  			}
  1608  			return appendOneFixed(v, ws[sel], nulls.Contains(&w.nsp, uint64(sel)), mp)
  1609  		}
  1610  	case types.T_int16:
  1611  		return func(v, w *Vector, sel int64) error {
  1612  			if w.IsConstNull() {
  1613  				return appendOneFixed(v, int16(0), true, mp)
  1614  			}
  1615  			ws := MustFixedCol[int16](w)
  1616  			if w.IsConst() {
  1617  				return appendOneFixed(v, ws[0], false, mp)
  1618  			}
  1619  			return appendOneFixed(v, ws[sel], nulls.Contains(&w.nsp, uint64(sel)), mp)
  1620  		}
  1621  	case types.T_int32:
  1622  		return func(v, w *Vector, sel int64) error {
  1623  			if w.IsConstNull() {
  1624  				return appendOneFixed(v, int32(0), true, mp)
  1625  			}
  1626  			ws := MustFixedCol[int32](w)
  1627  			if w.IsConst() {
  1628  				return appendOneFixed(v, ws[0], false, mp)
  1629  			}
  1630  			return appendOneFixed(v, ws[sel], nulls.Contains(&w.nsp, uint64(sel)), mp)
  1631  		}
  1632  	case types.T_int64:
  1633  		return func(v, w *Vector, sel int64) error {
  1634  			if w.IsConstNull() {
  1635  				return appendOneFixed(v, int64(0), true, mp)
  1636  			}
  1637  			ws := MustFixedCol[int64](w)
  1638  			if w.IsConst() {
  1639  				return appendOneFixed(v, ws[0], false, mp)
  1640  			}
  1641  			return appendOneFixed(v, ws[sel], nulls.Contains(&w.nsp, uint64(sel)), mp)
  1642  		}
  1643  	case types.T_uint8:
  1644  		return func(v, w *Vector, sel int64) error {
  1645  			if w.IsConstNull() {
  1646  				return appendOneFixed(v, uint8(0), true, mp)
  1647  			}
  1648  			ws := MustFixedCol[uint8](w)
  1649  			if w.IsConst() {
  1650  				return appendOneFixed(v, ws[0], false, mp)
  1651  			}
  1652  			return appendOneFixed(v, ws[sel], nulls.Contains(&w.nsp, uint64(sel)), mp)
  1653  		}
  1654  	case types.T_uint16:
  1655  		return func(v, w *Vector, sel int64) error {
  1656  			if w.IsConstNull() {
  1657  				return appendOneFixed(v, uint16(0), true, mp)
  1658  			}
  1659  			ws := MustFixedCol[uint16](w)
  1660  			if w.IsConst() {
  1661  				return appendOneFixed(v, ws[0], false, mp)
  1662  			}
  1663  			return appendOneFixed(v, ws[sel], nulls.Contains(&w.nsp, uint64(sel)), mp)
  1664  		}
  1665  	case types.T_uint32:
  1666  		return func(v, w *Vector, sel int64) error {
  1667  			if w.IsConstNull() {
  1668  				return appendOneFixed(v, uint32(0), true, mp)
  1669  			}
  1670  			ws := MustFixedCol[uint32](w)
  1671  			if w.IsConst() {
  1672  				return appendOneFixed(v, ws[0], false, mp)
  1673  			}
  1674  			return appendOneFixed(v, ws[sel], nulls.Contains(&w.nsp, uint64(sel)), mp)
  1675  		}
  1676  	case types.T_uint64:
  1677  		return func(v, w *Vector, sel int64) error {
  1678  			if w.IsConstNull() {
  1679  				return appendOneFixed(v, uint64(0), true, mp)
  1680  			}
  1681  			ws := MustFixedCol[uint64](w)
  1682  			if w.IsConst() {
  1683  				return appendOneFixed(v, ws[0], false, mp)
  1684  			}
  1685  			return appendOneFixed(v, ws[sel], nulls.Contains(&w.nsp, uint64(sel)), mp)
  1686  		}
  1687  	case types.T_float32:
  1688  		return func(v, w *Vector, sel int64) error {
  1689  			if w.IsConstNull() {
  1690  				return appendOneFixed(v, float32(0), true, mp)
  1691  			}
  1692  			ws := MustFixedCol[float32](w)
  1693  			if w.IsConst() {
  1694  				return appendOneFixed(v, ws[0], false, mp)
  1695  			}
  1696  			return appendOneFixed(v, ws[sel], nulls.Contains(&w.nsp, uint64(sel)), mp)
  1697  		}
  1698  	case types.T_float64:
  1699  		return func(v, w *Vector, sel int64) error {
  1700  			if w.IsConstNull() {
  1701  				return appendOneFixed(v, float64(0), true, mp)
  1702  			}
  1703  			ws := MustFixedCol[float64](w)
  1704  			if w.IsConst() {
  1705  				return appendOneFixed(v, ws[0], false, mp)
  1706  			}
  1707  			return appendOneFixed(v, ws[sel], nulls.Contains(&w.nsp, uint64(sel)), mp)
  1708  		}
  1709  	case types.T_date:
  1710  		return func(v, w *Vector, sel int64) error {
  1711  			if w.IsConstNull() {
  1712  				return appendOneFixed(v, types.Date(0), true, mp)
  1713  			}
  1714  			ws := MustFixedCol[types.Date](w)
  1715  			if w.IsConst() {
  1716  				return appendOneFixed(v, ws[0], false, mp)
  1717  			}
  1718  			return appendOneFixed(v, ws[sel], nulls.Contains(&w.nsp, uint64(sel)), mp)
  1719  		}
  1720  	case types.T_datetime:
  1721  		return func(v, w *Vector, sel int64) error {
  1722  			if w.IsConstNull() {
  1723  				return appendOneFixed(v, types.Datetime(0), true, mp)
  1724  			}
  1725  			ws := MustFixedCol[types.Datetime](w)
  1726  			if w.IsConst() {
  1727  				return appendOneFixed(v, ws[0], false, mp)
  1728  			}
  1729  			return appendOneFixed(v, ws[sel], nulls.Contains(&w.nsp, uint64(sel)), mp)
  1730  		}
  1731  	case types.T_time:
  1732  		return func(v, w *Vector, sel int64) error {
  1733  			if w.IsConstNull() {
  1734  				return appendOneFixed(v, types.Time(0), true, mp)
  1735  			}
  1736  			ws := MustFixedCol[types.Time](w)
  1737  			if w.IsConst() {
  1738  				return appendOneFixed(v, ws[0], false, mp)
  1739  			}
  1740  			return appendOneFixed(v, ws[sel], nulls.Contains(&w.nsp, uint64(sel)), mp)
  1741  		}
  1742  	case types.T_timestamp:
  1743  		return func(v, w *Vector, sel int64) error {
  1744  			if w.IsConstNull() {
  1745  				return appendOneFixed(v, types.Timestamp(0), true, mp)
  1746  			}
  1747  			ws := MustFixedCol[types.Timestamp](w)
  1748  			if w.IsConst() {
  1749  				return appendOneFixed(v, ws[0], false, mp)
  1750  			}
  1751  			return appendOneFixed(v, ws[sel], nulls.Contains(&w.nsp, uint64(sel)), mp)
  1752  		}
  1753  	case types.T_decimal64:
  1754  		return func(v, w *Vector, sel int64) error {
  1755  			if w.IsConstNull() {
  1756  				return appendOneFixed(v, types.Decimal64(0), true, mp)
  1757  			}
  1758  			ws := MustFixedCol[types.Decimal64](w)
  1759  			if w.IsConst() {
  1760  				return appendOneFixed(v, ws[0], false, mp)
  1761  			}
  1762  			return appendOneFixed(v, ws[sel], nulls.Contains(&w.nsp, uint64(sel)), mp)
  1763  		}
  1764  	case types.T_decimal128:
  1765  		return func(v, w *Vector, sel int64) error {
  1766  			if w.IsConstNull() {
  1767  				return appendOneFixed(v, types.Decimal128{}, true, mp)
  1768  			}
  1769  			ws := MustFixedCol[types.Decimal128](w)
  1770  			if w.IsConst() {
  1771  				return appendOneFixed(v, ws[0], false, mp)
  1772  			}
  1773  			return appendOneFixed(v, ws[sel], nulls.Contains(&w.nsp, uint64(sel)), mp)
  1774  		}
  1775  	case types.T_uuid:
  1776  		return func(v, w *Vector, sel int64) error {
  1777  			if w.IsConstNull() {
  1778  				return appendOneFixed(v, types.Uuid{}, true, mp)
  1779  			}
  1780  			ws := MustFixedCol[types.Uuid](w)
  1781  			if w.IsConst() {
  1782  				return appendOneFixed(v, ws[0], false, mp)
  1783  			}
  1784  			return appendOneFixed(v, ws[sel], nulls.Contains(&w.nsp, uint64(sel)), mp)
  1785  		}
  1786  	case types.T_TS:
  1787  		return func(v, w *Vector, sel int64) error {
  1788  			if w.IsConstNull() {
  1789  				return appendOneFixed(v, types.TS{}, true, mp)
  1790  			}
  1791  			ws := MustFixedCol[types.TS](w)
  1792  			if w.IsConst() {
  1793  				return appendOneFixed(v, ws[0], false, mp)
  1794  			}
  1795  			return appendOneFixed(v, ws[sel], nulls.Contains(&w.nsp, uint64(sel)), mp)
  1796  		}
  1797  	case types.T_Rowid:
  1798  		return func(v, w *Vector, sel int64) error {
  1799  			if w.IsConstNull() {
  1800  				return appendOneFixed(v, types.Rowid{}, true, mp)
  1801  			}
  1802  			ws := MustFixedCol[types.Rowid](w)
  1803  			if w.IsConst() {
  1804  				return appendOneFixed(v, ws[0], false, mp)
  1805  			}
  1806  			return appendOneFixed(v, ws[sel], nulls.Contains(&w.nsp, uint64(sel)), mp)
  1807  		}
  1808  	case types.T_char, types.T_varchar, types.T_binary, types.T_varbinary,
  1809  		types.T_json, types.T_blob, types.T_text, types.T_array_float32, types.T_array_float64:
  1810  		return func(v, w *Vector, sel int64) error {
  1811  			if w.IsConstNull() {
  1812  				return appendOneFixed(v, types.Varlena{}, true, mp)
  1813  			}
  1814  			ws := MustFixedCol[types.Varlena](w)
  1815  			if w.IsConst() {
  1816  				return appendOneBytes(v, ws[0].GetByteSlice(w.area), false, mp)
  1817  			}
  1818  			if nulls.Contains(&w.nsp, uint64(sel)) {
  1819  				return appendOneBytes(v, []byte{}, true, mp)
  1820  			} else {
  1821  				return appendOneBytes(v, ws[sel].GetByteSlice(w.area), false, mp)
  1822  			}
  1823  		}
  1824  	case types.T_Blockid:
  1825  		return func(v, w *Vector, sel int64) error {
  1826  			if w.IsConstNull() {
  1827  				return appendOneFixed(v, types.Blockid{}, true, mp)
  1828  			}
  1829  			ws := MustFixedCol[types.Blockid](w)
  1830  			if w.IsConst() {
  1831  				return appendOneFixed(v, ws[0], false, mp)
  1832  			}
  1833  			return appendOneFixed(v, ws[sel], nulls.Contains(&w.nsp, uint64(sel)), mp)
  1834  		}
  1835  	case types.T_enum:
  1836  		return func(v, w *Vector, sel int64) error {
  1837  			if w.IsConstNull() {
  1838  				return appendOneFixed(v, types.Enum(0), true, mp)
  1839  			}
  1840  			ws := MustFixedCol[types.Enum](w)
  1841  			if w.IsConst() {
  1842  				return appendOneFixed(v, ws[0], false, mp)
  1843  			}
  1844  			return appendOneFixed(v, ws[sel], nulls.Contains(&w.nsp, uint64(sel)), mp)
  1845  		}
  1846  	default:
  1847  		panic(fmt.Sprintf("unexpect type %s for function vector.GetUnionOneFunction", typ))
  1848  	}
  1849  }
  1850  
  1851  // GetConstSetFunction: A more sensible function for const vector set,
  1852  // which avoids having to do type conversions and type judgements every time you append.
  1853  func GetConstSetFunction(typ types.Type, mp *mpool.MPool) func(v, w *Vector, sel int64, length int) error {
  1854  	switch typ.Oid {
  1855  	case types.T_bool:
  1856  		return func(v, w *Vector, sel int64, length int) error {
  1857  			if w.IsConstNull() || w.nsp.Contains(uint64(sel)) {
  1858  				return SetConstNull(v, length, mp)
  1859  			}
  1860  			ws := MustFixedCol[bool](w)
  1861  			if w.IsConst() {
  1862  				return SetConstFixed(v, ws[0], length, mp)
  1863  			}
  1864  			return SetConstFixed(v, ws[sel], length, mp)
  1865  		}
  1866  	case types.T_bit:
  1867  		return func(v, w *Vector, sel int64, length int) error {
  1868  			if w.IsConstNull() || w.nsp.Contains(uint64(sel)) {
  1869  				return SetConstNull(v, length, mp)
  1870  			}
  1871  			ws := MustFixedCol[uint64](w)
  1872  			if w.IsConst() {
  1873  				return SetConstFixed(v, ws[0], length, mp)
  1874  			}
  1875  			return SetConstFixed(v, ws[sel], length, mp)
  1876  		}
  1877  	case types.T_int8:
  1878  		return func(v, w *Vector, sel int64, length int) error {
  1879  			if w.IsConstNull() || w.nsp.Contains(uint64(sel)) {
  1880  				return SetConstNull(v, length, mp)
  1881  			}
  1882  			ws := MustFixedCol[int8](w)
  1883  			if w.IsConst() {
  1884  				return SetConstFixed(v, ws[0], length, mp)
  1885  			}
  1886  			return SetConstFixed(v, ws[sel], length, mp)
  1887  		}
  1888  	case types.T_int16:
  1889  		return func(v, w *Vector, sel int64, length int) error {
  1890  			if w.IsConstNull() || w.nsp.Contains(uint64(sel)) {
  1891  				return SetConstNull(v, length, mp)
  1892  			}
  1893  			ws := MustFixedCol[int16](w)
  1894  			if w.IsConst() {
  1895  				return SetConstFixed(v, ws[0], length, mp)
  1896  			}
  1897  			return SetConstFixed(v, ws[sel], length, mp)
  1898  		}
  1899  	case types.T_int32:
  1900  		return func(v, w *Vector, sel int64, length int) error {
  1901  			if w.IsConstNull() || w.nsp.Contains(uint64(sel)) {
  1902  				return SetConstNull(v, length, mp)
  1903  			}
  1904  			ws := MustFixedCol[int32](w)
  1905  			if w.IsConst() {
  1906  				return SetConstFixed(v, ws[0], length, mp)
  1907  			}
  1908  			return SetConstFixed(v, ws[sel], length, mp)
  1909  		}
  1910  	case types.T_int64:
  1911  		return func(v, w *Vector, sel int64, length int) error {
  1912  			if w.IsConstNull() || w.nsp.Contains(uint64(sel)) {
  1913  				return SetConstNull(v, length, mp)
  1914  			}
  1915  			ws := MustFixedCol[int64](w)
  1916  			if w.IsConst() {
  1917  				return SetConstFixed(v, ws[0], length, mp)
  1918  			}
  1919  			return SetConstFixed(v, ws[sel], length, mp)
  1920  		}
  1921  	case types.T_uint8:
  1922  		return func(v, w *Vector, sel int64, length int) error {
  1923  			if w.IsConstNull() || w.nsp.Contains(uint64(sel)) {
  1924  				return SetConstNull(v, length, mp)
  1925  			}
  1926  			ws := MustFixedCol[uint8](w)
  1927  			if w.IsConst() {
  1928  				return SetConstFixed(v, ws[0], length, mp)
  1929  			}
  1930  			return SetConstFixed(v, ws[sel], length, mp)
  1931  		}
  1932  	case types.T_uint16:
  1933  		return func(v, w *Vector, sel int64, length int) error {
  1934  			if w.IsConstNull() || w.nsp.Contains(uint64(sel)) {
  1935  				return SetConstNull(v, length, mp)
  1936  			}
  1937  			ws := MustFixedCol[uint16](w)
  1938  			if w.IsConst() {
  1939  				return SetConstFixed(v, ws[0], length, mp)
  1940  			}
  1941  			return SetConstFixed(v, ws[sel], length, mp)
  1942  		}
  1943  	case types.T_uint32:
  1944  		return func(v, w *Vector, sel int64, length int) error {
  1945  			if w.IsConstNull() || w.nsp.Contains(uint64(sel)) {
  1946  				return appendOneFixed(v, uint32(0), true, mp)
  1947  			}
  1948  			ws := MustFixedCol[uint32](w)
  1949  			if w.IsConst() {
  1950  				return SetConstFixed(v, ws[0], length, mp)
  1951  			}
  1952  			return SetConstFixed(v, ws[sel], length, mp)
  1953  		}
  1954  	case types.T_uint64:
  1955  		return func(v, w *Vector, sel int64, length int) error {
  1956  			if w.IsConstNull() || w.nsp.Contains(uint64(sel)) {
  1957  				return SetConstNull(v, length, mp)
  1958  			}
  1959  			ws := MustFixedCol[uint64](w)
  1960  			if w.IsConst() {
  1961  				return SetConstFixed(v, ws[0], length, mp)
  1962  			}
  1963  			return SetConstFixed(v, ws[sel], length, mp)
  1964  		}
  1965  	case types.T_float32:
  1966  		return func(v, w *Vector, sel int64, length int) error {
  1967  			if w.IsConstNull() || w.nsp.Contains(uint64(sel)) {
  1968  				return SetConstNull(v, length, mp)
  1969  			}
  1970  			ws := MustFixedCol[float32](w)
  1971  			if w.IsConst() {
  1972  				return SetConstFixed(v, ws[0], length, mp)
  1973  			}
  1974  			return SetConstFixed(v, ws[sel], length, mp)
  1975  		}
  1976  	case types.T_float64:
  1977  		return func(v, w *Vector, sel int64, length int) error {
  1978  			if w.IsConstNull() || w.nsp.Contains(uint64(sel)) {
  1979  				return SetConstNull(v, length, mp)
  1980  			}
  1981  			ws := MustFixedCol[float64](w)
  1982  			if w.IsConst() {
  1983  				return SetConstFixed(v, ws[0], length, mp)
  1984  			}
  1985  			return SetConstFixed(v, ws[sel], length, mp)
  1986  		}
  1987  	case types.T_date:
  1988  		return func(v, w *Vector, sel int64, length int) error {
  1989  			if w.IsConstNull() || w.nsp.Contains(uint64(sel)) {
  1990  				return SetConstNull(v, length, mp)
  1991  			}
  1992  			ws := MustFixedCol[types.Date](w)
  1993  			if w.IsConst() {
  1994  				return SetConstFixed(v, ws[0], length, mp)
  1995  			}
  1996  			return SetConstFixed(v, ws[sel], length, mp)
  1997  		}
  1998  	case types.T_datetime:
  1999  		return func(v, w *Vector, sel int64, length int) error {
  2000  			if w.IsConstNull() || w.nsp.Contains(uint64(sel)) {
  2001  				return SetConstNull(v, length, mp)
  2002  			}
  2003  			ws := MustFixedCol[types.Datetime](w)
  2004  			if w.IsConst() {
  2005  				return SetConstFixed(v, ws[0], length, mp)
  2006  			}
  2007  			return SetConstFixed(v, ws[sel], length, mp)
  2008  		}
  2009  	case types.T_time:
  2010  		return func(v, w *Vector, sel int64, length int) error {
  2011  			if w.IsConstNull() || w.nsp.Contains(uint64(sel)) {
  2012  				return SetConstNull(v, length, mp)
  2013  			}
  2014  			ws := MustFixedCol[types.Time](w)
  2015  			if w.IsConst() {
  2016  				return SetConstFixed(v, ws[0], length, mp)
  2017  			}
  2018  			return SetConstFixed(v, ws[sel], length, mp)
  2019  		}
  2020  	case types.T_timestamp:
  2021  		return func(v, w *Vector, sel int64, length int) error {
  2022  			if w.IsConstNull() || w.nsp.Contains(uint64(sel)) {
  2023  				return SetConstNull(v, length, mp)
  2024  			}
  2025  			ws := MustFixedCol[types.Timestamp](w)
  2026  			if w.IsConst() {
  2027  				return SetConstFixed(v, ws[0], length, mp)
  2028  			}
  2029  			return SetConstFixed(v, ws[sel], length, mp)
  2030  		}
  2031  	case types.T_enum:
  2032  		return func(v, w *Vector, sel int64, length int) error {
  2033  			if w.IsConstNull() || w.nsp.Contains(uint64(sel)) {
  2034  				return SetConstNull(v, length, mp)
  2035  			}
  2036  			ws := MustFixedCol[types.Enum](w)
  2037  			if w.IsConst() {
  2038  				return SetConstFixed(v, ws[0], length, mp)
  2039  			}
  2040  			return SetConstFixed(v, ws[sel], length, mp)
  2041  		}
  2042  	case types.T_decimal64:
  2043  		return func(v, w *Vector, sel int64, length int) error {
  2044  			if w.IsConstNull() || w.nsp.Contains(uint64(sel)) {
  2045  				return SetConstNull(v, length, mp)
  2046  			}
  2047  			ws := MustFixedCol[types.Decimal64](w)
  2048  			if w.IsConst() {
  2049  				return SetConstFixed(v, ws[0], length, mp)
  2050  			}
  2051  			return SetConstFixed(v, ws[sel], length, mp)
  2052  		}
  2053  	case types.T_decimal128:
  2054  		return func(v, w *Vector, sel int64, length int) error {
  2055  			if w.IsConstNull() || w.nsp.Contains(uint64(sel)) {
  2056  				return SetConstNull(v, length, mp)
  2057  			}
  2058  			ws := MustFixedCol[types.Decimal128](w)
  2059  			if w.IsConst() {
  2060  				return SetConstFixed(v, ws[0], length, mp)
  2061  			}
  2062  			return SetConstFixed(v, ws[sel], length, mp)
  2063  		}
  2064  	case types.T_uuid:
  2065  		return func(v, w *Vector, sel int64, length int) error {
  2066  			if w.IsConstNull() || w.nsp.Contains(uint64(sel)) {
  2067  				return SetConstNull(v, length, mp)
  2068  			}
  2069  			ws := MustFixedCol[types.Uuid](w)
  2070  			if w.IsConst() {
  2071  				return SetConstFixed(v, ws[0], length, mp)
  2072  			}
  2073  			return SetConstFixed(v, ws[sel], length, mp)
  2074  		}
  2075  	case types.T_TS:
  2076  		return func(v, w *Vector, sel int64, length int) error {
  2077  			if w.IsConstNull() || w.nsp.Contains(uint64(sel)) {
  2078  				return SetConstNull(v, length, mp)
  2079  			}
  2080  			ws := MustFixedCol[types.TS](w)
  2081  			if w.IsConst() {
  2082  				return SetConstFixed(v, ws[0], length, mp)
  2083  			}
  2084  			return SetConstFixed(v, ws[sel], length, mp)
  2085  		}
  2086  	case types.T_Rowid:
  2087  		return func(v, w *Vector, sel int64, length int) error {
  2088  			if w.IsConstNull() || w.nsp.Contains(uint64(sel)) {
  2089  				return SetConstNull(v, length, mp)
  2090  			}
  2091  			ws := MustFixedCol[types.Rowid](w)
  2092  			if w.IsConst() {
  2093  				return SetConstFixed(v, ws[0], length, mp)
  2094  			}
  2095  			return SetConstFixed(v, ws[sel], length, mp)
  2096  		}
  2097  	case types.T_char, types.T_varchar, types.T_binary, types.T_varbinary,
  2098  		types.T_json, types.T_blob, types.T_text, types.T_array_float32, types.T_array_float64:
  2099  		return func(v, w *Vector, sel int64, length int) error {
  2100  			if w.IsConstNull() || w.nsp.Contains(uint64(sel)) {
  2101  				return SetConstNull(v, length, mp)
  2102  			}
  2103  			ws := MustFixedCol[types.Varlena](w)
  2104  			v.area = v.area[:0]
  2105  			if w.IsConst() {
  2106  				return SetConstBytes(v, ws[0].GetByteSlice(w.area), length, mp)
  2107  			}
  2108  			return SetConstBytes(v, ws[sel].GetByteSlice(w.area), length, mp)
  2109  		}
  2110  	case types.T_Blockid:
  2111  		return func(v, w *Vector, sel int64, length int) error {
  2112  			if w.IsConstNull() || w.nsp.Contains(uint64(sel)) {
  2113  				return SetConstNull(v, length, mp)
  2114  			}
  2115  			ws := MustFixedCol[types.Blockid](w)
  2116  			if w.IsConst() {
  2117  				return SetConstFixed(v, ws[0], length, mp)
  2118  			}
  2119  			return SetConstFixed(v, ws[sel], length, mp)
  2120  		}
  2121  	default:
  2122  		panic(fmt.Sprintf("unexpect type %s for function vector.GetConstSetFunction", typ))
  2123  	}
  2124  }
  2125  
  2126  func (v *Vector) UnionNull(mp *mpool.MPool) error {
  2127  	return appendOneFixed(v, 0, true, mp)
  2128  }
  2129  
  2130  // It is simply append. the purpose of retention is ease of use
  2131  func (v *Vector) UnionOne(w *Vector, sel int64, mp *mpool.MPool) error {
  2132  	if err := extend(v, 1, mp); err != nil {
  2133  		return err
  2134  	}
  2135  
  2136  	oldLen := v.length
  2137  	v.length++
  2138  	if w.IsConst() {
  2139  		if w.IsConstNull() {
  2140  			nulls.Add(&v.nsp, uint64(oldLen))
  2141  			return nil
  2142  		}
  2143  		sel = 0
  2144  	} else if nulls.Contains(&w.nsp, uint64(sel)) {
  2145  		nulls.Add(&v.nsp, uint64(oldLen))
  2146  		return nil
  2147  	}
  2148  
  2149  	if v.GetType().IsVarlen() {
  2150  		var vs, ws []types.Varlena
  2151  		ToSlice(v, &vs)
  2152  		ToSlice(w, &ws)
  2153  		err := BuildVarlenaFromValena(v, &vs[oldLen], &ws[sel], &w.area, mp)
  2154  		if err != nil {
  2155  			return err
  2156  		}
  2157  	} else {
  2158  		tlen := v.GetType().TypeSize()
  2159  		switch tlen {
  2160  		case 8:
  2161  			p1 := unsafe.Pointer(&v.data[oldLen*8])
  2162  			p2 := unsafe.Pointer(&w.data[sel*8])
  2163  			*(*int64)(p1) = *(*int64)(p2)
  2164  		case 4:
  2165  			p1 := unsafe.Pointer(&v.data[oldLen*4])
  2166  			p2 := unsafe.Pointer(&w.data[sel*4])
  2167  			*(*int32)(p1) = *(*int32)(p2)
  2168  		case 2:
  2169  			p1 := unsafe.Pointer(&v.data[oldLen*2])
  2170  			p2 := unsafe.Pointer(&w.data[sel*2])
  2171  			*(*int16)(p1) = *(*int16)(p2)
  2172  		case 1:
  2173  			v.data[oldLen] = w.data[sel]
  2174  		default:
  2175  			copy(v.data[oldLen*tlen:(oldLen+1)*tlen], w.data[int(sel)*tlen:(int(sel)+1)*tlen])
  2176  		}
  2177  	}
  2178  
  2179  	return nil
  2180  }
  2181  
  2182  // It is simply append. the purpose of retention is ease of use
  2183  func (v *Vector) UnionMulti(w *Vector, sel int64, cnt int, mp *mpool.MPool) error {
  2184  	if cnt == 0 {
  2185  		return nil
  2186  	}
  2187  
  2188  	if err := extend(v, cnt, mp); err != nil {
  2189  		return err
  2190  	}
  2191  
  2192  	oldLen := v.length
  2193  	v.length += cnt
  2194  	if w.IsConst() {
  2195  		if w.IsConstNull() {
  2196  			nulls.AddRange(&v.nsp, uint64(oldLen), uint64(oldLen+cnt))
  2197  			return nil
  2198  		}
  2199  		sel = 0
  2200  	} else if nulls.Contains(&w.nsp, uint64(sel)) {
  2201  		nulls.AddRange(&v.nsp, uint64(oldLen), uint64(oldLen+cnt))
  2202  		return nil
  2203  	}
  2204  
  2205  	if v.GetType().IsVarlen() {
  2206  		var err error
  2207  		var va types.Varlena
  2208  		var ws []types.Varlena
  2209  		ToSlice(w, &ws)
  2210  		err = BuildVarlenaFromValena(v, &va, &ws[sel], &w.area, mp)
  2211  		if err != nil {
  2212  			return err
  2213  		}
  2214  		var col []types.Varlena
  2215  		ToSlice(v, &col)
  2216  		for i := oldLen; i < v.length; i++ {
  2217  			col[i] = va
  2218  		}
  2219  	} else {
  2220  		tlen := v.GetType().TypeSize()
  2221  		for i := oldLen; i < v.length; i++ {
  2222  			switch tlen {
  2223  			case 8:
  2224  				p1 := unsafe.Pointer(&v.data[i*8])
  2225  				p2 := unsafe.Pointer(&w.data[sel*8])
  2226  				*(*int64)(p1) = *(*int64)(p2)
  2227  			case 4:
  2228  				p1 := unsafe.Pointer(&v.data[i*4])
  2229  				p2 := unsafe.Pointer(&w.data[sel*4])
  2230  				*(*int32)(p1) = *(*int32)(p2)
  2231  			case 2:
  2232  				p1 := unsafe.Pointer(&v.data[i*2])
  2233  				p2 := unsafe.Pointer(&w.data[sel*2])
  2234  				*(*int16)(p1) = *(*int16)(p2)
  2235  			case 1:
  2236  				v.data[i] = w.data[sel]
  2237  			default:
  2238  				copy(v.data[i*tlen:(i+1)*tlen], w.data[int(sel)*tlen:(int(sel)+1)*tlen])
  2239  			}
  2240  		}
  2241  	}
  2242  
  2243  	return nil
  2244  }
  2245  
  2246  func (v *Vector) Union(w *Vector, sels []int32, mp *mpool.MPool) error {
  2247  	if len(sels) == 0 {
  2248  		return nil
  2249  	}
  2250  
  2251  	if err := extend(v, len(sels), mp); err != nil {
  2252  		return err
  2253  	}
  2254  
  2255  	oldLen := v.length
  2256  	v.length += len(sels)
  2257  	if w.IsConst() {
  2258  		if w.IsConstNull() {
  2259  			nulls.AddRange(&v.nsp, uint64(oldLen), uint64(oldLen+len(sels)))
  2260  		} else if v.GetType().IsVarlen() {
  2261  			var err error
  2262  			var va types.Varlena
  2263  			var ws []types.Varlena
  2264  			ToSlice(w, &ws)
  2265  			err = BuildVarlenaFromValena(v, &va, &ws[0], &w.area, mp)
  2266  			if err != nil {
  2267  				return err
  2268  			}
  2269  			var col []types.Varlena
  2270  			ToSlice(v, &col)
  2271  			for i := oldLen; i < v.length; i++ {
  2272  				col[i] = va
  2273  			}
  2274  		} else {
  2275  			tlen := v.GetType().TypeSize()
  2276  			for i := oldLen; i < v.length; i++ {
  2277  				copy(v.data[i*tlen:(i+1)*tlen], w.data[:tlen])
  2278  			}
  2279  		}
  2280  
  2281  		return nil
  2282  	}
  2283  
  2284  	if v.GetType().IsVarlen() {
  2285  		var err error
  2286  		var vCol, wCol []types.Varlena
  2287  		ToSlice(v, &vCol)
  2288  		ToSlice(w, &wCol)
  2289  		if !w.GetNulls().EmptyByFlag() {
  2290  			for i, sel := range sels {
  2291  				if w.nsp.Contains(uint64(sel)) {
  2292  					nulls.Add(&v.nsp, uint64(oldLen+i))
  2293  					continue
  2294  				}
  2295  				err = BuildVarlenaFromValena(v, &vCol[oldLen+i], &wCol[sel], &w.area, mp)
  2296  				if err != nil {
  2297  					return err
  2298  				}
  2299  			}
  2300  		} else {
  2301  			for i, sel := range sels {
  2302  
  2303  				err = BuildVarlenaFromValena(v, &vCol[oldLen+i], &wCol[sel], &w.area, mp)
  2304  				if err != nil {
  2305  					return err
  2306  				}
  2307  			}
  2308  		}
  2309  	} else {
  2310  		tlen := v.GetType().TypeSize()
  2311  		if !w.nsp.EmptyByFlag() {
  2312  			for i, sel := range sels {
  2313  				if w.nsp.Contains(uint64(sel)) {
  2314  					nulls.Add(&v.nsp, uint64(oldLen+i))
  2315  					continue
  2316  				}
  2317  				copy(v.data[(oldLen+i)*tlen:(oldLen+i+1)*tlen], w.data[int(sel)*tlen:(int(sel)+1)*tlen])
  2318  			}
  2319  		} else {
  2320  			switch tlen {
  2321  			case 8:
  2322  				for i, sel := range sels {
  2323  					p1 := unsafe.Pointer(&v.data[(oldLen+i)*8])
  2324  					p2 := unsafe.Pointer(&w.data[int(sel)*8])
  2325  					*(*int64)(p1) = *(*int64)(p2)
  2326  				}
  2327  			case 4:
  2328  				for i, sel := range sels {
  2329  					p1 := unsafe.Pointer(&v.data[(oldLen+i)*4])
  2330  					p2 := unsafe.Pointer(&w.data[int(sel)*4])
  2331  					*(*int32)(p1) = *(*int32)(p2)
  2332  				}
  2333  			case 2:
  2334  				for i, sel := range sels {
  2335  					p1 := unsafe.Pointer(&v.data[(oldLen+i)*2])
  2336  					p2 := unsafe.Pointer(&w.data[int(sel)*2])
  2337  					*(*int16)(p1) = *(*int16)(p2)
  2338  				}
  2339  			case 1:
  2340  				for i, sel := range sels {
  2341  					v.data[(oldLen + i)] = w.data[int(sel)]
  2342  				}
  2343  			default:
  2344  				for i, sel := range sels {
  2345  					copy(v.data[(oldLen+i)*tlen:(oldLen+i+1)*tlen], w.data[int(sel)*tlen:(int(sel)+1)*tlen])
  2346  				}
  2347  			}
  2348  		}
  2349  	}
  2350  
  2351  	return nil
  2352  }
  2353  
  2354  func (v *Vector) UnionBatch(w *Vector, offset int64, cnt int, flags []uint8, mp *mpool.MPool) error {
  2355  	addCnt := 0
  2356  	if flags == nil {
  2357  		addCnt = cnt
  2358  	} else {
  2359  		for i := range flags {
  2360  			addCnt += int(flags[i])
  2361  		}
  2362  	}
  2363  
  2364  	if addCnt == 0 {
  2365  		return nil
  2366  	}
  2367  
  2368  	if err := extend(v, addCnt, mp); err != nil {
  2369  		return err
  2370  	}
  2371  
  2372  	if w.IsConst() {
  2373  		oldLen := v.length
  2374  		v.length += addCnt
  2375  		if w.IsConstNull() {
  2376  			nulls.AddRange(&v.nsp, uint64(oldLen), uint64(v.length))
  2377  		} else if v.GetType().IsVarlen() {
  2378  			var err error
  2379  			var va types.Varlena
  2380  			var ws []types.Varlena
  2381  			ToSlice(w, &ws)
  2382  			err = BuildVarlenaFromValena(v, &va, &ws[0], &w.area, mp)
  2383  			if err != nil {
  2384  				return err
  2385  			}
  2386  			var col []types.Varlena
  2387  			ToSlice(v, &col)
  2388  			for i := oldLen; i < v.length; i++ {
  2389  				col[i] = va
  2390  			}
  2391  		} else {
  2392  			tlen := v.GetType().TypeSize()
  2393  			for i := oldLen; i < v.length; i++ {
  2394  				copy(v.data[i*tlen:(i+1)*tlen], w.data[:tlen])
  2395  			}
  2396  		}
  2397  
  2398  		return nil
  2399  	}
  2400  
  2401  	if v.GetType().IsVarlen() {
  2402  		var err error
  2403  		var vCol, wCol []types.Varlena
  2404  		ToSlice(v, &vCol)
  2405  		ToSlice(w, &wCol)
  2406  		if !w.nsp.EmptyByFlag() {
  2407  			if flags == nil {
  2408  				for i := 0; i < cnt; i++ {
  2409  					if w.nsp.Contains(uint64(offset) + uint64(i)) {
  2410  						nulls.Add(&v.nsp, uint64(v.length))
  2411  					} else {
  2412  						err = BuildVarlenaFromValena(v, &vCol[v.length], &wCol[int(offset)+i], &w.area, mp)
  2413  						if err != nil {
  2414  							return err
  2415  						}
  2416  					}
  2417  					v.length++
  2418  				}
  2419  			} else {
  2420  				for i := range flags {
  2421  					if flags[i] == 0 {
  2422  						continue
  2423  					}
  2424  					if w.nsp.Contains(uint64(offset) + uint64(i)) {
  2425  						nulls.Add(&v.nsp, uint64(v.length))
  2426  					} else {
  2427  						err = BuildVarlenaFromValena(v, &vCol[v.length], &wCol[int(offset)+i], &w.area, mp)
  2428  						if err != nil {
  2429  							return err
  2430  						}
  2431  					}
  2432  					v.length++
  2433  				}
  2434  			}
  2435  		} else {
  2436  			if flags == nil {
  2437  				for i := 0; i < cnt; i++ {
  2438  					err = BuildVarlenaFromValena(v, &vCol[v.length], &wCol[int(offset)+i], &w.area, mp)
  2439  					if err != nil {
  2440  						return err
  2441  					}
  2442  					v.length++
  2443  				}
  2444  			} else {
  2445  				for i := range flags {
  2446  					if flags[i] == 0 {
  2447  						continue
  2448  					}
  2449  					err = BuildVarlenaFromValena(v, &vCol[v.length], &wCol[int(offset)+i], &w.area, mp)
  2450  					if err != nil {
  2451  						return err
  2452  					}
  2453  					v.length++
  2454  				}
  2455  			}
  2456  		}
  2457  	} else {
  2458  		tlen := v.GetType().TypeSize()
  2459  		if !w.nsp.EmptyByFlag() {
  2460  			if flags == nil {
  2461  				for i := 0; i < cnt; i++ {
  2462  					if w.nsp.Contains(uint64(offset) + uint64(i)) {
  2463  						nulls.Add(&v.nsp, uint64(v.length))
  2464  					} else {
  2465  						copy(v.data[v.length*tlen:(v.length+1)*tlen], w.data[(int(offset)+i)*tlen:(int(offset)+i+1)*tlen])
  2466  					}
  2467  					v.length++
  2468  				}
  2469  			} else {
  2470  				for i := range flags {
  2471  					if flags[i] == 0 {
  2472  						continue
  2473  					}
  2474  					if w.nsp.Contains(uint64(offset) + uint64(i)) {
  2475  						nulls.Add(&v.nsp, uint64(v.length))
  2476  					} else {
  2477  						copy(v.data[v.length*tlen:(v.length+1)*tlen], w.data[(int(offset)+i)*tlen:(int(offset)+i+1)*tlen])
  2478  					}
  2479  					v.length++
  2480  				}
  2481  			}
  2482  		} else {
  2483  			if flags == nil {
  2484  				copy(v.data[v.length*tlen:(v.length+cnt)*tlen], w.data[(int(offset))*tlen:(int(offset)+cnt)*tlen])
  2485  				v.length += cnt
  2486  			} else {
  2487  				for i := range flags {
  2488  					if flags[i] == 0 {
  2489  						continue
  2490  					}
  2491  					copy(v.data[v.length*tlen:(v.length+1)*tlen], w.data[(int(offset)+i)*tlen:(int(offset)+i+1)*tlen])
  2492  					v.length++
  2493  				}
  2494  			}
  2495  		}
  2496  	}
  2497  
  2498  	return nil
  2499  }
  2500  
  2501  // String function is used to visually display the vector,
  2502  // which is used to implement the Printf interface
  2503  func (v *Vector) String() string {
  2504  	switch v.typ.Oid {
  2505  	case types.T_bool:
  2506  		return vecToString[bool](v)
  2507  	case types.T_bit:
  2508  		return vecToString[uint64](v)
  2509  	case types.T_int8:
  2510  		return vecToString[int8](v)
  2511  	case types.T_int16:
  2512  		return vecToString[int16](v)
  2513  	case types.T_int32:
  2514  		return vecToString[int32](v)
  2515  	case types.T_int64:
  2516  		return vecToString[int64](v)
  2517  	case types.T_uint8:
  2518  		return vecToString[uint8](v)
  2519  	case types.T_uint16:
  2520  		return vecToString[uint16](v)
  2521  	case types.T_uint32:
  2522  		return vecToString[uint32](v)
  2523  	case types.T_uint64:
  2524  		return vecToString[uint64](v)
  2525  	case types.T_float32:
  2526  		return vecToString[float32](v)
  2527  	case types.T_float64:
  2528  		return vecToString[float64](v)
  2529  	case types.T_date:
  2530  		return vecToString[types.Date](v)
  2531  	case types.T_datetime:
  2532  		return vecToString[types.Datetime](v)
  2533  	case types.T_time:
  2534  		return vecToString[types.Time](v)
  2535  	case types.T_timestamp:
  2536  		return vecToString[types.Timestamp](v)
  2537  	case types.T_enum:
  2538  		return vecToString[types.Enum](v)
  2539  	case types.T_decimal64:
  2540  		return vecToString[types.Decimal64](v)
  2541  	case types.T_decimal128:
  2542  		return vecToString[types.Decimal128](v)
  2543  	case types.T_uuid:
  2544  		return vecToString[types.Uuid](v)
  2545  	case types.T_TS:
  2546  		return vecToString[types.TS](v)
  2547  	case types.T_Rowid:
  2548  		return vecToString[types.Rowid](v)
  2549  	case types.T_Blockid:
  2550  		return vecToString[types.Blockid](v)
  2551  	case types.T_char, types.T_varchar, types.T_binary, types.T_varbinary, types.T_json, types.T_blob, types.T_text:
  2552  		col := MustStrCol(v)
  2553  		if len(col) == 1 {
  2554  			if nulls.Contains(&v.nsp, 0) {
  2555  				return "null"
  2556  			} else {
  2557  				return col[0]
  2558  			}
  2559  		}
  2560  		if v.nsp.Any() {
  2561  			return fmt.Sprintf("%v-%s", col, v.nsp.GetBitmap().String())
  2562  		} else {
  2563  			return fmt.Sprintf("%v", col)
  2564  		}
  2565  		//return fmt.Sprintf("%v-%s", col, v.nsp.GetBitmap().String())
  2566  	case types.T_array_float32:
  2567  		//NOTE: Don't merge this with T_Varchar. We need to retrieve the Array and print the values.
  2568  		col := MustArrayCol[float32](v)
  2569  		if len(col) == 1 {
  2570  			if nulls.Contains(&v.nsp, 0) {
  2571  				return "null"
  2572  			} else {
  2573  				return types.ArrayToString[float32](col[0])
  2574  			}
  2575  		}
  2576  
  2577  		str := types.ArraysToString[float32](col, types.DefaultArraysToStringSep)
  2578  		if v.nsp.Any() {
  2579  			return fmt.Sprintf("%v-%s", str, v.nsp.GetBitmap().String())
  2580  		}
  2581  		return fmt.Sprintf("%v-%s", str, v.nsp.GetBitmap().String())
  2582  	case types.T_array_float64:
  2583  		//NOTE: Don't merge this with T_Varchar. We need to retrieve the Array and print the values.
  2584  		col := MustArrayCol[float64](v)
  2585  		if len(col) == 1 {
  2586  			if nulls.Contains(&v.nsp, 0) {
  2587  				return "null"
  2588  			} else {
  2589  				return types.ArrayToString[float64](col[0])
  2590  			}
  2591  		}
  2592  		str := types.ArraysToString[float64](col, types.DefaultArraysToStringSep)
  2593  		if v.nsp.Any() {
  2594  			return fmt.Sprintf("%v-%s", str, v.nsp.GetBitmap().String())
  2595  		}
  2596  		return fmt.Sprintf("%v-%s", str, v.nsp.GetBitmap().String())
  2597  	default:
  2598  		panic("vec to string unknown types.")
  2599  	}
  2600  }
  2601  
  2602  func SetConstNull(vec *Vector, length int, mp *mpool.MPool) error {
  2603  	if len(vec.data) > 0 {
  2604  		vec.data = vec.data[:0]
  2605  	}
  2606  	vec.class = CONSTANT
  2607  	vec.length = length
  2608  	return nil
  2609  }
  2610  
  2611  func SetConstFixed[T any](vec *Vector, val T, length int, mp *mpool.MPool) error {
  2612  	if vec.capacity == 0 {
  2613  		if err := extend(vec, 1, mp); err != nil {
  2614  			return err
  2615  		}
  2616  	}
  2617  	vec.class = CONSTANT
  2618  	var col []T
  2619  	ToSlice(vec, &col)
  2620  	col[0] = val
  2621  	vec.data = vec.data[:cap(vec.data)]
  2622  	vec.SetLength(length)
  2623  	return nil
  2624  }
  2625  
  2626  func SetConstBytes(vec *Vector, val []byte, length int, mp *mpool.MPool) error {
  2627  	var err error
  2628  	if vec.capacity == 0 {
  2629  		if err := extend(vec, 1, mp); err != nil {
  2630  			return err
  2631  		}
  2632  	}
  2633  	vec.class = CONSTANT
  2634  	var col []types.Varlena
  2635  	ToSlice(vec, &col)
  2636  	err = BuildVarlenaFromByteSlice(vec, &col[0], &val, mp)
  2637  	if err != nil {
  2638  		return err
  2639  	}
  2640  	vec.data = vec.data[:cap(vec.data)]
  2641  	vec.SetLength(length)
  2642  	return nil
  2643  }
  2644  
  2645  // SetConstArray set current vector as Constant_Array vector of given length.
  2646  func SetConstArray[T types.RealNumbers](vec *Vector, val []T, length int, mp *mpool.MPool) error {
  2647  	var err error
  2648  
  2649  	if vec.capacity == 0 {
  2650  		if err := extend(vec, 1, mp); err != nil {
  2651  			return err
  2652  		}
  2653  	}
  2654  	vec.class = CONSTANT
  2655  	var col []types.Varlena
  2656  	ToSlice(vec, &col)
  2657  	err = BuildVarlenaFromArray[T](vec, &col[0], &val, mp)
  2658  	if err != nil {
  2659  		return err
  2660  	}
  2661  	vec.data = vec.data[:cap(vec.data)]
  2662  	vec.SetLength(length)
  2663  	return nil
  2664  }
  2665  
  2666  func AppendAny(vec *Vector, val any, isNull bool, mp *mpool.MPool) error {
  2667  	if vec.IsConst() {
  2668  		panic(moerr.NewInternalErrorNoCtx("append to const vector"))
  2669  	}
  2670  	if mp == nil {
  2671  		panic(moerr.NewInternalErrorNoCtx("vector append does not have a mpool"))
  2672  	}
  2673  
  2674  	if isNull {
  2675  		return appendOneFixed(vec, 0, true, mp)
  2676  	}
  2677  
  2678  	switch vec.typ.Oid {
  2679  	case types.T_bool:
  2680  		return appendOneFixed(vec, val.(bool), false, mp)
  2681  	case types.T_bit:
  2682  		return appendOneFixed(vec, val.(uint64), false, mp)
  2683  	case types.T_int8:
  2684  		return appendOneFixed(vec, val.(int8), false, mp)
  2685  	case types.T_int16:
  2686  		return appendOneFixed(vec, val.(int16), false, mp)
  2687  	case types.T_int32:
  2688  		return appendOneFixed(vec, val.(int32), false, mp)
  2689  	case types.T_int64:
  2690  		return appendOneFixed(vec, val.(int64), false, mp)
  2691  	case types.T_uint8:
  2692  		return appendOneFixed(vec, val.(uint8), false, mp)
  2693  	case types.T_uint16:
  2694  		return appendOneFixed(vec, val.(uint16), false, mp)
  2695  	case types.T_uint32:
  2696  		return appendOneFixed(vec, val.(uint32), false, mp)
  2697  	case types.T_uint64:
  2698  		return appendOneFixed(vec, val.(uint64), false, mp)
  2699  	case types.T_float32:
  2700  		return appendOneFixed(vec, val.(float32), false, mp)
  2701  	case types.T_float64:
  2702  		return appendOneFixed(vec, val.(float64), false, mp)
  2703  	case types.T_date:
  2704  		return appendOneFixed(vec, val.(types.Date), false, mp)
  2705  	case types.T_datetime:
  2706  		return appendOneFixed(vec, val.(types.Datetime), false, mp)
  2707  	case types.T_time:
  2708  		return appendOneFixed(vec, val.(types.Time), false, mp)
  2709  	case types.T_timestamp:
  2710  		return appendOneFixed(vec, val.(types.Timestamp), false, mp)
  2711  	case types.T_enum:
  2712  		return appendOneFixed(vec, val.(types.Enum), false, mp)
  2713  	case types.T_decimal64:
  2714  		return appendOneFixed(vec, val.(types.Decimal64), false, mp)
  2715  	case types.T_decimal128:
  2716  		return appendOneFixed(vec, val.(types.Decimal128), false, mp)
  2717  	case types.T_uuid:
  2718  		return appendOneFixed(vec, val.(types.Uuid), false, mp)
  2719  	case types.T_TS:
  2720  		return appendOneFixed(vec, val.(types.TS), false, mp)
  2721  	case types.T_Rowid:
  2722  		return appendOneFixed(vec, val.(types.Rowid), false, mp)
  2723  	case types.T_Blockid:
  2724  		return appendOneFixed(vec, val.(types.Blockid), false, mp)
  2725  	case types.T_char, types.T_varchar, types.T_binary, types.T_varbinary, types.T_json, types.T_blob, types.T_text,
  2726  		types.T_array_float32, types.T_array_float64:
  2727  		return appendOneBytes(vec, val.([]byte), false, mp)
  2728  	}
  2729  	return nil
  2730  }
  2731  
  2732  func AppendFixed[T any](vec *Vector, val T, isNull bool, mp *mpool.MPool) error {
  2733  	if vec.IsConst() {
  2734  		panic(moerr.NewInternalErrorNoCtx("append to const vector"))
  2735  	}
  2736  	if mp == nil {
  2737  		panic(moerr.NewInternalErrorNoCtx("vector append does not have a mpool"))
  2738  	}
  2739  	return appendOneFixed(vec, val, isNull, mp)
  2740  }
  2741  
  2742  func AppendBytes(vec *Vector, val []byte, isNull bool, mp *mpool.MPool) error {
  2743  	if vec.IsConst() {
  2744  		panic(moerr.NewInternalErrorNoCtx("append to const vector"))
  2745  	}
  2746  	if mp == nil {
  2747  		panic(moerr.NewInternalErrorNoCtx("vector append does not have a mpool"))
  2748  	}
  2749  	return appendOneBytes(vec, val, isNull, mp)
  2750  }
  2751  
  2752  // AppendArray mainly used in tests
  2753  func AppendArray[T types.RealNumbers](vec *Vector, val []T, isNull bool, mp *mpool.MPool) error {
  2754  	if vec.IsConst() {
  2755  		panic(moerr.NewInternalErrorNoCtx("append to const vector"))
  2756  	}
  2757  	if mp == nil {
  2758  		panic(moerr.NewInternalErrorNoCtx("vector append does not have a mpool"))
  2759  	}
  2760  	return appendOneArray[T](vec, val, isNull, mp)
  2761  }
  2762  
  2763  func AppendMultiFixed[T any](vec *Vector, vals T, isNull bool, cnt int, mp *mpool.MPool) error {
  2764  	if vec.IsConst() {
  2765  		panic(moerr.NewInternalErrorNoCtx("append to const vector"))
  2766  	}
  2767  	if mp == nil {
  2768  		panic(moerr.NewInternalErrorNoCtx("vector append does not have a mpool"))
  2769  	}
  2770  	return appendMultiFixed(vec, vals, isNull, cnt, mp)
  2771  }
  2772  
  2773  func AppendMultiBytes(vec *Vector, vals []byte, isNull bool, cnt int, mp *mpool.MPool) error {
  2774  	if vec.IsConst() {
  2775  		panic(moerr.NewInternalErrorNoCtx("append to const vector"))
  2776  	}
  2777  	if mp == nil {
  2778  		panic(moerr.NewInternalErrorNoCtx("vector append does not have a mpool"))
  2779  	}
  2780  	return appendMultiBytes(vec, vals, isNull, cnt, mp)
  2781  }
  2782  
  2783  func AppendFixedList[T any](vec *Vector, ws []T, isNulls []bool, mp *mpool.MPool) error {
  2784  	if vec.IsConst() {
  2785  		panic(moerr.NewInternalErrorNoCtx("append to const vector"))
  2786  	}
  2787  	if mp == nil {
  2788  		panic(moerr.NewInternalErrorNoCtx("vector append does not have a mpool"))
  2789  	}
  2790  	if len(ws) == 0 {
  2791  		return nil
  2792  	}
  2793  	return appendList(vec, ws, isNulls, mp)
  2794  }
  2795  
  2796  func AppendBytesList(vec *Vector, ws [][]byte, isNulls []bool, mp *mpool.MPool) error {
  2797  	if vec.IsConst() {
  2798  		panic(moerr.NewInternalErrorNoCtx("append to const vector"))
  2799  	}
  2800  	if mp == nil {
  2801  		panic(moerr.NewInternalErrorNoCtx("vector append does not have a mpool"))
  2802  	}
  2803  	if len(ws) == 0 {
  2804  		return nil
  2805  	}
  2806  	return appendBytesList(vec, ws, isNulls, mp)
  2807  }
  2808  
  2809  func AppendStringList(vec *Vector, ws []string, isNulls []bool, mp *mpool.MPool) error {
  2810  	if vec.IsConst() {
  2811  		panic(moerr.NewInternalErrorNoCtx("append to const vector"))
  2812  	}
  2813  	if mp == nil {
  2814  		panic(moerr.NewInternalErrorNoCtx("vector append does not have a mpool"))
  2815  	}
  2816  	if len(ws) == 0 {
  2817  		return nil
  2818  	}
  2819  	return appendStringList(vec, ws, isNulls, mp)
  2820  }
  2821  
  2822  // AppendArrayList mainly used in unit tests
  2823  func AppendArrayList[T types.RealNumbers](vec *Vector, ws [][]T, isNulls []bool, mp *mpool.MPool) error {
  2824  	if vec.IsConst() {
  2825  		panic(moerr.NewInternalErrorNoCtx("append to const vector"))
  2826  	}
  2827  	if mp == nil {
  2828  		panic(moerr.NewInternalErrorNoCtx("vector append does not have a mpool"))
  2829  	}
  2830  	if len(ws) == 0 {
  2831  		return nil
  2832  	}
  2833  	return appendArrayList[T](vec, ws, isNulls, mp)
  2834  }
  2835  
  2836  func appendOneFixed[T any](vec *Vector, val T, isNull bool, mp *mpool.MPool) error {
  2837  	if err := extend(vec, 1, mp); err != nil {
  2838  		return err
  2839  	}
  2840  	length := vec.length
  2841  	vec.length++
  2842  	if isNull {
  2843  		nulls.Add(&vec.nsp, uint64(length))
  2844  	} else {
  2845  		var col []T
  2846  		ToSlice(vec, &col)
  2847  		col[length] = val
  2848  	}
  2849  	return nil
  2850  }
  2851  
  2852  func appendOneBytes(vec *Vector, val []byte, isNull bool, mp *mpool.MPool) error {
  2853  	var err error
  2854  	var va types.Varlena
  2855  
  2856  	if isNull {
  2857  		return appendOneFixed(vec, va, true, mp)
  2858  	} else {
  2859  		err = BuildVarlenaFromByteSlice(vec, &va, &val, mp)
  2860  		if err != nil {
  2861  			return err
  2862  		}
  2863  		return appendOneFixed(vec, va, false, mp)
  2864  	}
  2865  }
  2866  
  2867  // appendOneArray mainly used for unit tests
  2868  func appendOneArray[T types.RealNumbers](vec *Vector, val []T, isNull bool, mp *mpool.MPool) error {
  2869  	var err error
  2870  	var va types.Varlena
  2871  
  2872  	if isNull {
  2873  		return appendOneFixed(vec, va, true, mp)
  2874  	} else {
  2875  		err = BuildVarlenaFromArray[T](vec, &va, &val, mp)
  2876  		if err != nil {
  2877  			return err
  2878  		}
  2879  		return appendOneFixed(vec, va, false, mp)
  2880  	}
  2881  }
  2882  
  2883  func appendMultiFixed[T any](vec *Vector, val T, isNull bool, cnt int, mp *mpool.MPool) error {
  2884  	if err := extend(vec, cnt, mp); err != nil {
  2885  		return err
  2886  	}
  2887  	length := vec.length
  2888  	vec.length += cnt
  2889  	if isNull {
  2890  		nulls.AddRange(&vec.nsp, uint64(length), uint64(length+cnt))
  2891  	} else {
  2892  		var col []T
  2893  		ToSlice(vec, &col)
  2894  		for i := 0; i < cnt; i++ {
  2895  			col[length+i] = val
  2896  		}
  2897  	}
  2898  	return nil
  2899  }
  2900  
  2901  func appendMultiBytes(vec *Vector, val []byte, isNull bool, cnt int, mp *mpool.MPool) error {
  2902  	var err error
  2903  	var va types.Varlena
  2904  	if err = extend(vec, cnt, mp); err != nil {
  2905  		return err
  2906  	}
  2907  	length := vec.length
  2908  	vec.length += cnt
  2909  	if isNull {
  2910  		nulls.AddRange(&vec.nsp, uint64(length), uint64(length+cnt))
  2911  	} else {
  2912  		var col []types.Varlena
  2913  		ToSlice(vec, &col)
  2914  		err = BuildVarlenaFromByteSlice(vec, &va, &val, mp)
  2915  		if err != nil {
  2916  			return err
  2917  		}
  2918  		for i := 0; i < cnt; i++ {
  2919  			col[length+i] = va
  2920  		}
  2921  	}
  2922  	return nil
  2923  }
  2924  
  2925  func appendList[T any](vec *Vector, vals []T, isNulls []bool, mp *mpool.MPool) error {
  2926  	if err := extend(vec, len(vals), mp); err != nil {
  2927  		return err
  2928  	}
  2929  	length := vec.length
  2930  	vec.length += len(vals)
  2931  	col := MustFixedCol[T](vec)
  2932  	for i, w := range vals {
  2933  		if len(isNulls) > 0 && isNulls[i] {
  2934  			nulls.Add(&vec.nsp, uint64(length+i))
  2935  		} else {
  2936  			col[length+i] = w
  2937  		}
  2938  	}
  2939  	return nil
  2940  }
  2941  
  2942  func appendBytesList(vec *Vector, vals [][]byte, isNulls []bool, mp *mpool.MPool) error {
  2943  	var err error
  2944  	if err = extend(vec, len(vals), mp); err != nil {
  2945  		return err
  2946  	}
  2947  	length := vec.length
  2948  	vec.length += len(vals)
  2949  	col := MustFixedCol[types.Varlena](vec)
  2950  	for i, w := range vals {
  2951  		if len(isNulls) > 0 && isNulls[i] {
  2952  			nulls.Add(&vec.nsp, uint64(length+i))
  2953  		} else {
  2954  			err = BuildVarlenaFromByteSlice(vec, &col[length+i], &w, mp)
  2955  			if err != nil {
  2956  				return err
  2957  			}
  2958  		}
  2959  	}
  2960  	return nil
  2961  }
  2962  
  2963  func appendStringList(vec *Vector, vals []string, isNulls []bool, mp *mpool.MPool) error {
  2964  	var err error
  2965  
  2966  	if err = extend(vec, len(vals), mp); err != nil {
  2967  		return err
  2968  	}
  2969  	length := vec.length
  2970  	vec.length += len(vals)
  2971  	col := MustFixedCol[types.Varlena](vec)
  2972  	for i, w := range vals {
  2973  		if len(isNulls) > 0 && isNulls[i] {
  2974  			nulls.Add(&vec.nsp, uint64(length+i))
  2975  		} else {
  2976  			bs := []byte(w)
  2977  			err = BuildVarlenaFromByteSlice(vec, &col[length+i], &bs, mp)
  2978  			if err != nil {
  2979  				return err
  2980  			}
  2981  		}
  2982  	}
  2983  	return nil
  2984  }
  2985  
  2986  // appendArrayList mainly used for unit tests
  2987  func appendArrayList[T types.RealNumbers](vec *Vector, vals [][]T, isNulls []bool, mp *mpool.MPool) error {
  2988  	var err error
  2989  
  2990  	if err = extend(vec, len(vals), mp); err != nil {
  2991  		return err
  2992  	}
  2993  	length := vec.length
  2994  	vec.length += len(vals)
  2995  	col := MustFixedCol[types.Varlena](vec)
  2996  	for i, w := range vals {
  2997  		if len(isNulls) > 0 && isNulls[i] {
  2998  			nulls.Add(&vec.nsp, uint64(length+i))
  2999  		} else {
  3000  			bs := w
  3001  			err = BuildVarlenaFromArray[T](vec, &col[length+i], &bs, mp)
  3002  			if err != nil {
  3003  				return err
  3004  			}
  3005  		}
  3006  	}
  3007  	return nil
  3008  }
  3009  
  3010  func shrinkFixed[T types.FixedSizeT](v *Vector, sels []int64, negate bool) {
  3011  	vs := MustFixedCol[T](v)
  3012  	if !negate {
  3013  		for i, sel := range sels {
  3014  			vs[i] = vs[sel]
  3015  		}
  3016  		nulls.Filter(&v.nsp, sels, false)
  3017  		v.length = len(sels)
  3018  	} else if len(sels) > 0 {
  3019  		for oldIdx, newIdx, selIdx, sel := 0, 0, 0, sels[0]; oldIdx < v.length; oldIdx++ {
  3020  			if oldIdx != int(sel) {
  3021  				vs[newIdx] = vs[oldIdx]
  3022  				newIdx++
  3023  			} else {
  3024  				selIdx++
  3025  				if selIdx >= len(sels) {
  3026  					for idx := oldIdx + 1; idx < v.length; idx++ {
  3027  						vs[newIdx] = vs[idx]
  3028  						newIdx++
  3029  					}
  3030  					break
  3031  				}
  3032  				sel = sels[selIdx]
  3033  			}
  3034  		}
  3035  		nulls.Filter(&v.nsp, sels, true)
  3036  		v.length -= len(sels)
  3037  	}
  3038  }
  3039  
  3040  func shuffleFixed[T types.FixedSizeT](v *Vector, sels []int64, mp *mpool.MPool) error {
  3041  	sz := v.typ.TypeSize()
  3042  	olddata := v.data[:v.length*sz]
  3043  	ns := len(sels)
  3044  	vs := MustFixedCol[T](v)
  3045  	data, err := mp.Alloc(ns * v.GetType().TypeSize())
  3046  	if err != nil {
  3047  		return err
  3048  	}
  3049  	v.data = data
  3050  	v.setupColFromData()
  3051  	var ws []T
  3052  	ToSlice(v, &ws)
  3053  	ws = ws[:ns]
  3054  	shuffle.FixedLengthShuffle(vs, ws, sels)
  3055  	nulls.Filter(&v.nsp, sels, false)
  3056  	// XXX We should never allow "half-owned" vectors later. And unowned vector should be strictly read-only.
  3057  	if v.cantFreeData {
  3058  		v.cantFreeData = false
  3059  	} else {
  3060  		mp.Free(olddata)
  3061  	}
  3062  	v.length = ns
  3063  	return nil
  3064  }
  3065  
  3066  func vecToString[T types.FixedSizeT](v *Vector) string {
  3067  	col := MustFixedCol[T](v)
  3068  	if len(col) == 1 {
  3069  		if nulls.Contains(&v.nsp, 0) {
  3070  			return "null"
  3071  		} else {
  3072  			return fmt.Sprintf("%v", col[0])
  3073  		}
  3074  	}
  3075  	if v.nsp.Any() {
  3076  		return fmt.Sprintf("%v-%s", col, v.nsp.GetBitmap().String())
  3077  	} else {
  3078  		return fmt.Sprintf("%v", col)
  3079  	}
  3080  }
  3081  
  3082  // Window returns a "window" into the Vec.
  3083  // It selects a half-open range (i.e.[start, end)).
  3084  // The returned object is NOT allowed to be modified (
  3085  // TODO: Nulls are deep copied.
  3086  func (v *Vector) Window(start, end int) (*Vector, error) {
  3087  	if v.IsConstNull() {
  3088  		return NewConstNull(v.typ, end-start, nil), nil
  3089  	} else if v.IsConst() {
  3090  		vec := NewVec(v.typ)
  3091  		vec.class = v.class
  3092  		vec.col = v.col
  3093  		vec.data = v.data
  3094  		vec.area = v.area
  3095  		vec.capacity = v.capacity
  3096  		vec.length = end - start
  3097  		vec.cantFreeArea = true
  3098  		vec.cantFreeData = true
  3099  		vec.sorted = v.sorted
  3100  		return vec, nil
  3101  	}
  3102  	w := NewVec(v.typ)
  3103  	if start == end {
  3104  		return w, nil
  3105  	}
  3106  	nulls.Range(&v.nsp, uint64(start), uint64(end), uint64(start), &w.nsp)
  3107  	w.data = v.data[start*v.typ.TypeSize() : end*v.typ.TypeSize()]
  3108  	w.length = end - start
  3109  	w.setupColFromData()
  3110  	if v.typ.IsVarlen() {
  3111  		w.area = v.area
  3112  	}
  3113  	w.cantFreeData = true
  3114  	w.cantFreeArea = true
  3115  	return w, nil
  3116  }
  3117  
  3118  // CloneWindow Deep copies the content from start to end into another vector. Afterwise it's safe to destroy the original one.
  3119  func (v *Vector) CloneWindow(start, end int, mp *mpool.MPool) (*Vector, error) {
  3120  	if start == end {
  3121  		return NewVec(v.typ), nil
  3122  	}
  3123  	if end > v.Length() {
  3124  		panic(fmt.Sprintf("CloneWindow end %d >= length %d", end, v.Length()))
  3125  	}
  3126  	if v.IsConstNull() {
  3127  		return NewConstNull(v.typ, end-start, mp), nil
  3128  	} else if v.IsConst() {
  3129  		if v.typ.IsVarlen() {
  3130  			return NewConstBytes(v.typ, v.GetBytesAt(0), end-start, mp)
  3131  		} else {
  3132  			vec := NewVec(v.typ)
  3133  			vec.class = v.class
  3134  			vec.col = v.col
  3135  			vec.data = make([]byte, len(v.data))
  3136  			copy(vec.data, v.data)
  3137  			vec.capacity = v.capacity
  3138  			vec.length = end - start
  3139  			vec.cantFreeArea = true
  3140  			vec.cantFreeData = true
  3141  			vec.sorted = v.sorted
  3142  			return vec, nil
  3143  		}
  3144  	}
  3145  	w := NewVec(v.typ)
  3146  	if err := v.CloneWindowTo(w, start, end, mp); err != nil {
  3147  		return nil, err
  3148  	}
  3149  	return w, nil
  3150  }
  3151  
  3152  func (v *Vector) CloneWindowTo(w *Vector, start, end int, mp *mpool.MPool) error {
  3153  	if start == end {
  3154  		return nil
  3155  	}
  3156  	if v.IsConstNull() {
  3157  		w.class = CONSTANT
  3158  		w.length = end - start
  3159  		w.data = nil
  3160  		return nil
  3161  	} else if v.IsConst() {
  3162  		if v.typ.IsVarlen() {
  3163  			w.class = CONSTANT
  3164  			SetConstBytes(v, v.GetBytesAt(0), end-start, mp)
  3165  			return nil
  3166  		} else {
  3167  			w.class = v.class
  3168  			w.col = v.col
  3169  			w.data = make([]byte, len(v.data))
  3170  			copy(w.data, v.data)
  3171  			w.capacity = v.capacity
  3172  			w.length = end - start
  3173  			w.cantFreeArea = true
  3174  			w.cantFreeData = true
  3175  			w.sorted = v.sorted
  3176  			return nil
  3177  		}
  3178  	}
  3179  	nulls.Range(&v.nsp, uint64(start), uint64(end), uint64(start), &w.nsp)
  3180  	length := (end - start) * v.typ.TypeSize()
  3181  	if mp == nil {
  3182  		w.data = make([]byte, length)
  3183  		copy(w.data, v.data[start*v.typ.TypeSize():end*v.typ.TypeSize()])
  3184  		w.length = end - start
  3185  		w.setupColFromData()
  3186  		if v.typ.IsVarlen() {
  3187  			w.area = make([]byte, len(v.area))
  3188  			copy(w.area, v.area)
  3189  		}
  3190  		w.cantFreeData = true
  3191  		w.cantFreeArea = true
  3192  	} else {
  3193  		err := w.PreExtend(end-start, mp)
  3194  		if err != nil {
  3195  			return err
  3196  		}
  3197  		w.length = end - start
  3198  		if v.GetType().IsVarlen() {
  3199  			var vCol, wCol []types.Varlena
  3200  			ToSlice(v, &vCol)
  3201  			ToSlice(w, &wCol)
  3202  			for i := start; i < end; i++ {
  3203  				if !nulls.Contains(&v.nsp, uint64(i)) {
  3204  					bs := vCol[i].GetByteSlice(v.area)
  3205  					err = BuildVarlenaFromByteSlice(w, &wCol[i-start], &bs, mp)
  3206  					if err != nil {
  3207  						return err
  3208  					}
  3209  				}
  3210  			}
  3211  		} else {
  3212  			tlen := v.typ.TypeSize()
  3213  			copy(w.data[:length], v.data[start*tlen:end*tlen])
  3214  		}
  3215  	}
  3216  
  3217  	return nil
  3218  }
  3219  
  3220  // GetSumValue returns the sum value of the vector.
  3221  // if the length is 0 or all null or the vector is not numeric, return false
  3222  func (v *Vector) GetSumValue() (ok bool, sumv []byte) {
  3223  	if v.Length() == 0 || v.AllNull() || !v.typ.IsNumeric() {
  3224  		return
  3225  	}
  3226  	if v.typ.IsDecimal() && v.typ.Oid != types.T_decimal64 {
  3227  		return
  3228  	}
  3229  	ok = true
  3230  	switch v.typ.Oid {
  3231  	case types.T_bit:
  3232  		sumVal := IntegerGetSum[uint64, uint64](v)
  3233  		sumv = types.EncodeUint64(&sumVal)
  3234  	case types.T_int8:
  3235  		sumVal := IntegerGetSum[int8, int64](v)
  3236  		sumv = types.EncodeInt64(&sumVal)
  3237  	case types.T_int16:
  3238  		sumVal := IntegerGetSum[int16, int64](v)
  3239  		sumv = types.EncodeInt64(&sumVal)
  3240  	case types.T_int32:
  3241  		sumVal := IntegerGetSum[int32, int64](v)
  3242  		sumv = types.EncodeInt64(&sumVal)
  3243  	case types.T_int64:
  3244  		sumVal := IntegerGetSum[int64, int64](v)
  3245  		sumv = types.EncodeInt64(&sumVal)
  3246  	case types.T_uint8:
  3247  		sumVal := IntegerGetSum[uint8, uint64](v)
  3248  		sumv = types.EncodeUint64(&sumVal)
  3249  	case types.T_uint16:
  3250  		sumVal := IntegerGetSum[uint16, uint64](v)
  3251  		sumv = types.EncodeUint64(&sumVal)
  3252  	case types.T_uint32:
  3253  		sumVal := IntegerGetSum[uint32, uint64](v)
  3254  		sumv = types.EncodeUint64(&sumVal)
  3255  	case types.T_uint64:
  3256  		sumVal := IntegerGetSum[uint64, uint64](v)
  3257  		sumv = types.EncodeUint64(&sumVal)
  3258  	case types.T_float32:
  3259  		sumVal := FloatGetSum[float32](v)
  3260  		sumv = types.EncodeFloat64(&sumVal)
  3261  	case types.T_float64:
  3262  		sumVal := FloatGetSum[float64](v)
  3263  		sumv = types.EncodeFloat64(&sumVal)
  3264  	case types.T_decimal64:
  3265  		sumVal := Decimal64GetSum(v)
  3266  		sumv = types.EncodeDecimal64(&sumVal)
  3267  	default:
  3268  		panic(fmt.Sprintf("unsupported type %s", v.GetType().String()))
  3269  	}
  3270  	return
  3271  }
  3272  
  3273  // GetMinMaxValue returns the min and max value of the vector.
  3274  // if the length is 0 or all null, return false
  3275  func (v *Vector) GetMinMaxValue() (ok bool, minv, maxv []byte) {
  3276  	if v.Length() == 0 || v.AllNull() {
  3277  		return
  3278  	}
  3279  	ok = true
  3280  	switch v.typ.Oid {
  3281  	case types.T_bool:
  3282  		var minVal, maxVal bool
  3283  		col := MustFixedCol[bool](v)
  3284  		if v.HasNull() {
  3285  			first := true
  3286  			for i, j := 0, len(col); i < j; i++ {
  3287  				if v.IsNull(uint64(i)) {
  3288  					continue
  3289  				}
  3290  				if first {
  3291  					minVal, maxVal = col[i], col[i]
  3292  					first = false
  3293  				} else {
  3294  					minVal = minVal && col[i]
  3295  					maxVal = maxVal && col[i]
  3296  				}
  3297  			}
  3298  		} else {
  3299  			minVal, maxVal = col[0], col[0]
  3300  			for i, j := 1, len(col); i < j; i++ {
  3301  				minVal = minVal && col[i]
  3302  				maxVal = maxVal && col[i]
  3303  			}
  3304  		}
  3305  		minv = types.EncodeBool(&minVal)
  3306  		maxv = types.EncodeBool(&maxVal)
  3307  
  3308  	case types.T_bit:
  3309  		minVal, maxVal := OrderedGetMinAndMax[uint64](v)
  3310  		minv = types.EncodeUint64(&minVal)
  3311  		maxv = types.EncodeUint64(&maxVal)
  3312  
  3313  	case types.T_int8:
  3314  		minVal, maxVal := OrderedGetMinAndMax[int8](v)
  3315  		minv = types.EncodeInt8(&minVal)
  3316  		maxv = types.EncodeInt8(&maxVal)
  3317  
  3318  	case types.T_int16:
  3319  		minVal, maxVal := OrderedGetMinAndMax[int16](v)
  3320  		minv = types.EncodeInt16(&minVal)
  3321  		maxv = types.EncodeInt16(&maxVal)
  3322  
  3323  	case types.T_int32:
  3324  		minVal, maxVal := OrderedGetMinAndMax[int32](v)
  3325  		minv = types.EncodeInt32(&minVal)
  3326  		maxv = types.EncodeInt32(&maxVal)
  3327  
  3328  	case types.T_int64:
  3329  		minVal, maxVal := OrderedGetMinAndMax[int64](v)
  3330  		minv = types.EncodeInt64(&minVal)
  3331  		maxv = types.EncodeInt64(&maxVal)
  3332  
  3333  	case types.T_uint8:
  3334  		minVal, maxVal := OrderedGetMinAndMax[uint8](v)
  3335  		minv = types.EncodeUint8(&minVal)
  3336  		maxv = types.EncodeUint8(&maxVal)
  3337  
  3338  	case types.T_uint16:
  3339  		minVal, maxVal := OrderedGetMinAndMax[uint16](v)
  3340  		minv = types.EncodeUint16(&minVal)
  3341  		maxv = types.EncodeUint16(&maxVal)
  3342  
  3343  	case types.T_uint32:
  3344  		minVal, maxVal := OrderedGetMinAndMax[uint32](v)
  3345  		minv = types.EncodeUint32(&minVal)
  3346  		maxv = types.EncodeUint32(&maxVal)
  3347  
  3348  	case types.T_uint64:
  3349  		minVal, maxVal := OrderedGetMinAndMax[uint64](v)
  3350  		minv = types.EncodeUint64(&minVal)
  3351  		maxv = types.EncodeUint64(&maxVal)
  3352  
  3353  	case types.T_float32:
  3354  		minVal, maxVal := OrderedGetMinAndMax[float32](v)
  3355  		minv = types.EncodeFloat32(&minVal)
  3356  		maxv = types.EncodeFloat32(&maxVal)
  3357  
  3358  	case types.T_float64:
  3359  		minVal, maxVal := OrderedGetMinAndMax[float64](v)
  3360  		minv = types.EncodeFloat64(&minVal)
  3361  		maxv = types.EncodeFloat64(&maxVal)
  3362  
  3363  	case types.T_date:
  3364  		minVal, maxVal := OrderedGetMinAndMax[types.Date](v)
  3365  		minv = types.EncodeDate(&minVal)
  3366  		maxv = types.EncodeDate(&maxVal)
  3367  
  3368  	case types.T_datetime:
  3369  		minVal, maxVal := OrderedGetMinAndMax[types.Datetime](v)
  3370  		minv = types.EncodeDatetime(&minVal)
  3371  		maxv = types.EncodeDatetime(&maxVal)
  3372  
  3373  	case types.T_time:
  3374  		minVal, maxVal := OrderedGetMinAndMax[types.Time](v)
  3375  		minv = types.EncodeTime(&minVal)
  3376  		maxv = types.EncodeTime(&maxVal)
  3377  
  3378  	case types.T_timestamp:
  3379  		minVal, maxVal := OrderedGetMinAndMax[types.Timestamp](v)
  3380  		minv = types.EncodeTimestamp(&minVal)
  3381  		maxv = types.EncodeTimestamp(&maxVal)
  3382  
  3383  	case types.T_enum:
  3384  		minVal, maxVal := OrderedGetMinAndMax[types.Enum](v)
  3385  		minv = types.EncodeEnum(&minVal)
  3386  		maxv = types.EncodeEnum(&maxVal)
  3387  
  3388  	case types.T_decimal64:
  3389  		col := MustFixedCol[types.Decimal64](v)
  3390  		var minVal, maxVal types.Decimal64
  3391  		if v.HasNull() {
  3392  			first := true
  3393  			for i, j := 0, len(col); i < j; i++ {
  3394  				if v.IsNull(uint64(i)) {
  3395  					continue
  3396  				}
  3397  				if first {
  3398  					minVal, maxVal = col[i], col[i]
  3399  					first = false
  3400  				} else {
  3401  					if col[i].Less(minVal) {
  3402  						minVal = col[i]
  3403  					}
  3404  					if maxVal.Less(col[i]) {
  3405  
  3406  						maxVal = col[i]
  3407  					}
  3408  				}
  3409  			}
  3410  		} else {
  3411  			minVal, maxVal = col[0], col[0]
  3412  			for i, j := 1, len(col); i < j; i++ {
  3413  				if col[i].Less(minVal) {
  3414  					minVal = col[i]
  3415  				}
  3416  				if maxVal.Less(col[i]) {
  3417  					maxVal = col[i]
  3418  				}
  3419  			}
  3420  		}
  3421  
  3422  		minv = types.EncodeDecimal64(&minVal)
  3423  		maxv = types.EncodeDecimal64(&maxVal)
  3424  
  3425  	case types.T_decimal128:
  3426  		col := MustFixedCol[types.Decimal128](v)
  3427  		var minVal, maxVal types.Decimal128
  3428  		if v.HasNull() {
  3429  			first := true
  3430  			for i, j := 0, len(col); i < j; i++ {
  3431  				if v.IsNull(uint64(i)) {
  3432  					continue
  3433  				}
  3434  				if first {
  3435  					minVal, maxVal = col[i], col[i]
  3436  					first = false
  3437  				} else {
  3438  					if col[i].Less(minVal) {
  3439  						minVal = col[i]
  3440  					}
  3441  					if maxVal.Less(col[i]) {
  3442  
  3443  						maxVal = col[i]
  3444  					}
  3445  				}
  3446  			}
  3447  		} else {
  3448  			minVal, maxVal = col[0], col[0]
  3449  			for i, j := 1, len(col); i < j; i++ {
  3450  				if col[i].Less(minVal) {
  3451  					minVal = col[i]
  3452  				}
  3453  				if maxVal.Less(col[i]) {
  3454  					maxVal = col[i]
  3455  				}
  3456  			}
  3457  		}
  3458  
  3459  		minv = types.EncodeDecimal128(&minVal)
  3460  		maxv = types.EncodeDecimal128(&maxVal)
  3461  
  3462  	case types.T_TS:
  3463  		col := MustFixedCol[types.TS](v)
  3464  		var minVal, maxVal types.TS
  3465  		if v.HasNull() {
  3466  			first := true
  3467  			for i, j := 0, len(col); i < j; i++ {
  3468  				if v.IsNull(uint64(i)) {
  3469  					continue
  3470  				}
  3471  				if first {
  3472  					minVal, maxVal = col[i], col[i]
  3473  					first = false
  3474  				} else {
  3475  					if col[i].Less(&minVal) {
  3476  						minVal = col[i]
  3477  					}
  3478  					if maxVal.Less(&col[i]) {
  3479  
  3480  						maxVal = col[i]
  3481  					}
  3482  				}
  3483  			}
  3484  		} else {
  3485  			minVal, maxVal = col[0], col[0]
  3486  			for i, j := 1, len(col); i < j; i++ {
  3487  				if col[i].Less(&minVal) {
  3488  					minVal = col[i]
  3489  				}
  3490  				if maxVal.Less(&col[i]) {
  3491  					maxVal = col[i]
  3492  				}
  3493  			}
  3494  		}
  3495  
  3496  		minv = types.EncodeFixed(minVal)
  3497  		maxv = types.EncodeFixed(maxVal)
  3498  
  3499  	case types.T_uuid:
  3500  		col := MustFixedCol[types.Uuid](v)
  3501  		var minVal, maxVal types.Uuid
  3502  		if v.HasNull() {
  3503  			first := true
  3504  			for i, j := 0, len(col); i < j; i++ {
  3505  				if v.IsNull(uint64(i)) {
  3506  					continue
  3507  				}
  3508  				if first {
  3509  					minVal, maxVal = col[i], col[i]
  3510  					first = false
  3511  				} else {
  3512  					if col[i].Lt(minVal) {
  3513  						minVal = col[i]
  3514  					}
  3515  					if maxVal.Lt(col[i]) {
  3516  
  3517  						maxVal = col[i]
  3518  					}
  3519  				}
  3520  			}
  3521  		} else {
  3522  			minVal, maxVal = col[0], col[0]
  3523  			for i, j := 1, len(col); i < j; i++ {
  3524  				if col[i].Lt(minVal) {
  3525  					minVal = col[i]
  3526  				}
  3527  				if maxVal.Lt(col[i]) {
  3528  					maxVal = col[i]
  3529  				}
  3530  			}
  3531  		}
  3532  
  3533  		minv = types.EncodeUuid(&minVal)
  3534  		maxv = types.EncodeUuid(&maxVal)
  3535  
  3536  	case types.T_Rowid:
  3537  		col := MustFixedCol[types.Rowid](v)
  3538  		var minVal, maxVal types.Rowid
  3539  		if v.HasNull() {
  3540  			first := true
  3541  			for i, j := 0, len(col); i < j; i++ {
  3542  				if v.IsNull(uint64(i)) {
  3543  					continue
  3544  				}
  3545  				if first {
  3546  					minVal, maxVal = col[i], col[i]
  3547  					first = false
  3548  				} else {
  3549  					if col[i].Less(minVal) {
  3550  						minVal = col[i]
  3551  					}
  3552  					if maxVal.Less(col[i]) {
  3553  
  3554  						maxVal = col[i]
  3555  					}
  3556  				}
  3557  			}
  3558  		} else {
  3559  			minVal, maxVal = col[0], col[0]
  3560  			for i, j := 1, len(col); i < j; i++ {
  3561  				if col[i].Less(minVal) {
  3562  					minVal = col[i]
  3563  				}
  3564  				if maxVal.Less(col[i]) {
  3565  					maxVal = col[i]
  3566  				}
  3567  			}
  3568  		}
  3569  
  3570  		minv = types.EncodeFixed(minVal)
  3571  		maxv = types.EncodeFixed(maxVal)
  3572  
  3573  	case types.T_char, types.T_varchar, types.T_json, types.T_binary, types.T_varbinary, types.T_blob, types.T_text:
  3574  		minv, maxv = VarlenGetMinMax(v)
  3575  	case types.T_array_float32:
  3576  		// Zone map Comparator should be consistent with the SQL Comparator for Array.
  3577  		// Hence, we are not using bytesComparator for Array.
  3578  		// [Update]: We won't be using the Min and Max inside the ZM. Vector index is going to be handled
  3579  		// outside the zonemap via indexing techniques like HNSW etc.
  3580  		// For Array ZM, we will mostly make it uninitialized or set theoretical min and max.
  3581  		_minv, _maxv := ArrayGetMinMax[float32](v)
  3582  		minv = types.ArrayToBytes[float32](_minv)
  3583  		maxv = types.ArrayToBytes[float32](_maxv)
  3584  	case types.T_array_float64:
  3585  		_minv, _maxv := ArrayGetMinMax[float64](v)
  3586  		minv = types.ArrayToBytes[float64](_minv)
  3587  		maxv = types.ArrayToBytes[float64](_maxv)
  3588  	default:
  3589  		panic(fmt.Sprintf("unsupported type %s", v.GetType().String()))
  3590  	}
  3591  	return
  3592  }
  3593  
  3594  // InplaceSortAndCompact @todo optimization in the future
  3595  func (v *Vector) InplaceSortAndCompact() {
  3596  	switch v.GetType().Oid {
  3597  	case types.T_bool:
  3598  		col := MustFixedCol[bool](v)
  3599  		sort.Slice(col, func(i, j int) bool {
  3600  			return !col[i] && col[j]
  3601  		})
  3602  		newCol := slices.Compact(col)
  3603  		if len(newCol) != len(col) {
  3604  			v.CleanOnlyData()
  3605  			v.SetSorted(true)
  3606  			appendList(v, newCol, nil, nil)
  3607  		}
  3608  
  3609  	case types.T_bit:
  3610  		col := MustFixedCol[uint64](v)
  3611  		sort.Slice(col, func(i, j int) bool {
  3612  			return col[i] < col[j]
  3613  		})
  3614  		newCol := slices.Compact(col)
  3615  		if len(newCol) != len(col) {
  3616  			v.CleanOnlyData()
  3617  			v.SetSorted(true)
  3618  			appendList(v, newCol, nil, nil)
  3619  		}
  3620  
  3621  	case types.T_int8:
  3622  		col := MustFixedCol[int8](v)
  3623  		sort.Slice(col, func(i, j int) bool {
  3624  			return col[i] < col[j]
  3625  		})
  3626  		newCol := slices.Compact(col)
  3627  		if len(newCol) != len(col) {
  3628  			v.CleanOnlyData()
  3629  			v.SetSorted(true)
  3630  			appendList(v, newCol, nil, nil)
  3631  		}
  3632  
  3633  	case types.T_int16:
  3634  		col := MustFixedCol[int16](v)
  3635  		sort.Slice(col, func(i, j int) bool {
  3636  			return col[i] < col[j]
  3637  		})
  3638  		newCol := slices.Compact(col)
  3639  		if len(newCol) != len(col) {
  3640  			v.CleanOnlyData()
  3641  			v.SetSorted(true)
  3642  			appendList(v, newCol, nil, nil)
  3643  		}
  3644  
  3645  	case types.T_int32:
  3646  		col := MustFixedCol[int32](v)
  3647  		sort.Slice(col, func(i, j int) bool {
  3648  			return col[i] < col[j]
  3649  		})
  3650  		newCol := slices.Compact(col)
  3651  		if len(newCol) != len(col) {
  3652  			v.CleanOnlyData()
  3653  			v.SetSorted(true)
  3654  			appendList(v, newCol, nil, nil)
  3655  		}
  3656  
  3657  	case types.T_int64:
  3658  		col := MustFixedCol[int64](v)
  3659  		sort.Slice(col, func(i, j int) bool {
  3660  			return col[i] < col[j]
  3661  		})
  3662  		newCol := slices.Compact(col)
  3663  		if len(newCol) != len(col) {
  3664  			v.CleanOnlyData()
  3665  			v.SetSorted(true)
  3666  			appendList(v, newCol, nil, nil)
  3667  		}
  3668  
  3669  	case types.T_uint8:
  3670  		col := MustFixedCol[uint8](v)
  3671  		sort.Slice(col, func(i, j int) bool {
  3672  			return col[i] < col[j]
  3673  		})
  3674  		newCol := slices.Compact(col)
  3675  		if len(newCol) != len(col) {
  3676  			v.CleanOnlyData()
  3677  			v.SetSorted(true)
  3678  			appendList(v, newCol, nil, nil)
  3679  		}
  3680  
  3681  	case types.T_uint16:
  3682  		col := MustFixedCol[uint16](v)
  3683  		sort.Slice(col, func(i, j int) bool {
  3684  			return col[i] < col[j]
  3685  		})
  3686  		newCol := slices.Compact(col)
  3687  		if len(newCol) != len(col) {
  3688  			v.CleanOnlyData()
  3689  			v.SetSorted(true)
  3690  			appendList(v, newCol, nil, nil)
  3691  		}
  3692  
  3693  	case types.T_uint32:
  3694  		col := MustFixedCol[uint32](v)
  3695  		sort.Slice(col, func(i, j int) bool {
  3696  			return col[i] < col[j]
  3697  		})
  3698  		newCol := slices.Compact(col)
  3699  		if len(newCol) != len(col) {
  3700  			v.CleanOnlyData()
  3701  			v.SetSorted(true)
  3702  			appendList(v, newCol, nil, nil)
  3703  		}
  3704  
  3705  	case types.T_uint64:
  3706  		col := MustFixedCol[uint64](v)
  3707  		sort.Slice(col, func(i, j int) bool {
  3708  			return col[i] < col[j]
  3709  		})
  3710  		newCol := slices.Compact(col)
  3711  		if len(newCol) != len(col) {
  3712  			v.CleanOnlyData()
  3713  			v.SetSorted(true)
  3714  			appendList(v, newCol, nil, nil)
  3715  		}
  3716  
  3717  	case types.T_float32:
  3718  		col := MustFixedCol[float32](v)
  3719  		sort.Slice(col, func(i, j int) bool {
  3720  			return col[i] < col[j]
  3721  		})
  3722  		newCol := slices.Compact(col)
  3723  		if len(newCol) != len(col) {
  3724  			v.CleanOnlyData()
  3725  			v.SetSorted(true)
  3726  			appendList(v, newCol, nil, nil)
  3727  		}
  3728  
  3729  	case types.T_float64:
  3730  		col := MustFixedCol[float64](v)
  3731  		sort.Slice(col, func(i, j int) bool {
  3732  			return col[i] < col[j]
  3733  		})
  3734  		newCol := slices.Compact(col)
  3735  		if len(newCol) != len(col) {
  3736  			v.CleanOnlyData()
  3737  			v.SetSorted(true)
  3738  			appendList(v, newCol, nil, nil)
  3739  		}
  3740  
  3741  	case types.T_date:
  3742  		col := MustFixedCol[types.Date](v)
  3743  		sort.Slice(col, func(i, j int) bool {
  3744  			return col[i] < col[j]
  3745  		})
  3746  		newCol := slices.Compact(col)
  3747  		if len(newCol) != len(col) {
  3748  			v.CleanOnlyData()
  3749  			v.SetSorted(true)
  3750  			appendList(v, newCol, nil, nil)
  3751  		}
  3752  
  3753  	case types.T_datetime:
  3754  		col := MustFixedCol[types.Datetime](v)
  3755  		sort.Slice(col, func(i, j int) bool {
  3756  			return col[i] < col[j]
  3757  		})
  3758  		newCol := slices.Compact(col)
  3759  		if len(newCol) != len(col) {
  3760  			v.CleanOnlyData()
  3761  			v.SetSorted(true)
  3762  			appendList(v, newCol, nil, nil)
  3763  		}
  3764  
  3765  	case types.T_time:
  3766  		col := MustFixedCol[types.Time](v)
  3767  		sort.Slice(col, func(i, j int) bool {
  3768  			return col[i] < col[j]
  3769  		})
  3770  		newCol := slices.Compact(col)
  3771  		if len(newCol) != len(col) {
  3772  			v.CleanOnlyData()
  3773  			v.SetSorted(true)
  3774  			appendList(v, newCol, nil, nil)
  3775  		}
  3776  
  3777  	case types.T_timestamp:
  3778  		col := MustFixedCol[types.Timestamp](v)
  3779  		sort.Slice(col, func(i, j int) bool {
  3780  			return col[i] < col[j]
  3781  		})
  3782  		newCol := slices.Compact(col)
  3783  		if len(newCol) != len(col) {
  3784  			v.CleanOnlyData()
  3785  			v.SetSorted(true)
  3786  			appendList(v, newCol, nil, nil)
  3787  		}
  3788  
  3789  	case types.T_enum:
  3790  		col := MustFixedCol[types.Enum](v)
  3791  		sort.Slice(col, func(i, j int) bool {
  3792  			return col[i] < col[j]
  3793  		})
  3794  		newCol := slices.Compact(col)
  3795  		if len(newCol) != len(col) {
  3796  			v.CleanOnlyData()
  3797  			v.SetSorted(true)
  3798  			appendList(v, newCol, nil, nil)
  3799  		}
  3800  
  3801  	case types.T_decimal64:
  3802  		col := MustFixedCol[types.Decimal64](v)
  3803  		sort.Slice(col, func(i, j int) bool {
  3804  			return col[i].Less(col[j])
  3805  		})
  3806  		newCol := slices.CompactFunc(col, func(a, b types.Decimal64) bool {
  3807  			return a.Compare(b) == 0
  3808  		})
  3809  		if len(newCol) != len(col) {
  3810  			v.CleanOnlyData()
  3811  			v.SetSorted(true)
  3812  			appendList(v, newCol, nil, nil)
  3813  		}
  3814  
  3815  	case types.T_decimal128:
  3816  		col := MustFixedCol[types.Decimal128](v)
  3817  		sort.Slice(col, func(i, j int) bool {
  3818  			return col[i].Less(col[j])
  3819  		})
  3820  		newCol := slices.CompactFunc(col, func(a, b types.Decimal128) bool {
  3821  			return a.Compare(b) == 0
  3822  		})
  3823  		if len(newCol) != len(col) {
  3824  			v.CleanOnlyData()
  3825  			v.SetSorted(true)
  3826  			appendList(v, newCol, nil, nil)
  3827  		}
  3828  
  3829  	case types.T_TS:
  3830  		col := MustFixedCol[types.TS](v)
  3831  		sort.Slice(col, func(i, j int) bool {
  3832  			return col[i].Less(&col[j])
  3833  		})
  3834  		newCol := slices.CompactFunc(col, func(a, b types.TS) bool {
  3835  			return a.Equal(&b)
  3836  		})
  3837  		if len(newCol) != len(col) {
  3838  			v.CleanOnlyData()
  3839  			v.SetSorted(true)
  3840  			appendList(v, newCol, nil, nil)
  3841  		}
  3842  
  3843  	case types.T_uuid:
  3844  		col := MustFixedCol[types.Uuid](v)
  3845  		sort.Slice(col, func(i, j int) bool {
  3846  			return col[i].Lt(col[j])
  3847  		})
  3848  		newCol := slices.CompactFunc(col, func(a, b types.Uuid) bool {
  3849  			return a.Compare(b) == 0
  3850  		})
  3851  		if len(newCol) != len(col) {
  3852  			v.CleanOnlyData()
  3853  			v.SetSorted(true)
  3854  			appendList(v, newCol, nil, nil)
  3855  		}
  3856  	case types.T_Rowid:
  3857  		col := MustFixedCol[types.Rowid](v)
  3858  		sort.Slice(col, func(i, j int) bool {
  3859  			return col[i].Less(col[j])
  3860  		})
  3861  		newCol := slices.CompactFunc(col, func(a, b types.Rowid) bool {
  3862  			return a.Equal(b)
  3863  		})
  3864  		if len(newCol) != len(col) {
  3865  			v.CleanOnlyData()
  3866  			v.SetSorted(true)
  3867  			appendList(v, newCol, nil, nil)
  3868  		}
  3869  
  3870  	case types.T_char, types.T_varchar, types.T_json, types.T_binary, types.T_varbinary, types.T_blob, types.T_text:
  3871  		col, area := MustVarlenaRawData(v)
  3872  		sort.Slice(col, func(i, j int) bool {
  3873  			return bytes.Compare(col[i].GetByteSlice(area), col[j].GetByteSlice(area)) < 0
  3874  		})
  3875  		newCol := slices.CompactFunc(col, func(a, b types.Varlena) bool {
  3876  			return bytes.Equal(a.GetByteSlice(area), b.GetByteSlice(area))
  3877  		})
  3878  		if len(newCol) != len(col) {
  3879  			v.CleanOnlyData()
  3880  			v.SetSorted(true)
  3881  			appendList(v, newCol, nil, nil)
  3882  		}
  3883  
  3884  	case types.T_array_float32:
  3885  		col, area := MustVarlenaRawData(v)
  3886  		sort.Slice(col, func(i, j int) bool {
  3887  			return moarray.Compare[float32](
  3888  				types.GetArray[float32](&col[i], area),
  3889  				types.GetArray[float32](&col[j], area),
  3890  			) < 0
  3891  		})
  3892  		newCol := slices.CompactFunc(col, func(a, b types.Varlena) bool {
  3893  			return moarray.Compare[float32](
  3894  				types.GetArray[float32](&a, area),
  3895  				types.GetArray[float32](&b, area),
  3896  			) == 0
  3897  		})
  3898  		if len(newCol) != len(col) {
  3899  			v.CleanOnlyData()
  3900  			v.SetSorted(true)
  3901  			appendList(v, newCol, nil, nil)
  3902  		}
  3903  
  3904  	case types.T_array_float64:
  3905  		col, area := MustVarlenaRawData(v)
  3906  		sort.Slice(col, func(i, j int) bool {
  3907  			return moarray.Compare[float64](
  3908  				types.GetArray[float64](&col[i], area),
  3909  				types.GetArray[float64](&col[j], area),
  3910  			) < 0
  3911  		})
  3912  		newCol := slices.CompactFunc(col, func(a, b types.Varlena) bool {
  3913  			return moarray.Compare[float64](
  3914  				types.GetArray[float64](&a, area),
  3915  				types.GetArray[float64](&b, area),
  3916  			) == 0
  3917  		})
  3918  		if len(newCol) != len(col) {
  3919  			v.CleanOnlyData()
  3920  			v.SetSorted(true)
  3921  			appendList(v, newCol, nil, nil)
  3922  		}
  3923  	}
  3924  }
  3925  
  3926  func (v *Vector) InplaceSort() {
  3927  	switch v.GetType().Oid {
  3928  	case types.T_bool:
  3929  		col := MustFixedCol[bool](v)
  3930  		sort.Slice(col, func(i, j int) bool {
  3931  			return !col[i] && col[j]
  3932  		})
  3933  
  3934  	case types.T_bit:
  3935  		col := MustFixedCol[uint64](v)
  3936  		sort.Slice(col, func(i, j int) bool {
  3937  			return col[i] < col[j]
  3938  		})
  3939  
  3940  	case types.T_int8:
  3941  		col := MustFixedCol[int8](v)
  3942  		sort.Slice(col, func(i, j int) bool {
  3943  			return col[i] < col[j]
  3944  		})
  3945  
  3946  	case types.T_int16:
  3947  		col := MustFixedCol[int16](v)
  3948  		sort.Slice(col, func(i, j int) bool {
  3949  			return col[i] < col[j]
  3950  		})
  3951  
  3952  	case types.T_int32:
  3953  		col := MustFixedCol[int32](v)
  3954  		sort.Slice(col, func(i, j int) bool {
  3955  			return col[i] < col[j]
  3956  		})
  3957  
  3958  	case types.T_int64:
  3959  		col := MustFixedCol[int64](v)
  3960  		sort.Slice(col, func(i, j int) bool {
  3961  			return col[i] < col[j]
  3962  		})
  3963  
  3964  	case types.T_uint8:
  3965  		col := MustFixedCol[uint8](v)
  3966  		sort.Slice(col, func(i, j int) bool {
  3967  			return col[i] < col[j]
  3968  		})
  3969  
  3970  	case types.T_uint16:
  3971  		col := MustFixedCol[uint16](v)
  3972  		sort.Slice(col, func(i, j int) bool {
  3973  			return col[i] < col[j]
  3974  		})
  3975  
  3976  	case types.T_uint32:
  3977  		col := MustFixedCol[uint32](v)
  3978  		sort.Slice(col, func(i, j int) bool {
  3979  			return col[i] < col[j]
  3980  		})
  3981  
  3982  	case types.T_uint64:
  3983  		col := MustFixedCol[uint64](v)
  3984  		sort.Slice(col, func(i, j int) bool {
  3985  			return col[i] < col[j]
  3986  		})
  3987  
  3988  	case types.T_float32:
  3989  		col := MustFixedCol[float32](v)
  3990  		sort.Slice(col, func(i, j int) bool {
  3991  			return col[i] < col[j]
  3992  		})
  3993  
  3994  	case types.T_float64:
  3995  		col := MustFixedCol[float64](v)
  3996  		sort.Slice(col, func(i, j int) bool {
  3997  			return col[i] < col[j]
  3998  		})
  3999  
  4000  	case types.T_date:
  4001  		col := MustFixedCol[types.Date](v)
  4002  		sort.Slice(col, func(i, j int) bool {
  4003  			return col[i] < col[j]
  4004  		})
  4005  
  4006  	case types.T_datetime:
  4007  		col := MustFixedCol[types.Datetime](v)
  4008  		sort.Slice(col, func(i, j int) bool {
  4009  			return col[i] < col[j]
  4010  		})
  4011  
  4012  	case types.T_time:
  4013  		col := MustFixedCol[types.Time](v)
  4014  		sort.Slice(col, func(i, j int) bool {
  4015  			return col[i] < col[j]
  4016  		})
  4017  
  4018  	case types.T_timestamp:
  4019  		col := MustFixedCol[types.Timestamp](v)
  4020  		sort.Slice(col, func(i, j int) bool {
  4021  			return col[i] < col[j]
  4022  		})
  4023  
  4024  	case types.T_enum:
  4025  		col := MustFixedCol[types.Enum](v)
  4026  		sort.Slice(col, func(i, j int) bool {
  4027  			return col[i] < col[j]
  4028  		})
  4029  
  4030  	case types.T_decimal64:
  4031  		col := MustFixedCol[types.Decimal64](v)
  4032  		sort.Slice(col, func(i, j int) bool {
  4033  			return col[i].Less(col[j])
  4034  		})
  4035  
  4036  	case types.T_decimal128:
  4037  		col := MustFixedCol[types.Decimal128](v)
  4038  		sort.Slice(col, func(i, j int) bool {
  4039  			return col[i].Less(col[j])
  4040  		})
  4041  
  4042  	case types.T_TS:
  4043  		col := MustFixedCol[types.TS](v)
  4044  		sort.Slice(col, func(i, j int) bool {
  4045  			return col[i].Less(&col[j])
  4046  		})
  4047  
  4048  	case types.T_uuid:
  4049  		col := MustFixedCol[types.Uuid](v)
  4050  		sort.Slice(col, func(i, j int) bool {
  4051  			return col[i].Lt(col[j])
  4052  		})
  4053  
  4054  	case types.T_Rowid:
  4055  		col := MustFixedCol[types.Rowid](v)
  4056  		sort.Slice(col, func(i, j int) bool {
  4057  			return col[i].Less(col[j])
  4058  		})
  4059  
  4060  	case types.T_char, types.T_varchar, types.T_json, types.T_binary, types.T_varbinary, types.T_blob, types.T_text:
  4061  		col, area := MustVarlenaRawData(v)
  4062  		sort.Slice(col, func(i, j int) bool {
  4063  			return bytes.Compare(col[i].GetByteSlice(area), col[j].GetByteSlice(area)) < 0
  4064  		})
  4065  
  4066  	case types.T_array_float32:
  4067  		col, area := MustVarlenaRawData(v)
  4068  		sort.Slice(col, func(i, j int) bool {
  4069  			return moarray.Compare[float32](
  4070  				types.GetArray[float32](&col[i], area),
  4071  				types.GetArray[float32](&col[j], area),
  4072  			) < 0
  4073  		})
  4074  	case types.T_array_float64:
  4075  		col, area := MustVarlenaRawData(v)
  4076  		sort.Slice(col, func(i, j int) bool {
  4077  			return moarray.Compare[float64](
  4078  				types.GetArray[float64](&col[i], area),
  4079  				types.GetArray[float64](&col[j], area),
  4080  			) < 0
  4081  		})
  4082  	}
  4083  }
  4084  
  4085  func BuildVarlenaInline(v1, v2 *types.Varlena) {
  4086  	// use three dword operation to improve performance
  4087  	p1 := v1.UnsafePtr()
  4088  	p2 := v2.UnsafePtr()
  4089  	*(*int64)(p1) = *(*int64)(p2)
  4090  	*(*int64)(unsafe.Add(p1, 8)) = *(*int64)(unsafe.Add(p2, 8))
  4091  	*(*int64)(unsafe.Add(p1, 16)) = *(*int64)(unsafe.Add(p2, 16))
  4092  }
  4093  
  4094  func BuildVarlenaNoInline(vec *Vector, v1 *types.Varlena, bs *[]byte, m *mpool.MPool) error {
  4095  	vlen := len(*bs)
  4096  	area1 := vec.GetArea()
  4097  	voff := len(area1)
  4098  	if voff+vlen <= cap(area1) || m == nil {
  4099  		area1 = append(area1, *bs...)
  4100  		v1.SetOffsetLen(uint32(voff), uint32(vlen))
  4101  		vec.SetArea(area1)
  4102  		return nil
  4103  	}
  4104  	var err error
  4105  	area1, err = m.Grow2(area1, *bs, voff+vlen)
  4106  	if err != nil {
  4107  		return err
  4108  	}
  4109  	v1.SetOffsetLen(uint32(voff), uint32(vlen))
  4110  	vec.SetArea(area1)
  4111  	return nil
  4112  }
  4113  
  4114  func BuildVarlenaFromValena(vec *Vector, v1, v2 *types.Varlena, area *[]byte, m *mpool.MPool) error {
  4115  	if (*v2)[0] <= types.VarlenaInlineSize {
  4116  		BuildVarlenaInline(v1, v2)
  4117  		return nil
  4118  	}
  4119  	voff, vlen := v2.OffsetLen()
  4120  	bs := (*area)[voff : voff+vlen]
  4121  	return BuildVarlenaNoInline(vec, v1, &bs, m)
  4122  }
  4123  
  4124  func BuildVarlenaFromByteSlice(vec *Vector, v *types.Varlena, bs *[]byte, m *mpool.MPool) error {
  4125  	vlen := len(*bs)
  4126  	if vlen <= types.VarlenaInlineSize {
  4127  		// first clear varlena to 0
  4128  		p1 := v.UnsafePtr()
  4129  		*(*int64)(p1) = 0
  4130  		*(*int64)(unsafe.Add(p1, 8)) = 0
  4131  		*(*int64)(unsafe.Add(p1, 16)) = 0
  4132  		v[0] = byte(vlen)
  4133  		copy(v[1:1+vlen], *bs)
  4134  		return nil
  4135  	}
  4136  	return BuildVarlenaNoInline(vec, v, bs, m)
  4137  }
  4138  
  4139  // BuildVarlenaFromArray convert array to Varlena so that it can be stored in the vector
  4140  func BuildVarlenaFromArray[T types.RealNumbers](vec *Vector, v *types.Varlena, array *[]T, m *mpool.MPool) error {
  4141  	_bs := types.ArrayToBytes[T](*array)
  4142  	bs := &_bs
  4143  	vlen := len(*bs)
  4144  	if vlen <= types.VarlenaInlineSize {
  4145  		// first clear varlena to 0
  4146  		p1 := v.UnsafePtr()
  4147  		*(*int64)(p1) = 0
  4148  		*(*int64)(unsafe.Add(p1, 8)) = 0
  4149  		*(*int64)(unsafe.Add(p1, 16)) = 0
  4150  		v[0] = byte(vlen)
  4151  		copy(v[1:1+vlen], *bs)
  4152  		return nil
  4153  	}
  4154  	return BuildVarlenaNoInline(vec, v, bs, m)
  4155  }