github.com/matrixorigin/matrixone@v0.7.0/pkg/sql/plan/function/builtin/multi/substr_index_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 20 "github.com/matrixorigin/matrixone/pkg/container/vector" 21 "github.com/matrixorigin/matrixone/pkg/testutil" 22 "github.com/stretchr/testify/require" 23 ) 24 25 func TestSubstrIndedxInt64(t *testing.T) { 26 testCases := []arg{ 27 { 28 info: "substring_index('www.mysql.com', '.' , 0 )", proc: testutil.NewProc(), 29 vs: []*vector.Vector{ 30 testutil.MakeScalarVarchar("www.mysql.com", 1), 31 testutil.MakeScalarVarchar(".", 1), 32 testutil.MakeScalarInt64(0, 1), 33 }, 34 match: true, 35 err: false, 36 expect: testutil.MakeScalarVarchar("", 1), 37 }, 38 39 { 40 info: "substring_index('www.mysql.com', '.' , 1 )", proc: testutil.NewProc(), 41 vs: []*vector.Vector{ 42 testutil.MakeScalarVarchar("www.mysql.com", 1), 43 testutil.MakeScalarVarchar(".", 1), 44 testutil.MakeScalarInt64(1, 1), 45 }, 46 match: true, 47 err: false, 48 expect: testutil.MakeScalarVarchar("www", 1), 49 }, 50 51 { 52 info: "substring_index('www.mysql.com', '.' , 2 )", proc: testutil.NewProc(), 53 vs: []*vector.Vector{ 54 testutil.MakeScalarVarchar("www.mysql.com", 1), 55 testutil.MakeScalarVarchar(".", 1), 56 testutil.MakeScalarInt64(2, 1), 57 }, 58 match: true, 59 err: false, 60 expect: testutil.MakeScalarVarchar("www.mysql", 1), 61 }, 62 63 { 64 info: "substring_index('www.mysql.com', '.' , 3 )", proc: testutil.NewProc(), 65 vs: []*vector.Vector{ 66 testutil.MakeScalarVarchar("www.mysql.com", 1), 67 testutil.MakeScalarVarchar(".", 1), 68 testutil.MakeScalarInt64(3, 1), 69 }, 70 match: true, 71 err: false, 72 expect: testutil.MakeScalarVarchar("www.mysql.com", 1), 73 }, 74 75 { 76 info: "substring_index('www.mysql.com', '.' , -3 )", proc: testutil.NewProc(), 77 vs: []*vector.Vector{ 78 testutil.MakeScalarVarchar("www.mysql.com", 1), 79 testutil.MakeScalarVarchar(".", 1), 80 testutil.MakeScalarInt64(-3, 1), 81 }, 82 match: true, 83 err: false, 84 expect: testutil.MakeScalarVarchar("www.mysql.com", 1), 85 }, 86 87 { 88 info: "substring_index('www.mysql.com', '.' , -2 )", proc: testutil.NewProc(), 89 vs: []*vector.Vector{ 90 testutil.MakeScalarVarchar("www.mysql.com", 1), 91 testutil.MakeScalarVarchar(".", 1), 92 testutil.MakeScalarInt64(-2, 1), 93 }, 94 match: true, 95 err: false, 96 expect: testutil.MakeScalarVarchar("mysql.com", 1), 97 }, 98 99 { 100 info: "substring_index('www.mysql.com', '.' , -1 )", proc: testutil.NewProc(), 101 vs: []*vector.Vector{ 102 testutil.MakeScalarVarchar("www.mysql.com", 1), 103 testutil.MakeScalarVarchar(".", 1), 104 testutil.MakeScalarInt64(-1, 1), 105 }, 106 match: true, 107 err: false, 108 expect: testutil.MakeScalarVarchar("com", 1), 109 }, 110 111 { 112 info: "substring_index('www.mysql.com', '' , 1 )", proc: testutil.NewProc(), 113 vs: []*vector.Vector{ 114 testutil.MakeScalarVarchar("www.mysql.com", 1), 115 testutil.MakeScalarVarchar("", 1), 116 testutil.MakeScalarInt64(1, 1), 117 }, 118 match: true, 119 err: false, 120 expect: testutil.MakeScalarVarchar("", 1), 121 }, 122 } 123 124 for _, tc := range testCases { 125 t.Run(tc.info, func(t *testing.T) { 126 gotV, err := SubStrIndex(tc.vs, tc.proc) 127 if err != nil { 128 t.Fatal(err) 129 } 130 require.Equal(t, tc.expect.Col, gotV.Col) 131 }) 132 } 133 } 134 135 func TestSubstrIndedxUint64(t *testing.T) { 136 testCases := []arg{ 137 { 138 info: "substring_index('www.mysql.com', '.' , 0 )", proc: testutil.NewProc(), 139 vs: []*vector.Vector{ 140 testutil.MakeScalarVarchar("www.mysql.com", 1), 141 testutil.MakeScalarVarchar(".", 1), 142 testutil.MakeScalarUint64(0, 1), 143 }, 144 match: true, 145 err: false, 146 expect: testutil.MakeScalarVarchar("", 1), 147 }, 148 149 { 150 info: "substring_index('www.mysql.com', '.' , 1 )", proc: testutil.NewProc(), 151 vs: []*vector.Vector{ 152 testutil.MakeScalarVarchar("www.mysql.com", 1), 153 testutil.MakeScalarVarchar(".", 1), 154 testutil.MakeScalarUint64(1, 1), 155 }, 156 match: true, 157 err: false, 158 expect: testutil.MakeScalarVarchar("www", 1), 159 }, 160 161 { 162 info: "substring_index('www.mysql.com', '.' , 2 )", proc: testutil.NewProc(), 163 vs: []*vector.Vector{ 164 testutil.MakeScalarVarchar("www.mysql.com", 1), 165 testutil.MakeScalarVarchar(".", 1), 166 testutil.MakeScalarUint64(2, 1), 167 }, 168 match: true, 169 err: false, 170 expect: testutil.MakeScalarVarchar("www.mysql", 1), 171 }, 172 173 { 174 info: "substring_index('www.mysql.com', '.' , 3 )", proc: testutil.NewProc(), 175 vs: []*vector.Vector{ 176 testutil.MakeScalarVarchar("www.mysql.com", 1), 177 testutil.MakeScalarVarchar(".", 1), 178 testutil.MakeScalarUint64(3, 1), 179 }, 180 match: true, 181 err: false, 182 expect: testutil.MakeScalarVarchar("www.mysql.com", 1), 183 }, 184 185 { 186 info: "substring_index('www.mysql.com', '.' , 18446744073709551613)", proc: testutil.NewProc(), 187 vs: []*vector.Vector{ 188 testutil.MakeScalarVarchar("www.mysql.com", 1), 189 testutil.MakeScalarVarchar(".", 1), 190 testutil.MakeScalarUint64(18446744073709551613, 1), 191 }, 192 match: true, 193 err: false, 194 expect: testutil.MakeScalarVarchar("www.mysql.com", 1), 195 }, 196 } 197 198 for _, tc := range testCases { 199 t.Run(tc.info, func(t *testing.T) { 200 gotV, err := SubStrIndex(tc.vs, tc.proc) 201 if err != nil { 202 t.Fatal(err) 203 } 204 require.Equal(t, tc.expect.Col, gotV.Col) 205 }) 206 } 207 } 208 209 func TestSubstrIndedxFloat64(t *testing.T) { 210 testCases := []arg{ 211 { 212 info: "substring_index('www.mysql.com', '.' , 0 )", proc: testutil.NewProc(), 213 vs: []*vector.Vector{ 214 testutil.MakeScalarVarchar("www.mysql.com", 1), 215 testutil.MakeScalarVarchar(".", 1), 216 testutil.MakeScalarFloat64(0, 1), 217 }, 218 match: true, 219 err: false, 220 expect: testutil.MakeScalarVarchar("", 1), 221 }, 222 223 { 224 info: "substring_index('www.mysql.com', '.' , 1 )", proc: testutil.NewProc(), 225 vs: []*vector.Vector{ 226 testutil.MakeScalarVarchar("www.mysql.com", 1), 227 testutil.MakeScalarVarchar(".", 1), 228 testutil.MakeScalarFloat64(1.0, 1), 229 }, 230 match: true, 231 err: false, 232 expect: testutil.MakeScalarVarchar("www", 1), 233 }, 234 235 { 236 info: "substring_index('www.mysql.com', '.' , 2 )", proc: testutil.NewProc(), 237 vs: []*vector.Vector{ 238 testutil.MakeScalarVarchar("www.mysql.com", 1), 239 testutil.MakeScalarVarchar(".", 1), 240 testutil.MakeScalarFloat64(2.0, 1), 241 }, 242 match: true, 243 err: false, 244 expect: testutil.MakeScalarVarchar("www.mysql", 1), 245 }, 246 247 { 248 info: "substring_index('www.mysql.com', '.' , 3 )", proc: testutil.NewProc(), 249 vs: []*vector.Vector{ 250 testutil.MakeScalarVarchar("www.mysql.com", 1), 251 testutil.MakeScalarVarchar(".", 1), 252 testutil.MakeScalarFloat64(3.0, 1), 253 }, 254 match: true, 255 err: false, 256 expect: testutil.MakeScalarVarchar("www.mysql.com", 1), 257 }, 258 259 { 260 info: "substring_index('www.mysql.com', '.' , -3 )", proc: testutil.NewProc(), 261 vs: []*vector.Vector{ 262 testutil.MakeScalarVarchar("www.mysql.com", 1), 263 testutil.MakeScalarVarchar(".", 1), 264 testutil.MakeScalarFloat64(-3.0, 1), 265 }, 266 match: true, 267 err: false, 268 expect: testutil.MakeScalarVarchar("www.mysql.com", 1), 269 }, 270 271 { 272 info: "substring_index('www.mysql.com', '.' , -2 )", proc: testutil.NewProc(), 273 vs: []*vector.Vector{ 274 testutil.MakeScalarVarchar("www.mysql.com", 1), 275 testutil.MakeScalarVarchar(".", 1), 276 testutil.MakeScalarFloat64(-2.0, 1), 277 }, 278 match: true, 279 err: false, 280 expect: testutil.MakeScalarVarchar("mysql.com", 1), 281 }, 282 283 { 284 info: "substring_index('www.mysql.com', '.' , -1 )", proc: testutil.NewProc(), 285 vs: []*vector.Vector{ 286 testutil.MakeScalarVarchar("www.mysql.com", 1), 287 testutil.MakeScalarVarchar(".", 1), 288 testutil.MakeScalarFloat64(-1.0, 1), 289 }, 290 match: true, 291 err: false, 292 expect: testutil.MakeScalarVarchar("com", 1), 293 }, 294 295 { 296 info: "substring_index('www.mysql.com', '' , 1 )", proc: testutil.NewProc(), 297 vs: []*vector.Vector{ 298 testutil.MakeScalarVarchar("www.mysql.com", 1), 299 testutil.MakeScalarVarchar("", 1), 300 testutil.MakeScalarFloat64(1.0, 1), 301 }, 302 match: true, 303 err: false, 304 expect: testutil.MakeScalarVarchar("", 1), 305 }, 306 307 { 308 info: "substring_index('www.mysql.com', '' , 1 )", proc: testutil.NewProc(), 309 vs: []*vector.Vector{ 310 testutil.MakeScalarVarchar("www.mysql.com", 1), 311 testutil.MakeScalarVarchar(".", 1), 312 testutil.MakeScalarFloat64(85938593859330403.0, 1), 313 }, 314 match: true, 315 err: false, 316 expect: testutil.MakeScalarVarchar("www.mysql.com", 1), 317 }, 318 } 319 320 for _, tc := range testCases { 321 t.Run(tc.info, func(t *testing.T) { 322 gotV, err := SubStrIndex(tc.vs, tc.proc) 323 if err != nil { 324 t.Fatal(err) 325 } 326 require.Equal(t, tc.expect.Col, gotV.Col) 327 }) 328 } 329 }