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 }