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  }