github.com/matrixorigin/matrixone@v0.7.0/pkg/sql/plan/function/builtin/multi/from_unixtime_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 multi
    16  
    17  import (
    18  	"testing"
    19  	"time"
    20  
    21  	"github.com/matrixorigin/matrixone/pkg/common/mpool"
    22  	"github.com/matrixorigin/matrixone/pkg/container/types"
    23  	"github.com/matrixorigin/matrixone/pkg/container/vector"
    24  	"github.com/matrixorigin/matrixone/pkg/testutil"
    25  	"github.com/matrixorigin/matrixone/pkg/vm/process"
    26  	"github.com/smartystreets/goconvey/convey"
    27  	"github.com/stretchr/testify/require"
    28  )
    29  
    30  func TestFromUnixTimeInt64(t *testing.T) {
    31  	convey.Convey("test FromUnixTime Int64", t, func() {
    32  		kases := []struct {
    33  			num  int64
    34  			want string
    35  		}{
    36  			{
    37  				num:  0,
    38  				want: "1970-01-01 00:00:00",
    39  			},
    40  			{
    41  				num:  1451606400,
    42  				want: "2016-01-01 00:00:00",
    43  			},
    44  			{
    45  				num:  2451606400,
    46  				want: "2047-09-09 01:46:40",
    47  			},
    48  			{
    49  				num:  1451606488,
    50  				want: "2016-01-01 00:01:28",
    51  			},
    52  			{
    53  				num:  32536771199,
    54  				want: "3001-01-18 23:59:59",
    55  			},
    56  			{
    57  				num:  1447430881,
    58  				want: "2015-11-13 16:08:01",
    59  			},
    60  		}
    61  
    62  		var nums []int64
    63  		var wants []string
    64  		for _, kase := range kases {
    65  			nums = append(nums, kase.num)
    66  			wants = append(wants, kase.want)
    67  		}
    68  
    69  		int64Vector := testutil.MakeInt64Vector(nums, nil)
    70  		wantVector := testutil.MakeDateTimeVector(wants, nil)
    71  		process := newTmpProcess()
    72  		res, err := FromUnixTimeInt64([]*vector.Vector{int64Vector}, process)
    73  		convey.So(err, convey.ShouldBeNil)
    74  		cols1 := vector.MustTCols[types.Datetime](wantVector)
    75  		cols2 := vector.MustTCols[types.Datetime](res)
    76  		require.Equal(t, cols1, cols2)
    77  	})
    78  }
    79  
    80  func TestFromUnixTimeUint64(t *testing.T) {
    81  	convey.Convey("test FromUnixTime UInt64", t, func() {
    82  		kases := []struct {
    83  			num  uint64
    84  			want string
    85  		}{
    86  			{
    87  				num:  0,
    88  				want: "1970-01-01 00:00:00",
    89  			},
    90  			{
    91  				num:  1451606400,
    92  				want: "2016-01-01 00:00:00",
    93  			},
    94  			{
    95  				num:  2451606400,
    96  				want: "2047-09-09 01:46:40",
    97  			},
    98  			{
    99  				num:  1451606488,
   100  				want: "2016-01-01 00:01:28",
   101  			},
   102  			{
   103  				num:  32536771199,
   104  				want: "3001-01-18 23:59:59",
   105  			},
   106  			{
   107  				num:  1447430881,
   108  				want: "2015-11-13 16:08:01",
   109  			},
   110  		}
   111  
   112  		var nums []uint64
   113  		var wants []string
   114  		for _, kase := range kases {
   115  			nums = append(nums, kase.num)
   116  			wants = append(wants, kase.want)
   117  		}
   118  
   119  		uint64Vector := testutil.MakeUint64Vector(nums, nil)
   120  		wantVector := testutil.MakeDateTimeVector(wants, nil)
   121  		process := newTmpProcess()
   122  		res, err := FromUnixTimeUint64([]*vector.Vector{uint64Vector}, process)
   123  		convey.So(err, convey.ShouldBeNil)
   124  		cols1 := vector.MustTCols[types.Datetime](wantVector)
   125  		cols2 := vector.MustTCols[types.Datetime](res)
   126  		require.Equal(t, cols1, cols2)
   127  	})
   128  }
   129  
   130  func TestFromUnixTimeFloat64(t *testing.T) {
   131  	convey.Convey("test FromUnixTime Float64", t, func() {
   132  		kases := []struct {
   133  			num  float64
   134  			want string
   135  		}{
   136  			{
   137  				num:  0,
   138  				want: "1970-01-01 00:00:00.000000",
   139  			},
   140  			{
   141  				num:  1451606400.123456,
   142  				want: "2016-01-01 00:00:00.123456",
   143  			},
   144  			{
   145  				num:  1451606400.999999,
   146  				want: "2016-01-01 00:00:00.999999",
   147  			},
   148  			{
   149  				num:  1451606400.1233,
   150  				want: "2016-01-01 00:00:00.123300",
   151  			},
   152  			{
   153  				num:  32536771199.123456789,
   154  				want: "3001-01-18 23:59:59.123455",
   155  			},
   156  			{
   157  				num:  1447430881.4456789,
   158  				want: "2015-11-13 16:08:01.445679",
   159  			},
   160  		}
   161  
   162  		var nums []float64
   163  		var wants []string
   164  		for _, kase := range kases {
   165  			nums = append(nums, kase.num)
   166  			wants = append(wants, kase.want)
   167  		}
   168  
   169  		float64Vector := testutil.MakeFloat64Vector(nums, nil)
   170  		wantVector := testutil.MakeDateTimeVector(wants, nil)
   171  		process := newTmpProcess()
   172  		res, err := FromUnixTimeFloat64([]*vector.Vector{float64Vector}, process)
   173  		convey.So(err, convey.ShouldBeNil)
   174  		cols1 := vector.MustTCols[types.Datetime](wantVector)
   175  		cols2 := vector.MustTCols[types.Datetime](res)
   176  		require.Equal(t, cols1, cols2)
   177  	})
   178  }
   179  
   180  func TestFromUnixTimeInt64Format(t *testing.T) {
   181  	convey.Convey("test FromUnixTime Int64 Fromat", t, func() {
   182  		kases := []struct {
   183  			num    int64
   184  			format string
   185  			want   string
   186  		}{
   187  			{
   188  				num:    0,
   189  				format: "%b %M %m %c %D %d %e %j %k %h %i %p %r %T %s %f %v %x %Y %y",
   190  				want:   "Jan January 01 1 1st 01 1 001 0 12 00 AM 12:00:00 AM 00:00:00 00 000000 01 1970 1970 70",
   191  			},
   192  			{
   193  				num:    1451606400,
   194  				format: "%b %M %m %c %D %d %e %j %k %h %i %p %r %T %s %f %v %x %Y %y",
   195  				want:   "Jan January 01 1 1st 01 1 001 0 12 00 AM 12:00:00 AM 00:00:00 00 000000 53 2015 2016 16",
   196  			},
   197  			{
   198  				num:    2451606400,
   199  				format: "%b %M %m %c %D %d %e %j %k %h %i %p %r %T %s %f %v %x %Y %y",
   200  				want:   "Sep September 09 9 9th 09 9 252 1 01 46 AM 01:46:40 AM 01:46:40 40 000000 37 2047 2047 47",
   201  			},
   202  			{
   203  				num:    1451606267,
   204  				format: "%b %M %m %c %D %d %e %j %k %h %i %p %r %T %s %f %v %x %Y %y",
   205  				want:   "Dec December 12 12 31st 31 31 365 23 11 57 PM 11:57:47 PM 23:57:47 47 000000 53 2015 2015 15",
   206  			},
   207  			{
   208  				num:    32536771199,
   209  				format: "%b %M %m %c %D %d %e %j %k %h %i %p %r %T %s %f %v %x %Y %y",
   210  				want:   "Jan January 01 1 18th 18 18 018 23 11 59 PM 11:59:59 PM 23:59:59 59 000000 03 3001 3001 01",
   211  			},
   212  			{
   213  				num:    2447430881,
   214  				format: "%b %M %m %c %D %d %e %j %k %h %i %p %r %T %s %f %v %x %Y %y",
   215  				want:   "Jul July 07 7 22nd 22 22 203 17 05 54 PM 05:54:41 PM 17:54:41 41 000000 30 2047 2047 47",
   216  			},
   217  		}
   218  
   219  		var nums []int64
   220  		var formats []string
   221  		var wants []string
   222  		for _, kase := range kases {
   223  			nums = append(nums, kase.num)
   224  			formats = append(formats, kase.format)
   225  			wants = append(wants, kase.want)
   226  		}
   227  
   228  		int64Vector := testutil.MakeInt64Vector(nums, nil)
   229  		formatVector := testutil.MakeScalarVarchar(formats[0], 5)
   230  		wantVector := testutil.MakeVarcharVector(wants, nil)
   231  
   232  		process := newTmpProcess()
   233  		res, err := FromUnixTimeInt64Format([]*vector.Vector{int64Vector, formatVector}, process)
   234  		convey.So(err, convey.ShouldBeNil)
   235  		cols1 := vector.MustStrCols(wantVector)
   236  		cols2 := vector.MustStrCols(res)
   237  		require.Equal(t, cols1, cols2)
   238  	})
   239  }
   240  
   241  func TestFromUnixTimeUint64Format(t *testing.T) {
   242  	convey.Convey("test FromUnixTime Int64 Fromat", t, func() {
   243  		kases := []struct {
   244  			num    uint64
   245  			format string
   246  			want   string
   247  		}{
   248  			{
   249  				num:    0,
   250  				format: "%b %M %m %c %D %d %e %j %k %h %i %p %r %T %s %f %v %x %Y %y",
   251  				want:   "Jan January 01 1 1st 01 1 001 0 12 00 AM 12:00:00 AM 00:00:00 00 000000 01 1970 1970 70",
   252  			},
   253  			{
   254  				num:    1451606400,
   255  				format: "%b %M %m %c %D %d %e %j %k %h %i %p %r %T %s %f %v %x %Y %y",
   256  				want:   "Jan January 01 1 1st 01 1 001 0 12 00 AM 12:00:00 AM 00:00:00 00 000000 53 2015 2016 16",
   257  			},
   258  			{
   259  				num:    2451606400,
   260  				format: "%b %M %m %c %D %d %e %j %k %h %i %p %r %T %s %f %v %x %Y %y",
   261  				want:   "Sep September 09 9 9th 09 9 252 1 01 46 AM 01:46:40 AM 01:46:40 40 000000 37 2047 2047 47",
   262  			},
   263  			{
   264  				num:    1451606267,
   265  				format: "%b %M %m %c %D %d %e %j %k %h %i %p %r %T %s %f %v %x %Y %y",
   266  				want:   "Dec December 12 12 31st 31 31 365 23 11 57 PM 11:57:47 PM 23:57:47 47 000000 53 2015 2015 15",
   267  			},
   268  			{
   269  				num:    32536771199,
   270  				format: "%b %M %m %c %D %d %e %j %k %h %i %p %r %T %s %f %v %x %Y %y",
   271  				want:   "Jan January 01 1 18th 18 18 018 23 11 59 PM 11:59:59 PM 23:59:59 59 000000 03 3001 3001 01",
   272  			},
   273  			{
   274  				num:    2447430881,
   275  				format: "%b %M %m %c %D %d %e %j %k %h %i %p %r %T %s %f %v %x %Y %y",
   276  				want:   "Jul July 07 7 22nd 22 22 203 17 05 54 PM 05:54:41 PM 17:54:41 41 000000 30 2047 2047 47",
   277  			},
   278  		}
   279  
   280  		var nums []uint64
   281  		var formats []string
   282  		var wants []string
   283  		for _, kase := range kases {
   284  			nums = append(nums, kase.num)
   285  			formats = append(formats, kase.format)
   286  			wants = append(wants, kase.want)
   287  		}
   288  
   289  		uint64Vector := testutil.MakeUint64Vector(nums, nil)
   290  		formatVector := testutil.MakeScalarVarchar(formats[0], 5)
   291  		wantVector := testutil.MakeVarcharVector(wants, nil)
   292  
   293  		process := newTmpProcess()
   294  		res, err := FromUnixTimeUint64Format([]*vector.Vector{uint64Vector, formatVector}, process)
   295  		convey.So(err, convey.ShouldBeNil)
   296  		cols1 := vector.MustStrCols(wantVector)
   297  		cols2 := vector.MustStrCols(res)
   298  		require.Equal(t, cols1, cols2)
   299  	})
   300  }
   301  
   302  func TestFromUnixTimeFloat64Format(t *testing.T) {
   303  	convey.Convey("test FromUnixTime Float64 Fromat", t, func() {
   304  		kases := []struct {
   305  			num    float64
   306  			format string
   307  			want   string
   308  		}{
   309  			{
   310  				num:    1451606400.123456789,
   311  				format: "%b %M %m %c %D %d %e %j %k %h %i %p %r %T %s %f %v %x %Y %y",
   312  				want:   "Jan January 01 1 1st 01 1 001 0 12 00 AM 12:00:00 AM 00:00:00 00 123457 53 2015 2016 16",
   313  			},
   314  			{
   315  				num:    2451606400.999999,
   316  				format: "%b %M %m %c %D %d %e %j %k %h %i %p %r %T %s %f %v %x %Y %y",
   317  				want:   "Sep September 09 9 9th 09 9 252 1 01 46 AM 01:46:40 AM 01:46:40 40 999999 37 2047 2047 47",
   318  			},
   319  			{
   320  				num:    1451606267.99999999,
   321  				format: "%b %M %m %c %D %d %e %j %k %h %i %p %r %T %s %f %v %x %Y %y",
   322  				want:   "Dec December 12 12 31st 31 31 365 23 11 57 PM 11:57:48 PM 23:57:48 48 000000 53 2015 2015 15",
   323  			},
   324  			{
   325  				num:    32536771199.123456,
   326  				format: "%b %M %m %c %D %d %e %j %k %h %i %p %r %T %s %f %v %x %Y %y",
   327  				want:   "Jan January 01 1 18th 18 18 018 23 11 59 PM 11:59:59 PM 23:59:59 59 123455 03 3001 3001 01",
   328  			},
   329  			{
   330  				num:    2447430881.1245,
   331  				format: "%b %M %m %c %D %d %e %j %k %h %i %p %r %T %s %f %v %x %Y %y",
   332  				want:   "Jul July 07 7 22nd 22 22 203 17 05 54 PM 05:54:41 PM 17:54:41 41 124500 30 2047 2047 47",
   333  			},
   334  		}
   335  
   336  		var nums []float64
   337  		var formats []string
   338  		var wants []string
   339  		for _, kase := range kases {
   340  			nums = append(nums, kase.num)
   341  			formats = append(formats, kase.format)
   342  			wants = append(wants, kase.want)
   343  		}
   344  
   345  		float64Vector := testutil.MakeFloat64Vector(nums, nil)
   346  		formatVector := testutil.MakeScalarVarchar(formats[0], 5)
   347  		wantVector := testutil.MakeVarcharVector(wants, nil)
   348  
   349  		process := newTmpProcess()
   350  		res, err := FromUnixTimeFloat64Format([]*vector.Vector{float64Vector, formatVector}, process)
   351  		convey.So(err, convey.ShouldBeNil)
   352  		cols1 := vector.MustStrCols(wantVector)
   353  		cols2 := vector.MustStrCols(res)
   354  		require.Equal(t, cols1, cols2)
   355  	})
   356  }
   357  
   358  func TestFromUnixTimeFloat64Null(t *testing.T) {
   359  	convey.Convey("test FromUnixTime Float64 null", t, func() {
   360  		kases := []struct {
   361  			num float64
   362  		}{
   363  			{
   364  				num: -1451606400.123345,
   365  			},
   366  			{
   367  				num: 32536771200.1234566,
   368  			},
   369  			{
   370  				num: 1451606400.9999,
   371  			},
   372  			{
   373  				num: 32536771199.4444,
   374  			},
   375  			{
   376  				num: 1447430881.4545565,
   377  			},
   378  		}
   379  
   380  		var nums []float64
   381  		for _, kase := range kases {
   382  			nums = append(nums, kase.num)
   383  		}
   384  
   385  		numVector := testutil.MakeFloat64Vector(nums, []uint64{2, 3, 4})
   386  		process := testutil.NewProc()
   387  		res, err := FromUnixTimeFloat64([]*vector.Vector{numVector}, process)
   388  		convey.So(err, convey.ShouldBeNil)
   389  		require.Equal(t, []uint64{0, 1, 2, 3, 4}, res.Nsp.Np.ToArray())
   390  	})
   391  }
   392  
   393  func TestFromUnixTimeInt64Null(t *testing.T) {
   394  	convey.Convey("test FromUnixTime Int64 null", t, func() {
   395  		kases := []struct {
   396  			num int64
   397  		}{
   398  			{
   399  				num: -1451606400,
   400  			},
   401  			{
   402  				num: 32536771200,
   403  			},
   404  			{
   405  				num: 1451606400,
   406  			},
   407  			{
   408  				num: 32536771199,
   409  			},
   410  			{
   411  				num: 1447430881,
   412  			},
   413  		}
   414  
   415  		var nums []int64
   416  		for _, kase := range kases {
   417  			nums = append(nums, kase.num)
   418  		}
   419  
   420  		float64Vector := testutil.MakeInt64Vector(nums, []uint64{2, 3, 4})
   421  		process := testutil.NewProc()
   422  		res, err := FromUnixTimeInt64([]*vector.Vector{float64Vector}, process)
   423  		convey.So(err, convey.ShouldBeNil)
   424  		require.Equal(t, []uint64{0, 1, 2, 3, 4}, res.Nsp.Np.ToArray())
   425  	})
   426  }
   427  
   428  func TestFromUnixTimeInt64FormatNull(t *testing.T) {
   429  	convey.Convey("test FromUnixTime Int64 format NUll", t, func() {
   430  		kases := []struct {
   431  			num int64
   432  		}{
   433  			{
   434  				num: -1451606400,
   435  			},
   436  			{
   437  				num: 32536771200,
   438  			},
   439  			{
   440  				num: 1451606400,
   441  			},
   442  			{
   443  				num: 32536771199,
   444  			},
   445  			{
   446  				num: 1447430881,
   447  			},
   448  		}
   449  
   450  		var nums []int64
   451  		for _, kase := range kases {
   452  			nums = append(nums, kase.num)
   453  		}
   454  
   455  		numVector := testutil.MakeInt64Vector(nums, []uint64{2, 3, 4})
   456  		formatVector := testutil.MakeScalarVarchar("%b %M %m %c %D %d %e %j %k %h %i %p %r %T %s %f %v %x %Y %y", 5)
   457  		process := testutil.NewProc()
   458  		res, err := FromUnixTimeInt64Format([]*vector.Vector{numVector, formatVector}, process)
   459  		convey.So(err, convey.ShouldBeNil)
   460  		require.Equal(t, []uint64{0, 1, 2, 3, 4}, res.Nsp.Np.ToArray())
   461  	})
   462  }
   463  
   464  func TestFromUnixTimeFloat64FormatNull(t *testing.T) {
   465  	convey.Convey("test FromUnixTime float64 NUll", t, func() {
   466  		kases := []struct {
   467  			num float64
   468  		}{
   469  			{
   470  				num: -1451606400.34534,
   471  			},
   472  			{
   473  				num: 32536771200.78678,
   474  			},
   475  			{
   476  				num: 1451606400.56456,
   477  			},
   478  			{
   479  				num: 32536771199.354345,
   480  			},
   481  			{
   482  				num: 1447430881.1232,
   483  			},
   484  		}
   485  
   486  		var nums []float64
   487  		for _, kase := range kases {
   488  			nums = append(nums, kase.num)
   489  		}
   490  
   491  		numVector := testutil.MakeFloat64Vector(nums, []uint64{2, 3, 4})
   492  		formatVector := testutil.MakeScalarVarchar("%b %M %m %c %D %d %e %j %k %h %i %p %r %T %s %f %v %x %Y %y", 5)
   493  		process := testutil.NewProc()
   494  		res, err := FromUnixTimeFloat64Format([]*vector.Vector{numVector, formatVector}, process)
   495  		convey.So(err, convey.ShouldBeNil)
   496  		require.Equal(t, []uint64{0, 1, 2, 3, 4}, res.Nsp.Np.ToArray())
   497  	})
   498  }
   499  
   500  func newTmpProcess() *process.Process {
   501  	return newProcessWithMPool(mpool.MustNewZero())
   502  }
   503  
   504  func newProcessWithMPool(mp *mpool.MPool) *process.Process {
   505  	process := testutil.NewProcessWithMPool(mp)
   506  	process.SessionInfo.TimeZone = time.FixedZone("UTC0", 0)
   507  	return process
   508  }