github.com/matrixorigin/matrixone@v0.7.0/pkg/sql/plan/function/operator/cast_test.go (about) 1 // Copyright 2022 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 operator 16 17 import ( 18 "testing" 19 "time" 20 21 roaring "github.com/RoaringBitmap/roaring/roaring64" 22 "github.com/matrixorigin/matrixone/pkg/container/nulls" 23 "github.com/matrixorigin/matrixone/pkg/container/types" 24 "github.com/matrixorigin/matrixone/pkg/container/vector" 25 "github.com/matrixorigin/matrixone/pkg/testutil" 26 "github.com/matrixorigin/matrixone/pkg/vm/process" 27 "github.com/smartystreets/goconvey/convey" 28 "github.com/stretchr/testify/require" 29 ) 30 31 func TestCastStringToJson(t *testing.T) { 32 makeTempVectors := func(src string, srcIsConst bool, destType types.T) []*vector.Vector { 33 vectors := make([]*vector.Vector, 2) 34 vectors[0] = makeStringVector(src, types.T_varchar, srcIsConst) 35 vectors[1] = makeTypeVector(destType) 36 return vectors 37 } 38 type caseStruct struct { 39 name string 40 vecs []*vector.Vector 41 proc *process.Process 42 wantValues interface{} 43 wantScalar bool 44 } 45 makeCase := func(name string, src string, srcIsConst bool, procs *process.Process, destType types.T, wantScalar bool) caseStruct { 46 return caseStruct{ 47 name: name, 48 vecs: makeTempVectors(src, srcIsConst, destType), 49 proc: procs, 50 wantValues: src, 51 wantScalar: wantScalar, 52 } 53 } 54 procs := testutil.NewProc() 55 cases := []caseStruct{ 56 makeCase("Test01", `{"a":1,"b":2}`, true, procs, types.T_json, true), 57 makeCase("Test02", `{"a":1,"b":2}`, false, procs, types.T_json, false), 58 } 59 for _, c := range cases { 60 t.Run(c.name, func(t *testing.T) { 61 castRes, err := Cast(c.vecs, c.proc) 62 if err != nil { 63 t.Fatal(err) 64 } 65 require.JSONEq(t, c.wantValues.(string), types.DecodeJson(castRes.GetBytes(0)).String()) 66 require.Equal(t, c.wantScalar, castRes.IsScalar()) 67 }) 68 } 69 } 70 71 func TestCastSameType(t *testing.T) { 72 makeTempVectors := func(src interface{}, destType types.T, srcIsConst bool) []*vector.Vector { 73 vectors := make([]*vector.Vector, 2) 74 vectors[0] = makeVector(src, srcIsConst) 75 vectors[1] = makeTypeVector(destType) 76 return vectors 77 } 78 79 procs := testutil.NewProc() 80 cases := []struct { 81 name string 82 vecs []*vector.Vector 83 proc *process.Process 84 wantValues interface{} 85 wantScalar bool 86 }{ 87 { 88 name: "Test01", 89 vecs: makeTempVectors(int8(-23), types.T_int8, true), 90 proc: procs, 91 wantValues: []int8{-23}, 92 wantScalar: true, 93 }, 94 { 95 name: "Test02", 96 vecs: makeTempVectors(int16(-23), types.T_int16, true), 97 proc: procs, 98 wantValues: []int16{-23}, 99 wantScalar: true, 100 }, 101 { 102 name: "Test03", 103 vecs: makeTempVectors(int32(-23), types.T_int32, true), 104 proc: procs, 105 wantValues: []int32{-23}, 106 wantScalar: true, 107 }, 108 { 109 name: "Test04", 110 vecs: makeTempVectors(int64(-23), types.T_int64, true), 111 proc: procs, 112 wantValues: []int64{-23}, 113 wantScalar: true, 114 }, 115 { 116 name: "Test05", 117 vecs: makeTempVectors(uint8(23), types.T_uint8, true), 118 proc: procs, 119 wantValues: []uint8{23}, 120 wantScalar: true, 121 }, 122 { 123 name: "Test06", 124 vecs: makeTempVectors(uint16(23), types.T_uint16, true), 125 proc: procs, 126 wantValues: []uint16{23}, 127 wantScalar: true, 128 }, 129 { 130 name: "Test07", 131 vecs: makeTempVectors(uint32(23), types.T_uint32, true), 132 proc: procs, 133 wantValues: []uint32{23}, 134 wantScalar: true, 135 }, 136 { 137 name: "Test08", 138 vecs: makeTempVectors(uint64(23), types.T_uint64, true), 139 proc: procs, 140 wantValues: []uint64{23}, 141 wantScalar: true, 142 }, 143 { 144 name: "Test09", 145 vecs: makeTempVectors(float32(23.5), types.T_float32, true), 146 proc: procs, 147 wantValues: []float32{23.5}, 148 wantScalar: true, 149 }, 150 { 151 name: "Test10", 152 vecs: makeTempVectors(float64(23.5), types.T_float64, true), 153 proc: procs, 154 wantValues: []float64{23.5}, 155 wantScalar: true, 156 }, 157 { 158 name: "Test11", 159 vecs: makeTempVectors(int8(-23), types.T_int8, false), 160 proc: procs, 161 wantValues: []int8{-23}, 162 wantScalar: false, 163 }, 164 { 165 name: "Test12", 166 vecs: makeTempVectors(int16(-23), types.T_int16, false), 167 proc: procs, 168 wantValues: []int16{-23}, 169 wantScalar: false, 170 }, 171 { 172 name: "Test13", 173 vecs: makeTempVectors(int32(-23), types.T_int32, false), 174 proc: procs, 175 wantValues: []int32{-23}, 176 wantScalar: false, 177 }, 178 { 179 name: "Test14", 180 vecs: makeTempVectors(int64(-23), types.T_int64, false), 181 proc: procs, 182 wantValues: []int64{-23}, 183 wantScalar: false, 184 }, 185 { 186 name: "Test15", 187 vecs: makeTempVectors(uint8(23), types.T_uint8, false), 188 proc: procs, 189 wantValues: []uint8{23}, 190 wantScalar: false, 191 }, 192 { 193 name: "Test16", 194 vecs: makeTempVectors(uint16(23), types.T_uint16, false), 195 proc: procs, 196 wantValues: []uint16{23}, 197 wantScalar: false, 198 }, 199 { 200 name: "Test17", 201 vecs: makeTempVectors(uint32(23), types.T_uint32, false), 202 proc: procs, 203 wantValues: []uint32{23}, 204 wantScalar: false, 205 }, 206 { 207 name: "Test18", 208 vecs: makeTempVectors(uint64(23), types.T_uint64, false), 209 proc: procs, 210 wantValues: []uint64{23}, 211 wantScalar: false, 212 }, 213 { 214 name: "Test19", 215 vecs: makeTempVectors(float32(23.5), types.T_float32, false), 216 proc: procs, 217 wantValues: []float32{23.5}, 218 wantScalar: false, 219 }, 220 { 221 name: "Test20", 222 vecs: makeTempVectors(float64(23.5), types.T_float64, false), 223 proc: procs, 224 wantValues: []float64{23.5}, 225 wantScalar: false, 226 }, 227 } 228 229 for _, c := range cases { 230 t.Run(c.name, func(t *testing.T) { 231 castRes, err := Cast(c.vecs, c.proc) 232 if err != nil { 233 t.Fatal(err) 234 } 235 require.Equal(t, c.wantValues, castRes.Col) 236 require.Equal(t, c.wantScalar, castRes.IsScalar()) 237 }) 238 } 239 } 240 241 func TestCastSameType2(t *testing.T) { 242 makeTempVectors := func(src interface{}, destType types.T, srcIsConst bool) []*vector.Vector { 243 vectors := make([]*vector.Vector, 2) 244 vectors[0] = makeVector(src, srcIsConst) 245 vectors[1] = makeTypeVector(destType) 246 return vectors 247 } 248 249 procs := testutil.NewProc() 250 //types.Date | types.Time | types.Datetime | types.Timestamp 251 cases := []struct { 252 name string 253 vecs []*vector.Vector 254 proc *process.Process 255 wantValues interface{} 256 wantScalar bool 257 }{ 258 { 259 name: "Test01", 260 vecs: makeTempVectors(types.Date(729848), types.T_date, true), 261 proc: procs, 262 wantValues: []types.Date{729848}, 263 wantScalar: true, 264 }, 265 { 266 name: "Test02", 267 vecs: makeTempVectors(types.Datetime(66122056321728512), types.T_datetime, true), 268 proc: procs, 269 wantValues: []types.Datetime{66122056321728512}, 270 wantScalar: true, 271 }, 272 { 273 name: "Test03", 274 vecs: makeTempVectors(types.Timestamp(66122026122739712), types.T_timestamp, true), 275 proc: procs, 276 wantValues: []types.Timestamp{66122026122739712}, 277 wantScalar: true, 278 }, 279 { 280 name: "Test04", 281 vecs: makeTempVectors(types.Date(729848), types.T_date, false), 282 proc: procs, 283 wantValues: []types.Date{729848}, 284 wantScalar: false, 285 }, 286 { 287 name: "Test05", 288 vecs: makeTempVectors(types.Datetime(66122056321728512), types.T_datetime, false), 289 proc: procs, 290 wantValues: []types.Datetime{66122056321728512}, 291 wantScalar: false, 292 }, 293 { 294 name: "Test06", 295 vecs: makeTempVectors(types.Timestamp(66122026122739712), types.T_timestamp, false), 296 proc: procs, 297 wantValues: []types.Timestamp{66122026122739712}, 298 wantScalar: false, 299 }, 300 { 301 name: "Test07", 302 vecs: makeTempVectors(types.Time(661220261227), types.T_time, false), 303 proc: procs, 304 wantValues: []types.Time{661220261227}, 305 wantScalar: false, 306 }, 307 } 308 for _, c := range cases { 309 t.Run(c.name, func(t *testing.T) { 310 castRes, err := Cast(c.vecs, c.proc) 311 if err != nil { 312 t.Fatal(err) 313 } 314 require.Equal(t, c.wantValues, castRes.Col) 315 require.Equal(t, c.wantScalar, castRes.IsScalar()) 316 }) 317 } 318 } 319 320 func TestCastLeftToRight(t *testing.T) { 321 // int8 -> (int16/int32/int64/uint8/uint16/uint32/uint64/float32/float64) 322 // int16 -> (int8/int32/int64/uint8/uint16/uint32/uint64/float32/float64) 323 // int32 -> (int8/int16/int64/uint8/uint16/uint32/uint64/float32/float64) 324 // int64 -> (int8/int16/int32/uint8/uint16/uint32/uint64/float32/float64) 325 // uint8 -> (int8/int16/int32/int64/uint16/uint32/uint64/float32/float64) 326 // uint16 -> (int8/int16/int32/int64/uint8/uint32/uint64/float32/float64) 327 // uint32 -> (int8/int16/int32/int64/uint8/uint16/uint64/float32/float64) 328 // uint64 -> (int8/int16/int32/int64/uint8/uint16/uint32/float32/float64) 329 // float32 -> (int8/int16/int32/int64/uint8/uint16/uint32/uint64/float64) 330 // float64 -> (int8/int16/int32/int64/uint8/uint16/uint32/uint64/float32) 331 332 makeTempVectors := func(src interface{}, destType types.T, srcIsConst bool) []*vector.Vector { 333 vectors := make([]*vector.Vector, 2) 334 vectors[0] = makeVector(src, srcIsConst) 335 vectors[1] = makeTypeVector(destType) 336 return vectors 337 } 338 339 procs := testutil.NewProc() 340 cases := []struct { 341 name string 342 vecs []*vector.Vector 343 proc *process.Process 344 wantValues interface{} 345 wantScalar bool 346 }{ 347 { 348 name: "Test01", 349 vecs: makeTempVectors(int8(125), types.T_int8, true), 350 proc: procs, 351 wantValues: []int8{125}, 352 wantScalar: true, 353 }, 354 { 355 name: "Test02", 356 vecs: makeTempVectors(int8(125), types.T_int16, true), 357 proc: procs, 358 wantValues: []int16{125}, 359 wantScalar: true, 360 }, 361 { 362 name: "Test03", 363 vecs: makeTempVectors(int8(125), types.T_int32, true), 364 proc: procs, 365 wantValues: []int32{125}, 366 wantScalar: true, 367 }, 368 { 369 name: "Test04", 370 vecs: makeTempVectors(int8(125), types.T_int64, true), 371 proc: procs, 372 wantValues: []int64{125}, 373 wantScalar: true, 374 }, 375 { 376 name: "Test05", 377 vecs: makeTempVectors(int8(125), types.T_uint8, true), 378 proc: procs, 379 wantValues: []uint8{125}, 380 wantScalar: true, 381 }, 382 { 383 name: "Test06", 384 vecs: makeTempVectors(int8(125), types.T_uint16, true), 385 proc: procs, 386 wantValues: []uint16{125}, 387 wantScalar: true, 388 }, 389 { 390 name: "Test07", 391 vecs: makeTempVectors(int8(125), types.T_uint32, true), 392 proc: procs, 393 wantValues: []uint32{125}, 394 wantScalar: true, 395 }, 396 { 397 name: "Test08", 398 vecs: makeTempVectors(int8(125), types.T_uint64, true), 399 proc: procs, 400 wantValues: []uint64{125}, 401 wantScalar: true, 402 }, 403 { 404 name: "Test09", 405 vecs: makeTempVectors(int8(125), types.T_float32, true), 406 proc: procs, 407 wantValues: []float32{125}, 408 wantScalar: true, 409 }, 410 { 411 name: "Test10", 412 vecs: makeTempVectors(int8(125), types.T_float64, true), 413 proc: procs, 414 wantValues: []float64{125}, 415 wantScalar: true, 416 }, 417 { 418 name: "Test11", 419 vecs: makeTempVectors(int16(125), types.T_int8, true), 420 proc: procs, 421 wantValues: []int8{125}, 422 wantScalar: true, 423 }, 424 { 425 name: "Test12", 426 vecs: makeTempVectors(int16(125), types.T_int16, true), 427 proc: procs, 428 wantValues: []int16{125}, 429 wantScalar: true, 430 }, 431 { 432 name: "Test13", 433 vecs: makeTempVectors(int16(125), types.T_int32, true), 434 proc: procs, 435 wantValues: []int32{125}, 436 wantScalar: true, 437 }, 438 { 439 name: "Test14", 440 vecs: makeTempVectors(int16(125), types.T_int64, true), 441 proc: procs, 442 wantValues: []int64{125}, 443 wantScalar: true, 444 }, 445 { 446 name: "Test15", 447 vecs: makeTempVectors(int16(125), types.T_uint8, true), 448 proc: procs, 449 wantValues: []uint8{125}, 450 wantScalar: true, 451 }, 452 { 453 name: "Test16", 454 vecs: makeTempVectors(int16(125), types.T_uint16, true), 455 proc: procs, 456 wantValues: []uint16{125}, 457 wantScalar: true, 458 }, 459 { 460 name: "Test17", 461 vecs: makeTempVectors(int16(125), types.T_uint32, true), 462 proc: procs, 463 wantValues: []uint32{125}, 464 wantScalar: true, 465 }, 466 { 467 name: "Test18", 468 vecs: makeTempVectors(int16(125), types.T_uint64, true), 469 proc: procs, 470 wantValues: []uint64{125}, 471 wantScalar: true, 472 }, 473 { 474 name: "Test19", 475 vecs: makeTempVectors(int16(125), types.T_float32, true), 476 proc: procs, 477 wantValues: []float32{125}, 478 wantScalar: true, 479 }, 480 { 481 name: "Test20", 482 vecs: makeTempVectors(int16(125), types.T_float64, true), 483 proc: procs, 484 wantValues: []float64{125}, 485 wantScalar: true, 486 }, 487 { 488 name: "Test21", 489 vecs: makeTempVectors(int32(125), types.T_int8, true), 490 proc: procs, 491 wantValues: []int8{125}, 492 wantScalar: true, 493 }, 494 { 495 name: "Test22", 496 vecs: makeTempVectors(int32(125), types.T_int16, true), 497 proc: procs, 498 wantValues: []int16{125}, 499 wantScalar: true, 500 }, 501 { 502 name: "Test23", 503 vecs: makeTempVectors(int32(125), types.T_int32, true), 504 proc: procs, 505 wantValues: []int32{125}, 506 wantScalar: true, 507 }, 508 { 509 name: "Test24", 510 vecs: makeTempVectors(int32(125), types.T_int64, true), 511 proc: procs, 512 wantValues: []int64{125}, 513 wantScalar: true, 514 }, 515 { 516 name: "Test25", 517 vecs: makeTempVectors(int32(125), types.T_uint8, true), 518 proc: procs, 519 wantValues: []uint8{125}, 520 wantScalar: true, 521 }, 522 { 523 name: "Test26", 524 vecs: makeTempVectors(int32(125), types.T_uint16, true), 525 proc: procs, 526 wantValues: []uint16{125}, 527 wantScalar: true, 528 }, 529 { 530 name: "Test27", 531 vecs: makeTempVectors(int32(125), types.T_uint32, true), 532 proc: procs, 533 wantValues: []uint32{125}, 534 wantScalar: true, 535 }, 536 { 537 name: "Test28", 538 vecs: makeTempVectors(int32(125), types.T_uint64, true), 539 proc: procs, 540 wantValues: []uint64{125}, 541 wantScalar: true, 542 }, 543 { 544 name: "Test29", 545 vecs: makeTempVectors(int32(125), types.T_float32, true), 546 proc: procs, 547 wantValues: []float32{125}, 548 wantScalar: true, 549 }, 550 { 551 name: "Test30", 552 vecs: makeTempVectors(int32(125), types.T_float64, true), 553 proc: procs, 554 wantValues: []float64{125}, 555 wantScalar: true, 556 }, 557 { 558 name: "Test31", 559 vecs: makeTempVectors(int64(125), types.T_int8, true), 560 proc: procs, 561 wantValues: []int8{125}, 562 wantScalar: true, 563 }, 564 { 565 name: "Test32", 566 vecs: makeTempVectors(int64(125), types.T_int16, true), 567 proc: procs, 568 wantValues: []int16{125}, 569 wantScalar: true, 570 }, 571 { 572 name: "Test33", 573 vecs: makeTempVectors(int64(125), types.T_int32, true), 574 proc: procs, 575 wantValues: []int32{125}, 576 wantScalar: true, 577 }, 578 { 579 name: "Test34", 580 vecs: makeTempVectors(int64(125), types.T_int64, true), 581 proc: procs, 582 wantValues: []int64{125}, 583 wantScalar: true, 584 }, 585 { 586 name: "Test35", 587 vecs: makeTempVectors(int64(125), types.T_uint8, true), 588 proc: procs, 589 wantValues: []uint8{125}, 590 wantScalar: true, 591 }, 592 { 593 name: "Test36", 594 vecs: makeTempVectors(int64(125), types.T_uint16, true), 595 proc: procs, 596 wantValues: []uint16{125}, 597 wantScalar: true, 598 }, 599 { 600 name: "Test37", 601 vecs: makeTempVectors(int64(125), types.T_uint32, true), 602 proc: procs, 603 wantValues: []uint32{125}, 604 wantScalar: true, 605 }, 606 { 607 name: "Test38", 608 vecs: makeTempVectors(int64(125), types.T_uint64, true), 609 proc: procs, 610 wantValues: []uint64{125}, 611 wantScalar: true, 612 }, 613 { 614 name: "Test39", 615 vecs: makeTempVectors(int64(125), types.T_float32, true), 616 proc: procs, 617 wantValues: []float32{125}, 618 wantScalar: true, 619 }, 620 { 621 name: "Test40", 622 vecs: makeTempVectors(int64(125), types.T_float64, true), 623 proc: procs, 624 wantValues: []float64{125}, 625 wantScalar: true, 626 }, 627 { 628 name: "Test41", 629 vecs: makeTempVectors(uint8(125), types.T_int8, true), 630 proc: procs, 631 wantValues: []int8{125}, 632 wantScalar: true, 633 }, 634 { 635 name: "Test42", 636 vecs: makeTempVectors(uint8(125), types.T_int16, true), 637 proc: procs, 638 wantValues: []int16{125}, 639 wantScalar: true, 640 }, 641 { 642 name: "Test43", 643 vecs: makeTempVectors(uint8(125), types.T_int32, true), 644 proc: procs, 645 wantValues: []int32{125}, 646 wantScalar: true, 647 }, 648 { 649 name: "Test44", 650 vecs: makeTempVectors(uint8(125), types.T_int64, true), 651 proc: procs, 652 wantValues: []int64{125}, 653 wantScalar: true, 654 }, 655 { 656 name: "Test45", 657 vecs: makeTempVectors(uint8(125), types.T_uint8, true), 658 proc: procs, 659 wantValues: []uint8{125}, 660 wantScalar: true, 661 }, 662 { 663 name: "Test46", 664 vecs: makeTempVectors(uint8(125), types.T_uint16, true), 665 proc: procs, 666 wantValues: []uint16{125}, 667 wantScalar: true, 668 }, 669 { 670 name: "Test47", 671 vecs: makeTempVectors(uint8(125), types.T_uint32, true), 672 proc: procs, 673 wantValues: []uint32{125}, 674 wantScalar: true, 675 }, 676 { 677 name: "Test48", 678 vecs: makeTempVectors(uint8(125), types.T_uint64, true), 679 proc: procs, 680 wantValues: []uint64{125}, 681 wantScalar: true, 682 }, 683 { 684 name: "Test49", 685 vecs: makeTempVectors(uint8(125), types.T_float32, true), 686 proc: procs, 687 wantValues: []float32{125}, 688 wantScalar: true, 689 }, 690 { 691 name: "Test50", 692 vecs: makeTempVectors(uint8(125), types.T_float64, true), 693 proc: procs, 694 wantValues: []float64{125}, 695 wantScalar: true, 696 }, 697 { 698 name: "Test51", 699 vecs: makeTempVectors(uint16(125), types.T_int8, true), 700 proc: procs, 701 wantValues: []int8{125}, 702 wantScalar: true, 703 }, 704 { 705 name: "Test52", 706 vecs: makeTempVectors(uint16(125), types.T_int16, true), 707 proc: procs, 708 wantValues: []int16{125}, 709 wantScalar: true, 710 }, 711 { 712 name: "Test53", 713 vecs: makeTempVectors(uint16(125), types.T_int32, true), 714 proc: procs, 715 wantValues: []int32{125}, 716 wantScalar: true, 717 }, 718 { 719 name: "Test54", 720 vecs: makeTempVectors(uint16(125), types.T_int64, true), 721 proc: procs, 722 wantValues: []int64{125}, 723 wantScalar: true, 724 }, 725 { 726 name: "Test55", 727 vecs: makeTempVectors(uint16(125), types.T_uint8, true), 728 proc: procs, 729 wantValues: []uint8{125}, 730 wantScalar: true, 731 }, 732 { 733 name: "Test56", 734 vecs: makeTempVectors(uint16(125), types.T_uint16, true), 735 proc: procs, 736 wantValues: []uint16{125}, 737 wantScalar: true, 738 }, 739 { 740 name: "Test57", 741 vecs: makeTempVectors(uint16(125), types.T_uint32, true), 742 proc: procs, 743 wantValues: []uint32{125}, 744 wantScalar: true, 745 }, 746 { 747 name: "Test58", 748 vecs: makeTempVectors(uint16(125), types.T_uint64, true), 749 proc: procs, 750 wantValues: []uint64{125}, 751 wantScalar: true, 752 }, 753 { 754 name: "Test59", 755 vecs: makeTempVectors(uint16(125), types.T_float32, true), 756 proc: procs, 757 wantValues: []float32{125}, 758 wantScalar: true, 759 }, 760 { 761 name: "Test60", 762 vecs: makeTempVectors(uint16(125), types.T_float64, true), 763 proc: procs, 764 wantValues: []float64{125}, 765 wantScalar: true, 766 }, 767 { 768 name: "Test61", 769 vecs: makeTempVectors(uint32(125), types.T_int8, true), 770 proc: procs, 771 wantValues: []int8{125}, 772 wantScalar: true, 773 }, 774 { 775 name: "Test62", 776 vecs: makeTempVectors(uint32(125), types.T_int16, true), 777 proc: procs, 778 wantValues: []int16{125}, 779 wantScalar: true, 780 }, 781 { 782 name: "Test63", 783 vecs: makeTempVectors(uint32(125), types.T_int32, true), 784 proc: procs, 785 wantValues: []int32{125}, 786 wantScalar: true, 787 }, 788 { 789 name: "Test64", 790 vecs: makeTempVectors(uint32(125), types.T_int64, true), 791 proc: procs, 792 wantValues: []int64{125}, 793 wantScalar: true, 794 }, 795 { 796 name: "Test65", 797 vecs: makeTempVectors(uint32(125), types.T_uint8, true), 798 proc: procs, 799 wantValues: []uint8{125}, 800 wantScalar: true, 801 }, 802 { 803 name: "Test66", 804 vecs: makeTempVectors(uint32(125), types.T_uint16, true), 805 proc: procs, 806 wantValues: []uint16{125}, 807 wantScalar: true, 808 }, 809 { 810 name: "Test67", 811 vecs: makeTempVectors(uint32(125), types.T_uint32, true), 812 proc: procs, 813 wantValues: []uint32{125}, 814 wantScalar: true, 815 }, 816 { 817 name: "Test68", 818 vecs: makeTempVectors(uint32(125), types.T_uint64, true), 819 proc: procs, 820 wantValues: []uint64{125}, 821 wantScalar: true, 822 }, 823 { 824 name: "Test69", 825 vecs: makeTempVectors(uint32(125), types.T_float32, true), 826 proc: procs, 827 wantValues: []float32{125}, 828 wantScalar: true, 829 }, 830 { 831 name: "Test70", 832 vecs: makeTempVectors(uint32(125), types.T_float64, true), 833 proc: procs, 834 wantValues: []float64{125}, 835 wantScalar: true, 836 }, 837 { 838 name: "Test71", 839 vecs: makeTempVectors(uint64(125), types.T_int8, true), 840 proc: procs, 841 wantValues: []int8{125}, 842 wantScalar: true, 843 }, 844 { 845 name: "Test72", 846 vecs: makeTempVectors(uint64(125), types.T_int16, true), 847 proc: procs, 848 wantValues: []int16{125}, 849 wantScalar: true, 850 }, 851 { 852 name: "Test73", 853 vecs: makeTempVectors(uint64(125), types.T_int32, true), 854 proc: procs, 855 wantValues: []int32{125}, 856 wantScalar: true, 857 }, 858 { 859 name: "Test74", 860 vecs: makeTempVectors(uint64(125), types.T_int64, true), 861 proc: procs, 862 wantValues: []int64{125}, 863 wantScalar: true, 864 }, 865 { 866 name: "Test75", 867 vecs: makeTempVectors(uint64(125), types.T_uint8, true), 868 proc: procs, 869 wantValues: []uint8{125}, 870 wantScalar: true, 871 }, 872 { 873 name: "Test76", 874 vecs: makeTempVectors(uint64(125), types.T_uint16, true), 875 proc: procs, 876 wantValues: []uint16{125}, 877 wantScalar: true, 878 }, 879 { 880 name: "Test77", 881 vecs: makeTempVectors(uint64(125), types.T_uint32, true), 882 proc: procs, 883 wantValues: []uint32{125}, 884 wantScalar: true, 885 }, 886 { 887 name: "Test78", 888 vecs: makeTempVectors(uint64(125), types.T_uint64, true), 889 proc: procs, 890 wantValues: []uint64{125}, 891 wantScalar: true, 892 }, 893 { 894 name: "Test79", 895 vecs: makeTempVectors(uint64(125), types.T_float32, true), 896 proc: procs, 897 wantValues: []float32{125}, 898 wantScalar: true, 899 }, 900 { 901 name: "Test80", 902 vecs: makeTempVectors(uint64(125), types.T_float64, true), 903 proc: procs, 904 wantValues: []float64{125}, 905 wantScalar: true, 906 }, 907 { 908 name: "Test81", 909 vecs: makeTempVectors(float32(125), types.T_int8, true), 910 proc: procs, 911 wantValues: []int8{125}, 912 wantScalar: true, 913 }, 914 { 915 name: "Test82", 916 vecs: makeTempVectors(float32(125), types.T_int16, true), 917 proc: procs, 918 wantValues: []int16{125}, 919 wantScalar: true, 920 }, 921 { 922 name: "Test83", 923 vecs: makeTempVectors(float32(125), types.T_int32, true), 924 proc: procs, 925 wantValues: []int32{125}, 926 wantScalar: true, 927 }, 928 { 929 name: "Test84", 930 vecs: makeTempVectors(float32(125), types.T_int64, true), 931 proc: procs, 932 wantValues: []int64{125}, 933 wantScalar: true, 934 }, 935 { 936 name: "Test85", 937 vecs: makeTempVectors(float32(125), types.T_uint8, true), 938 proc: procs, 939 wantValues: []uint8{125}, 940 wantScalar: true, 941 }, 942 { 943 name: "Test86", 944 vecs: makeTempVectors(float32(125), types.T_uint16, true), 945 proc: procs, 946 wantValues: []uint16{125}, 947 wantScalar: true, 948 }, 949 { 950 name: "Test87", 951 vecs: makeTempVectors(float32(125), types.T_uint32, true), 952 proc: procs, 953 wantValues: []uint32{125}, 954 wantScalar: true, 955 }, 956 { 957 name: "Test88", 958 vecs: makeTempVectors(float32(125), types.T_uint64, true), 959 proc: procs, 960 wantValues: []uint64{125}, 961 wantScalar: true, 962 }, 963 { 964 name: "Test89", 965 vecs: makeTempVectors(float32(125), types.T_float32, true), 966 proc: procs, 967 wantValues: []float32{125}, 968 wantScalar: true, 969 }, 970 { 971 name: "Test90", 972 vecs: makeTempVectors(float32(125), types.T_float64, true), 973 proc: procs, 974 wantValues: []float64{125}, 975 wantScalar: true, 976 }, 977 { 978 name: "Test91", 979 vecs: makeTempVectors(float64(125), types.T_int8, true), 980 proc: procs, 981 wantValues: []int8{125}, 982 wantScalar: true, 983 }, 984 { 985 name: "Test92", 986 vecs: makeTempVectors(float64(125), types.T_int16, true), 987 proc: procs, 988 wantValues: []int16{125}, 989 wantScalar: true, 990 }, 991 { 992 name: "Test93", 993 vecs: makeTempVectors(float64(125), types.T_int32, true), 994 proc: procs, 995 wantValues: []int32{125}, 996 wantScalar: true, 997 }, 998 { 999 name: "Test94", 1000 vecs: makeTempVectors(float64(125), types.T_int64, true), 1001 proc: procs, 1002 wantValues: []int64{125}, 1003 wantScalar: true, 1004 }, 1005 { 1006 name: "Test95", 1007 vecs: makeTempVectors(float64(125), types.T_uint8, true), 1008 proc: procs, 1009 wantValues: []uint8{125}, 1010 wantScalar: true, 1011 }, 1012 { 1013 name: "Test96", 1014 vecs: makeTempVectors(float64(125), types.T_uint16, true), 1015 proc: procs, 1016 wantValues: []uint16{125}, 1017 wantScalar: true, 1018 }, 1019 { 1020 name: "Test97", 1021 vecs: makeTempVectors(float64(125), types.T_uint32, true), 1022 proc: procs, 1023 wantValues: []uint32{125}, 1024 wantScalar: true, 1025 }, 1026 { 1027 name: "Test98", 1028 vecs: makeTempVectors(float64(125), types.T_uint64, true), 1029 proc: procs, 1030 wantValues: []uint64{125}, 1031 wantScalar: true, 1032 }, 1033 { 1034 name: "Test99", 1035 vecs: makeTempVectors(float64(125), types.T_float32, true), 1036 proc: procs, 1037 wantValues: []float32{125}, 1038 wantScalar: true, 1039 }, 1040 { 1041 name: "Test100", 1042 vecs: makeTempVectors(float64(125), types.T_float64, true), 1043 proc: procs, 1044 wantValues: []float64{125}, 1045 wantScalar: true, 1046 }, 1047 } 1048 1049 for _, c := range cases { 1050 t.Run(c.name, func(t *testing.T) { 1051 castRes, err := Cast(c.vecs, c.proc) 1052 if err != nil { 1053 t.Fatal(err) 1054 } 1055 1056 require.Equal(t, c.wantValues, castRes.Col) 1057 require.Equal(t, c.wantScalar, castRes.IsScalar()) 1058 }) 1059 } 1060 } 1061 1062 func TestCastSpecials1Int(t *testing.T) { 1063 // (char / varhcar / blob / text) -> (int8 / int16 / int32/ int64 / uint8 / uint16 / uint32 / uint64) 1064 1065 makeTempVectors := func(src string, srcType types.T, srcIsConst bool, destType types.T) []*vector.Vector { 1066 vectors := make([]*vector.Vector, 2) 1067 vectors[0] = makeStringVector(src, srcType, srcIsConst) 1068 vectors[1] = makeTypeVector(destType) 1069 return vectors 1070 } 1071 1072 procs := testutil.NewProc() 1073 cases := []struct { 1074 name string 1075 vecs []*vector.Vector 1076 proc *process.Process 1077 wantValues interface{} 1078 wantScalar bool 1079 }{ 1080 { 1081 name: "Test01", 1082 vecs: makeTempVectors("15", types.T_varchar, true, types.T_int8), 1083 proc: procs, 1084 wantValues: []int8{15}, 1085 wantScalar: true, 1086 }, 1087 { 1088 name: "Test02", 1089 vecs: makeTempVectors("15", types.T_varchar, true, types.T_int16), 1090 proc: procs, 1091 wantValues: []int16{15}, 1092 wantScalar: true, 1093 }, 1094 { 1095 name: "Test03", 1096 vecs: makeTempVectors("15", types.T_varchar, true, types.T_int32), 1097 proc: procs, 1098 wantValues: []int32{15}, 1099 wantScalar: true, 1100 }, 1101 { 1102 name: "Test04", 1103 vecs: makeTempVectors("15", types.T_varchar, true, types.T_int64), 1104 proc: procs, 1105 wantValues: []int64{15}, 1106 wantScalar: true, 1107 }, 1108 { 1109 name: "Test05", 1110 vecs: makeTempVectors("15", types.T_varchar, true, types.T_uint8), 1111 proc: procs, 1112 wantValues: []uint8{15}, 1113 wantScalar: true, 1114 }, 1115 { 1116 name: "Test06", 1117 vecs: makeTempVectors("15", types.T_varchar, true, types.T_uint16), 1118 proc: procs, 1119 wantValues: []uint16{15}, 1120 wantScalar: true, 1121 }, 1122 { 1123 name: "Test07", 1124 vecs: makeTempVectors("15", types.T_varchar, true, types.T_uint32), 1125 proc: procs, 1126 wantValues: []uint32{15}, 1127 wantScalar: true, 1128 }, 1129 { 1130 name: "Test08", 1131 vecs: makeTempVectors("15", types.T_varchar, true, types.T_uint64), 1132 proc: procs, 1133 wantValues: []uint64{15}, 1134 wantScalar: true, 1135 }, 1136 { 1137 name: "Test09", 1138 vecs: makeTempVectors("15", types.T_char, true, types.T_int8), 1139 proc: procs, 1140 wantValues: []int8{15}, 1141 wantScalar: true, 1142 }, 1143 { 1144 name: "Test10", 1145 vecs: makeTempVectors("15", types.T_char, true, types.T_int16), 1146 proc: procs, 1147 wantValues: []int16{15}, 1148 wantScalar: true, 1149 }, 1150 { 1151 name: "Test11", 1152 vecs: makeTempVectors("15", types.T_char, true, types.T_int32), 1153 proc: procs, 1154 wantValues: []int32{15}, 1155 wantScalar: true, 1156 }, 1157 { 1158 name: "Test12", 1159 vecs: makeTempVectors("15", types.T_char, true, types.T_int64), 1160 proc: procs, 1161 wantValues: []int64{15}, 1162 wantScalar: true, 1163 }, 1164 { 1165 name: "Test13", 1166 vecs: makeTempVectors("15", types.T_char, true, types.T_uint8), 1167 proc: procs, 1168 wantValues: []uint8{15}, 1169 wantScalar: true, 1170 }, 1171 { 1172 name: "Test14", 1173 vecs: makeTempVectors("15", types.T_char, true, types.T_uint16), 1174 proc: procs, 1175 wantValues: []uint16{15}, 1176 wantScalar: true, 1177 }, 1178 { 1179 name: "Test15", 1180 vecs: makeTempVectors("15", types.T_char, true, types.T_uint32), 1181 proc: procs, 1182 wantValues: []uint32{15}, 1183 wantScalar: true, 1184 }, 1185 { 1186 name: "Test16", 1187 vecs: makeTempVectors("15", types.T_char, true, types.T_uint64), 1188 proc: procs, 1189 wantValues: []uint64{15}, 1190 wantScalar: true, 1191 }, 1192 { 1193 name: "Test17", 1194 vecs: makeTempVectors("15", types.T_varchar, false, types.T_int8), 1195 proc: procs, 1196 wantValues: []int8{15}, 1197 wantScalar: false, 1198 }, 1199 { 1200 name: "Test18", 1201 vecs: makeTempVectors("15", types.T_varchar, false, types.T_int16), 1202 proc: procs, 1203 wantValues: []int16{15}, 1204 wantScalar: false, 1205 }, 1206 { 1207 name: "Test19", 1208 vecs: makeTempVectors("15", types.T_varchar, false, types.T_int32), 1209 proc: procs, 1210 wantValues: []int32{15}, 1211 wantScalar: false, 1212 }, 1213 { 1214 name: "Test20", 1215 vecs: makeTempVectors("15", types.T_varchar, false, types.T_int64), 1216 proc: procs, 1217 wantValues: []int64{15}, 1218 wantScalar: false, 1219 }, 1220 { 1221 name: "Test21", 1222 vecs: makeTempVectors("15", types.T_varchar, false, types.T_uint8), 1223 proc: procs, 1224 wantValues: []uint8{15}, 1225 wantScalar: false, 1226 }, 1227 { 1228 name: "Test22", 1229 vecs: makeTempVectors("15", types.T_varchar, false, types.T_uint16), 1230 proc: procs, 1231 wantValues: []uint16{15}, 1232 wantScalar: false, 1233 }, 1234 { 1235 name: "Test23", 1236 vecs: makeTempVectors("15", types.T_varchar, false, types.T_uint32), 1237 proc: procs, 1238 wantValues: []uint32{15}, 1239 wantScalar: false, 1240 }, 1241 { 1242 name: "Test24", 1243 vecs: makeTempVectors("15", types.T_varchar, false, types.T_uint64), 1244 proc: procs, 1245 wantValues: []uint64{15}, 1246 wantScalar: false, 1247 }, 1248 { 1249 name: "Test25", 1250 vecs: makeTempVectors("15", types.T_char, false, types.T_int8), 1251 proc: procs, 1252 wantValues: []int8{15}, 1253 wantScalar: false, 1254 }, 1255 { 1256 name: "Test26", 1257 vecs: makeTempVectors("15", types.T_char, false, types.T_int16), 1258 proc: procs, 1259 wantValues: []int16{15}, 1260 wantScalar: false, 1261 }, 1262 { 1263 name: "Test27", 1264 vecs: makeTempVectors("15", types.T_char, false, types.T_int32), 1265 proc: procs, 1266 wantValues: []int32{15}, 1267 wantScalar: false, 1268 }, 1269 { 1270 name: "Test28", 1271 vecs: makeTempVectors("15", types.T_char, false, types.T_int64), 1272 proc: procs, 1273 wantValues: []int64{15}, 1274 wantScalar: false, 1275 }, 1276 { 1277 name: "Test29", 1278 vecs: makeTempVectors("15", types.T_char, false, types.T_uint8), 1279 proc: procs, 1280 wantValues: []uint8{15}, 1281 wantScalar: false, 1282 }, 1283 { 1284 name: "Test30", 1285 vecs: makeTempVectors("15", types.T_char, false, types.T_uint16), 1286 proc: procs, 1287 wantValues: []uint16{15}, 1288 wantScalar: false, 1289 }, 1290 { 1291 name: "Test31", 1292 vecs: makeTempVectors("15", types.T_char, false, types.T_uint32), 1293 proc: procs, 1294 wantValues: []uint32{15}, 1295 wantScalar: false, 1296 }, 1297 { 1298 name: "Test32", 1299 vecs: makeTempVectors("15", types.T_char, false, types.T_uint64), 1300 proc: procs, 1301 wantValues: []uint64{15}, 1302 wantScalar: false, 1303 }, 1304 { 1305 name: "Test33", 1306 vecs: makeTempVectors("15", types.T_blob, false, types.T_int8), 1307 proc: procs, 1308 wantValues: []int8{15}, 1309 wantScalar: false, 1310 }, 1311 { 1312 name: "Test34", 1313 vecs: makeTempVectors("15", types.T_blob, false, types.T_int16), 1314 proc: procs, 1315 wantValues: []int16{15}, 1316 wantScalar: false, 1317 }, 1318 { 1319 name: "Test35", 1320 vecs: makeTempVectors("15", types.T_blob, false, types.T_int32), 1321 proc: procs, 1322 wantValues: []int32{15}, 1323 wantScalar: false, 1324 }, 1325 { 1326 name: "Test36", 1327 vecs: makeTempVectors("15", types.T_blob, false, types.T_int64), 1328 proc: procs, 1329 wantValues: []int64{15}, 1330 wantScalar: false, 1331 }, 1332 { 1333 name: "Test37", 1334 vecs: makeTempVectors("15", types.T_blob, false, types.T_uint8), 1335 proc: procs, 1336 wantValues: []uint8{15}, 1337 wantScalar: false, 1338 }, 1339 { 1340 name: "Test38", 1341 vecs: makeTempVectors("15", types.T_blob, false, types.T_uint16), 1342 proc: procs, 1343 wantValues: []uint16{15}, 1344 wantScalar: false, 1345 }, 1346 { 1347 name: "Test39", 1348 vecs: makeTempVectors("15", types.T_blob, false, types.T_uint32), 1349 proc: procs, 1350 wantValues: []uint32{15}, 1351 wantScalar: false, 1352 }, 1353 { 1354 name: "Test40", 1355 vecs: makeTempVectors("15", types.T_blob, false, types.T_uint64), 1356 proc: procs, 1357 wantValues: []uint64{15}, 1358 wantScalar: false, 1359 }, 1360 1361 { 1362 name: "Test41", 1363 vecs: makeTempVectors("15", types.T_text, false, types.T_int8), 1364 proc: procs, 1365 wantValues: []int8{15}, 1366 wantScalar: false, 1367 }, 1368 { 1369 name: "Test42", 1370 vecs: makeTempVectors("15", types.T_text, false, types.T_int16), 1371 proc: procs, 1372 wantValues: []int16{15}, 1373 wantScalar: false, 1374 }, 1375 { 1376 name: "Test43", 1377 vecs: makeTempVectors("15", types.T_text, false, types.T_int32), 1378 proc: procs, 1379 wantValues: []int32{15}, 1380 wantScalar: false, 1381 }, 1382 { 1383 name: "Test44", 1384 vecs: makeTempVectors("15", types.T_text, false, types.T_int64), 1385 proc: procs, 1386 wantValues: []int64{15}, 1387 wantScalar: false, 1388 }, 1389 { 1390 name: "Test45", 1391 vecs: makeTempVectors("15", types.T_text, false, types.T_uint8), 1392 proc: procs, 1393 wantValues: []uint8{15}, 1394 wantScalar: false, 1395 }, 1396 { 1397 name: "Test46", 1398 vecs: makeTempVectors("15", types.T_text, false, types.T_uint16), 1399 proc: procs, 1400 wantValues: []uint16{15}, 1401 wantScalar: false, 1402 }, 1403 { 1404 name: "Test47", 1405 vecs: makeTempVectors("15", types.T_text, false, types.T_uint32), 1406 proc: procs, 1407 wantValues: []uint32{15}, 1408 wantScalar: false, 1409 }, 1410 { 1411 name: "Test48", 1412 vecs: makeTempVectors("15", types.T_text, false, types.T_uint64), 1413 proc: procs, 1414 wantValues: []uint64{15}, 1415 wantScalar: false, 1416 }, 1417 } 1418 1419 for _, c := range cases { 1420 t.Run(c.name, func(t *testing.T) { 1421 castRes, err := Cast(c.vecs, c.proc) 1422 if err != nil { 1423 t.Fatal(err) 1424 } 1425 require.Equal(t, c.wantValues, castRes.Col) 1426 require.Equal(t, c.wantScalar, castRes.IsScalar()) 1427 }) 1428 } 1429 1430 } 1431 1432 func TestCastSpecials1Float(t *testing.T) { 1433 // (char / varhcar / blob) -> (float32 / float64) 1434 makeTempVectors := func(src string, srcType types.T, srcIsConst bool, destType types.T) []*vector.Vector { 1435 vectors := make([]*vector.Vector, 2) 1436 vectors[0] = makeStringVector(src, srcType, srcIsConst) 1437 vectors[1] = makeTypeVector(destType) 1438 return vectors 1439 } 1440 1441 procs := testutil.NewProc() 1442 cases := []struct { 1443 name string 1444 vecs []*vector.Vector 1445 proc *process.Process 1446 wantValues interface{} 1447 wantScalar bool 1448 }{ 1449 { 1450 name: "Test01", 1451 vecs: makeTempVectors("15.23", types.T_varchar, true, types.T_float32), 1452 proc: procs, 1453 wantValues: []float32{15.23}, 1454 wantScalar: true, 1455 }, 1456 { 1457 name: "Test02", 1458 vecs: makeTempVectors("15.23", types.T_varchar, true, types.T_float64), 1459 proc: procs, 1460 wantValues: []float64{15.23}, 1461 wantScalar: true, 1462 }, 1463 { 1464 name: "Test03", 1465 vecs: makeTempVectors("15.23", types.T_char, true, types.T_float32), 1466 proc: procs, 1467 wantValues: []float32{15.23}, 1468 wantScalar: true, 1469 }, 1470 { 1471 name: "Test04", 1472 vecs: makeTempVectors("15.23", types.T_char, true, types.T_float64), 1473 proc: procs, 1474 wantValues: []float64{15.23}, 1475 wantScalar: true, 1476 }, 1477 { 1478 name: "Test05", 1479 vecs: makeTempVectors("15.23", types.T_varchar, false, types.T_float32), 1480 proc: procs, 1481 wantValues: []float32{15.23}, 1482 wantScalar: false, 1483 }, 1484 { 1485 name: "Test06", 1486 vecs: makeTempVectors("15.23", types.T_varchar, false, types.T_float64), 1487 proc: procs, 1488 wantValues: []float64{15.23}, 1489 wantScalar: false, 1490 }, 1491 { 1492 name: "Test07", 1493 vecs: makeTempVectors("15.23", types.T_char, false, types.T_float32), 1494 proc: procs, 1495 wantValues: []float32{15.23}, 1496 wantScalar: false, 1497 }, 1498 { 1499 name: "Test08", 1500 vecs: makeTempVectors("15.23", types.T_char, false, types.T_float64), 1501 proc: procs, 1502 wantValues: []float64{15.23}, 1503 wantScalar: false, 1504 }, 1505 { 1506 name: "Test09", 1507 vecs: makeTempVectors("15.23", types.T_blob, false, types.T_float32), 1508 proc: procs, 1509 wantValues: []float32{15.23}, 1510 wantScalar: false, 1511 }, 1512 { 1513 name: "Test10", 1514 vecs: makeTempVectors("15.23", types.T_blob, true, types.T_float64), 1515 proc: procs, 1516 wantValues: []float64{15.23}, 1517 wantScalar: true, 1518 }, 1519 { 1520 name: "Test11", 1521 vecs: makeTempVectors("15.23", types.T_blob, false, types.T_float32), 1522 proc: procs, 1523 wantValues: []float32{15.23}, 1524 wantScalar: false, 1525 }, 1526 { 1527 name: "Test12", 1528 vecs: makeTempVectors("15.23", types.T_blob, true, types.T_float64), 1529 proc: procs, 1530 wantValues: []float64{15.23}, 1531 wantScalar: true, 1532 }, 1533 { 1534 name: "Test13", 1535 vecs: makeTempVectors("15.23", types.T_text, false, types.T_float32), 1536 proc: procs, 1537 wantValues: []float32{15.23}, 1538 wantScalar: false, 1539 }, 1540 { 1541 name: "Test14", 1542 vecs: makeTempVectors("15.23", types.T_text, true, types.T_float64), 1543 proc: procs, 1544 wantValues: []float64{15.23}, 1545 wantScalar: true, 1546 }, 1547 { 1548 name: "Test15", 1549 vecs: makeTempVectors("15.23", types.T_text, false, types.T_float32), 1550 proc: procs, 1551 wantValues: []float32{15.23}, 1552 wantScalar: false, 1553 }, 1554 { 1555 name: "Test16", 1556 vecs: makeTempVectors("15.23", types.T_text, true, types.T_float64), 1557 proc: procs, 1558 wantValues: []float64{15.23}, 1559 wantScalar: true, 1560 }, 1561 } 1562 1563 for _, c := range cases { 1564 t.Run(c.name, func(t *testing.T) { 1565 castRes, err := Cast(c.vecs, c.proc) 1566 if err != nil { 1567 t.Fatal(err) 1568 } 1569 require.Equal(t, c.wantValues, castRes.Col) 1570 require.Equal(t, c.wantScalar, castRes.IsScalar()) 1571 }) 1572 } 1573 1574 } 1575 1576 func TestCastSpecials2Float(t *testing.T) { 1577 //(float32/float64) -> (char / varhcar / blob) 1578 makeTempVectors := func(src interface{}, destType types.T, srcIsConst bool) []*vector.Vector { 1579 vectors := make([]*vector.Vector, 2) 1580 vectors[0] = makeVector(src, srcIsConst) 1581 vectors[1] = makeTypeVector(destType) 1582 return vectors 1583 } 1584 1585 procs := testutil.NewProc() 1586 cases := []struct { 1587 name string 1588 vecs []*vector.Vector 1589 proc *process.Process 1590 wantBytes []byte 1591 wantScalar bool 1592 }{ 1593 { 1594 name: "Test01", 1595 vecs: makeTempVectors(float32(23.65), types.T_char, true), 1596 proc: procs, 1597 wantBytes: []byte("23.65"), 1598 wantScalar: true, 1599 }, 1600 { 1601 name: "Test02", 1602 vecs: makeTempVectors(float64(23.65), types.T_char, true), 1603 proc: procs, 1604 wantBytes: []byte("23.65"), 1605 wantScalar: true, 1606 }, 1607 { 1608 name: "Test03", 1609 vecs: makeTempVectors(float32(23.65), types.T_varchar, true), 1610 proc: procs, 1611 wantBytes: []byte("23.65"), 1612 wantScalar: true, 1613 }, 1614 { 1615 name: "Test04", 1616 vecs: makeTempVectors(float64(23.65), types.T_varchar, true), 1617 proc: procs, 1618 wantBytes: []byte("23.65"), 1619 wantScalar: true, 1620 }, 1621 { 1622 name: "Test05", 1623 vecs: makeTempVectors(float32(23.65), types.T_char, false), 1624 proc: procs, 1625 wantBytes: []byte("23.65"), 1626 wantScalar: false, 1627 }, 1628 { 1629 name: "Test06", 1630 vecs: makeTempVectors(float64(23.65), types.T_char, false), 1631 proc: procs, 1632 wantBytes: []byte("23.65"), 1633 wantScalar: false, 1634 }, 1635 { 1636 name: "Test07", 1637 vecs: makeTempVectors(float32(23.65), types.T_varchar, false), 1638 proc: procs, 1639 wantBytes: []byte("23.65"), 1640 wantScalar: false, 1641 }, 1642 { 1643 name: "Test08", 1644 vecs: makeTempVectors(float64(23.65), types.T_varchar, false), 1645 proc: procs, 1646 wantBytes: []byte("23.65"), 1647 wantScalar: false, 1648 }, 1649 { 1650 name: "Test09", 1651 vecs: makeTempVectors(float32(23.65), types.T_blob, false), 1652 proc: procs, 1653 wantBytes: []byte("23.65"), 1654 wantScalar: false, 1655 }, 1656 { 1657 name: "Test10", 1658 vecs: makeTempVectors(float64(23.65), types.T_blob, false), 1659 proc: procs, 1660 wantBytes: []byte("23.65"), 1661 wantScalar: false, 1662 }, 1663 { 1664 name: "Test11", 1665 vecs: makeTempVectors(float32(23.65), types.T_blob, true), 1666 proc: procs, 1667 wantBytes: []byte("23.65"), 1668 wantScalar: true, 1669 }, 1670 { 1671 name: "Test12", 1672 vecs: makeTempVectors(float64(23.65), types.T_blob, true), 1673 proc: procs, 1674 wantBytes: []byte("23.65"), 1675 wantScalar: true, 1676 }, 1677 { 1678 name: "Test13", 1679 vecs: makeTempVectors(float32(23.65), types.T_text, false), 1680 proc: procs, 1681 wantBytes: []byte("23.65"), 1682 wantScalar: false, 1683 }, 1684 { 1685 name: "Test14", 1686 vecs: makeTempVectors(float64(23.65), types.T_text, false), 1687 proc: procs, 1688 wantBytes: []byte("23.65"), 1689 wantScalar: false, 1690 }, 1691 { 1692 name: "Test15", 1693 vecs: makeTempVectors(float32(23.65), types.T_text, true), 1694 proc: procs, 1695 wantBytes: []byte("23.65"), 1696 wantScalar: true, 1697 }, 1698 { 1699 name: "Test16", 1700 vecs: makeTempVectors(float64(23.65), types.T_text, true), 1701 proc: procs, 1702 wantBytes: []byte("23.65"), 1703 wantScalar: true, 1704 }, 1705 } 1706 1707 for _, c := range cases { 1708 t.Run(c.name, func(t *testing.T) { 1709 castRes, err := Cast(c.vecs, c.proc) 1710 if err != nil { 1711 t.Fatal(err) 1712 } 1713 require.Equal(t, c.wantBytes, castRes.GetBytes(0)) 1714 require.Equal(t, c.wantScalar, castRes.IsScalar()) 1715 }) 1716 } 1717 } 1718 1719 func TestCastSpecials3(t *testing.T) { 1720 // char -> char 1721 // char -> varhcar 1722 // varhcar -> char 1723 // varhcar -> varhcar 1724 // blob -> blob 1725 // blob -> varchar 1726 // blob -> char 1727 // varchar -> blob 1728 // char -> blob 1729 makeTempVectors := func(src string, srcType types.T, destType types.T, srcIsConst bool) []*vector.Vector { 1730 vectors := make([]*vector.Vector, 2) 1731 vectors[0] = makeStringVector(src, srcType, srcIsConst) 1732 vectors[1] = makeTypeVector(destType) 1733 return vectors 1734 } 1735 1736 procs := testutil.NewProc() 1737 cases := []struct { 1738 name string 1739 vecs []*vector.Vector 1740 proc *process.Process 1741 wantBytes []byte 1742 wantScalar bool 1743 }{ 1744 { 1745 name: "Test01", 1746 vecs: makeTempVectors("abcsedn", types.T_char, types.T_char, true), 1747 proc: procs, 1748 wantBytes: []byte("abcsedn"), 1749 wantScalar: true, 1750 }, 1751 { 1752 name: "Test02", 1753 vecs: makeTempVectors("abcsedn", types.T_char, types.T_varchar, true), 1754 proc: procs, 1755 wantBytes: []byte("abcsedn"), 1756 wantScalar: true, 1757 }, 1758 { 1759 name: "Test03", 1760 vecs: makeTempVectors("abcsedn", types.T_varchar, types.T_char, true), 1761 proc: procs, 1762 wantBytes: []byte("abcsedn"), 1763 wantScalar: true, 1764 }, 1765 { 1766 name: "Test04", 1767 vecs: makeTempVectors("abcsedn", types.T_varchar, types.T_varchar, true), 1768 proc: procs, 1769 wantBytes: []byte("abcsedn"), 1770 wantScalar: true, 1771 }, 1772 { 1773 name: "Test05", 1774 vecs: makeTempVectors("abcsedn", types.T_char, types.T_char, false), 1775 proc: procs, 1776 wantBytes: []byte("abcsedn"), 1777 wantScalar: false, 1778 }, 1779 { 1780 name: "Test06", 1781 vecs: makeTempVectors("abcsedn", types.T_char, types.T_varchar, false), 1782 proc: procs, 1783 wantBytes: []byte("abcsedn"), 1784 wantScalar: false, 1785 }, 1786 { 1787 name: "Test07", 1788 vecs: makeTempVectors("abcsedn", types.T_varchar, types.T_char, false), 1789 proc: procs, 1790 wantBytes: []byte("abcsedn"), 1791 wantScalar: false, 1792 }, 1793 { 1794 name: "Test08", 1795 vecs: makeTempVectors("abcsedn", types.T_varchar, types.T_varchar, false), 1796 proc: procs, 1797 wantBytes: []byte("abcsedn"), 1798 wantScalar: false, 1799 }, 1800 { 1801 name: "Test09", 1802 vecs: makeTempVectors("abcsedn", types.T_blob, types.T_blob, false), 1803 proc: procs, 1804 wantBytes: []byte("abcsedn"), 1805 wantScalar: false, 1806 }, 1807 { 1808 name: "Test10", 1809 vecs: makeTempVectors("abcsedn", types.T_blob, types.T_varchar, false), 1810 proc: procs, 1811 wantBytes: []byte("abcsedn"), 1812 wantScalar: false, 1813 }, 1814 { 1815 name: "Test11", 1816 vecs: makeTempVectors("abcsedn", types.T_blob, types.T_char, false), 1817 proc: procs, 1818 wantBytes: []byte("abcsedn"), 1819 wantScalar: false, 1820 }, 1821 { 1822 name: "Test12", 1823 vecs: makeTempVectors("abcsedn", types.T_varchar, types.T_blob, false), 1824 proc: procs, 1825 wantBytes: []byte("abcsedn"), 1826 wantScalar: false, 1827 }, 1828 { 1829 name: "Test13", 1830 vecs: makeTempVectors("abcsedn", types.T_char, types.T_blob, false), 1831 proc: procs, 1832 wantBytes: []byte("abcsedn"), 1833 wantScalar: false, 1834 }, 1835 { 1836 name: "Test14", 1837 vecs: makeTempVectors("abcsedn", types.T_text, types.T_text, false), 1838 proc: procs, 1839 wantBytes: []byte("abcsedn"), 1840 wantScalar: false, 1841 }, 1842 { 1843 name: "Test15", 1844 vecs: makeTempVectors("abcsedn", types.T_text, types.T_varchar, false), 1845 proc: procs, 1846 wantBytes: []byte("abcsedn"), 1847 wantScalar: false, 1848 }, 1849 { 1850 name: "Test16", 1851 vecs: makeTempVectors("abcsedn", types.T_text, types.T_char, false), 1852 proc: procs, 1853 wantBytes: []byte("abcsedn"), 1854 wantScalar: false, 1855 }, 1856 { 1857 name: "Test17", 1858 vecs: makeTempVectors("abcsedn", types.T_varchar, types.T_text, false), 1859 proc: procs, 1860 wantBytes: []byte("abcsedn"), 1861 wantScalar: false, 1862 }, 1863 { 1864 name: "Test18", 1865 vecs: makeTempVectors("abcsedn", types.T_char, types.T_text, false), 1866 proc: procs, 1867 wantBytes: []byte("abcsedn"), 1868 wantScalar: false, 1869 }, 1870 } 1871 1872 for _, c := range cases { 1873 t.Run(c.name, func(t *testing.T) { 1874 castRes, err := Cast(c.vecs, c.proc) 1875 if err != nil { 1876 t.Fatal(err) 1877 } 1878 require.Equal(t, c.wantBytes, castRes.GetBytes(0)) 1879 require.Equal(t, c.wantScalar, castRes.IsScalar()) 1880 }) 1881 } 1882 1883 } 1884 1885 func TestCastSpecial4(t *testing.T) { 1886 //(int8/int16/int32/int64) to decimal128 1887 // (uint8/uint16/uint32/uint64) to decimal128 1888 1889 makeTempVectors := func(src interface{}, destType types.T, srcIsConst bool) []*vector.Vector { 1890 vectors := make([]*vector.Vector, 2) 1891 vectors[0] = makeVector(src, srcIsConst) 1892 vectors[1] = makeTypeVector(destType) 1893 vectors[1].Typ.Width = 64 1894 vectors[1].Typ.Scale = 0 1895 return vectors 1896 } 1897 resType := types.T_decimal128.ToType() 1898 decimal128 := types.Decimal128FromInt32(123) 1899 procs := testutil.NewProc() 1900 cases := []struct { 1901 name string 1902 vecs []*vector.Vector 1903 proc *process.Process 1904 wantValues interface{} 1905 wantType types.Type 1906 wantScalar bool 1907 }{ 1908 { 1909 name: "Test01", 1910 vecs: makeTempVectors(int8(123), types.T_decimal128, true), 1911 proc: procs, 1912 wantValues: []types.Decimal128{decimal128}, 1913 wantType: resType, 1914 wantScalar: true, 1915 }, 1916 { 1917 name: "Test02", 1918 vecs: makeTempVectors(int16(123), types.T_decimal128, true), 1919 proc: procs, 1920 wantValues: []types.Decimal128{decimal128}, 1921 wantType: resType, 1922 wantScalar: true, 1923 }, 1924 { 1925 name: "Test03", 1926 vecs: makeTempVectors(int32(123), types.T_decimal128, true), 1927 proc: procs, 1928 wantValues: []types.Decimal128{decimal128}, 1929 wantType: resType, 1930 wantScalar: true, 1931 }, 1932 { 1933 name: "Test04", 1934 vecs: makeTempVectors(int64(123), types.T_decimal128, true), 1935 proc: procs, 1936 wantValues: []types.Decimal128{decimal128}, 1937 wantType: resType, 1938 wantScalar: true, 1939 }, 1940 { 1941 name: "Test05", 1942 vecs: makeTempVectors(uint8(123), types.T_decimal128, true), 1943 proc: procs, 1944 wantValues: []types.Decimal128{decimal128}, 1945 wantType: resType, 1946 wantScalar: true, 1947 }, 1948 { 1949 name: "Test06", 1950 vecs: makeTempVectors(uint16(123), types.T_decimal128, true), 1951 proc: procs, 1952 wantValues: []types.Decimal128{decimal128}, 1953 wantType: resType, 1954 wantScalar: true, 1955 }, 1956 { 1957 name: "Test07", 1958 vecs: makeTempVectors(uint32(123), types.T_decimal128, true), 1959 proc: procs, 1960 wantValues: []types.Decimal128{decimal128}, 1961 wantType: resType, 1962 wantScalar: true, 1963 }, 1964 { 1965 name: "Test08", 1966 vecs: makeTempVectors(uint64(123), types.T_decimal128, true), 1967 proc: procs, 1968 wantValues: []types.Decimal128{decimal128}, 1969 wantType: resType, 1970 wantScalar: true, 1971 }, 1972 { 1973 name: "Test09", 1974 vecs: makeTempVectors(int8(123), types.T_decimal128, false), 1975 proc: procs, 1976 wantValues: []types.Decimal128{decimal128}, 1977 wantType: resType, 1978 wantScalar: false, 1979 }, 1980 { 1981 name: "Test10", 1982 vecs: makeTempVectors(int16(123), types.T_decimal128, false), 1983 proc: procs, 1984 wantValues: []types.Decimal128{decimal128}, 1985 wantType: resType, 1986 wantScalar: false, 1987 }, 1988 { 1989 name: "Test11", 1990 vecs: makeTempVectors(int32(123), types.T_decimal128, false), 1991 proc: procs, 1992 wantValues: []types.Decimal128{decimal128}, 1993 wantType: resType, 1994 wantScalar: false, 1995 }, 1996 { 1997 name: "Test12", 1998 vecs: makeTempVectors(int64(123), types.T_decimal128, false), 1999 proc: procs, 2000 wantValues: []types.Decimal128{decimal128}, 2001 wantType: resType, 2002 wantScalar: false, 2003 }, 2004 { 2005 name: "Test13", 2006 vecs: makeTempVectors(uint8(123), types.T_decimal128, false), 2007 proc: procs, 2008 wantValues: []types.Decimal128{decimal128}, 2009 wantType: resType, 2010 wantScalar: false, 2011 }, 2012 { 2013 name: "Test14", 2014 vecs: makeTempVectors(uint16(123), types.T_decimal128, false), 2015 proc: procs, 2016 wantValues: []types.Decimal128{decimal128}, 2017 wantType: resType, 2018 wantScalar: false, 2019 }, 2020 { 2021 name: "Test15", 2022 vecs: makeTempVectors(uint32(123), types.T_decimal128, false), 2023 proc: procs, 2024 wantValues: []types.Decimal128{decimal128}, 2025 wantType: resType, 2026 wantScalar: false, 2027 }, 2028 { 2029 name: "Test16", 2030 vecs: makeTempVectors(uint64(123), types.T_decimal128, false), 2031 proc: procs, 2032 wantValues: []types.Decimal128{decimal128}, 2033 wantType: resType, 2034 wantScalar: false, 2035 }, 2036 } 2037 2038 for _, c := range cases { 2039 t.Run(c.name, func(t *testing.T) { 2040 decimalres, err := Cast(c.vecs, c.proc) 2041 if err != nil { 2042 t.Fatal(err) 2043 } 2044 require.Equal(t, c.wantValues, decimalres.Col) 2045 require.Equal(t, c.wantType, decimalres.Typ) 2046 require.Equal(t, c.wantScalar, decimalres.IsScalar()) 2047 }) 2048 } 2049 2050 } 2051 2052 func TestCastVarcharAsDate(t *testing.T) { 2053 //Cast converts varchar to date type 2054 convey.Convey("Cast varchar to date", t, func() { 2055 type kase struct { 2056 s string 2057 want string 2058 } 2059 2060 kases := []kase{ 2061 { 2062 s: "2004-04-03", 2063 want: "2004-04-03", 2064 }, 2065 { 2066 s: "2021-10-03", 2067 want: "2021-10-03", 2068 }, 2069 { 2070 s: "2020-08-23", 2071 want: "2020-08-23", 2072 }, 2073 { 2074 s: "2021-11-23", 2075 want: "2021-11-23", 2076 }, 2077 { 2078 s: "2014-09-23", 2079 want: "2014-09-23", 2080 }, 2081 } 2082 2083 var inStrs []string 2084 var wantStrs []string 2085 for _, k := range kases { 2086 inStrs = append(inStrs, k.s) 2087 wantStrs = append(wantStrs, k.want) 2088 } 2089 2090 srcVector := testutil.MakeVarcharVector(inStrs, nil) 2091 destVector := testutil.MakeDateVector(nil, nil) 2092 2093 wantVec := testutil.MakeDateVector(wantStrs, nil) 2094 proc := testutil.NewProc() 2095 res, err := Cast([]*vector.Vector{srcVector, destVector}, proc) 2096 convey.So(err, convey.ShouldBeNil) 2097 compare := testutil.CompareVectors(wantVec, res) 2098 convey.So(compare, convey.ShouldBeTrue) 2099 }) 2100 2101 convey.Convey("Cast scalar varchar to date", t, func() { 2102 type kase struct { 2103 s string 2104 want string 2105 } 2106 2107 k := kase{ 2108 s: "2014-09-23", 2109 want: "2014-09-23", 2110 } 2111 2112 srcVector := testutil.MakeScalarVarchar(k.s, 10) 2113 destVector := testutil.MakeDateVector(nil, nil) 2114 wantVec := testutil.MakeScalarDate(k.want, 10) 2115 proc := testutil.NewProc() 2116 res, err := Cast([]*vector.Vector{srcVector, destVector}, proc) 2117 convey.So(err, convey.ShouldBeNil) 2118 compare := testutil.CompareVectors(wantVec, res) 2119 convey.So(compare, convey.ShouldBeTrue) 2120 }) 2121 2122 //Cast converts varchar to datetime type 2123 convey.Convey("Cast varchar to datetime", t, func() { 2124 type kase struct { 2125 s string 2126 want string 2127 } 2128 2129 kases := []kase{ 2130 { 2131 s: "2004-04-03 12:14:35", 2132 want: "2004-04-03 12:14:35", 2133 }, 2134 { 2135 s: "2021-10-03 11:52:21", 2136 want: "2021-10-03 11:52:21", 2137 }, 2138 { 2139 s: "2020-08-23 11:52:21", 2140 want: "2020-08-23 11:52:21", 2141 }, 2142 { 2143 s: "2021-11-23 16:12:21", 2144 want: "2021-11-23 16:12:21", 2145 }, 2146 { 2147 s: "2014-09-23 16:17:21", 2148 want: "2014-09-23 16:17:21", 2149 }, 2150 } 2151 2152 var inStrs []string 2153 var wantStrs []string 2154 for _, k := range kases { 2155 inStrs = append(inStrs, k.s) 2156 wantStrs = append(wantStrs, k.want) 2157 } 2158 2159 srcVector := testutil.MakeVarcharVector(inStrs, nil) 2160 destVector := testutil.MakeDateTimeVector(nil, nil) 2161 2162 wantVec := testutil.MakeDateTimeVector(wantStrs, nil) 2163 proc := testutil.NewProc() 2164 res, err := Cast([]*vector.Vector{srcVector, destVector}, proc) 2165 convey.So(err, convey.ShouldBeNil) 2166 compare := testutil.CompareVectors(wantVec, res) 2167 convey.So(compare, convey.ShouldBeTrue) 2168 }) 2169 2170 convey.Convey("Cast scalar varchar to datetime", t, func() { 2171 type kase struct { 2172 s string 2173 want string 2174 } 2175 2176 k := kase{ 2177 s: "2004-04-03 12:14:35", 2178 want: "2004-04-03 12:14:35", 2179 } 2180 2181 srcVector := testutil.MakeScalarVarchar(k.s, 10) 2182 destVector := testutil.MakeDateTimeVector(nil, nil) 2183 wantVec := testutil.MakeScalarDateTime(k.want, 10) 2184 proc := testutil.NewProc() 2185 res, err := Cast([]*vector.Vector{srcVector, destVector}, proc) 2186 convey.So(err, convey.ShouldBeNil) 2187 compare := testutil.CompareVectors(wantVec, res) 2188 convey.So(compare, convey.ShouldBeTrue) 2189 }) 2190 2191 //Cast converts varchar to timestamp type 2192 convey.Convey("Cast varchar to timestamp", t, func() { 2193 type kase struct { 2194 s string 2195 want string 2196 } 2197 2198 kases := []kase{ 2199 { 2200 s: "2004-04-03 12:14:35", 2201 want: "2004-04-03 12:14:35", 2202 }, 2203 { 2204 s: "2021-10-03 11:52:21", 2205 want: "2021-10-03 11:52:21", 2206 }, 2207 { 2208 s: "2020-08-23 11:52:21", 2209 want: "2020-08-23 11:52:21", 2210 }, 2211 { 2212 s: "2021-11-23 16:12:21", 2213 want: "2021-11-23 16:12:21", 2214 }, 2215 { 2216 s: "2014-09-23 16:17:21", 2217 want: "2014-09-23 16:17:21", 2218 }, 2219 } 2220 2221 var inStrs []string 2222 var wantStrs []string 2223 for _, k := range kases { 2224 inStrs = append(inStrs, k.s) 2225 wantStrs = append(wantStrs, k.want) 2226 } 2227 2228 srcVector := testutil.MakeVarcharVector(inStrs, nil) 2229 destVector := testutil.MakeTimeStampVector(nil, nil) 2230 2231 wantVec := testutil.MakeTimeStampVector(wantStrs, nil) 2232 proc := testutil.NewProc() 2233 res, err := Cast([]*vector.Vector{srcVector, destVector}, proc) 2234 convey.So(err, convey.ShouldBeNil) 2235 compare := testutil.CompareVectors(wantVec, res) 2236 convey.So(compare, convey.ShouldBeTrue) 2237 }) 2238 2239 convey.Convey("Cast scalar varchar to timestamp", t, func() { 2240 type kase struct { 2241 s string 2242 want string 2243 } 2244 2245 k := kase{ 2246 s: "2021-11-23 16:12:21", 2247 want: "2021-11-23 16:12:21", 2248 } 2249 2250 srcVector := testutil.MakeScalarVarchar(k.s, 10) 2251 destVector := testutil.MakeTimeStampVector(nil, nil) 2252 wantVec := testutil.MakeScalarTimeStamp(k.want, 10) 2253 proc := testutil.NewProc() 2254 res, err := Cast([]*vector.Vector{srcVector, destVector}, proc) 2255 convey.So(err, convey.ShouldBeNil) 2256 compare := testutil.CompareVectors(wantVec, res) 2257 convey.So(compare, convey.ShouldBeTrue) 2258 }) 2259 } 2260 2261 func TestCastFloatAsDecimal(t *testing.T) { 2262 makeTempVectors := func(leftVal []float32, leftType types.Type, rightType types.Type) []*vector.Vector { 2263 vecs := make([]*vector.Vector, 2) 2264 vecs[0] = vector.NewConstFixed(leftType, 1, leftVal[0], testutil.TestUtilMp) 2265 vecs[1] = &vector.Vector{ 2266 Col: nil, 2267 Typ: rightType, 2268 Nsp: &nulls.Nulls{}, 2269 } 2270 return vecs 2271 } 2272 leftType := types.Type{Oid: types.T_float32, Size: 8} 2273 rightType := types.Type{Oid: types.T_decimal64, Size: 8, Scale: 2, Width: 16} 2274 d, _ := types.Decimal64FromFloat64(123.0, 5, 1) 2275 2276 cases := []struct { 2277 name string 2278 vecs []*vector.Vector 2279 proc *process.Process 2280 wantBytes interface{} 2281 }{ 2282 { 2283 name: "TEST01", 2284 vecs: makeTempVectors([]float32{123.0}, leftType, rightType), 2285 proc: testutil.NewProc(), 2286 wantBytes: []types.Decimal64{d}, 2287 }, 2288 } 2289 2290 for _, c := range cases { 2291 t.Run(c.name, func(t *testing.T) { 2292 result, _ := Cast(c.vecs, c.proc) 2293 require.Equal(t, c.wantBytes, result.Col.([]types.Decimal64)) 2294 }) 2295 } 2296 } 2297 2298 func TestCastDecimalAsString(t *testing.T) { 2299 makeTempVectors := func(leftVal []types.Decimal64, leftType types.Type, rightType types.Type) []*vector.Vector { 2300 vecs := make([]*vector.Vector, 2) 2301 vecs[0] = vector.NewConstFixed(leftType, 1, leftVal[0], testutil.TestUtilMp) 2302 vecs[1] = vector.New(rightType) 2303 return vecs 2304 } 2305 leftType := types.Type{Oid: types.T_decimal64, Size: 8} 2306 rightType := types.Type{Oid: types.T_varchar, Size: 24} 2307 2308 cases := []struct { 2309 name string 2310 vecs []*vector.Vector 2311 proc *process.Process 2312 wantBytes interface{} 2313 }{ 2314 { 2315 name: "TEST01", 2316 vecs: makeTempVectors([]types.Decimal64{types.Decimal64FromInt32(1230)}, leftType, rightType), 2317 proc: testutil.NewProc(), 2318 wantBytes: [][]byte{ 2319 {0x31, 0x32, 0x33, 0x30}, 2320 }, 2321 }, 2322 } 2323 2324 for _, c := range cases { 2325 t.Run(c.name, func(t *testing.T) { 2326 result, _ := Cast(c.vecs, c.proc) 2327 require.Equal(t, c.wantBytes, vector.GetBytesVectorValues(result)) 2328 }) 2329 } 2330 } 2331 2332 func TestCastTimestampAsDate(t *testing.T) { 2333 makeTempVectors := func(leftVal []types.Timestamp, leftType types.Type, rightType types.Type) []*vector.Vector { 2334 vecs := make([]*vector.Vector, 2) 2335 vecs[0] = vector.NewConstFixed(leftType, 1, leftVal[0], testutil.TestUtilMp) 2336 vecs[1] = &vector.Vector{ 2337 Col: nil, 2338 Typ: rightType, 2339 Nsp: &nulls.Nulls{}, 2340 } 2341 return vecs 2342 } 2343 leftType := types.Type{Oid: types.T_timestamp, Size: 8} 2344 rightType := types.Type{Oid: types.T_date, Size: 4} 2345 2346 cases := []struct { 2347 name string 2348 vecs []*vector.Vector 2349 proc *process.Process 2350 wantBytes interface{} 2351 }{ 2352 { 2353 name: "TEST01", 2354 vecs: makeTempVectors([]types.Timestamp{types.Timestamp(382331223)}, leftType, rightType), 2355 proc: testutil.NewProc(), 2356 wantBytes: []types.Date{types.Date(0)}, 2357 }, 2358 } 2359 2360 for _, c := range cases { 2361 t.Run(c.name, func(t *testing.T) { 2362 result, _ := Cast(c.vecs, c.proc) 2363 require.Equal(t, c.wantBytes, result.Col.([]types.Date)) 2364 }) 2365 } 2366 } 2367 2368 func TestCastDecimal64AsDecimal128(t *testing.T) { 2369 //Cast converts decimal64 to decimal128 2370 makeTempVector := func(left types.Decimal64, leftType types.Type, leftScalar bool, destType types.Type) []*vector.Vector { 2371 vectors := make([]*vector.Vector, 2) 2372 if leftScalar { 2373 vectors[0] = vector.NewConstFixed(leftType, 1, left, testutil.TestUtilMp) 2374 } else { 2375 vectors[0] = vector.NewWithFixed(leftType, []types.Decimal64{left}, nil, testutil.TestUtilMp) 2376 } 2377 vectors[1] = vector.New(destType) 2378 return vectors 2379 } 2380 // decimal(10,5) 2381 leftType := types.Type{Oid: types.T_decimal64, Size: 8, Width: 10, Scale: 5} 2382 //decimal(20, 5) 2383 destType := types.Type{Oid: types.T_decimal128, Size: 16, Width: 20, Scale: 5} 2384 2385 d64_33333300 := types.Decimal64FromInt32(333333000) 2386 d128_33333300 := types.Decimal128FromInt32(333333000) 2387 2388 procs := testutil.NewProc() 2389 cases := []struct { 2390 name string 2391 vecs []*vector.Vector 2392 proc *process.Process 2393 wantBytes interface{} 2394 wantType types.T 2395 wantScalar bool 2396 }{ 2397 { 2398 name: "TEST01", //cast(333.33300 as decimal(20, 5)) 2399 vecs: makeTempVector(d64_33333300, leftType, true, destType), 2400 proc: procs, 2401 wantBytes: []types.Decimal128{d128_33333300}, 2402 wantType: types.T_decimal128, 2403 wantScalar: true, 2404 }, 2405 { 2406 name: "TEST01", //cast(333.33300 as decimal(20, 5)) 2407 vecs: makeTempVector(d64_33333300, leftType, false, destType), 2408 proc: procs, 2409 wantBytes: []types.Decimal128{d128_33333300}, 2410 wantType: types.T_decimal128, 2411 wantScalar: false, 2412 }, 2413 } 2414 2415 for _, c := range cases { 2416 t.Run(c.name, func(t *testing.T) { 2417 castRes, err := Cast(c.vecs, c.proc) 2418 if err != nil { 2419 t.Fatal(err) 2420 } 2421 require.Equal(t, c.wantBytes, castRes.Col) 2422 require.Equal(t, c.wantType, castRes.Typ.Oid) 2423 require.Equal(t, c.wantScalar, castRes.IsScalar()) 2424 }) 2425 } 2426 2427 } 2428 2429 func TestCastDecimal64AsDecimal64(t *testing.T) { 2430 //Cast converts decimal64 to decimal64 2431 makeTempVector := func(left types.Decimal64, leftType types.Type, leftScalar bool, destType types.Type) []*vector.Vector { 2432 vectors := make([]*vector.Vector, 2) 2433 if leftScalar { 2434 vectors[0] = vector.NewConstFixed(leftType, 1, left, testutil.TestUtilMp) 2435 } else { 2436 vectors[0] = vector.NewWithFixed(leftType, []types.Decimal64{left}, nil, testutil.TestUtilMp) 2437 } 2438 2439 vectors[1] = vector.New(destType) 2440 return vectors 2441 } 2442 // decimal(10,5) 2443 leftType := types.Type{Oid: types.T_decimal64, Size: 8, Width: 10, Scale: 5} 2444 //decimal(10, 4) 2445 destType := types.Type{Oid: types.T_decimal64, Size: 8, Width: 10, Scale: 4} 2446 2447 procs := testutil.NewProc() 2448 cases := []struct { 2449 name string 2450 vecs []*vector.Vector 2451 proc *process.Process 2452 wantBytes interface{} 2453 wantType types.Type 2454 wantScalar bool 2455 }{ 2456 { 2457 name: "TEST01", //cast(333.33300 as decimal(10, 4)) 2458 vecs: makeTempVector(types.Decimal64FromInt32(33333300), leftType, true, destType), 2459 proc: procs, 2460 wantBytes: []types.Decimal64{types.Decimal64FromInt32(33333300)}, 2461 wantType: destType, 2462 wantScalar: true, 2463 }, 2464 { 2465 name: "TEST02", //cast(333.33300 as decimal(10, 4)) 2466 vecs: makeTempVector(types.Decimal64FromInt32(33333300), leftType, false, destType), 2467 proc: procs, 2468 wantBytes: []types.Decimal64{types.Decimal64FromInt32(33333300)}, 2469 wantType: destType, 2470 wantScalar: false, 2471 }, 2472 } 2473 2474 for _, c := range cases { 2475 t.Run(c.name, func(t *testing.T) { 2476 castRes, err := Cast(c.vecs, c.proc) 2477 if err != nil { 2478 t.Fatal(err) 2479 } 2480 require.Equal(t, c.wantBytes, castRes.Col) 2481 require.Equal(t, c.wantType.Oid, castRes.Typ.Oid) 2482 require.Equal(t, c.wantScalar, castRes.IsScalar()) 2483 }) 2484 } 2485 } 2486 2487 func TestCastDecimal128AsDecimal128(t *testing.T) { 2488 // Cast converts decimal128 to decimal128 2489 makeTempVector := func(left types.Decimal128, leftType types.Type, leftScalar bool, destType types.Type) []*vector.Vector { 2490 vectors := make([]*vector.Vector, 2) 2491 if leftScalar { 2492 vectors[0] = vector.NewConstFixed(leftType, 1, left, testutil.TestUtilMp) 2493 } else { 2494 vectors[0] = vector.NewWithFixed(leftType, []types.Decimal128{left}, nil, testutil.TestUtilMp) 2495 } 2496 2497 vectors[1] = vector.New(destType) 2498 return vectors 2499 } 2500 2501 leftType := types.Type{Oid: types.T_decimal128, Size: 16, Width: 20, Scale: 5} 2502 destType := types.Type{Oid: types.T_decimal128, Size: 16, Width: 20, Scale: 5} 2503 2504 procs := testutil.NewProc() 2505 cases := []struct { 2506 name string 2507 vecs []*vector.Vector 2508 proc *process.Process 2509 wantBytes interface{} 2510 wantType types.Type 2511 wantScalar bool 2512 }{ 2513 { 2514 name: "TEST01", //cast(333.33300 as decimal(20, 5)) 2515 vecs: makeTempVector(types.Decimal128FromInt32(33333300), leftType, true, destType), 2516 proc: procs, 2517 wantBytes: []types.Decimal128{types.Decimal128FromInt32(33333300)}, 2518 wantType: destType, 2519 wantScalar: true, 2520 }, 2521 { 2522 name: "Test02", 2523 vecs: makeTempVector(types.Decimal128FromInt32(33333300), leftType, false, destType), 2524 proc: procs, 2525 wantBytes: []types.Decimal128{types.Decimal128FromInt32(33333300)}, 2526 wantType: destType, 2527 wantScalar: false, 2528 }, 2529 } 2530 2531 for _, c := range cases { 2532 t.Run(c.name, func(t *testing.T) { 2533 castRes, err := Cast(c.vecs, c.proc) 2534 if err != nil { 2535 t.Fatal(err) 2536 } 2537 require.Equal(t, c.wantBytes, castRes.Col) 2538 require.Equal(t, c.wantType.Oid, castRes.Typ.Oid) 2539 require.Equal(t, c.wantScalar, castRes.IsScalar()) 2540 }) 2541 } 2542 } 2543 2544 /* 2545 * Honestly I have no idea what this is testing ... 2546 * 2547 func TestCastStringAsDecimal64(t *testing.T) { 2548 2549 makeDecimal64Vector := func(values []int64, nsp []uint64, width int32, scale int32) *vector.Vector { 2550 d64 := types.Type{ 2551 Oid: types.T_decimal64, 2552 Size: 8, 2553 Width: width, 2554 Scale: scale, 2555 } 2556 vec := vector.New(d64) 2557 for _, n := range nsp { 2558 nulls.Add(vec.Nsp, n) 2559 } 2560 ptr := (*[]types.Decimal64)(unsafe.Pointer(&values)) 2561 vec.Col = *ptr 2562 return vec 2563 } 2564 2565 makeScalarDecimal64 := func(v int64, length int, width int32, scale int32) *vector.Vector { 2566 d64 := types.Type{ 2567 Oid: types.T_decimal64, 2568 Size: 8, 2569 Width: width, 2570 Scale: scale, 2571 } 2572 vec := testutil.NewProc().AllocScalarVector(d64) 2573 vec.Length = length 2574 var tmp types.Decimal64 2575 tmp.FromInt64(v) 2576 vec.Col = []types.Decimal64{tmp} 2577 return vec 2578 } 2579 2580 convey.Convey("TestCastStringAsDecimal64", t, func() { 2581 type kase struct { 2582 s string 2583 want int64 2584 } 2585 2586 kases := []kase{ 2587 { 2588 s: "333.333", 2589 want: 33333300, 2590 }, 2591 { 2592 s: "-1234.5", 2593 want: -123450000, 2594 }, 2595 } 2596 2597 var inStr []string 2598 var wantDecimal64 []int64 2599 for _, k := range kases { 2600 inStr = append(inStr, k.s) 2601 wantDecimal64 = append(wantDecimal64, k.want) 2602 } 2603 2604 inVector := testutil.MakeVarcharVector(inStr, nil) 2605 destVector := makeDecimal64Vector(nil, nil, 10, 5) 2606 wantVector := makeDecimal64Vector(wantDecimal64, nil, 10, 5) 2607 proc := testutil.NewProc() 2608 res, err := Cast([]*vector.Vector{inVector, destVector}, proc) 2609 //res, err := CastStringAsDecimal64(inVector, destVector, proc) 2610 convey.ShouldBeNil(err) 2611 compare := testutil.CompareVectors(wantVector, res) 2612 convey.So(compare, convey.ShouldBeTrue) 2613 }) 2614 2615 convey.Convey("TestCasetScalarStringAsDecimal64", t, func() { 2616 type kase struct { 2617 s string 2618 want int64 2619 } 2620 2621 k := kase{ 2622 s: "333.123", 2623 want: 33312300, 2624 } 2625 2626 inVector := testutil.MakeScalarVarchar(k.s, 10) 2627 wantVector := makeScalarDecimal64(k.want, 10, 10, 5) 2628 destVector := makeDecimal64Vector(nil, nil, 10, 5) 2629 proc := testutil.NewProc() 2630 res, err := Cast([]*vector.Vector{inVector, destVector}, proc) 2631 //res, err := CastStringAsDecimal64(inVector, destVector, proc) 2632 convey.ShouldBeNil(err) 2633 compare := testutil.CompareVectors(wantVector, res) 2634 convey.So(compare, convey.ShouldBeTrue) 2635 }) 2636 } 2637 2638 * 2639 */ 2640 2641 func TestCastTimeStampAsDatetime(t *testing.T) { 2642 //Cast converts timestamp to datetime 2643 convey.Convey("Cast timestamp to datetime", t, func() { 2644 type kase struct { 2645 s string 2646 want string 2647 } 2648 kases := []kase{ 2649 { 2650 s: "2004-04-03 12:14:35", 2651 want: "2004-04-03 12:14:35", 2652 }, 2653 { 2654 s: "2021-10-03 11:52:21", 2655 want: "2021-10-03 11:52:21", 2656 }, 2657 { 2658 s: "2020-08-23 11:52:21", 2659 want: "2020-08-23 11:52:21", 2660 }, 2661 { 2662 s: "2021-11-23 16:12:21", 2663 want: "2021-11-23 16:12:21", 2664 }, 2665 { 2666 s: "2014-09-23 16:17:21", 2667 want: "2014-09-23 16:17:21", 2668 }, 2669 } 2670 2671 var inStrs []string 2672 var wantStrs []string 2673 for _, k := range kases { 2674 inStrs = append(inStrs, k.s) 2675 wantStrs = append(wantStrs, k.want) 2676 } 2677 2678 srcVector := testutil.MakeTimeStampVector(inStrs, nil) 2679 destVector := testutil.MakeDateTimeVector(nil, nil) 2680 wantVec := testutil.MakeDateTimeVector(wantStrs, nil) 2681 proc := testutil.NewProc() 2682 res, err := Cast([]*vector.Vector{srcVector, destVector}, proc) 2683 convey.So(err, convey.ShouldBeNil) 2684 compare := testutil.CompareVectors(wantVec, res) 2685 convey.So(compare, convey.ShouldBeTrue) 2686 }) 2687 2688 convey.Convey("Cast scalar timestamp to datetime", t, func() { 2689 type kase struct { 2690 s string 2691 want string 2692 } 2693 k := kase{ 2694 s: "2021-10-03 11:52:21", 2695 want: "2021-10-03 11:52:21", 2696 } 2697 2698 srcVector := testutil.MakeScalarTimeStamp(k.s, 10) 2699 destVector := testutil.MakeDateTimeVector(nil, nil) 2700 wantVec := testutil.MakeScalarDateTime(k.want, 10) 2701 proc := testutil.NewProc() 2702 res, err := Cast([]*vector.Vector{srcVector, destVector}, proc) 2703 convey.So(err, convey.ShouldBeNil) 2704 compare := testutil.CompareVectors(wantVec, res) 2705 convey.So(compare, convey.ShouldBeTrue) 2706 }) 2707 } 2708 2709 func TestCastDatetimeAsTimeStamp(t *testing.T) { 2710 //Cast converts timestamp to datetime 2711 convey.Convey("Cast datetime to timestamp", t, func() { 2712 type kase struct { 2713 s string 2714 want string 2715 } 2716 kases := []kase{ 2717 { 2718 s: "2004-04-03 12:14:35", 2719 want: "2004-04-03 12:14:35", 2720 }, 2721 { 2722 s: "2021-10-03 11:52:21", 2723 want: "2021-10-03 11:52:21", 2724 }, 2725 { 2726 s: "2020-08-23 11:52:21", 2727 want: "2020-08-23 11:52:21", 2728 }, 2729 { 2730 s: "2021-11-23 16:12:21", 2731 want: "2021-11-23 16:12:21", 2732 }, 2733 { 2734 s: "2014-09-23 16:17:21", 2735 want: "2014-09-23 16:17:21", 2736 }, 2737 } 2738 2739 var inStrs []string 2740 var wantStrs []string 2741 for _, k := range kases { 2742 inStrs = append(inStrs, k.s) 2743 wantStrs = append(wantStrs, k.want) 2744 } 2745 2746 srcVector := testutil.MakeDateTimeVector(inStrs, nil) 2747 destVector := testutil.MakeTimeStampVector(nil, nil) 2748 wantVec := testutil.MakeTimeStampVector(wantStrs, nil) 2749 proc := testutil.NewProc() 2750 res, err := Cast([]*vector.Vector{srcVector, destVector}, proc) 2751 convey.So(err, convey.ShouldBeNil) 2752 compare := testutil.CompareVectors(wantVec, res) 2753 convey.So(compare, convey.ShouldBeTrue) 2754 }) 2755 2756 convey.Convey("Cast scalar datetimeto timestamp ", t, func() { 2757 type kase struct { 2758 s string 2759 want string 2760 } 2761 k := kase{ 2762 s: "2021-10-03 11:52:21", 2763 want: "2021-10-03 11:52:21", 2764 } 2765 2766 srcVector := testutil.MakeScalarDateTime(k.s, 10) 2767 destVector := testutil.MakeTimeStampVector(nil, nil) 2768 wantVec := testutil.MakeScalarTimeStamp(k.want, 10) 2769 proc := testutil.NewProc() 2770 res, err := Cast([]*vector.Vector{srcVector, destVector}, proc) 2771 convey.So(err, convey.ShouldBeNil) 2772 compare := testutil.CompareVectors(wantVec, res) 2773 convey.So(compare, convey.ShouldBeTrue) 2774 }) 2775 } 2776 2777 func TestCastDateAsTimeStamp(t *testing.T) { 2778 //Cast converts timestamp to datetime 2779 convey.Convey("Cast date to timeStamp", t, func() { 2780 type kase struct { 2781 s string 2782 want string 2783 } 2784 kases := []kase{ 2785 { 2786 s: "2004-04-03", 2787 want: "2004-04-03 00:00:00", 2788 }, 2789 { 2790 s: "2021-10-03", 2791 want: "2021-10-03 00:00:00", 2792 }, 2793 { 2794 s: "2020-08-23", 2795 want: "2020-08-23 00:00:00", 2796 }, 2797 { 2798 s: "2021-11-23", 2799 want: "2021-11-23 00:00:00", 2800 }, 2801 { 2802 s: "2014-09-23", 2803 want: "2014-09-23 00:00:00", 2804 }, 2805 } 2806 2807 var inStrs []string 2808 var wantStrs []string 2809 for _, k := range kases { 2810 inStrs = append(inStrs, k.s) 2811 wantStrs = append(wantStrs, k.want) 2812 } 2813 2814 srcVector := testutil.MakeDateVector(inStrs, nil) 2815 destVector := testutil.MakeTimeStampVector(nil, nil) 2816 wantVec := testutil.MakeTimeStampVector(wantStrs, nil) 2817 proc := testutil.NewProc() 2818 res, err := Cast([]*vector.Vector{srcVector, destVector}, proc) 2819 convey.So(err, convey.ShouldBeNil) 2820 compare := testutil.CompareVectors(wantVec, res) 2821 convey.So(compare, convey.ShouldBeTrue) 2822 }) 2823 2824 convey.Convey("Cast scalar date to timestamp", t, func() { 2825 type kase struct { 2826 s string 2827 want string 2828 } 2829 k := kase{ 2830 s: "2021-10-03", 2831 want: "2021-10-03 00:00:00", 2832 } 2833 2834 srcVector := testutil.MakeScalarDate(k.s, 10) 2835 destVector := testutil.MakeTimeStampVector(nil, nil) 2836 wantVec := testutil.MakeScalarTimeStamp(k.want, 10) 2837 proc := testutil.NewProc() 2838 res, err := Cast([]*vector.Vector{srcVector, destVector}, proc) 2839 convey.So(err, convey.ShouldBeNil) 2840 compare := testutil.CompareVectors(wantVec, res) 2841 convey.So(compare, convey.ShouldBeTrue) 2842 }) 2843 } 2844 2845 func TestCastIntegerAsTimestamp(t *testing.T) { 2846 2847 wantDatetimeFromUnix := func(ts int64) string { 2848 return time.Unix(ts, 0).Local().Format("2006-01-02 15:04:05") 2849 } 2850 //Cast converts int8 to timeStamp 2851 convey.Convey("Cast int8 to timeStamp", t, func() { 2852 type kase struct { 2853 intval int8 2854 want string 2855 } 2856 kases := []kase{ 2857 { 2858 intval: 23, 2859 want: wantDatetimeFromUnix(23), 2860 }, 2861 { 2862 intval: 26, 2863 want: wantDatetimeFromUnix(26), 2864 }, 2865 } 2866 2867 var intVals []int8 2868 var wantStrs []string 2869 for _, k := range kases { 2870 intVals = append(intVals, k.intval) 2871 wantStrs = append(wantStrs, k.want) 2872 } 2873 2874 srcVector := testutil.MakeInt8Vector(intVals, nil) 2875 destVector := testutil.MakeTimeStampVector(nil, nil) 2876 wantVec := testutil.MakeTimeStampVector(wantStrs, nil) 2877 proc := testutil.NewProc() 2878 res, err := Cast([]*vector.Vector{srcVector, destVector}, proc) 2879 convey.So(err, convey.ShouldBeNil) 2880 compare := testutil.CompareVectors(wantVec, res) 2881 convey.So(compare, convey.ShouldBeTrue) 2882 }) 2883 2884 //Cast converts int16 to timeStamp 2885 convey.Convey("Cast int16 to timeStamp", t, func() { 2886 type kase struct { 2887 intval int16 2888 want string 2889 } 2890 kases := []kase{ 2891 { 2892 intval: 12000, 2893 want: wantDatetimeFromUnix(12000), 2894 }, 2895 { 2896 intval: 26200, 2897 want: wantDatetimeFromUnix(26200), 2898 }, 2899 } 2900 2901 var intVals []int16 2902 var wantStrs []string 2903 for _, k := range kases { 2904 intVals = append(intVals, k.intval) 2905 wantStrs = append(wantStrs, k.want) 2906 } 2907 2908 srcVector := testutil.MakeInt16Vector(intVals, nil) 2909 destVector := testutil.MakeTimeStampVector(nil, nil) 2910 wantVec := testutil.MakeTimeStampVector(wantStrs, nil) 2911 proc := testutil.NewProc() 2912 res, err := Cast([]*vector.Vector{srcVector, destVector}, proc) 2913 convey.So(err, convey.ShouldBeNil) 2914 compare := testutil.CompareVectors(wantVec, res) 2915 convey.So(compare, convey.ShouldBeTrue) 2916 }) 2917 2918 //Cast converts int32 to timeStamp 2919 convey.Convey("Cast int32 to timeStamp", t, func() { 2920 type kase struct { 2921 intval int32 2922 want string 2923 } 2924 kases := []kase{ 2925 { 2926 intval: 2300000, 2927 want: wantDatetimeFromUnix(2300000), 2928 }, 2929 { 2930 intval: 2710000, 2931 want: wantDatetimeFromUnix(2710000), 2932 }, 2933 } 2934 2935 var intVals []int32 2936 var wantStrs []string 2937 for _, k := range kases { 2938 intVals = append(intVals, k.intval) 2939 wantStrs = append(wantStrs, k.want) 2940 } 2941 2942 srcVector := testutil.MakeInt32Vector(intVals, nil) 2943 destVector := testutil.MakeTimeStampVector(nil, nil) 2944 wantVec := testutil.MakeTimeStampVector(wantStrs, nil) 2945 proc := testutil.NewProc() 2946 res, err := Cast([]*vector.Vector{srcVector, destVector}, proc) 2947 convey.So(err, convey.ShouldBeNil) 2948 compare := testutil.CompareVectors(wantVec, res) 2949 convey.So(compare, convey.ShouldBeTrue) 2950 }) 2951 2952 //Cast converts int64 to timeStamp 2953 convey.Convey("Cast int64 to timeStamp", t, func() { 2954 type kase struct { 2955 intval int64 2956 want string 2957 } 2958 kases := []kase{ 2959 { 2960 intval: 833453453, 2961 want: wantDatetimeFromUnix(833453453), 2962 }, 2963 { 2964 intval: 933453453, 2965 want: wantDatetimeFromUnix(933453453), 2966 }, 2967 } 2968 2969 var intVals []int64 2970 var wantStrs []string 2971 for _, k := range kases { 2972 intVals = append(intVals, k.intval) 2973 wantStrs = append(wantStrs, k.want) 2974 } 2975 2976 srcVector := testutil.MakeInt64Vector(intVals, nil) 2977 destVector := testutil.MakeTimeStampVector(nil, nil) 2978 wantVec := testutil.MakeTimeStampVector(wantStrs, nil) 2979 proc := testutil.NewProc() 2980 res, err := Cast([]*vector.Vector{srcVector, destVector}, proc) 2981 convey.So(err, convey.ShouldBeNil) 2982 compare := testutil.CompareVectors(wantVec, res) 2983 convey.So(compare, convey.ShouldBeTrue) 2984 }) 2985 2986 //Cast converts uint8 to timeStamp 2987 convey.Convey("Cast uint8 to timeStamp", t, func() { 2988 type kase struct { 2989 intval uint8 2990 want string 2991 } 2992 kases := []kase{ 2993 { 2994 intval: 233, 2995 want: wantDatetimeFromUnix(233), 2996 }, 2997 { 2998 intval: 254, 2999 want: wantDatetimeFromUnix(254), 3000 }, 3001 } 3002 3003 var intVals []uint8 3004 var wantStrs []string 3005 for _, k := range kases { 3006 intVals = append(intVals, k.intval) 3007 wantStrs = append(wantStrs, k.want) 3008 } 3009 3010 srcVector := testutil.MakeUint8Vector(intVals, nil) 3011 destVector := testutil.MakeTimeStampVector(nil, nil) 3012 wantVec := testutil.MakeTimeStampVector(wantStrs, nil) 3013 proc := testutil.NewProc() 3014 res, err := Cast([]*vector.Vector{srcVector, destVector}, proc) 3015 convey.So(err, convey.ShouldBeNil) 3016 compare := testutil.CompareVectors(wantVec, res) 3017 convey.So(compare, convey.ShouldBeTrue) 3018 }) 3019 3020 //Cast converts uint16 to timeStamp 3021 convey.Convey("Cast uint16 to timeStamp", t, func() { 3022 type kase struct { 3023 intval uint16 3024 want string 3025 } 3026 kases := []kase{ 3027 { 3028 intval: 33345, 3029 want: wantDatetimeFromUnix(33345), 3030 }, 3031 { 3032 intval: 43345, 3033 want: wantDatetimeFromUnix(43345), 3034 }, 3035 } 3036 3037 var intVals []uint16 3038 var wantStrs []string 3039 for _, k := range kases { 3040 intVals = append(intVals, k.intval) 3041 wantStrs = append(wantStrs, k.want) 3042 } 3043 3044 srcVector := testutil.MakeUint16Vector(intVals, nil) 3045 destVector := testutil.MakeTimeStampVector(nil, nil) 3046 wantVec := testutil.MakeTimeStampVector(wantStrs, nil) 3047 proc := testutil.NewProc() 3048 res, err := Cast([]*vector.Vector{srcVector, destVector}, proc) 3049 convey.So(err, convey.ShouldBeNil) 3050 compare := testutil.CompareVectors(wantVec, res) 3051 convey.So(compare, convey.ShouldBeTrue) 3052 }) 3053 3054 //Cast converts uint32 to timeStamp 3055 convey.Convey("Cast uint32 to timeStamp", t, func() { 3056 type kase struct { 3057 intval uint32 3058 want string 3059 } 3060 kases := []kase{ 3061 { 3062 intval: 83345789, 3063 want: wantDatetimeFromUnix(83345789), 3064 }, 3065 { 3066 intval: 89345789, 3067 want: wantDatetimeFromUnix(89345789), 3068 }, 3069 } 3070 3071 var intVals []uint32 3072 var wantStrs []string 3073 for _, k := range kases { 3074 intVals = append(intVals, k.intval) 3075 wantStrs = append(wantStrs, k.want) 3076 } 3077 3078 srcVector := testutil.MakeUint32Vector(intVals, nil) 3079 destVector := testutil.MakeTimeStampVector(nil, nil) 3080 wantVec := testutil.MakeTimeStampVector(wantStrs, nil) 3081 proc := testutil.NewProc() 3082 res, err := Cast([]*vector.Vector{srcVector, destVector}, proc) 3083 convey.So(err, convey.ShouldBeNil) 3084 compare := testutil.CompareVectors(wantVec, res) 3085 convey.So(compare, convey.ShouldBeTrue) 3086 }) 3087 3088 //Cast converts uint64 to timeStamp 3089 convey.Convey("Cast uint64 to timeStamp", t, func() { 3090 type kase struct { 3091 intval uint64 3092 want string 3093 } 3094 kases := []kase{ 3095 { 3096 intval: 1998933575, 3097 want: wantDatetimeFromUnix(1998933575), 3098 }, 3099 { 3100 intval: 1298933575, 3101 want: wantDatetimeFromUnix(1298933575), 3102 }, 3103 } 3104 3105 var intVals []uint64 3106 var wantStrs []string 3107 for _, k := range kases { 3108 intVals = append(intVals, k.intval) 3109 wantStrs = append(wantStrs, k.want) 3110 } 3111 3112 srcVector := testutil.MakeUint64Vector(intVals, nil) 3113 destVector := testutil.MakeTimeStampVector(nil, nil) 3114 wantVec := testutil.MakeTimeStampVector(wantStrs, nil) 3115 proc := testutil.NewProc() 3116 res, err := Cast([]*vector.Vector{srcVector, destVector}, proc) 3117 convey.So(err, convey.ShouldBeNil) 3118 compare := testutil.CompareVectors(wantVec, res) 3119 convey.So(compare, convey.ShouldBeTrue) 3120 }) 3121 } 3122 3123 func TestCastNullAsAllType(t *testing.T) { 3124 //Cast null as (int8/int16/int32/int64/uint8/uint16/uint32/uint64/float32/float64/date/datetime/timestamp/decimal64/decimal128/char/varchar) 3125 makeTempVectors := func(srcType types.T, destType types.T) []*vector.Vector { 3126 vectors := make([]*vector.Vector, 2) 3127 vectors[0] = makeScalarNullVector(srcType) 3128 vectors[1] = makeTypeVector(destType) 3129 return vectors 3130 } 3131 3132 procs := testutil.NewProc() 3133 cases := []struct { 3134 name string 3135 vecs []*vector.Vector 3136 proc *process.Process 3137 bitMap *roaring.Bitmap 3138 wantScalar bool 3139 }{ 3140 { 3141 name: "Test1", 3142 vecs: makeTempVectors(types.T_int8, types.T_int8), 3143 proc: procs, 3144 bitMap: roaring.BitmapOf(0), 3145 wantScalar: true, 3146 }, 3147 { 3148 name: "Test2", 3149 vecs: makeTempVectors(types.T_int8, types.T_int16), 3150 proc: procs, 3151 bitMap: roaring.BitmapOf(0), 3152 wantScalar: true, 3153 }, 3154 { 3155 name: "Test3", 3156 vecs: makeTempVectors(types.T_int8, types.T_int32), 3157 proc: procs, 3158 bitMap: roaring.BitmapOf(0), 3159 wantScalar: true, 3160 }, 3161 { 3162 name: "Test4", 3163 vecs: makeTempVectors(types.T_int8, types.T_int64), 3164 proc: procs, 3165 bitMap: roaring.BitmapOf(0), 3166 wantScalar: true, 3167 }, 3168 { 3169 name: "Test5", 3170 vecs: makeTempVectors(types.T_int8, types.T_uint8), 3171 proc: procs, 3172 bitMap: roaring.BitmapOf(0), 3173 wantScalar: true, 3174 }, 3175 { 3176 name: "Test6", 3177 vecs: makeTempVectors(types.T_int8, types.T_uint16), 3178 proc: procs, 3179 bitMap: roaring.BitmapOf(0), 3180 wantScalar: true, 3181 }, 3182 { 3183 name: "Test7", 3184 vecs: makeTempVectors(types.T_int8, types.T_uint32), 3185 proc: procs, 3186 bitMap: roaring.BitmapOf(0), 3187 wantScalar: true, 3188 }, 3189 { 3190 name: "Test8", 3191 vecs: makeTempVectors(types.T_int8, types.T_uint64), 3192 proc: procs, 3193 bitMap: roaring.BitmapOf(0), 3194 wantScalar: true, 3195 }, 3196 { 3197 name: "Test9", 3198 vecs: makeTempVectors(types.T_int8, types.T_float32), 3199 proc: procs, 3200 bitMap: roaring.BitmapOf(0), 3201 wantScalar: true, 3202 }, 3203 { 3204 name: "Test10", 3205 vecs: makeTempVectors(types.T_int8, types.T_float64), 3206 proc: procs, 3207 bitMap: roaring.BitmapOf(0), 3208 wantScalar: true, 3209 }, 3210 { 3211 name: "Test11", 3212 vecs: makeTempVectors(types.T_int8, types.T_decimal128), 3213 proc: procs, 3214 bitMap: roaring.BitmapOf(0), 3215 wantScalar: true, 3216 }, 3217 { 3218 name: "Test12", 3219 vecs: makeTempVectors(types.T_int8, types.T_char), 3220 proc: procs, 3221 bitMap: roaring.BitmapOf(0), 3222 wantScalar: true, 3223 }, 3224 { 3225 name: "Test13", 3226 vecs: makeTempVectors(types.T_int8, types.T_varchar), 3227 proc: procs, 3228 bitMap: roaring.BitmapOf(0), 3229 wantScalar: true, 3230 }, 3231 { 3232 name: "Test14", 3233 vecs: makeTempVectors(types.T_int16, types.T_int8), 3234 proc: procs, 3235 bitMap: roaring.BitmapOf(0), 3236 wantScalar: true, 3237 }, 3238 { 3239 name: "Test15", 3240 vecs: makeTempVectors(types.T_int16, types.T_int16), 3241 proc: procs, 3242 bitMap: roaring.BitmapOf(0), 3243 wantScalar: true, 3244 }, 3245 { 3246 name: "Test16", 3247 vecs: makeTempVectors(types.T_int16, types.T_int32), 3248 proc: procs, 3249 bitMap: roaring.BitmapOf(0), 3250 wantScalar: true, 3251 }, 3252 { 3253 name: "Test17", 3254 vecs: makeTempVectors(types.T_int16, types.T_int64), 3255 proc: procs, 3256 bitMap: roaring.BitmapOf(0), 3257 wantScalar: true, 3258 }, 3259 { 3260 name: "Test18", 3261 vecs: makeTempVectors(types.T_int16, types.T_uint8), 3262 proc: procs, 3263 bitMap: roaring.BitmapOf(0), 3264 wantScalar: true, 3265 }, 3266 { 3267 name: "Test19", 3268 vecs: makeTempVectors(types.T_int16, types.T_uint16), 3269 proc: procs, 3270 bitMap: roaring.BitmapOf(0), 3271 wantScalar: true, 3272 }, 3273 { 3274 name: "Test20", 3275 vecs: makeTempVectors(types.T_int16, types.T_uint32), 3276 proc: procs, 3277 bitMap: roaring.BitmapOf(0), 3278 wantScalar: true, 3279 }, 3280 { 3281 name: "Test21", 3282 vecs: makeTempVectors(types.T_int16, types.T_uint64), 3283 proc: procs, 3284 bitMap: roaring.BitmapOf(0), 3285 wantScalar: true, 3286 }, 3287 { 3288 name: "Test22", 3289 vecs: makeTempVectors(types.T_int16, types.T_float32), 3290 proc: procs, 3291 bitMap: roaring.BitmapOf(0), 3292 wantScalar: true, 3293 }, 3294 { 3295 name: "Test23", 3296 vecs: makeTempVectors(types.T_int16, types.T_float64), 3297 proc: procs, 3298 bitMap: roaring.BitmapOf(0), 3299 wantScalar: true, 3300 }, 3301 { 3302 name: "Test24", 3303 vecs: makeTempVectors(types.T_int16, types.T_decimal128), 3304 proc: procs, 3305 bitMap: roaring.BitmapOf(0), 3306 wantScalar: true, 3307 }, 3308 { 3309 name: "Test25", 3310 vecs: makeTempVectors(types.T_int16, types.T_char), 3311 proc: procs, 3312 bitMap: roaring.BitmapOf(0), 3313 wantScalar: true, 3314 }, 3315 { 3316 name: "Test26", 3317 vecs: makeTempVectors(types.T_int16, types.T_varchar), 3318 proc: procs, 3319 bitMap: roaring.BitmapOf(0), 3320 wantScalar: true, 3321 }, 3322 { 3323 name: "Test27", 3324 vecs: makeTempVectors(types.T_int32, types.T_int8), 3325 proc: procs, 3326 bitMap: roaring.BitmapOf(0), 3327 wantScalar: true, 3328 }, 3329 { 3330 name: "Test28", 3331 vecs: makeTempVectors(types.T_int32, types.T_int16), 3332 proc: procs, 3333 bitMap: roaring.BitmapOf(0), 3334 wantScalar: true, 3335 }, 3336 { 3337 name: "Test29", 3338 vecs: makeTempVectors(types.T_int32, types.T_int32), 3339 proc: procs, 3340 bitMap: roaring.BitmapOf(0), 3341 wantScalar: true, 3342 }, 3343 { 3344 name: "Test30", 3345 vecs: makeTempVectors(types.T_int32, types.T_int64), 3346 proc: procs, 3347 bitMap: roaring.BitmapOf(0), 3348 wantScalar: true, 3349 }, 3350 { 3351 name: "Test31", 3352 vecs: makeTempVectors(types.T_int32, types.T_uint8), 3353 proc: procs, 3354 bitMap: roaring.BitmapOf(0), 3355 wantScalar: true, 3356 }, 3357 { 3358 name: "Test32", 3359 vecs: makeTempVectors(types.T_int32, types.T_uint16), 3360 proc: procs, 3361 bitMap: roaring.BitmapOf(0), 3362 wantScalar: true, 3363 }, 3364 { 3365 name: "Test33", 3366 vecs: makeTempVectors(types.T_int32, types.T_uint32), 3367 proc: procs, 3368 bitMap: roaring.BitmapOf(0), 3369 wantScalar: true, 3370 }, 3371 { 3372 name: "Test34", 3373 vecs: makeTempVectors(types.T_int32, types.T_uint64), 3374 proc: procs, 3375 bitMap: roaring.BitmapOf(0), 3376 wantScalar: true, 3377 }, 3378 { 3379 name: "Test35", 3380 vecs: makeTempVectors(types.T_int32, types.T_float32), 3381 proc: procs, 3382 bitMap: roaring.BitmapOf(0), 3383 wantScalar: true, 3384 }, 3385 { 3386 name: "Test36", 3387 vecs: makeTempVectors(types.T_int32, types.T_float64), 3388 proc: procs, 3389 bitMap: roaring.BitmapOf(0), 3390 wantScalar: true, 3391 }, 3392 { 3393 name: "Test37", 3394 vecs: makeTempVectors(types.T_int32, types.T_decimal128), 3395 proc: procs, 3396 bitMap: roaring.BitmapOf(0), 3397 wantScalar: true, 3398 }, 3399 { 3400 name: "Test38", 3401 vecs: makeTempVectors(types.T_int32, types.T_char), 3402 proc: procs, 3403 bitMap: roaring.BitmapOf(0), 3404 wantScalar: true, 3405 }, 3406 { 3407 name: "Test39", 3408 vecs: makeTempVectors(types.T_int32, types.T_varchar), 3409 proc: procs, 3410 bitMap: roaring.BitmapOf(0), 3411 wantScalar: true, 3412 }, 3413 { 3414 name: "Test40", 3415 vecs: makeTempVectors(types.T_int64, types.T_int8), 3416 proc: procs, 3417 bitMap: roaring.BitmapOf(0), 3418 wantScalar: true, 3419 }, 3420 { 3421 name: "Test41", 3422 vecs: makeTempVectors(types.T_int64, types.T_int16), 3423 proc: procs, 3424 bitMap: roaring.BitmapOf(0), 3425 wantScalar: true, 3426 }, 3427 { 3428 name: "Test42", 3429 vecs: makeTempVectors(types.T_int64, types.T_int32), 3430 proc: procs, 3431 bitMap: roaring.BitmapOf(0), 3432 wantScalar: true, 3433 }, 3434 { 3435 name: "Test43", 3436 vecs: makeTempVectors(types.T_int64, types.T_int64), 3437 proc: procs, 3438 bitMap: roaring.BitmapOf(0), 3439 wantScalar: true, 3440 }, 3441 { 3442 name: "Test44", 3443 vecs: makeTempVectors(types.T_int64, types.T_uint8), 3444 proc: procs, 3445 bitMap: roaring.BitmapOf(0), 3446 wantScalar: true, 3447 }, 3448 { 3449 name: "Test45", 3450 vecs: makeTempVectors(types.T_int64, types.T_uint16), 3451 proc: procs, 3452 bitMap: roaring.BitmapOf(0), 3453 wantScalar: true, 3454 }, 3455 { 3456 name: "Test46", 3457 vecs: makeTempVectors(types.T_int64, types.T_uint32), 3458 proc: procs, 3459 bitMap: roaring.BitmapOf(0), 3460 wantScalar: true, 3461 }, 3462 { 3463 name: "Test47", 3464 vecs: makeTempVectors(types.T_int64, types.T_uint64), 3465 proc: procs, 3466 bitMap: roaring.BitmapOf(0), 3467 wantScalar: true, 3468 }, 3469 { 3470 name: "Test48", 3471 vecs: makeTempVectors(types.T_int64, types.T_float32), 3472 proc: procs, 3473 bitMap: roaring.BitmapOf(0), 3474 wantScalar: true, 3475 }, 3476 { 3477 name: "Test49", 3478 vecs: makeTempVectors(types.T_int64, types.T_float64), 3479 proc: procs, 3480 bitMap: roaring.BitmapOf(0), 3481 wantScalar: true, 3482 }, 3483 { 3484 name: "Test50", 3485 vecs: makeTempVectors(types.T_int64, types.T_decimal128), 3486 proc: procs, 3487 bitMap: roaring.BitmapOf(0), 3488 wantScalar: true, 3489 }, 3490 { 3491 name: "Test51", 3492 vecs: makeTempVectors(types.T_int64, types.T_char), 3493 proc: procs, 3494 bitMap: roaring.BitmapOf(0), 3495 wantScalar: true, 3496 }, 3497 { 3498 name: "Test52", 3499 vecs: makeTempVectors(types.T_int64, types.T_varchar), 3500 proc: procs, 3501 bitMap: roaring.BitmapOf(0), 3502 wantScalar: true, 3503 }, 3504 { 3505 name: "Test53", 3506 vecs: makeTempVectors(types.T_uint8, types.T_int8), 3507 proc: procs, 3508 bitMap: roaring.BitmapOf(0), 3509 wantScalar: true, 3510 }, 3511 { 3512 name: "Test54", 3513 vecs: makeTempVectors(types.T_uint8, types.T_int16), 3514 proc: procs, 3515 bitMap: roaring.BitmapOf(0), 3516 wantScalar: true, 3517 }, 3518 { 3519 name: "Test55", 3520 vecs: makeTempVectors(types.T_uint8, types.T_int32), 3521 proc: procs, 3522 bitMap: roaring.BitmapOf(0), 3523 wantScalar: true, 3524 }, 3525 { 3526 name: "Test56", 3527 vecs: makeTempVectors(types.T_uint8, types.T_int64), 3528 proc: procs, 3529 bitMap: roaring.BitmapOf(0), 3530 wantScalar: true, 3531 }, 3532 { 3533 name: "Test57", 3534 vecs: makeTempVectors(types.T_uint8, types.T_uint8), 3535 proc: procs, 3536 bitMap: roaring.BitmapOf(0), 3537 wantScalar: true, 3538 }, 3539 { 3540 name: "Test58", 3541 vecs: makeTempVectors(types.T_uint8, types.T_uint16), 3542 proc: procs, 3543 bitMap: roaring.BitmapOf(0), 3544 wantScalar: true, 3545 }, 3546 { 3547 name: "Test59", 3548 vecs: makeTempVectors(types.T_uint8, types.T_uint32), 3549 proc: procs, 3550 bitMap: roaring.BitmapOf(0), 3551 wantScalar: true, 3552 }, 3553 { 3554 name: "Test60", 3555 vecs: makeTempVectors(types.T_uint8, types.T_uint64), 3556 proc: procs, 3557 bitMap: roaring.BitmapOf(0), 3558 wantScalar: true, 3559 }, 3560 { 3561 name: "Test61", 3562 vecs: makeTempVectors(types.T_uint8, types.T_float32), 3563 proc: procs, 3564 bitMap: roaring.BitmapOf(0), 3565 wantScalar: true, 3566 }, 3567 { 3568 name: "Test62", 3569 vecs: makeTempVectors(types.T_uint8, types.T_float64), 3570 proc: procs, 3571 bitMap: roaring.BitmapOf(0), 3572 wantScalar: true, 3573 }, 3574 { 3575 name: "Test63", 3576 vecs: makeTempVectors(types.T_uint8, types.T_decimal128), 3577 proc: procs, 3578 bitMap: roaring.BitmapOf(0), 3579 wantScalar: true, 3580 }, 3581 { 3582 name: "Test64", 3583 vecs: makeTempVectors(types.T_uint8, types.T_char), 3584 proc: procs, 3585 bitMap: roaring.BitmapOf(0), 3586 wantScalar: true, 3587 }, 3588 { 3589 name: "Test65", 3590 vecs: makeTempVectors(types.T_uint8, types.T_varchar), 3591 proc: procs, 3592 bitMap: roaring.BitmapOf(0), 3593 wantScalar: true, 3594 }, 3595 { 3596 name: "Test66", 3597 vecs: makeTempVectors(types.T_uint16, types.T_int8), 3598 proc: procs, 3599 bitMap: roaring.BitmapOf(0), 3600 wantScalar: true, 3601 }, 3602 { 3603 name: "Test67", 3604 vecs: makeTempVectors(types.T_uint16, types.T_int16), 3605 proc: procs, 3606 bitMap: roaring.BitmapOf(0), 3607 wantScalar: true, 3608 }, 3609 { 3610 name: "Test68", 3611 vecs: makeTempVectors(types.T_uint16, types.T_int32), 3612 proc: procs, 3613 bitMap: roaring.BitmapOf(0), 3614 wantScalar: true, 3615 }, 3616 { 3617 name: "Test69", 3618 vecs: makeTempVectors(types.T_uint16, types.T_int64), 3619 proc: procs, 3620 bitMap: roaring.BitmapOf(0), 3621 wantScalar: true, 3622 }, 3623 { 3624 name: "Test70", 3625 vecs: makeTempVectors(types.T_uint16, types.T_uint8), 3626 proc: procs, 3627 bitMap: roaring.BitmapOf(0), 3628 wantScalar: true, 3629 }, 3630 { 3631 name: "Test71", 3632 vecs: makeTempVectors(types.T_uint16, types.T_uint16), 3633 proc: procs, 3634 bitMap: roaring.BitmapOf(0), 3635 wantScalar: true, 3636 }, 3637 { 3638 name: "Test72", 3639 vecs: makeTempVectors(types.T_uint16, types.T_uint32), 3640 proc: procs, 3641 bitMap: roaring.BitmapOf(0), 3642 wantScalar: true, 3643 }, 3644 { 3645 name: "Test73", 3646 vecs: makeTempVectors(types.T_uint16, types.T_uint64), 3647 proc: procs, 3648 bitMap: roaring.BitmapOf(0), 3649 wantScalar: true, 3650 }, 3651 { 3652 name: "Test74", 3653 vecs: makeTempVectors(types.T_uint16, types.T_float32), 3654 proc: procs, 3655 bitMap: roaring.BitmapOf(0), 3656 wantScalar: true, 3657 }, 3658 { 3659 name: "Test75", 3660 vecs: makeTempVectors(types.T_uint16, types.T_float64), 3661 proc: procs, 3662 bitMap: roaring.BitmapOf(0), 3663 wantScalar: true, 3664 }, 3665 { 3666 name: "Test76", 3667 vecs: makeTempVectors(types.T_uint16, types.T_decimal128), 3668 proc: procs, 3669 bitMap: roaring.BitmapOf(0), 3670 wantScalar: true, 3671 }, 3672 { 3673 name: "Test77", 3674 vecs: makeTempVectors(types.T_uint16, types.T_char), 3675 proc: procs, 3676 bitMap: roaring.BitmapOf(0), 3677 wantScalar: true, 3678 }, 3679 { 3680 name: "Test78", 3681 vecs: makeTempVectors(types.T_uint16, types.T_varchar), 3682 proc: procs, 3683 bitMap: roaring.BitmapOf(0), 3684 wantScalar: true, 3685 }, 3686 { 3687 name: "Test79", 3688 vecs: makeTempVectors(types.T_uint32, types.T_int8), 3689 proc: procs, 3690 bitMap: roaring.BitmapOf(0), 3691 wantScalar: true, 3692 }, 3693 { 3694 name: "Test80", 3695 vecs: makeTempVectors(types.T_uint32, types.T_int16), 3696 proc: procs, 3697 bitMap: roaring.BitmapOf(0), 3698 wantScalar: true, 3699 }, 3700 { 3701 name: "Test81", 3702 vecs: makeTempVectors(types.T_uint32, types.T_int32), 3703 proc: procs, 3704 bitMap: roaring.BitmapOf(0), 3705 wantScalar: true, 3706 }, 3707 { 3708 name: "Test82", 3709 vecs: makeTempVectors(types.T_uint32, types.T_int64), 3710 proc: procs, 3711 bitMap: roaring.BitmapOf(0), 3712 wantScalar: true, 3713 }, 3714 { 3715 name: "Test83", 3716 vecs: makeTempVectors(types.T_uint32, types.T_uint8), 3717 proc: procs, 3718 bitMap: roaring.BitmapOf(0), 3719 wantScalar: true, 3720 }, 3721 { 3722 name: "Test84", 3723 vecs: makeTempVectors(types.T_uint32, types.T_uint16), 3724 proc: procs, 3725 bitMap: roaring.BitmapOf(0), 3726 wantScalar: true, 3727 }, 3728 { 3729 name: "Test85", 3730 vecs: makeTempVectors(types.T_uint32, types.T_uint32), 3731 proc: procs, 3732 bitMap: roaring.BitmapOf(0), 3733 wantScalar: true, 3734 }, 3735 { 3736 name: "Test86", 3737 vecs: makeTempVectors(types.T_uint32, types.T_uint64), 3738 proc: procs, 3739 bitMap: roaring.BitmapOf(0), 3740 wantScalar: true, 3741 }, 3742 { 3743 name: "Test87", 3744 vecs: makeTempVectors(types.T_uint32, types.T_float32), 3745 proc: procs, 3746 bitMap: roaring.BitmapOf(0), 3747 wantScalar: true, 3748 }, 3749 { 3750 name: "Test88", 3751 vecs: makeTempVectors(types.T_uint32, types.T_float64), 3752 proc: procs, 3753 bitMap: roaring.BitmapOf(0), 3754 wantScalar: true, 3755 }, 3756 { 3757 name: "Test89", 3758 vecs: makeTempVectors(types.T_uint32, types.T_decimal128), 3759 proc: procs, 3760 bitMap: roaring.BitmapOf(0), 3761 wantScalar: true, 3762 }, 3763 { 3764 name: "Test90", 3765 vecs: makeTempVectors(types.T_uint32, types.T_char), 3766 proc: procs, 3767 bitMap: roaring.BitmapOf(0), 3768 wantScalar: true, 3769 }, 3770 { 3771 name: "Test91", 3772 vecs: makeTempVectors(types.T_uint32, types.T_varchar), 3773 proc: procs, 3774 bitMap: roaring.BitmapOf(0), 3775 wantScalar: true, 3776 }, 3777 { 3778 name: "Test92", 3779 vecs: makeTempVectors(types.T_uint64, types.T_int8), 3780 proc: procs, 3781 bitMap: roaring.BitmapOf(0), 3782 wantScalar: true, 3783 }, 3784 { 3785 name: "Test93", 3786 vecs: makeTempVectors(types.T_uint64, types.T_int16), 3787 proc: procs, 3788 bitMap: roaring.BitmapOf(0), 3789 wantScalar: true, 3790 }, 3791 { 3792 name: "Test94", 3793 vecs: makeTempVectors(types.T_uint64, types.T_int32), 3794 proc: procs, 3795 bitMap: roaring.BitmapOf(0), 3796 wantScalar: true, 3797 }, 3798 { 3799 name: "Test95", 3800 vecs: makeTempVectors(types.T_uint64, types.T_int64), 3801 proc: procs, 3802 bitMap: roaring.BitmapOf(0), 3803 wantScalar: true, 3804 }, 3805 { 3806 name: "Test96", 3807 vecs: makeTempVectors(types.T_uint64, types.T_uint8), 3808 proc: procs, 3809 bitMap: roaring.BitmapOf(0), 3810 wantScalar: true, 3811 }, 3812 { 3813 name: "Test97", 3814 vecs: makeTempVectors(types.T_uint64, types.T_uint16), 3815 proc: procs, 3816 bitMap: roaring.BitmapOf(0), 3817 wantScalar: true, 3818 }, 3819 { 3820 name: "Test98", 3821 vecs: makeTempVectors(types.T_uint64, types.T_uint32), 3822 proc: procs, 3823 bitMap: roaring.BitmapOf(0), 3824 wantScalar: true, 3825 }, 3826 { 3827 name: "Test99", 3828 vecs: makeTempVectors(types.T_uint64, types.T_uint64), 3829 proc: procs, 3830 bitMap: roaring.BitmapOf(0), 3831 wantScalar: true, 3832 }, 3833 { 3834 name: "Test100", 3835 vecs: makeTempVectors(types.T_uint64, types.T_float32), 3836 proc: procs, 3837 bitMap: roaring.BitmapOf(0), 3838 wantScalar: true, 3839 }, 3840 { 3841 name: "Test101", 3842 vecs: makeTempVectors(types.T_uint64, types.T_float64), 3843 proc: procs, 3844 bitMap: roaring.BitmapOf(0), 3845 wantScalar: true, 3846 }, 3847 { 3848 name: "Test102", 3849 vecs: makeTempVectors(types.T_uint64, types.T_decimal128), 3850 proc: procs, 3851 bitMap: roaring.BitmapOf(0), 3852 wantScalar: true, 3853 }, 3854 { 3855 name: "Test103", 3856 vecs: makeTempVectors(types.T_uint64, types.T_char), 3857 proc: procs, 3858 bitMap: roaring.BitmapOf(0), 3859 wantScalar: true, 3860 }, 3861 { 3862 name: "Test104", 3863 vecs: makeTempVectors(types.T_uint64, types.T_varchar), 3864 proc: procs, 3865 bitMap: roaring.BitmapOf(0), 3866 wantScalar: true, 3867 }, 3868 { 3869 name: "Test105", 3870 vecs: makeTempVectors(types.T_float32, types.T_int8), 3871 proc: procs, 3872 bitMap: roaring.BitmapOf(0), 3873 wantScalar: true, 3874 }, 3875 { 3876 name: "Test106", 3877 vecs: makeTempVectors(types.T_float32, types.T_int16), 3878 proc: procs, 3879 bitMap: roaring.BitmapOf(0), 3880 wantScalar: true, 3881 }, 3882 { 3883 name: "Test107", 3884 vecs: makeTempVectors(types.T_float32, types.T_int32), 3885 proc: procs, 3886 bitMap: roaring.BitmapOf(0), 3887 wantScalar: true, 3888 }, 3889 { 3890 name: "Test108", 3891 vecs: makeTempVectors(types.T_float32, types.T_int64), 3892 proc: procs, 3893 bitMap: roaring.BitmapOf(0), 3894 wantScalar: true, 3895 }, 3896 { 3897 name: "Test109", 3898 vecs: makeTempVectors(types.T_float32, types.T_uint8), 3899 proc: procs, 3900 bitMap: roaring.BitmapOf(0), 3901 wantScalar: true, 3902 }, 3903 { 3904 name: "Test110", 3905 vecs: makeTempVectors(types.T_float32, types.T_uint16), 3906 proc: procs, 3907 bitMap: roaring.BitmapOf(0), 3908 wantScalar: true, 3909 }, 3910 { 3911 name: "Test111", 3912 vecs: makeTempVectors(types.T_float32, types.T_uint32), 3913 proc: procs, 3914 bitMap: roaring.BitmapOf(0), 3915 wantScalar: true, 3916 }, 3917 { 3918 name: "Test112", 3919 vecs: makeTempVectors(types.T_float32, types.T_uint64), 3920 proc: procs, 3921 bitMap: roaring.BitmapOf(0), 3922 wantScalar: true, 3923 }, 3924 { 3925 name: "Test113", 3926 vecs: makeTempVectors(types.T_float32, types.T_float32), 3927 proc: procs, 3928 bitMap: roaring.BitmapOf(0), 3929 wantScalar: true, 3930 }, 3931 { 3932 name: "Test114", 3933 vecs: makeTempVectors(types.T_float32, types.T_float64), 3934 proc: procs, 3935 bitMap: roaring.BitmapOf(0), 3936 wantScalar: true, 3937 }, 3938 { 3939 name: "Test115", 3940 vecs: makeTempVectors(types.T_float32, types.T_char), 3941 proc: procs, 3942 bitMap: roaring.BitmapOf(0), 3943 wantScalar: true, 3944 }, 3945 { 3946 name: "Test116", 3947 vecs: makeTempVectors(types.T_float32, types.T_varchar), 3948 proc: procs, 3949 bitMap: roaring.BitmapOf(0), 3950 wantScalar: true, 3951 }, 3952 { 3953 name: "Test117", 3954 vecs: makeTempVectors(types.T_float64, types.T_int8), 3955 proc: procs, 3956 bitMap: roaring.BitmapOf(0), 3957 wantScalar: true, 3958 }, 3959 { 3960 name: "Test118", 3961 vecs: makeTempVectors(types.T_float64, types.T_int16), 3962 proc: procs, 3963 bitMap: roaring.BitmapOf(0), 3964 wantScalar: true, 3965 }, 3966 { 3967 name: "Test119", 3968 vecs: makeTempVectors(types.T_float64, types.T_int32), 3969 proc: procs, 3970 bitMap: roaring.BitmapOf(0), 3971 wantScalar: true, 3972 }, 3973 { 3974 name: "Test120", 3975 vecs: makeTempVectors(types.T_float64, types.T_int64), 3976 proc: procs, 3977 bitMap: roaring.BitmapOf(0), 3978 wantScalar: true, 3979 }, 3980 { 3981 name: "Test121", 3982 vecs: makeTempVectors(types.T_float64, types.T_uint8), 3983 proc: procs, 3984 bitMap: roaring.BitmapOf(0), 3985 wantScalar: true, 3986 }, 3987 { 3988 name: "Test122", 3989 vecs: makeTempVectors(types.T_float64, types.T_uint16), 3990 proc: procs, 3991 bitMap: roaring.BitmapOf(0), 3992 wantScalar: true, 3993 }, 3994 { 3995 name: "Test123", 3996 vecs: makeTempVectors(types.T_float64, types.T_uint32), 3997 proc: procs, 3998 bitMap: roaring.BitmapOf(0), 3999 wantScalar: true, 4000 }, 4001 { 4002 name: "Test124", 4003 vecs: makeTempVectors(types.T_float64, types.T_uint64), 4004 proc: procs, 4005 bitMap: roaring.BitmapOf(0), 4006 wantScalar: true, 4007 }, 4008 { 4009 name: "Test125", 4010 vecs: makeTempVectors(types.T_float64, types.T_float32), 4011 proc: procs, 4012 bitMap: roaring.BitmapOf(0), 4013 wantScalar: true, 4014 }, 4015 { 4016 name: "Test126", 4017 vecs: makeTempVectors(types.T_float64, types.T_float64), 4018 proc: procs, 4019 bitMap: roaring.BitmapOf(0), 4020 wantScalar: true, 4021 }, 4022 { 4023 name: "Test127", 4024 vecs: makeTempVectors(types.T_float64, types.T_char), 4025 proc: procs, 4026 bitMap: roaring.BitmapOf(0), 4027 wantScalar: true, 4028 }, 4029 { 4030 name: "Test128", 4031 vecs: makeTempVectors(types.T_float64, types.T_varchar), 4032 proc: procs, 4033 bitMap: roaring.BitmapOf(0), 4034 wantScalar: true, 4035 }, 4036 { 4037 name: "Test0129", 4038 vecs: makeTempVectors(types.T_char, types.T_int8), 4039 proc: procs, 4040 bitMap: roaring.BitmapOf(0), 4041 wantScalar: true, 4042 }, 4043 { 4044 name: "Test0130", 4045 vecs: makeTempVectors(types.T_char, types.T_int16), 4046 proc: procs, 4047 bitMap: roaring.BitmapOf(0), 4048 wantScalar: true, 4049 }, 4050 { 4051 name: "Test0131", 4052 vecs: makeTempVectors(types.T_char, types.T_int32), 4053 proc: procs, 4054 bitMap: roaring.BitmapOf(0), 4055 wantScalar: true, 4056 }, 4057 { 4058 name: "Test0132", 4059 vecs: makeTempVectors(types.T_char, types.T_int64), 4060 proc: procs, 4061 bitMap: roaring.BitmapOf(0), 4062 wantScalar: true, 4063 }, 4064 { 4065 name: "Test0133", 4066 vecs: makeTempVectors(types.T_char, types.T_uint8), 4067 proc: procs, 4068 bitMap: roaring.BitmapOf(0), 4069 wantScalar: true, 4070 }, 4071 { 4072 name: "Test0134", 4073 vecs: makeTempVectors(types.T_char, types.T_uint16), 4074 proc: procs, 4075 bitMap: roaring.BitmapOf(0), 4076 wantScalar: true, 4077 }, 4078 { 4079 name: "Test0135", 4080 vecs: makeTempVectors(types.T_char, types.T_uint32), 4081 proc: procs, 4082 bitMap: roaring.BitmapOf(0), 4083 wantScalar: true, 4084 }, 4085 { 4086 name: "Test0136", 4087 vecs: makeTempVectors(types.T_char, types.T_uint64), 4088 proc: procs, 4089 bitMap: roaring.BitmapOf(0), 4090 wantScalar: true, 4091 }, 4092 { 4093 name: "Test0137", 4094 vecs: makeTempVectors(types.T_char, types.T_float32), 4095 proc: procs, 4096 bitMap: roaring.BitmapOf(0), 4097 wantScalar: true, 4098 }, 4099 { 4100 name: "Test0138", 4101 vecs: makeTempVectors(types.T_char, types.T_float64), 4102 proc: procs, 4103 bitMap: roaring.BitmapOf(0), 4104 wantScalar: true, 4105 }, 4106 { 4107 name: "Test0139", 4108 vecs: makeTempVectors(types.T_char, types.T_char), 4109 proc: procs, 4110 bitMap: roaring.BitmapOf(0), 4111 wantScalar: true, 4112 }, 4113 { 4114 name: "Test0140", 4115 vecs: makeTempVectors(types.T_char, types.T_varchar), 4116 proc: procs, 4117 bitMap: roaring.BitmapOf(0), 4118 wantScalar: true, 4119 }, 4120 { 4121 name: "Test0141", 4122 vecs: makeTempVectors(types.T_varchar, types.T_int8), 4123 proc: procs, 4124 bitMap: roaring.BitmapOf(0), 4125 wantScalar: true, 4126 }, 4127 { 4128 name: "Test0142", 4129 vecs: makeTempVectors(types.T_varchar, types.T_int16), 4130 proc: procs, 4131 bitMap: roaring.BitmapOf(0), 4132 wantScalar: true, 4133 }, 4134 { 4135 name: "Test0143", 4136 vecs: makeTempVectors(types.T_varchar, types.T_int32), 4137 proc: procs, 4138 bitMap: roaring.BitmapOf(0), 4139 wantScalar: true, 4140 }, 4141 { 4142 name: "Test0144", 4143 vecs: makeTempVectors(types.T_varchar, types.T_int64), 4144 proc: procs, 4145 bitMap: roaring.BitmapOf(0), 4146 wantScalar: true, 4147 }, 4148 { 4149 name: "Test0145", 4150 vecs: makeTempVectors(types.T_varchar, types.T_uint8), 4151 proc: procs, 4152 bitMap: roaring.BitmapOf(0), 4153 wantScalar: true, 4154 }, 4155 { 4156 name: "Test0146", 4157 vecs: makeTempVectors(types.T_varchar, types.T_uint16), 4158 proc: procs, 4159 bitMap: roaring.BitmapOf(0), 4160 wantScalar: true, 4161 }, 4162 { 4163 name: "Test0147", 4164 vecs: makeTempVectors(types.T_varchar, types.T_uint32), 4165 proc: procs, 4166 bitMap: roaring.BitmapOf(0), 4167 wantScalar: true, 4168 }, 4169 { 4170 name: "Test0148", 4171 vecs: makeTempVectors(types.T_varchar, types.T_uint64), 4172 proc: procs, 4173 bitMap: roaring.BitmapOf(0), 4174 wantScalar: true, 4175 }, 4176 { 4177 name: "Test0149", 4178 vecs: makeTempVectors(types.T_varchar, types.T_float32), 4179 proc: procs, 4180 bitMap: roaring.BitmapOf(0), 4181 wantScalar: true, 4182 }, 4183 { 4184 name: "Test0150", 4185 vecs: makeTempVectors(types.T_varchar, types.T_float64), 4186 proc: procs, 4187 bitMap: roaring.BitmapOf(0), 4188 wantScalar: true, 4189 }, 4190 { 4191 name: "Test0151", 4192 vecs: makeTempVectors(types.T_varchar, types.T_date), 4193 proc: procs, 4194 bitMap: roaring.BitmapOf(0), 4195 wantScalar: true, 4196 }, 4197 { 4198 name: "Test0152", 4199 vecs: makeTempVectors(types.T_varchar, types.T_datetime), 4200 proc: procs, 4201 bitMap: roaring.BitmapOf(0), 4202 wantScalar: true, 4203 }, 4204 { 4205 name: "Test0153", 4206 vecs: makeTempVectors(types.T_varchar, types.T_timestamp), 4207 proc: procs, 4208 bitMap: roaring.BitmapOf(0), 4209 wantScalar: true, 4210 }, 4211 { 4212 name: "Test0154", 4213 vecs: makeTempVectors(types.T_varchar, types.T_char), 4214 proc: procs, 4215 bitMap: roaring.BitmapOf(0), 4216 wantScalar: true, 4217 }, 4218 { 4219 name: "Test0155", 4220 vecs: makeTempVectors(types.T_varchar, types.T_varchar), 4221 proc: procs, 4222 bitMap: roaring.BitmapOf(0), 4223 wantScalar: true, 4224 }, 4225 { 4226 name: "Test0156", 4227 vecs: makeTempVectors(types.T_date, types.T_date), 4228 proc: procs, 4229 bitMap: roaring.BitmapOf(0), 4230 wantScalar: true, 4231 }, 4232 { 4233 name: "Test0157", 4234 vecs: makeTempVectors(types.T_datetime, types.T_datetime), 4235 proc: procs, 4236 bitMap: roaring.BitmapOf(0), 4237 wantScalar: true, 4238 }, 4239 { 4240 name: "Test0158", 4241 vecs: makeTempVectors(types.T_datetime, types.T_datetime), 4242 proc: procs, 4243 bitMap: roaring.BitmapOf(0), 4244 wantScalar: true, 4245 }, 4246 { 4247 name: "Test0159", 4248 vecs: makeTempVectors(types.T_timestamp, types.T_datetime), 4249 proc: procs, 4250 bitMap: roaring.BitmapOf(0), 4251 wantScalar: true, 4252 }, 4253 { 4254 name: "Test0160", 4255 vecs: makeTempVectors(types.T_timestamp, types.T_timestamp), 4256 proc: procs, 4257 bitMap: roaring.BitmapOf(0), 4258 wantScalar: true, 4259 }, 4260 { 4261 name: "Test0161", 4262 vecs: makeTempVectors(types.T_decimal64, types.T_decimal64), 4263 proc: procs, 4264 bitMap: roaring.BitmapOf(0), 4265 wantScalar: true, 4266 }, 4267 { 4268 name: "Test0162", 4269 vecs: makeTempVectors(types.T_decimal64, types.T_decimal128), 4270 proc: procs, 4271 bitMap: roaring.BitmapOf(0), 4272 wantScalar: true, 4273 }, 4274 { 4275 name: "Test0163", 4276 vecs: makeTempVectors(types.T_decimal128, types.T_decimal128), 4277 proc: procs, 4278 bitMap: roaring.BitmapOf(0), 4279 wantScalar: true, 4280 }, 4281 } 4282 4283 for _, c := range cases { 4284 t.Run(c.name, func(t *testing.T) { 4285 castRes, err := Cast(c.vecs, c.proc) 4286 if err != nil { 4287 t.Fatal(err) 4288 } 4289 require.Equal(t, c.wantScalar, castRes.IsScalar()) 4290 }) 4291 } 4292 } 4293 4294 func TestCastBoolAsString(t *testing.T) { 4295 //Cast converts bool to char 4296 //Cast converts bool to varchar 4297 makeTempVectors := func(src bool, srcIsConst bool, destType types.T) []*vector.Vector { 4298 vectors := make([]*vector.Vector, 2) 4299 vectors[0] = makeVector(src, srcIsConst) 4300 vectors[1] = makeTypeVector(destType) 4301 return vectors 4302 } 4303 4304 procs := testutil.NewProc() 4305 cases := []struct { 4306 name string 4307 vecs []*vector.Vector 4308 proc *process.Process 4309 wantValues interface{} 4310 wantType types.T 4311 wantScalar bool 4312 }{ 4313 { 4314 name: "Test01", 4315 vecs: makeTempVectors(true, true, types.T_char), 4316 proc: procs, 4317 wantValues: []string{"1"}, 4318 wantType: types.T_char, 4319 wantScalar: true, 4320 }, 4321 { 4322 name: "Test02", 4323 vecs: makeTempVectors(true, false, types.T_char), 4324 proc: procs, 4325 wantValues: []string{"1"}, 4326 wantType: types.T_char, 4327 wantScalar: false, 4328 }, 4329 { 4330 name: "Test03", 4331 vecs: makeTempVectors(false, false, types.T_varchar), 4332 proc: procs, 4333 wantValues: []string{"0"}, 4334 wantType: types.T_varchar, 4335 wantScalar: false, 4336 }, 4337 { 4338 name: "Test04", 4339 vecs: makeTempVectors(false, false, types.T_varchar), 4340 proc: procs, 4341 wantValues: []string{"0"}, 4342 wantType: types.T_varchar, 4343 wantScalar: false, 4344 }, 4345 } 4346 4347 for _, c := range cases { 4348 t.Run(c.name, func(t *testing.T) { 4349 castRes, err := Cast(c.vecs, c.proc) 4350 if err != nil { 4351 t.Fatal(err) 4352 } 4353 got := vector.GetStrVectorValues(castRes) 4354 require.Equal(t, c.wantValues, got) 4355 require.Equal(t, c.wantType, castRes.Typ.Oid) 4356 require.Equal(t, c.wantScalar, castRes.IsScalar()) 4357 }) 4358 } 4359 4360 } 4361 4362 // date to datetime and date to string 4363 func TestCastDateAsDatetimeAndString(t *testing.T) { 4364 makeTempVectors := func(src string, srcIsConst bool, destType types.T) []*vector.Vector { 4365 vectors := make([]*vector.Vector, 2) 4366 date, _ := types.ParseDateCast(src) 4367 vectors[0] = makeVector(date, srcIsConst) 4368 vectors[1] = makeTypeVector(destType) 4369 return vectors 4370 } 4371 4372 procs := testutil.NewProc() 4373 cases := []struct { 4374 name string 4375 vecs []*vector.Vector 4376 proc *process.Process 4377 wantValues interface{} 4378 wantType types.T 4379 wantScalar bool 4380 }{ 4381 { 4382 name: "Test01", 4383 vecs: makeTempVectors("1992-01-01", true, types.T_datetime), 4384 proc: procs, 4385 wantValues: []types.Datetime{types.DatetimeFromClock(1992, 1, 1, 0, 0, 0, 0)}, 4386 wantType: types.T_datetime, 4387 wantScalar: true, 4388 }, 4389 { 4390 name: "Test02", 4391 vecs: makeTempVectors("1992-01-01", false, types.T_datetime), 4392 proc: procs, 4393 wantValues: []types.Datetime{types.DatetimeFromClock(1992, 1, 1, 0, 0, 0, 0)}, 4394 wantType: types.T_datetime, 4395 wantScalar: false, 4396 }, 4397 { 4398 name: "Test03", 4399 vecs: makeTempVectors("1992-01-01", true, types.T_char), 4400 proc: procs, 4401 wantValues: []string{"1992-01-01"}, 4402 wantType: types.T_char, 4403 wantScalar: true, 4404 }, 4405 { 4406 name: "Test04", 4407 vecs: makeTempVectors("1992-02-02", true, types.T_varchar), 4408 proc: procs, 4409 wantValues: []string{"1992-02-02"}, 4410 wantType: types.T_varchar, 4411 wantScalar: true, 4412 }, 4413 } 4414 4415 for _, c := range cases { 4416 t.Run(c.name, func(t *testing.T) { 4417 castRes, err := Cast(c.vecs, c.proc) 4418 if err != nil { 4419 t.Fatal(err) 4420 } 4421 if castRes.GetType().IsVarlen() { 4422 got := vector.GetStrVectorValues(castRes) 4423 require.Equal(t, c.wantValues, got) 4424 } else { 4425 require.Equal(t, c.wantValues, castRes.Col) 4426 } 4427 require.Equal(t, c.wantType, castRes.Typ.Oid) 4428 require.Equal(t, c.wantScalar, castRes.IsScalar()) 4429 }) 4430 } 4431 4432 } 4433 4434 // datetime to date and datetime to string 4435 func TestCastDatetimeAsDateAndString(t *testing.T) { 4436 makeTempVectors := func(src string, srcIsConst bool, destType types.T) []*vector.Vector { 4437 vectors := make([]*vector.Vector, 2) 4438 date, _ := types.ParseDatetime(src, 0) 4439 vectors[0] = makeVector(date, srcIsConst) 4440 vectors[1] = makeTypeVector(destType) 4441 return vectors 4442 } 4443 4444 procs := testutil.NewProc() 4445 cases := []struct { 4446 name string 4447 vecs []*vector.Vector 4448 proc *process.Process 4449 wantValues interface{} 4450 wantType types.T 4451 wantScalar bool 4452 }{ 4453 { 4454 name: "Test01", 4455 vecs: makeTempVectors("1992-01-01 00:00:00", true, types.T_date), 4456 proc: procs, 4457 wantValues: []types.Date{types.DateFromCalendar(1992, 1, 1)}, 4458 wantType: types.T_date, 4459 wantScalar: true, 4460 }, 4461 { 4462 name: "Test02", 4463 vecs: makeTempVectors("1992-01-01 00:00:00", false, types.T_date), 4464 proc: procs, 4465 wantValues: []types.Date{types.DateFromCalendar(1992, 1, 1)}, 4466 wantType: types.T_date, 4467 wantScalar: false, 4468 }, 4469 { 4470 name: "Test03", 4471 vecs: makeTempVectors("1992-01-01 00:00:00", true, types.T_char), 4472 proc: procs, 4473 wantValues: []string{"1992-01-01 00:00:00"}, 4474 wantType: types.T_char, 4475 wantScalar: true, 4476 }, 4477 { 4478 name: "Test04", 4479 vecs: makeTempVectors("1992-02-02 00:00:00", true, types.T_varchar), 4480 proc: procs, 4481 wantValues: []string{"1992-02-02 00:00:00"}, 4482 wantType: types.T_varchar, 4483 wantScalar: true, 4484 }, 4485 } 4486 4487 for _, c := range cases { 4488 t.Run(c.name, func(t *testing.T) { 4489 castRes, err := Cast(c.vecs, c.proc) 4490 if err != nil { 4491 t.Fatal(err) 4492 } 4493 if castRes.GetType().IsVarlen() { 4494 got := vector.GetStrVectorValues(castRes) 4495 require.Equal(t, c.wantValues, got) 4496 } else { 4497 require.Equal(t, c.wantValues, castRes.Col) 4498 } 4499 require.Equal(t, c.wantType, castRes.Typ.Oid) 4500 require.Equal(t, c.wantScalar, castRes.IsScalar()) 4501 }) 4502 } 4503 4504 } 4505 4506 // cast uuid to string 4507 func TestCastUuidAsString(t *testing.T) { 4508 // White box test 4509 convey.Convey("test cast uuid to string", t, func() { 4510 cases := []struct { 4511 uuid types.Uuid 4512 str string 4513 }{ 4514 { 4515 uuid: [16]byte{13, 86, 135, 218, 42, 103, 17, 237, 153, 224, 0, 12, 41, 132, 121, 4}, 4516 str: "0d5687da-2a67-11ed-99e0-000c29847904", 4517 }, 4518 { 4519 uuid: [16]byte{97, 25, 223, 253, 42, 107, 17, 237, 153, 224, 0, 12, 41, 132, 121, 4}, 4520 str: "6119dffd-2a6b-11ed-99e0-000c29847904", 4521 }, 4522 { 4523 uuid: [16]byte{62, 53, 10, 92, 34, 42, 17, 235, 171, 239, 2, 66, 172, 17, 0, 2}, 4524 str: "3e350a5c-222a-11eb-abef-0242ac110002", 4525 }, 4526 { 4527 uuid: [16]byte{62, 53, 10, 92, 34, 42, 17, 235, 171, 239, 2, 66, 172, 17, 0, 2}, 4528 str: "3e350a5c222a11ebabef0242ac110002", 4529 }, 4530 } 4531 4532 var uuids []types.Uuid 4533 var expects []string 4534 for _, c := range cases { 4535 uuids = append(uuids, c.uuid) 4536 expects = append(expects, c.str) 4537 } 4538 4539 srcVector := testutil.MakeUuidVector(uuids, nil) 4540 destVector := testutil.MakeVarcharVector(nil, nil) 4541 4542 wantVec := testutil.MakeVarcharVector(expects, nil) 4543 proc := testutil.NewProc() 4544 res, err := Cast([]*vector.Vector{srcVector, destVector}, proc) 4545 convey.ShouldBeNil(err) 4546 compare := testutil.CompareVectors(wantVec, res) 4547 convey.ShouldBeTrue(compare) 4548 }) 4549 4550 } 4551 4552 // cast string to uuid 4553 func TestCastStringToUuid(t *testing.T) { 4554 // White box test 4555 convey.Convey("test cast to uuid case", t, func() { 4556 cases := []struct { 4557 str string 4558 uuid string 4559 }{ 4560 { 4561 str: "0d5687da-2a67-11ed-99e0-000c29847904", 4562 uuid: "0d5687da-2a67-11ed-99e0-000c29847904", 4563 //uuid: [16]byte{13, 86, 135, 218, 42, 103, 17, 237, 153, 224, 0, 12, 41, 132, 121, 4}, 4564 }, 4565 { 4566 str: "6119dffd-2a6b-11ed-99e0-000c29847904", 4567 uuid: "6119dffd-2a6b-11ed-99e0-000c29847904", 4568 //uuid: [16]byte{97, 25, 223, 253, 42, 107, 17, 237, 153, 224, 0, 12, 41, 132, 121, 4}, 4569 }, 4570 { 4571 str: "3e350a5c-222a-11eb-abef-0242ac110002", 4572 uuid: "3e350a5c-222a-11eb-abef-0242ac110002", 4573 //uuid: [16]byte{62, 53, 10, 92, 34, 42, 17, 235, 171, 239, 2, 66, 172, 17, 0, 2}, 4574 }, 4575 { 4576 str: "3e350a5c222a11ebabef0242ac110002", 4577 uuid: "3e350a5c-222a-11eb-abef-0242ac110002", 4578 //uuid: [16]byte{62, 53, 10, 92, 34, 42, 17, 235, 171, 239, 2, 66, 172, 17, 0, 2}, 4579 }, 4580 } 4581 4582 var srcstrs []string 4583 var expects []string 4584 for _, c := range cases { 4585 srcstrs = append(srcstrs, c.str) 4586 expects = append(expects, c.uuid) 4587 } 4588 4589 srcVector := testutil.MakeVarcharVector(srcstrs, nil) 4590 destVector := testutil.MakeUuidVector(nil, nil) 4591 4592 wantVec := testutil.MakeUuidVectorByString(expects, nil) 4593 proc := testutil.NewProc() 4594 res, err := Cast([]*vector.Vector{srcVector, destVector}, proc) 4595 convey.ShouldBeNil(err) 4596 compare := testutil.CompareVectors(wantVec, res) 4597 convey.ShouldBeTrue(compare) 4598 }) 4599 4600 // tolerance test 4601 } 4602 4603 func TestCastTimeToString(t *testing.T) { 4604 makeTempVectors := func(src string, srcIsConst bool, destType types.T) []*vector.Vector { 4605 vectors := make([]*vector.Vector, 2) 4606 time, _ := types.ParseTime(src, 6) 4607 vectors[0] = makeVector(time, srcIsConst) 4608 vectors[1] = makeTypeVector(destType) 4609 return vectors 4610 } 4611 4612 procs := testutil.NewProc() 4613 cases := []struct { 4614 name string 4615 vecs []*vector.Vector 4616 proc *process.Process 4617 wantValues interface{} 4618 wantType types.T 4619 precision int32 4620 wantScalar bool 4621 }{ 4622 { 4623 name: "Test01", 4624 vecs: makeTempVectors("2022-12-01 11:22:33", true, types.T_varchar), 4625 proc: procs, 4626 wantValues: []string{"11:22:33"}, 4627 wantType: types.T_varchar, 4628 precision: 0, 4629 wantScalar: true, 4630 }, 4631 { 4632 name: "Test02", 4633 vecs: makeTempVectors("2022-12-01 11:22:33", false, types.T_varchar), 4634 proc: procs, 4635 wantValues: []string{"11:22:33.00"}, 4636 wantType: types.T_varchar, 4637 precision: 2, 4638 wantScalar: false, 4639 }, 4640 { 4641 name: "Test03", 4642 vecs: makeTempVectors("2022-12-01 11:22:33", true, types.T_varchar), 4643 proc: procs, 4644 wantValues: []string{"11:22:33.000000"}, 4645 wantType: types.T_varchar, 4646 precision: 6, 4647 wantScalar: true, 4648 }, 4649 { 4650 name: "Test04", 4651 vecs: makeTempVectors("-11223", true, types.T_varchar), 4652 proc: procs, 4653 wantValues: []string{"-01:12:23.000"}, 4654 wantType: types.T_varchar, 4655 precision: 3, 4656 wantScalar: true, 4657 }, 4658 { 4659 name: "Test05", 4660 vecs: makeTempVectors("-11223.4448", false, types.T_varchar), 4661 proc: procs, 4662 wantValues: []string{"-01:12:23.444"}, 4663 wantType: types.T_varchar, 4664 precision: 3, 4665 wantScalar: false, 4666 }, 4667 { 4668 name: "Test06", 4669 vecs: makeTempVectors("-11223.4448", true, types.T_char), 4670 proc: procs, 4671 wantValues: []string{"-01:12:23.444"}, 4672 wantType: types.T_char, 4673 precision: 3, 4674 wantScalar: true, 4675 }, 4676 } 4677 4678 for _, c := range cases { 4679 t.Run(c.name, func(t *testing.T) { 4680 // setting precision 4681 c.vecs[0].Typ.Precision = c.precision 4682 castRes, err := Cast(c.vecs, c.proc) 4683 require.NoError(t, err) 4684 4685 if castRes.GetType().IsVarlen() { 4686 got := vector.GetStrVectorValues(castRes) 4687 require.Equal(t, c.wantValues, got) 4688 } else { 4689 require.Equal(t, c.wantValues, castRes.Col) 4690 } 4691 4692 require.Equal(t, c.wantType, castRes.Typ.Oid) 4693 require.Equal(t, c.wantScalar, castRes.IsScalar()) 4694 }) 4695 } 4696 4697 } 4698 func TestCastStringToTime(t *testing.T) { 4699 makeTempVectors := func(src string, srcIsConst bool, destType types.T) []*vector.Vector { 4700 vectors := make([]*vector.Vector, 2) 4701 vectors[0] = makeStringVector(src, types.T_varchar, srcIsConst) 4702 vectors[1] = makeTypeVector(destType) 4703 return vectors 4704 } 4705 4706 procs := testutil.NewProc() 4707 cases := []struct { 4708 name string 4709 vecs []*vector.Vector 4710 proc *process.Process 4711 wantValues interface{} 4712 wantType types.T 4713 precision int32 4714 wantScalar bool 4715 }{ 4716 { 4717 name: "Test01", 4718 vecs: makeTempVectors("2022-12-01 11:22:33", true, types.T_time), 4719 proc: procs, 4720 wantValues: []types.Time{types.TimeFromClock(false, 11, 22, 33, 0)}, 4721 wantType: types.T_time, 4722 precision: 0, 4723 wantScalar: true, 4724 }, 4725 { 4726 name: "Test02", 4727 vecs: makeTempVectors("2022-12-01 11:22:33.125", true, types.T_time), 4728 proc: procs, 4729 wantValues: []types.Time{types.TimeFromClock(false, 11, 22, 33, 130000)}, 4730 wantType: types.T_time, 4731 precision: 2, 4732 wantScalar: true, 4733 }, 4734 { 4735 name: "Test03", 4736 vecs: makeTempVectors("2022-12-01 11:22:33", true, types.T_time), 4737 proc: procs, 4738 wantValues: []types.Time{types.TimeFromClock(false, 11, 22, 33, 0)}, 4739 wantType: types.T_time, 4740 precision: 6, 4741 wantScalar: true, 4742 }, 4743 { 4744 name: "Test04", 4745 vecs: makeTempVectors("-11223", true, types.T_time), 4746 proc: procs, 4747 wantValues: []types.Time{types.TimeFromClock(true, 1, 12, 23, 0)}, 4748 wantType: types.T_time, 4749 precision: 3, 4750 wantScalar: true, 4751 }, 4752 { 4753 name: "Test05", 4754 vecs: makeTempVectors("11223.4444", true, types.T_time), 4755 proc: procs, 4756 wantValues: []types.Time{types.TimeFromClock(false, 1, 12, 23, 444000)}, 4757 wantType: types.T_time, 4758 precision: 3, 4759 wantScalar: true, 4760 }, 4761 { 4762 name: "Test06", 4763 vecs: makeTempVectors("-11223.4448", true, types.T_time), 4764 proc: procs, 4765 wantValues: []types.Time{types.TimeFromClock(true, 1, 12, 23, 445000)}, 4766 wantType: types.T_time, 4767 precision: 3, 4768 wantScalar: true, 4769 }, 4770 } 4771 4772 for _, c := range cases { 4773 t.Run(c.name, func(t *testing.T) { 4774 // setting precision 4775 c.vecs[1].Typ.Precision = c.precision 4776 castRes, err := Cast(c.vecs, c.proc) 4777 require.NoError(t, err) 4778 require.Equal(t, c.wantValues, castRes.Col) 4779 require.Equal(t, c.wantType, castRes.Typ.Oid) 4780 require.Equal(t, c.wantScalar, castRes.IsScalar()) 4781 }) 4782 } 4783 4784 } 4785 4786 func TestCastInt64ToTime(t *testing.T) { 4787 makeTempVectors := func(src int64, srcIsConst bool, destType types.T) []*vector.Vector { 4788 vectors := make([]*vector.Vector, 2) 4789 vectors[0] = makeVector(src, false) 4790 vectors[1] = makeTypeVector(destType) 4791 return vectors 4792 } 4793 4794 procs := testutil.NewProc() 4795 cases := []struct { 4796 name string 4797 vecs []*vector.Vector 4798 proc *process.Process 4799 wantValues interface{} 4800 wantType types.T 4801 precision int32 4802 wantScalar bool 4803 }{ 4804 { 4805 name: "Test01", 4806 vecs: makeTempVectors(112233, true, types.T_time), 4807 proc: procs, 4808 wantValues: []types.Time{types.TimeFromClock(false, 11, 22, 33, 0)}, 4809 wantType: types.T_time, 4810 precision: 0, 4811 wantScalar: false, 4812 }, 4813 { 4814 name: "Test02", 4815 vecs: makeTempVectors(-223344, true, types.T_time), 4816 proc: procs, 4817 wantValues: []types.Time{types.TimeFromClock(true, 22, 33, 44, 0)}, 4818 wantType: types.T_time, 4819 precision: 2, 4820 wantScalar: false, 4821 }, 4822 } 4823 4824 for _, c := range cases { 4825 t.Run(c.name, func(t *testing.T) { 4826 // setting precision 4827 c.vecs[1].Typ.Precision = c.precision 4828 castRes, err := Cast(c.vecs, c.proc) 4829 require.NoError(t, err) 4830 require.Equal(t, c.wantValues, castRes.Col) 4831 require.Equal(t, c.wantType, castRes.Typ.Oid) 4832 require.Equal(t, c.wantScalar, castRes.IsScalar()) 4833 }) 4834 } 4835 } 4836 4837 func TestCastDecimal128ToTime(t *testing.T) { 4838 makeTempVectors := func(dcmStr string, isScalar bool, destType types.T) []*vector.Vector { 4839 vectors := make([]*vector.Vector, 2) 4840 dcm, _ := types.Decimal128_FromString(dcmStr) 4841 dcmType := types.Type{Oid: types.T_decimal128, Size: 8, Width: 34, Scale: 6} 4842 4843 if isScalar { 4844 vectors[0] = vector.NewConstFixed(dcmType, 1, dcm, testutil.TestUtilMp) 4845 } else { 4846 vectors[0] = vector.NewWithFixed(dcmType, []types.Decimal128{dcm}, nil, testutil.TestUtilMp) 4847 } 4848 vectors[1] = makeTypeVector(destType) 4849 return vectors 4850 } 4851 4852 procs := testutil.NewProc() 4853 cases := []struct { 4854 name string 4855 vecs []*vector.Vector 4856 proc *process.Process 4857 wantValues interface{} 4858 wantType types.T 4859 precision int32 4860 wantScalar bool 4861 }{ 4862 { 4863 name: "Test01", 4864 vecs: makeTempVectors("112233.4444", true, types.T_time), 4865 proc: procs, 4866 wantValues: []types.Time{types.TimeFromClock(false, 11, 22, 33, 444000)}, 4867 wantType: types.T_time, 4868 precision: 3, 4869 wantScalar: true, 4870 }, 4871 { 4872 name: "Test02", 4873 vecs: makeTempVectors("-223344.4445", true, types.T_time), 4874 proc: procs, 4875 wantValues: []types.Time{types.TimeFromClock(true, 22, 33, 44, 444000)}, 4876 wantType: types.T_time, 4877 precision: 3, 4878 wantScalar: true, 4879 }, 4880 } 4881 4882 for _, c := range cases { 4883 t.Run(c.name, func(t *testing.T) { 4884 // setting precision 4885 c.vecs[1].Typ.Precision = c.precision 4886 castRes, err := Cast(c.vecs, c.proc) 4887 require.NoError(t, err) 4888 require.Equal(t, c.wantValues, castRes.Col) 4889 require.Equal(t, c.wantType, castRes.Typ.Oid) 4890 require.Equal(t, c.wantScalar, castRes.IsScalar()) 4891 }) 4892 } 4893 } 4894 4895 func TestCastDateAndDatetimeToTime(t *testing.T) { 4896 makeTempVectors := func(src string, srcIsConst bool, precision int32, srcType types.T) []*vector.Vector { 4897 vectors := make([]*vector.Vector, 2) 4898 switch srcType { 4899 case types.T_date: 4900 date, err := types.ParseDateCast(src) 4901 require.NoError(t, err) 4902 vectors[0] = makeVector(date, srcIsConst) 4903 case types.T_datetime: 4904 datetime, err := types.ParseDatetime(src, 6) 4905 require.NoError(t, err) 4906 vectors[0] = makeVector(datetime, srcIsConst) 4907 default: 4908 panic("wrong input test type") 4909 } 4910 vectors[1] = makeTypeVector(types.T_time) 4911 vectors[1].Typ.Precision = precision 4912 return vectors 4913 } 4914 4915 procs := testutil.NewProc() 4916 cases := []struct { 4917 name string 4918 vecs []*vector.Vector 4919 proc *process.Process 4920 wantValues interface{} 4921 precision int32 4922 wantScalar bool 4923 }{ 4924 { 4925 name: "Test01", 4926 vecs: makeTempVectors("2022-12-01", true, 0, types.T_date), 4927 proc: procs, 4928 wantValues: []types.Time{types.TimeFromClock(false, 0, 0, 0, 0)}, 4929 precision: 0, 4930 wantScalar: true, 4931 }, 4932 { 4933 name: "Test02", 4934 vecs: makeTempVectors("2022-12-01 11:22:33", false, 0, types.T_datetime), 4935 proc: procs, 4936 wantValues: []types.Time{types.TimeFromClock(false, 11, 22, 33, 0)}, 4937 precision: 0, 4938 wantScalar: false, 4939 }, 4940 { 4941 name: "Test03", 4942 vecs: makeTempVectors("2022-12-01 11:22:33.123456", true, 0, types.T_datetime), 4943 proc: procs, 4944 wantValues: []types.Time{types.TimeFromClock(false, 11, 22, 33, 123000)}, 4945 precision: 3, 4946 wantScalar: true, 4947 }, 4948 } 4949 4950 for _, c := range cases { 4951 t.Run(c.name, func(t *testing.T) { 4952 // setting precision 4953 c.vecs[1].Typ.Precision = c.precision 4954 castRes, err := Cast(c.vecs, c.proc) 4955 require.NoError(t, err) 4956 require.Equal(t, c.wantValues, castRes.Col) 4957 require.Equal(t, types.T_time, castRes.Typ.Oid) 4958 require.Equal(t, c.wantScalar, castRes.IsScalar()) 4959 }) 4960 } 4961 4962 } 4963 4964 func TestCastDateAndDatetimeToInt(t *testing.T) { 4965 makeTempVectors := func(src string, srcIsConst bool, precision int32, srcType, dstType types.T) []*vector.Vector { 4966 vectors := make([]*vector.Vector, 2) 4967 switch srcType { 4968 case types.T_date: 4969 date, err := types.ParseDateCast(src) 4970 require.NoError(t, err) 4971 vectors[0] = makeVector(date, srcIsConst) 4972 case types.T_datetime: 4973 datetime, err := types.ParseDatetime(src, 6) 4974 require.NoError(t, err) 4975 vectors[0] = makeVector(datetime, srcIsConst) 4976 case types.T_timestamp: 4977 datetime, err := types.ParseTimestamp(time.UTC, src, 6) 4978 require.NoError(t, err) 4979 vectors[0] = makeVector(datetime, srcIsConst) 4980 default: 4981 panic("wrong input test type") 4982 } 4983 vectors[1] = makeTypeVector(dstType) 4984 return vectors 4985 } 4986 4987 procs := testutil.NewProc() 4988 cases := []struct { 4989 name string 4990 vecs []*vector.Vector 4991 proc *process.Process 4992 wantValues interface{} 4993 wantScalar bool 4994 }{ 4995 { 4996 name: "Test01", 4997 vecs: makeTempVectors("2022-12-01", true, 0, types.T_date, types.T_int32), 4998 proc: procs, 4999 wantValues: []int32{19327}, 5000 wantScalar: true, 5001 }, 5002 { 5003 name: "Test02", 5004 vecs: makeTempVectors("2022-12-01 12:34:56", false, 0, types.T_datetime, types.T_int64), 5005 proc: procs, 5006 wantValues: []int64{1669898096}, 5007 wantScalar: false, 5008 }, 5009 { 5010 name: "Test02", 5011 vecs: makeTempVectors("2022-12-01 12:34:56", false, 0, types.T_timestamp, types.T_int64), 5012 proc: procs, 5013 wantValues: []int64{1669898096}, 5014 wantScalar: false, 5015 }, 5016 } 5017 5018 for _, c := range cases { 5019 t.Run(c.name, func(t *testing.T) { 5020 // setting precision 5021 castRes, err := Cast(c.vecs, c.proc) 5022 require.NoError(t, err) 5023 require.Equal(t, c.wantValues, castRes.Col) 5024 require.Equal(t, c.wantScalar, castRes.IsScalar()) 5025 }) 5026 } 5027 5028 } 5029 5030 func TestCastJsonToString(t *testing.T) { 5031 procs := testutil.NewProc() 5032 cases := []struct { 5033 name string 5034 vecs []*vector.Vector 5035 proc *process.Process 5036 wantValues interface{} 5037 wantScalar bool 5038 }{ 5039 { 5040 name: "Test01", 5041 vecs: makeJsonVectors(`"1"`, true, types.T_varchar), 5042 proc: procs, 5043 wantValues: []string{`"1"`}, 5044 wantScalar: true, 5045 }, 5046 { 5047 name: "Test02", 5048 vecs: makeJsonVectors(`{"a": "b"}`, false, types.T_varchar), 5049 proc: procs, 5050 wantValues: []string{`{"a": "b"}`}, 5051 wantScalar: false, 5052 }, 5053 { 5054 name: "Test03", 5055 vecs: makeJsonVectors(`1`, true, types.T_varchar), 5056 proc: procs, 5057 wantValues: []string{`1`}, 5058 wantScalar: true, 5059 }, 5060 { 5061 name: "Test04", 5062 vecs: makeJsonVectors(`null`, false, types.T_varchar), 5063 proc: procs, 5064 wantValues: []string{`null`}, 5065 wantScalar: false, 5066 }, 5067 } 5068 5069 for _, c := range cases { 5070 t.Run(c.name, func(t *testing.T) { 5071 castRes, err := Cast(c.vecs, c.proc) 5072 require.NoError(t, err) 5073 got := vector.MustStrCols(castRes) 5074 require.Equal(t, c.wantValues, got) 5075 require.Equal(t, types.T_varchar, castRes.Typ.Oid) 5076 require.Equal(t, c.wantScalar, castRes.IsScalar()) 5077 }) 5078 } 5079 } 5080 5081 func makeTypeVector(t types.T) *vector.Vector { 5082 return vector.New(t.ToType()) 5083 } 5084 5085 // make vector for type of int8,int16,int32,int64,uint8,uint16,uint32,uint64,date,datetime,timestamp,bool 5086 func makeVector(src interface{}, isSrcConst bool) *vector.Vector { 5087 var typeOid types.T 5088 var vec *vector.Vector 5089 mp := testutil.TestUtilMp 5090 5091 switch val := src.(type) { 5092 case int8: 5093 typeOid = types.T_int8 5094 if isSrcConst { 5095 vec = vector.NewConstFixed(typeOid.ToType(), 1, val, mp) 5096 } else { 5097 vec = vector.NewWithFixed(typeOid.ToType(), []int8{val}, nil, mp) 5098 } 5099 5100 case int16: 5101 typeOid = types.T_int16 5102 if isSrcConst { 5103 vec = vector.NewConstFixed(typeOid.ToType(), 1, val, mp) 5104 } else { 5105 vec = vector.NewWithFixed(typeOid.ToType(), []int16{val}, nil, mp) 5106 } 5107 5108 case int32: 5109 typeOid = types.T_int32 5110 if isSrcConst { 5111 vec = vector.NewConstFixed(typeOid.ToType(), 1, val, mp) 5112 } else { 5113 vec = vector.NewWithFixed(typeOid.ToType(), []int32{val}, nil, mp) 5114 } 5115 5116 case int64: 5117 typeOid = types.T_int64 5118 if isSrcConst { 5119 vec = vector.NewConstFixed(typeOid.ToType(), 1, val, mp) 5120 } else { 5121 vec = vector.NewWithFixed(typeOid.ToType(), []int64{val}, nil, mp) 5122 } 5123 5124 case uint8: 5125 typeOid = types.T_uint8 5126 if isSrcConst { 5127 vec = vector.NewConstFixed(typeOid.ToType(), 1, val, mp) 5128 } else { 5129 vec = vector.NewWithFixed(typeOid.ToType(), []uint8{val}, nil, mp) 5130 } 5131 5132 case uint16: 5133 typeOid = types.T_uint16 5134 if isSrcConst { 5135 vec = vector.NewConstFixed(typeOid.ToType(), 1, val, mp) 5136 } else { 5137 vec = vector.NewWithFixed(typeOid.ToType(), []uint16{val}, nil, mp) 5138 } 5139 5140 case uint32: 5141 typeOid = types.T_uint32 5142 if isSrcConst { 5143 vec = vector.NewConstFixed(typeOid.ToType(), 1, val, mp) 5144 } else { 5145 vec = vector.NewWithFixed(typeOid.ToType(), []uint32{val}, nil, mp) 5146 } 5147 5148 case uint64: 5149 typeOid = types.T_uint64 5150 if isSrcConst { 5151 vec = vector.NewConstFixed(typeOid.ToType(), 1, val, testutil.TestUtilMp) 5152 } else { 5153 vec = vector.NewWithFixed(typeOid.ToType(), []uint64{val}, nil, testutil.TestUtilMp) 5154 } 5155 5156 case float32: 5157 typeOid = types.T_float32 5158 if isSrcConst { 5159 vec = vector.NewConstFixed(typeOid.ToType(), 1, val, mp) 5160 } else { 5161 vec = vector.NewWithFixed(typeOid.ToType(), []float32{val}, nil, mp) 5162 } 5163 5164 case float64: 5165 typeOid = types.T_float64 5166 if isSrcConst { 5167 vec = vector.NewConstFixed(typeOid.ToType(), 1, val, mp) 5168 } else { 5169 vec = vector.NewWithFixed(typeOid.ToType(), []float64{val}, nil, mp) 5170 } 5171 5172 case types.Date: 5173 typeOid = types.T_date 5174 if isSrcConst { 5175 vec = vector.NewConstFixed(typeOid.ToType(), 1, val, mp) 5176 } else { 5177 vec = vector.NewWithFixed(typeOid.ToType(), []types.Date{val}, nil, mp) 5178 } 5179 5180 case types.Time: 5181 typeOid = types.T_time 5182 if isSrcConst { 5183 vec = vector.NewConstFixed(typeOid.ToType(), 1, val, mp) 5184 } else { 5185 vec = vector.NewWithFixed(typeOid.ToType(), []types.Time{val}, nil, mp) 5186 } 5187 5188 case types.Datetime: 5189 typeOid = types.T_datetime 5190 if isSrcConst { 5191 vec = vector.NewConstFixed(typeOid.ToType(), 1, val, mp) 5192 } else { 5193 vec = vector.NewWithFixed(typeOid.ToType(), []types.Datetime{val}, nil, mp) 5194 } 5195 5196 case types.Timestamp: 5197 typeOid = types.T_timestamp 5198 if isSrcConst { 5199 vec = vector.NewConstFixed(typeOid.ToType(), 1, val, mp) 5200 } else { 5201 vec = vector.NewWithFixed(typeOid.ToType(), []types.Timestamp{val}, nil, mp) 5202 } 5203 5204 case bool: 5205 typeOid = types.T_bool 5206 if isSrcConst { 5207 vec = vector.NewConstFixed(typeOid.ToType(), 1, val, mp) 5208 } else { 5209 vec = vector.NewWithFixed(typeOid.ToType(), []bool{val}, nil, mp) 5210 } 5211 } 5212 return vec 5213 } 5214 5215 func makeScalarNullVector(srcType types.T) *vector.Vector { 5216 nullVector := vector.NewConstNull(srcType.ToType(), 1) 5217 return nullVector 5218 } 5219 5220 // make vector for type of char and varchar 5221 func makeStringVector(src string, t types.T, isConst bool) *vector.Vector { 5222 if isConst { 5223 return vector.NewConstString(t.ToType(), 1, src, testutil.TestUtilMp) 5224 } else { 5225 return vector.NewWithStrings(t.ToType(), []string{src}, nil, testutil.TestUtilMp) 5226 } 5227 } 5228 func makeJsonVectors(src string, isConst bool, t types.T) []*vector.Vector { 5229 dt, _ := types.ParseStringToByteJson(src) 5230 r, _ := dt.Marshal() 5231 if isConst { 5232 return []*vector.Vector{vector.NewConstBytes(types.T_json.ToType(), 1, r, testutil.TestUtilMp), makeTypeVector(t)} 5233 } else { 5234 return []*vector.Vector{vector.NewWithBytes(types.T_json.ToType(), [][]byte{r}, nil, testutil.TestUtilMp), makeTypeVector(t)} 5235 } 5236 }