github.com/matrixorigin/matrixone@v0.7.0/pkg/sql/plan/function/builtin/binary/date_format_test.go (about) 1 // Copyright 2021 - 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 binary 16 17 import ( 18 "context" 19 "testing" 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/smartystreets/goconvey/convey" 26 "github.com/stretchr/testify/require" 27 ) 28 29 // Batch multi line test date_format() function 30 func TestDateFormat(t *testing.T) { 31 convey.Convey("Test01 Date_Format() with multi line", t, func() { 32 cases := []struct { 33 datestr string 34 expect string 35 }{ 36 { 37 datestr: "2010-01-07 23:12:34.12345", 38 expect: `Jan January 01 1 7th 07 7 007 23 11 12 PM 11:12:34 PM 23:12:34 34 123450 01 01 01 01 Thu Thursday 4 2010 2010 2010 10 %`, 39 }, 40 { 41 datestr: "2012-12-21 23:12:34.123456", 42 expect: "Dec December 12 12 21st 21 21 356 23 11 12 PM 11:12:34 PM 23:12:34 34 123456 51 51 51 51 Fri Friday 5 2012 2012 2012 12 %", 43 }, 44 { 45 datestr: "0001-01-01 00:00:00.123456", 46 expect: `Jan January 01 1 1st 01 1 001 0 12 00 AM 12:00:00 AM 00:00:00 00 123456 00 01 53 01 Mon Monday 1 0000 0001 0001 01 %`, 47 }, 48 { 49 datestr: "2016-09-3 00:59:59.123456", 50 expect: `Sep September 09 9 3rd 03 3 247 0 12 59 AM 12:59:59 AM 00:59:59 59 123456 35 35 35 35 Sat Saturday 6 2016 2016 2016 16 %`, 51 }, 52 { 53 datestr: "2012-10-01 00:00:00", 54 expect: `Oct October 10 10 1st 01 1 275 0 12 00 AM 12:00:00 AM 00:00:00 00 000000 40 40 40 40 Mon Monday 1 2012 2012 2012 12 %`, 55 }, { 56 datestr: "2009-10-04 22:23:00", 57 expect: `Oct October 10 10 4th 04 4 277 22 10 23 PM 10:23:00 PM 22:23:00 00 000000 40 40 40 40 Sun Sunday 0 2009 2009 2009 09 %`, 58 }, 59 { 60 datestr: "2007-10-04 22:23:00", 61 expect: `Oct October 10 10 4th 04 4 277 22 10 23 PM 10:23:00 PM 22:23:00 00 000000 39 40 39 40 Thu Thursday 4 2007 2007 2007 07 %`, 62 }, 63 { 64 datestr: "1900-10-04 22:23:00", 65 expect: `Oct October 10 10 4th 04 4 277 22 10 23 PM 10:23:00 PM 22:23:00 00 000000 39 40 39 40 Thu Thursday 4 1900 1900 1900 00 %`, 66 }, 67 { 68 datestr: "1997-10-04 22:23:00", 69 expect: `Oct October 10 10 4th 04 4 277 22 10 23 PM 10:23:00 PM 22:23:00 00 000000 39 40 39 40 Sat Saturday 6 1997 1997 1997 97 %`, 70 }, 71 { 72 datestr: "1999-01-01", 73 expect: `Jan January 01 1 1st 01 1 001 0 12 00 AM 12:00:00 AM 00:00:00 00 000000 00 00 52 53 Fri Friday 5 1998 1998 1999 99 %`, 74 }, 75 { 76 datestr: "2006-06-01", 77 expect: `Jun June 06 6 1st 01 1 152 0 12 00 AM 12:00:00 AM 00:00:00 00 000000 22 22 22 22 Thu Thursday 4 2006 2006 2006 06 %`, 78 }, 79 } 80 81 var datestrs []string 82 var expects []string 83 for _, c := range cases { 84 datestrs = append(datestrs, c.datestr) 85 expects = append(expects, c.expect) 86 } 87 88 dateVector := testutil.MakeDateTimeVector(datestrs, nil) 89 90 format := `%b %M %m %c %D %d %e %j %k %h %i %p %r %T %s %f %U %u %V %v %a %W %w %X %x %Y %y %%` 91 formatVector := testutil.MakeScalarVarchar(format, 11) 92 93 expectVector := testutil.MakeVarcharVector(expects, nil) 94 95 proc := testutil.NewProc() 96 result, err := DateFormat([]*vector.Vector{dateVector, formatVector}, proc) 97 if err != nil { 98 t.Fatal(err) 99 } 100 convey.So(err, convey.ShouldBeNil) 101 compare := testutil.CompareVectors(expectVector, result) 102 convey.So(compare, convey.ShouldBeTrue) 103 }) 104 105 convey.Convey("Test02 Date_Format() with multi line", t, func() { 106 cases := []struct { 107 datestr string 108 expect string 109 }{ 110 { 111 datestr: "2010-01-07 23:12:34.12345", 112 expect: `Jan January 01 1 7th 07 7 007 23 11 12 PM 11:12:34 PM 23:12:34 34 123450 01 2010 2010 10 %`, 113 }, 114 { 115 datestr: "2012-12-21 23:12:34.123456", 116 expect: `Dec December 12 12 21st 21 21 356 23 11 12 PM 11:12:34 PM 23:12:34 34 123456 51 2012 2012 12 %`, 117 }, 118 { 119 datestr: "0001-01-01 00:00:00.123456", 120 expect: `Jan January 01 1 1st 01 1 001 0 12 00 AM 12:00:00 AM 00:00:00 00 123456 01 0001 0001 01 %`, 121 }, 122 { 123 datestr: "2016-09-3 00:59:59.123456", 124 expect: `Sep September 09 9 3rd 03 3 247 0 12 59 AM 12:59:59 AM 00:59:59 59 123456 35 2016 2016 16 %`, 125 }, 126 { 127 datestr: "2012-10-01 00:00:00", 128 expect: `Oct October 10 10 1st 01 1 275 0 12 00 AM 12:00:00 AM 00:00:00 00 000000 40 2012 2012 12 %`, 129 }, 130 { 131 datestr: "2009-10-04 22:23:00", 132 expect: `Oct October 10 10 4th 04 4 277 22 10 23 PM 10:23:00 PM 22:23:00 00 000000 40 2009 2009 09 %`, 133 }, 134 { 135 datestr: "2007-10-04 22:23:00", 136 expect: `Oct October 10 10 4th 04 4 277 22 10 23 PM 10:23:00 PM 22:23:00 00 000000 40 2007 2007 07 %`, 137 }, 138 { 139 //SELECT DATE_FORMAT('1900-10-04 22:23:00','%D %y %a %d %m %b %j'); 140 datestr: "1900-10-04 22:23:00", 141 expect: `Oct October 10 10 4th 04 4 277 22 10 23 PM 10:23:00 PM 22:23:00 00 000000 40 1900 1900 00 %`, 142 }, 143 { 144 // SELECT DATE_FORMAT('1997-10-04 22:23:00','%H %k %I %r %T %S %w'); 145 datestr: "1997-10-04 22:23:00", 146 expect: `Oct October 10 10 4th 04 4 277 22 10 23 PM 10:23:00 PM 22:23:00 00 000000 40 1997 1997 97 %`, 147 }, 148 { 149 // SELECT DATE_FORMAT('1999-01-01', '%X %V'); 150 datestr: "1999-01-01", 151 expect: `Jan January 01 1 1st 01 1 001 0 12 00 AM 12:00:00 AM 00:00:00 00 000000 53 1998 1999 99 %`, 152 }, 153 { 154 // SELECT DATE_FORMAT('2006-06-00', '%d'); 155 datestr: "2006-06-01", 156 expect: `Jun June 06 6 1st 01 1 152 0 12 00 AM 12:00:00 AM 00:00:00 00 000000 22 2006 2006 06 %`, 157 }, 158 } 159 160 var datestrs []string 161 var expects []string 162 for _, c := range cases { 163 datestrs = append(datestrs, c.datestr) 164 expects = append(expects, c.expect) 165 } 166 167 dateVector := testutil.MakeDateTimeVector(datestrs, nil) 168 format := `%b %M %m %c %D %d %e %j %k %h %i %p %r %T %s %f %v %x %Y %y %%` 169 formatVector := testutil.MakeScalarVarchar(format, 11) 170 expectVector := testutil.MakeVarcharVector(expects, nil) 171 172 proc := testutil.NewProc() 173 result, err := DateFormat([]*vector.Vector{dateVector, formatVector}, proc) 174 if err != nil { 175 t.Fatal(err) 176 } 177 convey.So(err, convey.ShouldBeNil) 178 compare := testutil.CompareVectors(expectVector, result) 179 convey.So(compare, convey.ShouldBeTrue) 180 }) 181 182 convey.Convey("Test03 Date_Format() with multi line", t, func() { 183 cases := []struct { 184 datestr string 185 expect string 186 }{ 187 { 188 datestr: "2010-01-07 23:12:34.12345", 189 expect: `abcJan January 01 1 7th 07 7 007 23 11 12 PM 11:12:34 PM 23:12:34 34 123450 01 01 01 01 Thu Thursday 4 2010 2010 2010 10!123 %xyz z`, 190 }, 191 { 192 datestr: "2012-12-21 23:12:34.123456", 193 expect: `abcDec December 12 12 21st 21 21 356 23 11 12 PM 11:12:34 PM 23:12:34 34 123456 51 51 51 51 Fri Friday 5 2012 2012 2012 12!123 %xyz z`, 194 }, 195 { 196 datestr: "0001-01-01 00:00:00.123456", 197 expect: `abcJan January 01 1 1st 01 1 001 0 12 00 AM 12:00:00 AM 00:00:00 00 123456 00 01 53 01 Mon Monday 1 0000 0001 0001 01!123 %xyz z`, 198 }, 199 { 200 datestr: "2016-09-3 00:59:59.123456", 201 expect: `abcSep September 09 9 3rd 03 3 247 0 12 59 AM 12:59:59 AM 00:59:59 59 123456 35 35 35 35 Sat Saturday 6 2016 2016 2016 16!123 %xyz z`, 202 }, 203 { 204 datestr: "2012-10-01 00:00:00", 205 expect: `abcOct October 10 10 1st 01 1 275 0 12 00 AM 12:00:00 AM 00:00:00 00 000000 40 40 40 40 Mon Monday 1 2012 2012 2012 12!123 %xyz z`, 206 }, 207 { 208 datestr: "2009-10-04 22:23:00", 209 expect: `abcOct October 10 10 4th 04 4 277 22 10 23 PM 10:23:00 PM 22:23:00 00 000000 40 40 40 40 Sun Sunday 0 2009 2009 2009 09!123 %xyz z`, 210 }, 211 { 212 datestr: "2007-10-04 22:23:00", 213 expect: `abcOct October 10 10 4th 04 4 277 22 10 23 PM 10:23:00 PM 22:23:00 00 000000 39 40 39 40 Thu Thursday 4 2007 2007 2007 07!123 %xyz z`, 214 }, 215 { 216 datestr: "1900-10-04 22:23:00", 217 expect: `abcOct October 10 10 4th 04 4 277 22 10 23 PM 10:23:00 PM 22:23:00 00 000000 39 40 39 40 Thu Thursday 4 1900 1900 1900 00!123 %xyz z`, 218 }, 219 { 220 datestr: "1997-10-04 22:23:00", 221 expect: `abcOct October 10 10 4th 04 4 277 22 10 23 PM 10:23:00 PM 22:23:00 00 000000 39 40 39 40 Sat Saturday 6 1997 1997 1997 97!123 %xyz z`, 222 }, 223 { 224 datestr: "1999-01-01", 225 expect: `abcJan January 01 1 1st 01 1 001 0 12 00 AM 12:00:00 AM 00:00:00 00 000000 00 00 52 53 Fri Friday 5 1998 1998 1999 99!123 %xyz z`, 226 }, 227 { 228 datestr: "2006-06-01", 229 expect: `abcJun June 06 6 1st 01 1 152 0 12 00 AM 12:00:00 AM 00:00:00 00 000000 22 22 22 22 Thu Thursday 4 2006 2006 2006 06!123 %xyz z`, 230 }, 231 } 232 233 var datestrs []string 234 var expects []string 235 for _, c := range cases { 236 datestrs = append(datestrs, c.datestr) 237 expects = append(expects, c.expect) 238 } 239 240 dateVector := testutil.MakeDateTimeVector(datestrs, nil) 241 format := `abc%b %M %m %c %D %d %e %j %k %h %i %p %r %T %s %f %U %u %V %v %a %W %w %X %x %Y %y!123 %%xyz %z` 242 formatVector := testutil.MakeScalarVarchar(format, 11) 243 expectVector := testutil.MakeVarcharVector(expects, nil) 244 245 proc := testutil.NewProc() 246 result, err := DateFormat([]*vector.Vector{dateVector, formatVector}, proc) 247 if err != nil { 248 t.Fatal(err) 249 } 250 convey.So(err, convey.ShouldBeNil) 251 compare := testutil.CompareVectors(expectVector, result) 252 convey.So(compare, convey.ShouldBeTrue) 253 }) 254 255 convey.Convey("Test04 Date_Format() with multi line", t, func() { 256 cases := []struct { 257 datestr string 258 expect string 259 }{ 260 { 261 datestr: "2010-01-07 23:12:34.12345", 262 expect: `07`, 263 }, 264 { 265 datestr: "2012-12-21 23:12:34.123456", 266 expect: "21", 267 }, 268 { 269 datestr: "0001-01-01 00:00:00.123456", 270 expect: `01`, 271 }, 272 { 273 datestr: "2016-09-3 00:59:59.123456", 274 expect: `03`, 275 }, 276 { 277 datestr: "2012-10-01 00:00:00", 278 expect: `01`, 279 }, 280 { 281 //SELECT DATE_FORMAT('2009-10-04 22:23:00', '%W %M %Y'); 282 datestr: "2009-10-04 22:23:00", 283 expect: `04`, 284 }, 285 { 286 //SELECT DATE_FORMAT('2007-10-04 22:23:00', '%H:%i:%s'); 287 datestr: "2007-10-04 22:23:00", 288 expect: `04`, 289 }, 290 { 291 datestr: "1900-10-04 22:23:00", 292 expect: `04`, 293 }, 294 { 295 datestr: "1997-10-04 22:23:00", 296 expect: `04`, 297 }, 298 { 299 datestr: "1999-01-01", 300 expect: `01`, 301 }, 302 { 303 datestr: "2006-06-01", 304 expect: `01`, 305 }, 306 } 307 308 var datestrs []string 309 var expects []string 310 for _, c := range cases { 311 datestrs = append(datestrs, c.datestr) 312 expects = append(expects, c.expect) 313 } 314 315 dateVector := testutil.MakeDateTimeVector(datestrs, nil) 316 format := `%d` 317 formatVector := testutil.MakeScalarVarchar(format, 1) 318 expectVector := testutil.MakeVarcharVector(expects, nil) 319 320 proc := testutil.NewProc() 321 result, err := DateFormat([]*vector.Vector{dateVector, formatVector}, proc) 322 if err != nil { 323 t.Fatal(err) 324 } 325 convey.So(err, convey.ShouldBeNil) 326 compare := testutil.CompareVectors(expectVector, result) 327 convey.So(compare, convey.ShouldBeTrue) 328 }) 329 330 convey.Convey("Test05 Date_Format() with multi line", t, func() { 331 cases := []struct { 332 datestr string 333 expect string 334 }{ 335 { 336 datestr: "2010-01-07 23:12:34.12345", 337 expect: `2010-01-07 23:12:34`, 338 }, 339 { 340 datestr: "2012-12-21 23:12:34.123456", 341 expect: "2012-12-21 23:12:34", 342 }, 343 { 344 datestr: "0001-01-01 00:00:00.123456", 345 expect: `0001-01-01 00:00:00`, 346 }, 347 { 348 datestr: "2016-09-3 00:59:59.123456", 349 expect: `2016-09-03 00:59:59`, 350 }, 351 { 352 datestr: "2012-10-01 00:00:00", 353 expect: `2012-10-01 00:00:00`, 354 }, 355 { 356 datestr: "2009-10-04 22:23:00", 357 expect: `2009-10-04 22:23:00`, 358 }, 359 { 360 datestr: "2007-10-04 22:23:00", 361 expect: `2007-10-04 22:23:00`, 362 }, 363 { 364 datestr: "1999-01-01", 365 expect: `1999-01-01 00:00:00`, 366 }, 367 { 368 datestr: "2006-06-01", 369 expect: `2006-06-01 00:00:00`, 370 }, 371 { 372 datestr: "1997-10-04 22:23:00", 373 expect: `1997-10-04 22:23:00`, 374 }, 375 } 376 377 var datestrs []string 378 var expects []string 379 for _, c := range cases { 380 datestrs = append(datestrs, c.datestr) 381 expects = append(expects, c.expect) 382 } 383 384 dateVector := testutil.MakeDateTimeVector(datestrs, nil) 385 format := `%Y-%m-%d %H:%i:%s` 386 formatVector := testutil.MakeScalarVarchar(format, 10) 387 expectVector := testutil.MakeVarcharVector(expects, nil) 388 389 proc := testutil.NewProc() 390 result, err := DateFormat([]*vector.Vector{dateVector, formatVector}, proc) 391 if err != nil { 392 t.Fatal(err) 393 } 394 convey.So(err, convey.ShouldBeNil) 395 compare := testutil.CompareVectors(expectVector, result) 396 convey.So(compare, convey.ShouldBeTrue) 397 }) 398 399 convey.Convey("Test06 Date_Format() with multi line", t, func() { 400 cases := []struct { 401 datestr string 402 expect string 403 }{ 404 { 405 datestr: "2010-01-07 23:12:34.12345", 406 expect: `2010-01-07`, 407 }, 408 { 409 datestr: "2012-12-21 23:12:34.123456", 410 expect: "2012-12-21", 411 }, 412 { 413 datestr: "0001-01-01 00:00:00.123456", 414 expect: `0001-01-01`, 415 }, 416 { 417 datestr: "2016-09-3 00:59:59.123456", 418 expect: `2016-09-03`, 419 }, 420 { 421 datestr: "2012-10-01 00:00:00", 422 expect: `2012-10-01`, 423 }, 424 { 425 datestr: "2009-10-04 22:23:00", 426 expect: `2009-10-04`, 427 }, 428 { 429 datestr: "2007-10-04 22:23:00", 430 expect: `2007-10-04`, 431 }, 432 { 433 datestr: "1900-10-04 22:23:00", 434 expect: `1900-10-04`, 435 }, 436 { 437 datestr: "1999-01-01", 438 expect: `1999-01-01`, 439 }, 440 { 441 datestr: "2006-06-01", 442 expect: `2006-06-01`, 443 }, 444 { 445 datestr: "1997-10-04 22:23:00", 446 expect: `1997-10-04`, 447 }, 448 } 449 450 var datestrs []string 451 var expects []string 452 for _, c := range cases { 453 datestrs = append(datestrs, c.datestr) 454 expects = append(expects, c.expect) 455 } 456 457 dateVector := testutil.MakeDateTimeVector(datestrs, nil) 458 format := `%Y-%m-%d` 459 formatVector := testutil.MakeScalarVarchar(format, 1) 460 expectVector := testutil.MakeVarcharVector(expects, nil) 461 462 proc := testutil.NewProc() 463 result, err := DateFormat([]*vector.Vector{dateVector, formatVector}, proc) 464 if err != nil { 465 t.Fatal(err) 466 } 467 convey.So(err, convey.ShouldBeNil) 468 compare := testutil.CompareVectors(expectVector, result) 469 convey.So(compare, convey.ShouldBeTrue) 470 }) 471 472 convey.Convey("Test07 Date_Format() with multi line", t, func() { 473 cases := []struct { 474 datestr string 475 expect string 476 }{ 477 { 478 datestr: "2010-01-07 23:12:34.12345", 479 expect: `2010 01`, 480 }, 481 { 482 datestr: "2012-12-21 23:12:34.123456", 483 expect: "2012 51", 484 }, 485 { 486 datestr: "0001-01-01 00:00:00.123456", 487 expect: `0000 53`, 488 }, 489 { 490 datestr: "2016-09-3 00:59:59.123456", 491 expect: `2016 35`, 492 }, 493 { 494 datestr: "2012-10-01 00:00:00", 495 expect: `2012 40`, 496 }, 497 { 498 datestr: "2009-10-04 22:23:00", 499 expect: `2009 40`, 500 }, 501 { 502 datestr: "1999-01-01", 503 expect: `1998 52`, 504 }, 505 { 506 datestr: "2006-06-01", 507 expect: `2006 22`, 508 }, 509 { 510 datestr: "1997-10-04 22:23:00", 511 expect: `1997 39`, 512 }, 513 } 514 515 var datestrs []string 516 var expects []string 517 for _, c := range cases { 518 datestrs = append(datestrs, c.datestr) 519 expects = append(expects, c.expect) 520 } 521 522 dateVector := testutil.MakeDateTimeVector(datestrs, nil) 523 format := `%X %V` 524 formatVector := testutil.MakeScalarVarchar(format, 1) 525 expectVector := testutil.MakeVarcharVector(expects, nil) 526 527 proc := testutil.NewProc() 528 result, err := DateFormat([]*vector.Vector{dateVector, formatVector}, proc) 529 if err != nil { 530 t.Fatal(err) 531 } 532 convey.So(err, convey.ShouldBeNil) 533 compare := testutil.CompareVectors(expectVector, result) 534 convey.So(compare, convey.ShouldBeTrue) 535 }) 536 } 537 538 // Single row constant input parameter test date_format function 539 func TestDateFormatWithScalar(t *testing.T) { 540 mp := mpool.MustNewZero() 541 // Construct vector parameter of date_format() function 542 makeDateFormatVectors := func(date string, format string) []*vector.Vector { 543 vec := make([]*vector.Vector, 2) 544 545 datetime, err := types.ParseDatetime(date, 6) 546 if err != nil { 547 panic(err) 548 } 549 550 vec[0] = vector.NewConstFixed(types.T_datetime.ToType(), 1, datetime, mp) 551 vec[1] = vector.NewConstString(types.T_varchar.ToType(), 1, format, mp) 552 return vec 553 } 554 555 cases := []struct { 556 name string 557 datestr string 558 format string 559 expect string 560 }{ 561 { 562 name: "Test01", 563 datestr: "2010-01-07 23:12:34.12345", 564 format: `%b %M %m %c %D %d %e %j %k %h %i %p %r %T %s %f %U %u %V %v %a %W %w %X %x %Y %y %%`, 565 expect: `Jan January 01 1 7th 07 7 007 23 11 12 PM 11:12:34 PM 23:12:34 34 123450 01 01 01 01 Thu Thursday 4 2010 2010 2010 10 %`, 566 }, 567 { 568 name: "Test02", 569 datestr: "2012-12-21 23:12:34.123456", 570 format: `%b %M %m %c %D %d %e %j %k %h %i %p %r %T %s %f %U %u %V %v %a %W %w %X %x %Y %y %%`, 571 expect: "Dec December 12 12 21st 21 21 356 23 11 12 PM 11:12:34 PM 23:12:34 34 123456 51 51 51 51 Fri Friday 5 2012 2012 2012 12 %", 572 }, 573 { 574 name: "Test03", 575 datestr: "0001-01-01 00:00:00.123456", 576 format: `%b %M %m %c %D %d %e %j %k %h %i %p %r %T %s %f %v %x %Y %y %%`, 577 expect: `Jan January 01 1 1st 01 1 001 0 12 00 AM 12:00:00 AM 00:00:00 00 123456 01 0001 0001 01 %`, 578 }, 579 { 580 name: "Test04", 581 datestr: "2016-09-3 00:59:59.123456", 582 format: `abc%b %M %m %c %D %d %e %j %k %h %i %p %r %T %s %f %U %u %V %v %a %W %w %X %x %Y %y!123 %%xyz %z`, 583 expect: `abcSep September 09 9 3rd 03 3 247 0 12 59 AM 12:59:59 AM 00:59:59 59 123456 35 35 35 35 Sat Saturday 6 2016 2016 2016 16!123 %xyz z`, 584 }, 585 { 586 name: "Test05", 587 datestr: "2012-10-01 00:00:00", 588 format: `%b %M %m %c %D %d %e %j %k %H %i %p %r %T %s %f %v %x %Y %y %%`, 589 expect: `Oct October 10 10 1st 01 1 275 0 00 00 AM 12:00:00 AM 00:00:00 00 000000 40 2012 2012 12 %`, 590 }, 591 { 592 //SELECT DATE_FORMAT('2009-10-04 22:23:00', '%W %M %Y'); 593 name: "Test06", 594 datestr: "2009-10-04 22:23:00", 595 format: `%W %M %Y`, 596 expect: `Sunday October 2009`, 597 }, 598 { 599 //SELECT DATE_FORMAT('2007-10-04 22:23:00', '%H:%i:%s'); 600 name: "Test07", 601 datestr: "2007-10-04 22:23:00", 602 format: `%H:%i:%s`, 603 expect: `22:23:00`, 604 }, 605 { 606 //SELECT DATE_FORMAT('1900-10-04 22:23:00','%D %y %a %d %m %b %j'); 607 name: "Test08", 608 datestr: "1900-10-04 22:23:00", 609 format: `%D %y %a %d %m %b %j`, 610 expect: `4th 00 Thu 04 10 Oct 277`, 611 }, 612 { 613 // SELECT DATE_FORMAT('1997-10-04 22:23:00','%H %k %I %r %T %S %w'); 614 name: "Test09", 615 datestr: "1997-10-04 22:23:00", 616 format: `%H %k %I %r %T %S %w`, 617 expect: `22 22 10 10:23:00 PM 22:23:00 00 6`, 618 }, 619 { 620 // SELECT DATE_FORMAT('1999-01-01', '%X %V'); 621 name: "Test10", 622 datestr: "1999-01-01", 623 format: `%X %V`, 624 expect: `1998 52`, 625 }, 626 { 627 // SELECT DATE_FORMAT('2006-06-00', '%d'); 628 name: "Test11", 629 datestr: "2006-06-01", 630 format: `%d`, 631 expect: `01`, 632 }, 633 { 634 // SELECT DATE_FORMAT('1997-10-04 22:23:00','%Y-%m-%d %H:%i:%s'); 635 name: "Test12", 636 datestr: "1997-10-04 22:23:00", 637 format: `%Y-%m-%d %H:%i:%s`, 638 expect: `1997-10-04 22:23:00`, 639 }, 640 { 641 // SELECT DATE_FORMAT('1997-10-04 22:23:00','%Y-%m'); 642 name: "Test13", 643 datestr: "1997-10-04 22:23:00", 644 format: `%Y-%m`, 645 expect: `1997-10`, 646 }, 647 { 648 // SELECT DATE_FORMAT('1997-10-04 22:23:00','%Y-%m-%d'); 649 name: "Test14", 650 datestr: "1997-10-04 22:23:00", 651 format: `%Y-%m-%d`, 652 expect: `1997-10-04`, 653 }, 654 } 655 656 proc := testutil.NewProc() 657 for _, c := range cases { 658 t.Run(c.name, func(t *testing.T) { 659 inputVecs := makeDateFormatVectors(c.datestr, c.format) 660 formatVec, err := DateFormat(inputVecs, proc) 661 if err != nil { 662 t.Fatal(err) 663 } 664 require.Equal(t, []byte(c.expect), formatVec.GetBytes(0)) 665 }) 666 } 667 } 668 669 func TestDatetimeFromat(t *testing.T) { 670 kases := []struct { 671 datestr string 672 format []string 673 Expect []string 674 }{ 675 { 676 datestr: "2010-01-07 23:12:34.12345", 677 format: []string{`%b`, `%M`, `%m`, `%c`, `%D`, `%d`, `%e`, `%j`, `%k`, `%h`, `%i`, `%p`, `%r`, `%T`, `%s`, `%f`, `%U`, `%u`, `%V`, `%v`, `%a`, `%W`, `%w`, `%X`, `%x`, `%Y`, `%y`, `%%`}, 678 Expect: []string{`Jan`, `January`, `01`, `1`, `7th`, `07`, `7`, `007`, `23`, `11`, `12`, `PM`, `11:12:34 PM`, `23:12:34`, `34`, `123450`, `01`, `01`, `01`, `01`, `Thu`, `Thursday`, `4`, `2010`, `2010`, `2010`, `10`, `%`}, 679 }, 680 } 681 682 for _, k := range kases { 683 datetime, err := types.ParseDatetime(k.datestr, 5) 684 if err != nil { 685 t.Fatalf("parse datetime string err %+v", err) 686 } 687 688 for i := 0; i < len(k.format); i++ { 689 res, err := datetimeFormat(context.TODO(), datetime, k.format[i]) 690 if err != nil { 691 t.Fatalf("dateformat exec error: %+v", err) 692 } 693 require.Equal(t, k.Expect[i], res) 694 } 695 } 696 697 cases := []struct { 698 name string 699 datestr string 700 format string 701 expect string 702 }{ 703 { 704 name: "Test01", 705 datestr: "2010-01-07 23:12:34.12345", 706 format: `%b %M %m %c %D %d %e %j %k %h %i %p %r %T %s %f %U %u %V %v %a %W %w %X %x %Y %y %%`, 707 expect: `Jan January 01 1 7th 07 7 007 23 11 12 PM 11:12:34 PM 23:12:34 34 123450 01 01 01 01 Thu Thursday 4 2010 2010 2010 10 %`, 708 }, 709 { 710 name: "Test02", 711 datestr: "2012-12-21 23:12:34.123456", 712 format: `%b %M %m %c %D %d %e %j %k %h %i %p %r %T %s %f %U %u %V %v %a %W %w %X %x %Y %y %%`, 713 expect: "Dec December 12 12 21st 21 21 356 23 11 12 PM 11:12:34 PM 23:12:34 34 123456 51 51 51 51 Fri Friday 5 2012 2012 2012 12 %", 714 }, 715 { 716 name: "Test03", 717 datestr: "0001-01-01 00:00:00.123456", 718 format: `%b %M %m %c %D %d %e %j %k %h %i %p %r %T %s %f %v %x %Y %y %%`, 719 expect: `Jan January 01 1 1st 01 1 001 0 12 00 AM 12:00:00 AM 00:00:00 00 123456 01 0001 0001 01 %`, 720 }, 721 { 722 name: "Test04", 723 datestr: "2016-09-3 00:59:59.123456", 724 format: `abc%b %M %m %c %D %d %e %j %k %h %i %p %r %T %s %f %U %u %V %v %a %W %w %X %x %Y %y!123 %%xyz %z`, 725 expect: `abcSep September 09 9 3rd 03 3 247 0 12 59 AM 12:59:59 AM 00:59:59 59 123456 35 35 35 35 Sat Saturday 6 2016 2016 2016 16!123 %xyz z`, 726 }, 727 { 728 datestr: "2012-10-01 00:00:00", 729 format: `%b %M %m %c %D %d %e %j %k %H %i %p %r %T %s %f %v %x %Y %y %%`, 730 expect: `Oct October 10 10 1st 01 1 275 0 00 00 AM 12:00:00 AM 00:00:00 00 000000 40 2012 2012 12 %`, 731 }, 732 } 733 734 for _, c := range cases { 735 t.Run(c.name, func(t *testing.T) { 736 datetime, err := types.ParseDatetime(c.datestr, 6) 737 if err != nil { 738 t.Fatalf("parse datetime string err %+v", err) 739 } 740 result, err := datetimeFormat(context.TODO(), datetime, c.format) 741 if err != nil { 742 t.Fatalf("dateformat exec error: %+v", err) 743 } 744 require.Equal(t, c.expect, result) 745 }) 746 } 747 } 748 749 func TestFormatIntByWidth(t *testing.T) { 750 cases := []struct { 751 name string 752 num int 753 width int 754 want string 755 }{ 756 {"Test01", 0, 0, "0"}, 757 {"Test02", 1, 0, "1"}, 758 {"Test03", 1, 1, "1"}, 759 {"Test04", 1, 2, "01"}, 760 {"Test05", 1, 3, "001"}, 761 {"Test06", 10, 2, "10"}, 762 {"Test07", 99, 4, "0099"}, 763 {"Test08", 100, 3, "100"}, 764 {"Test09", 888, 3, "888"}, 765 {"Test10", 428, 4, "0428"}, 766 {"Test11", 100000, 5, "100000"}, 767 } 768 769 for _, c := range cases { 770 t.Run(c.name, func(t *testing.T) { 771 res := FormatIntByWidth(c.num, c.width) 772 require.Equal(t, c.want, res) 773 }) 774 } 775 }