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  }