github.com/matrixorigin/matrixone@v0.7.0/pkg/sql/plan/function/builtin/binary/timediff_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 binary 16 17 import ( 18 "testing" 19 20 "github.com/matrixorigin/matrixone/pkg/common/mpool" 21 "github.com/matrixorigin/matrixone/pkg/container/types" 22 "github.com/matrixorigin/matrixone/pkg/container/vector" 23 "github.com/matrixorigin/matrixone/pkg/testutil" 24 "github.com/matrixorigin/matrixone/pkg/vm/process" 25 "github.com/stretchr/testify/require" 26 ) 27 28 func TestTimeDiffInTime(t *testing.T) { 29 procs := testutil.NewProc() 30 cases := []struct { 31 name string 32 vecs []*vector.Vector 33 proc *process.Process 34 want *vector.Vector 35 }{ 36 { 37 name: "TEST01", 38 vecs: makeTimeVectors("22:22:22", "11:11:11", procs.Mp()), 39 proc: testutil.NewProc(), 40 want: makeResultVector("11:11:11", procs), 41 }, 42 { 43 name: "TEST02", 44 vecs: makeTimeVectors("22:22:22", "-11:11:11", procs.Mp()), 45 proc: testutil.NewProc(), 46 want: makeResultVector("33:33:33", procs), 47 }, 48 { 49 name: "TEST03", 50 vecs: makeTimeVectors("-22:22:22", "11:11:11", procs.Mp()), 51 proc: testutil.NewProc(), 52 want: makeResultVector("-33:33:33", procs), 53 }, 54 { 55 name: "TEST04", 56 vecs: makeTimeVectors("-22:22:22", "-11:11:11", procs.Mp()), 57 proc: testutil.NewProc(), 58 want: makeResultVector("-11:11:11", procs), 59 }, 60 { 61 name: "TEST05", 62 vecs: makeTimeVectors("11:11:11", "22:22:22", procs.Mp()), 63 proc: testutil.NewProc(), 64 want: makeResultVector("-11:11:11", procs), 65 }, 66 { 67 name: "TEST06", 68 vecs: makeTimeVectors("11:11:11", "-22:22:22", procs.Mp()), 69 proc: testutil.NewProc(), 70 want: makeResultVector("33:33:33", procs), 71 }, 72 { 73 name: "TEST07", 74 vecs: makeTimeVectors("-11:11:11", "22:22:22", procs.Mp()), 75 proc: testutil.NewProc(), 76 want: makeResultVector("-33:33:33", procs), 77 }, 78 { 79 name: "TEST08", 80 vecs: makeTimeVectors("-11:11:11", "-22:22:22", procs.Mp()), 81 proc: testutil.NewProc(), 82 want: makeResultVector("11:11:11", procs), 83 }, 84 { 85 name: "TEST09", 86 vecs: makeTimeVectors("-2562047787:59:59", "-2562047787:59:59", procs.Mp()), 87 proc: testutil.NewProc(), 88 want: makeResultVector("00:00:00", procs), 89 }, 90 { 91 name: "TEST10", 92 vecs: makeTimeVectors("2562047787:59:59", "2562047787:59:59", procs.Mp()), 93 proc: testutil.NewProc(), 94 want: makeResultVector("00:00:00", procs), 95 }, 96 } 97 98 for _, c := range cases { 99 t.Run(c.name, func(t *testing.T) { 100 diff, err := TimeDiff[types.Time](c.vecs, c.proc) 101 if err != nil { 102 t.Fatal(err) 103 } 104 require.Equal(t, c.want.Col, diff.Col) 105 }) 106 } 107 } 108 109 func TestTimeDiffInDateTime(t *testing.T) { 110 procs := testutil.NewProc() 111 cases := []struct { 112 name string 113 vecs []*vector.Vector 114 proc *process.Process 115 want *vector.Vector 116 }{ 117 { 118 name: "TEST01", 119 vecs: makeDateTimeVectors("2012-12-12 22:22:22", "2012-12-12 11:11:11", procs.Mp()), 120 proc: testutil.NewProc(), 121 want: makeResultVector("11:11:11", procs), 122 }, 123 { 124 name: "TEST02", 125 vecs: makeDateTimeVectors("2012-12-12 11:11:11", "2012-12-12 22:22:22", procs.Mp()), 126 proc: testutil.NewProc(), 127 want: makeResultVector("-11:11:11", procs), 128 }, 129 { 130 name: "TEST03", 131 vecs: makeDateTimeVectors("2012-12-12 22:22:22", "2000-12-12 11:11:11", procs.Mp()), 132 proc: testutil.NewProc(), 133 want: makeResultVector("105203:11:11", procs), 134 }, 135 { 136 name: "TEST04", 137 vecs: makeDateTimeVectors("2000-12-12 11:11:11", "2012-12-12 22:22:22", procs.Mp()), 138 proc: testutil.NewProc(), 139 want: makeResultVector("-105203:11:11", procs), 140 }, 141 { 142 name: "TEST05", 143 vecs: makeDateTimeVectors("2012-12-12 22:22:22", "2012-10-10 11:11:11", procs.Mp()), 144 proc: testutil.NewProc(), 145 want: makeResultVector("1523:11:11", procs), 146 }, 147 { 148 name: "TEST06", 149 vecs: makeDateTimeVectors("2012-10-10 11:11:11", "2012-12-12 22:22:22", procs.Mp()), 150 proc: testutil.NewProc(), 151 want: makeResultVector("-1523:11:11", procs), 152 }, 153 { 154 name: "TEST07", 155 vecs: makeDateTimeVectors("2012-12-12 22:22:22", "2012-12-10 11:11:11", procs.Mp()), 156 proc: testutil.NewProc(), 157 want: makeResultVector("59:11:11", procs), 158 }, 159 { 160 name: "TEST08", 161 vecs: makeDateTimeVectors("2012-12-10 11:11:11", "2012-12-12 22:22:22", procs.Mp()), 162 proc: testutil.NewProc(), 163 want: makeResultVector("-59:11:11", procs), 164 }, 165 { 166 name: "TEST09", 167 vecs: makeDateTimeVectors("2012-12-10 11:11:11", "2012-12-10 11:11:11", procs.Mp()), 168 proc: testutil.NewProc(), 169 want: makeResultVector("00:00:00", procs), 170 }, 171 } 172 173 for _, c := range cases { 174 t.Run(c.name, func(t *testing.T) { 175 diff, err := TimeDiff[types.Datetime](c.vecs, c.proc) 176 if err != nil { 177 t.Fatal(err) 178 } 179 require.Equal(t, c.want.Col, diff.Col) 180 }) 181 } 182 } 183 184 func makeDateTimeVectors(firstStr, secondStr string, mp *mpool.MPool) []*vector.Vector { 185 vec := make([]*vector.Vector, 2) 186 187 firstDate, _ := types.ParseDatetime(firstStr, 0) 188 secondDate, _ := types.ParseDatetime(secondStr, 0) 189 190 vec[0] = vector.NewConstFixed(types.T_datetime.ToType(), 1, firstDate, mp) 191 vec[1] = vector.NewConstFixed(types.T_datetime.ToType(), 1, secondDate, mp) 192 return vec 193 } 194 195 func makeTimeVectors(firstStr, secondStr string, mp *mpool.MPool) []*vector.Vector { 196 vec := make([]*vector.Vector, 2) 197 198 firstDate, _ := types.ParseTime(firstStr, 0) 199 secondDate, _ := types.ParseTime(secondStr, 0) 200 201 vec[0] = vector.NewConstFixed(types.T_time.ToType(), 1, firstDate, mp) 202 vec[1] = vector.NewConstFixed(types.T_time.ToType(), 1, secondDate, mp) 203 return vec 204 } 205 206 func makeResultVector(res string, proc *process.Process) *vector.Vector { 207 208 resData, _ := types.ParseTime(res, 0) 209 return vector.NewConstFixed(types.T_time.ToType(), 1, resData, proc.Mp()) 210 }