@@ -449,11 +449,12 @@ func eType2FieldType(eType types.EvalType) *types.FieldType {
449
449
}
450
450
451
451
func genVecExprBenchCase (ctx sessionctx.Context , funcName string , testCase vecExprBenchCase ) (expr Expression , fts []* types.FieldType , input * chunk.Chunk , output * chunk.Chunk ) {
452
- fts = testCase .childrenFieldTypes
453
- if fts == nil {
454
- fts = make ([]* types.FieldType , len (testCase .childrenTypes ))
455
- for i , eType := range testCase .childrenTypes {
456
- fts [i ] = eType2FieldType (eType )
452
+ fts = make ([]* types.FieldType , len (testCase .childrenTypes ))
453
+ for i := range fts {
454
+ if i < len (testCase .childrenFieldTypes ) && testCase .childrenFieldTypes [i ] != nil {
455
+ fts [i ] = testCase .childrenFieldTypes [i ]
456
+ } else {
457
+ fts [i ] = eType2FieldType (testCase .childrenTypes [i ])
457
458
}
458
459
}
459
460
cols := make ([]Expression , len (testCase .childrenTypes ))
@@ -580,11 +581,12 @@ func benchmarkVectorizedEvalOneVec(b *testing.B, vecExprCases vecExprBenchCases)
580
581
581
582
func genVecBuiltinFuncBenchCase (ctx sessionctx.Context , funcName string , testCase vecExprBenchCase ) (baseFunc builtinFunc , fts []* types.FieldType , input * chunk.Chunk , result * chunk.Column ) {
582
583
childrenNumber := len (testCase .childrenTypes )
583
- fts = testCase .childrenFieldTypes
584
- if fts == nil {
585
- fts = make ([]* types.FieldType , childrenNumber )
586
- for i , eType := range testCase .childrenTypes {
587
- fts [i ] = eType2FieldType (eType )
584
+ fts = make ([]* types.FieldType , childrenNumber )
585
+ for i := range fts {
586
+ if i < len (testCase .childrenFieldTypes ) && testCase .childrenFieldTypes [i ] != nil {
587
+ fts [i ] = testCase .childrenFieldTypes [i ]
588
+ } else {
589
+ fts [i ] = eType2FieldType (testCase .childrenTypes [i ])
588
590
}
589
591
}
590
592
cols := make ([]Expression , childrenNumber )
@@ -622,9 +624,18 @@ func genVecBuiltinFuncBenchCase(ctx sessionctx.Context, funcName string, testCas
622
624
panic (err )
623
625
}
624
626
result = chunk .NewColumn (eType2FieldType (testCase .retEvalType ), 1024 )
627
+ // Mess up the output to make sure vecEvalXXX to call ResizeXXX/ReserveXXX itself.
628
+ result .AppendNull ()
625
629
return baseFunc , fts , input , result
626
630
}
627
631
632
+ // a hack way to calculate length of a chunk.Column.
633
+ func getColumnLen (col * chunk.Column , eType types.EvalType ) int {
634
+ chk := chunk .New ([]* types.FieldType {eType2FieldType (eType )}, 1024 , 1024 )
635
+ chk .SetCol (0 , col )
636
+ return chk .NumRows ()
637
+ }
638
+
628
639
// testVectorizedBuiltinFunc is used to verify that the vectorized
629
640
// expression is evaluated correctly
630
641
func testVectorizedBuiltinFunc (c * C , vecExprCases vecExprBenchCases ) {
@@ -645,8 +656,10 @@ func testVectorizedBuiltinFunc(c *C, vecExprCases vecExprBenchCases) {
645
656
if ! testAll && testFunc [baseFuncName ] != true {
646
657
continue
647
658
}
659
+ // do not forget to implement the vectorized method.
660
+ c .Assert (baseFunc .vectorized (), IsTrue , Commentf ("func: %v" , baseFuncName ))
648
661
commentf := func (row int ) CommentInterface {
649
- return Commentf ("case %+v, row: %v, rowData: %v" , testCase , row , input .GetRow (row ).GetDatumRow (fts ))
662
+ return Commentf ("func: %v, case %+v, row: %v, rowData: %v" , baseFuncName , testCase , row , input .GetRow (row ).GetDatumRow (fts ))
650
663
}
651
664
it := chunk .NewIterator4Chunk (input )
652
665
i := 0
@@ -655,12 +668,14 @@ func testVectorizedBuiltinFunc(c *C, vecExprCases vecExprBenchCases) {
655
668
case types .ETInt :
656
669
err := baseFunc .vecEvalInt (input , output )
657
670
c .Assert (err , IsNil )
671
+ // do not forget to call ResizeXXX/ReserveXXX
672
+ c .Assert (getColumnLen (output , testCase .retEvalType ), Equals , input .NumRows ())
658
673
vecWarnCnt = ctx .GetSessionVars ().StmtCtx .WarningCount ()
659
674
i64s := output .Int64s ()
660
675
for row := it .Begin (); row != it .End (); row = it .Next () {
661
676
val , isNull , err := baseFunc .evalInt (row )
662
677
c .Assert (err , IsNil )
663
- c .Assert (isNull , Equals , output .IsNull (i ))
678
+ c .Assert (isNull , Equals , output .IsNull (i ), commentf ( i ) )
664
679
if ! isNull {
665
680
c .Assert (val , Equals , i64s [i ], commentf (i ))
666
681
}
@@ -669,12 +684,14 @@ func testVectorizedBuiltinFunc(c *C, vecExprCases vecExprBenchCases) {
669
684
case types .ETReal :
670
685
err := baseFunc .vecEvalReal (input , output )
671
686
c .Assert (err , IsNil )
687
+ // do not forget to call ResizeXXX/ReserveXXX
688
+ c .Assert (getColumnLen (output , testCase .retEvalType ), Equals , input .NumRows ())
672
689
vecWarnCnt = ctx .GetSessionVars ().StmtCtx .WarningCount ()
673
690
f64s := output .Float64s ()
674
691
for row := it .Begin (); row != it .End (); row = it .Next () {
675
692
val , isNull , err := baseFunc .evalReal (row )
676
693
c .Assert (err , IsNil )
677
- c .Assert (isNull , Equals , output .IsNull (i ))
694
+ c .Assert (isNull , Equals , output .IsNull (i ), commentf ( i ) )
678
695
if ! isNull {
679
696
c .Assert (val , Equals , f64s [i ], commentf (i ))
680
697
}
@@ -683,12 +700,14 @@ func testVectorizedBuiltinFunc(c *C, vecExprCases vecExprBenchCases) {
683
700
case types .ETDecimal :
684
701
err := baseFunc .vecEvalDecimal (input , output )
685
702
c .Assert (err , IsNil )
703
+ // do not forget to call ResizeXXX/ReserveXXX
704
+ c .Assert (getColumnLen (output , testCase .retEvalType ), Equals , input .NumRows ())
686
705
vecWarnCnt = ctx .GetSessionVars ().StmtCtx .WarningCount ()
687
706
d64s := output .Decimals ()
688
707
for row := it .Begin (); row != it .End (); row = it .Next () {
689
708
val , isNull , err := baseFunc .evalDecimal (row )
690
709
c .Assert (err , IsNil )
691
- c .Assert (isNull , Equals , output .IsNull (i ))
710
+ c .Assert (isNull , Equals , output .IsNull (i ), commentf ( i ) )
692
711
if ! isNull {
693
712
c .Assert (* val , Equals , d64s [i ], commentf (i ))
694
713
}
@@ -697,12 +716,14 @@ func testVectorizedBuiltinFunc(c *C, vecExprCases vecExprBenchCases) {
697
716
case types .ETDatetime , types .ETTimestamp :
698
717
err := baseFunc .vecEvalTime (input , output )
699
718
c .Assert (err , IsNil )
719
+ // do not forget to call ResizeXXX/ReserveXXX
720
+ c .Assert (getColumnLen (output , testCase .retEvalType ), Equals , input .NumRows ())
700
721
vecWarnCnt = ctx .GetSessionVars ().StmtCtx .WarningCount ()
701
722
t64s := output .Times ()
702
723
for row := it .Begin (); row != it .End (); row = it .Next () {
703
724
val , isNull , err := baseFunc .evalTime (row )
704
725
c .Assert (err , IsNil )
705
- c .Assert (isNull , Equals , output .IsNull (i ))
726
+ c .Assert (isNull , Equals , output .IsNull (i ), commentf ( i ) )
706
727
if ! isNull {
707
728
c .Assert (val , Equals , t64s [i ], commentf (i ))
708
729
}
@@ -711,12 +732,14 @@ func testVectorizedBuiltinFunc(c *C, vecExprCases vecExprBenchCases) {
711
732
case types .ETDuration :
712
733
err := baseFunc .vecEvalDuration (input , output )
713
734
c .Assert (err , IsNil )
735
+ // do not forget to call ResizeXXX/ReserveXXX
736
+ c .Assert (getColumnLen (output , testCase .retEvalType ), Equals , input .NumRows ())
714
737
vecWarnCnt = ctx .GetSessionVars ().StmtCtx .WarningCount ()
715
738
d64s := output .GoDurations ()
716
739
for row := it .Begin (); row != it .End (); row = it .Next () {
717
740
val , isNull , err := baseFunc .evalDuration (row )
718
741
c .Assert (err , IsNil )
719
- c .Assert (isNull , Equals , output .IsNull (i ))
742
+ c .Assert (isNull , Equals , output .IsNull (i ), commentf ( i ) )
720
743
if ! isNull {
721
744
c .Assert (val .Duration , Equals , d64s [i ], commentf (i ))
722
745
}
@@ -725,11 +748,13 @@ func testVectorizedBuiltinFunc(c *C, vecExprCases vecExprBenchCases) {
725
748
case types .ETJson :
726
749
err := baseFunc .vecEvalJSON (input , output )
727
750
c .Assert (err , IsNil )
751
+ // do not forget to call ResizeXXX/ReserveXXX
752
+ c .Assert (getColumnLen (output , testCase .retEvalType ), Equals , input .NumRows ())
728
753
vecWarnCnt = ctx .GetSessionVars ().StmtCtx .WarningCount ()
729
754
for row := it .Begin (); row != it .End (); row = it .Next () {
730
755
val , isNull , err := baseFunc .evalJSON (row )
731
756
c .Assert (err , IsNil )
732
- c .Assert (isNull , Equals , output .IsNull (i ))
757
+ c .Assert (isNull , Equals , output .IsNull (i ), commentf ( i ) )
733
758
if ! isNull {
734
759
var cmp int
735
760
cmp = json .CompareBinary (val , output .GetJSON (i ))
@@ -740,11 +765,13 @@ func testVectorizedBuiltinFunc(c *C, vecExprCases vecExprBenchCases) {
740
765
case types .ETString :
741
766
err := baseFunc .vecEvalString (input , output )
742
767
c .Assert (err , IsNil )
768
+ // do not forget to call ResizeXXX/ReserveXXX
769
+ c .Assert (getColumnLen (output , testCase .retEvalType ), Equals , input .NumRows ())
743
770
vecWarnCnt = ctx .GetSessionVars ().StmtCtx .WarningCount ()
744
771
for row := it .Begin (); row != it .End (); row = it .Next () {
745
772
val , isNull , err := baseFunc .evalString (row )
746
773
c .Assert (err , IsNil )
747
- c .Assert (isNull , Equals , output .IsNull (i ))
774
+ c .Assert (isNull , Equals , output .IsNull (i ), commentf ( i ) )
748
775
if ! isNull {
749
776
c .Assert (val , Equals , output .GetString (i ), commentf (i ))
750
777
}
0 commit comments