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 }