github.com/matrixorigin/matrixone@v0.7.0/pkg/vectorize/dump/dump_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 dump 16 17 import ( 18 "strconv" 19 "testing" 20 "time" 21 22 "github.com/matrixorigin/matrixone/pkg/container/nulls" 23 "github.com/matrixorigin/matrixone/pkg/container/types" 24 "github.com/stretchr/testify/require" 25 ) 26 27 type Kase struct { 28 tp types.Type 29 xs []string 30 ns *nulls.Nulls 31 } 32 33 var ( 34 cases []*Kase 35 typs = []types.Type{ 36 types.T_bool.ToType(), 37 types.T_int8.ToType(), 38 types.T_int16.ToType(), 39 types.T_int32.ToType(), 40 types.T_int64.ToType(), 41 types.T_uint8.ToType(), 42 types.T_uint16.ToType(), 43 types.T_uint32.ToType(), 44 types.T_uint64.ToType(), 45 types.T_float32.ToType(), 46 types.T_float64.ToType(), 47 types.T_decimal64.ToType(), 48 types.T_decimal128.ToType(), 49 types.T_date.ToType(), 50 types.T_time.ToType(), 51 types.T_datetime.ToType(), 52 types.T_timestamp.ToType(), 53 types.T_varchar.ToType(), 54 types.T_char.ToType(), 55 types.T_json.ToType(), 56 types.T_uuid.ToType(), 57 } 58 vals = [][]string{ 59 {"true", "false"}, 60 {"1", "127", "-128"}, 61 {"1", "32767", "-32768"}, 62 {"1", "2147483647", "-2147483648"}, 63 {"1", "9223372036854775807", "-9223372036854775808"}, 64 {"1", "255"}, 65 {"1", "65535"}, 66 {"1", "4294967295"}, 67 {"1", "18446744073709551615"}, 68 {"1.1", "3.412"}, 69 {"1.1", "3.412"}, 70 {"1.1", "2.2", "3.3", "4.4", "5.5"}, 71 {"1.1", "2.2", "3.3", "4.4", "5.5"}, 72 {"2021-01-01", "2021-01-02", "2021-01-03", "2021-01-04", "2021-01-05"}, 73 {"2021-01-01 00:00:00", "2021-01-02 00:00:00", "2021-01-03 00:00:00", "2021-01-04 00:00:00", "2021-01-05 00:00:00"}, 74 {"2021-01-01 00:00:00", "2021-01-02 00:00:00", "2021-01-03 00:00:00", "2021-01-04 00:00:00", "2021-01-05 00:00:00"}, 75 {"2021-01-01 00:00:00", "2021-01-02 00:00:00", "2021-01-03 00:00:00", "2021-01-04 00:00:00", "2021-01-05 00:00:00"}, 76 {"xsxs", "xsxwda", "dafafef", "fefefqw", "adeqf"}, 77 {"xsxs", "xsxwda", "dafafef", "fefefqw", "adeqf"}, 78 {"{\"a\":1}", "{\"a\":2}", "{\"a\":3}", "{\"a\":4}", "{\"a\":5}"}, 79 {"00000000-0000-0000-0000-000000000000", "00000000-0000-0000-0000-000000000001", "00000000-0000-0000-0000-000000000002", "00000000-0000-0000-0000-000000000003", "00000000-0000-0000-0000-000000000004"}, 80 } 81 ) 82 83 func newTestCase(tp types.Type, xs []string) *Kase { 84 return &Kase{ 85 tp: tp, 86 xs: xs, 87 } 88 } 89 90 func init() { 91 for i, typ := range typs { 92 cases = append(cases, newTestCase(typ, vals[i])) 93 } 94 } 95 96 func TestParser(t *testing.T) { 97 for _, kase := range cases { 98 rs := make([]string, len(kase.xs)+1) 99 var err error 100 switch kase.tp.Oid { 101 case types.T_bool: 102 xs := make([]bool, len(kase.xs)) 103 for i, x := range kase.xs { 104 xs[i] = x == "true" 105 } 106 xs = append(xs, xs[0]) 107 kase.ns = nulls.NewWithSize(len(xs)) 108 kase.ns.Set(uint64(len(xs) - 1)) 109 rs, err = ParseBool(xs, kase.ns, rs) 110 require.Nil(t, err) 111 require.Equal(t, rs[len(rs)-1], "NULL") 112 for i := 0; i < len(xs)-1; i++ { 113 require.Equal(t, strconv.FormatBool(xs[i]), rs[i]) 114 } 115 case types.T_int8: 116 xs := make([]int8, len(kase.xs)) 117 for i, x := range kase.xs { 118 tmp, err := strconv.ParseInt(x, 10, 8) 119 require.Nil(t, err) 120 xs[i] = int8(tmp) 121 } 122 xs = append(xs, xs[0]) 123 kase.ns = nulls.NewWithSize(len(xs)) 124 kase.ns.Set(uint64(len(xs) - 1)) 125 rs, err = ParseSigned[int8](xs, kase.ns, rs) 126 require.Nil(t, err) 127 require.Equal(t, rs[len(rs)-1], "NULL") 128 for i := 0; i < len(xs)-1; i++ { 129 require.Equal(t, strconv.FormatInt(int64(xs[i]), 10), rs[i]) 130 } 131 case types.T_int16: 132 xs := make([]int16, len(kase.xs)) 133 for i, x := range kase.xs { 134 tmp, err := strconv.ParseInt(x, 10, 16) 135 require.Nil(t, err) 136 xs[i] = int16(tmp) 137 } 138 xs = append(xs, xs[0]) 139 kase.ns = nulls.NewWithSize(len(xs)) 140 kase.ns.Set(uint64(len(xs) - 1)) 141 rs, err = ParseSigned[int16](xs, kase.ns, rs) 142 require.Nil(t, err) 143 require.Equal(t, rs[len(rs)-1], "NULL") 144 for i := 0; i < len(xs)-1; i++ { 145 require.Equal(t, strconv.FormatInt(int64(xs[i]), 10), rs[i]) 146 } 147 case types.T_int32: 148 xs := make([]int32, len(kase.xs)) 149 for i, x := range kase.xs { 150 tmp, err := strconv.ParseInt(x, 10, 32) 151 require.Nil(t, err) 152 xs[i] = int32(tmp) 153 } 154 xs = append(xs, xs[0]) 155 kase.ns = nulls.NewWithSize(len(xs)) 156 kase.ns.Set(uint64(len(xs) - 1)) 157 rs, err = ParseSigned[int32](xs, kase.ns, rs) 158 require.Nil(t, err) 159 require.Equal(t, rs[len(rs)-1], "NULL") 160 for i := 0; i < len(xs)-1; i++ { 161 require.Equal(t, strconv.FormatInt(int64(xs[i]), 10), rs[i]) 162 } 163 case types.T_int64: 164 xs := make([]int64, len(kase.xs)) 165 for i, x := range kase.xs { 166 tmp, err := strconv.ParseInt(x, 10, 64) 167 require.Nil(t, err) 168 xs[i] = tmp 169 } 170 xs = append(xs, xs[0]) 171 kase.ns = nulls.NewWithSize(len(xs)) 172 kase.ns.Set(uint64(len(xs) - 1)) 173 rs, err = ParseSigned[int64](xs, kase.ns, rs) 174 require.Nil(t, err) 175 require.Equal(t, rs[len(rs)-1], "NULL") 176 for i := 0; i < len(xs)-1; i++ { 177 require.Equal(t, strconv.FormatInt(xs[i], 10), rs[i]) 178 } 179 case types.T_uint8: 180 xs := make([]uint8, len(kase.xs)) 181 for i, x := range kase.xs { 182 tmp, err := strconv.ParseUint(x, 10, 8) 183 require.Nil(t, err) 184 xs[i] = uint8(tmp) 185 } 186 xs = append(xs, xs[0]) 187 kase.ns = nulls.NewWithSize(len(xs)) 188 kase.ns.Set(uint64(len(xs) - 1)) 189 rs, err = ParseUnsigned[uint8](xs, kase.ns, rs) 190 require.Nil(t, err) 191 require.Equal(t, rs[len(rs)-1], "NULL") 192 for i := 0; i < len(xs)-1; i++ { 193 require.Equal(t, strconv.FormatUint(uint64(xs[i]), 10), rs[i]) 194 } 195 case types.T_uint16: 196 xs := make([]uint16, len(kase.xs)) 197 for i, x := range kase.xs { 198 tmp, err := strconv.ParseUint(x, 10, 16) 199 require.Nil(t, err) 200 xs[i] = uint16(tmp) 201 } 202 xs = append(xs, xs[0]) 203 kase.ns = nulls.NewWithSize(len(xs)) 204 kase.ns.Set(uint64(len(xs) - 1)) 205 rs, err = ParseUnsigned[uint16](xs, kase.ns, rs) 206 require.Nil(t, err) 207 require.Equal(t, rs[len(rs)-1], "NULL") 208 for i := 0; i < len(xs)-1; i++ { 209 require.Equal(t, strconv.FormatUint(uint64(xs[i]), 10), rs[i]) 210 } 211 case types.T_uint32: 212 xs := make([]uint32, len(kase.xs)) 213 for i, x := range kase.xs { 214 tmp, err := strconv.ParseUint(x, 10, 32) 215 require.Nil(t, err) 216 xs[i] = uint32(tmp) 217 } 218 xs = append(xs, xs[0]) 219 kase.ns = nulls.NewWithSize(len(xs)) 220 kase.ns.Set(uint64(len(xs) - 1)) 221 rs, err = ParseUnsigned[uint32](xs, kase.ns, rs) 222 require.Nil(t, err) 223 require.Equal(t, rs[len(rs)-1], "NULL") 224 for i := 0; i < len(xs)-1; i++ { 225 require.Equal(t, strconv.FormatUint(uint64(xs[i]), 10), rs[i]) 226 } 227 case types.T_uint64: 228 xs := make([]uint64, len(kase.xs)) 229 for i, x := range kase.xs { 230 tmp, err := strconv.ParseUint(x, 10, 64) 231 require.Nil(t, err) 232 xs[i] = tmp 233 } 234 xs = append(xs, xs[0]) 235 kase.ns = nulls.NewWithSize(len(xs)) 236 kase.ns.Set(uint64(len(xs) - 1)) 237 rs, err = ParseUnsigned[uint64](xs, kase.ns, rs) 238 require.Nil(t, err) 239 require.Equal(t, rs[len(rs)-1], "NULL") 240 for i := 0; i < len(xs)-1; i++ { 241 require.Equal(t, strconv.FormatUint(uint64(xs[i]), 10), rs[i]) 242 } 243 case types.T_float32: 244 xs := make([]float32, len(kase.xs)) 245 for i, x := range kase.xs { 246 tmp, err := strconv.ParseFloat(x, 32) 247 require.Nil(t, err) 248 xs[i] = float32(tmp) 249 } 250 xs = append(xs, xs[0]) 251 kase.ns = nulls.NewWithSize(len(xs)) 252 kase.ns.Set(uint64(len(xs) - 1)) 253 rs, err = ParseFloats[float32](xs, kase.ns, rs, 32) 254 require.Nil(t, err) 255 require.Equal(t, rs[len(rs)-1], "NULL") 256 for i := 0; i < len(xs)-1; i++ { 257 require.Equal(t, strconv.FormatFloat(float64(xs[i]), 'f', -1, 32), rs[i]) 258 } 259 case types.T_float64: 260 xs := make([]float64, len(kase.xs)) 261 for i, x := range kase.xs { 262 tmp, err := strconv.ParseFloat(x, 64) 263 require.Nil(t, err) 264 xs[i] = tmp 265 } 266 xs = append(xs, xs[0]) 267 kase.ns = nulls.NewWithSize(len(xs)) 268 kase.ns.Set(uint64(len(xs) - 1)) 269 rs, err = ParseFloats[float64](xs, kase.ns, rs, 64) 270 require.Nil(t, err) 271 require.Equal(t, rs[len(rs)-1], "NULL") 272 for i := 0; i < len(xs)-1; i++ { 273 require.Equal(t, strconv.FormatFloat(xs[i], 'f', -1, 64), rs[i]) 274 } 275 case types.T_decimal64: 276 xs := make([]types.Decimal64, len(kase.xs)) 277 for i, x := range kase.xs { 278 xs[i] = types.MustDecimal64FromString(x) 279 } 280 xs = append(xs, xs[0]) 281 kase.ns = nulls.NewWithSize(len(xs)) 282 kase.ns.Set(uint64(len(xs) - 1)) 283 rs, err = ParseQuoted[types.Decimal64](xs, kase.ns, rs, DefaultParser[types.Decimal64]) 284 require.Nil(t, err) 285 require.Equal(t, rs[len(rs)-1], "NULL") 286 for i := 0; i < len(xs)-1; i++ { 287 unquote := rs[i][1 : len(rs[i])-1] 288 require.Equal(t, xs[i].String(), unquote) 289 } 290 case types.T_decimal128: 291 xs := make([]types.Decimal128, len(kase.xs)) 292 for i, x := range kase.xs { 293 xs[i] = types.MustDecimal128FromString(x) 294 } 295 xs = append(xs, xs[0]) 296 kase.ns = nulls.NewWithSize(len(xs)) 297 kase.ns.Set(uint64(len(xs) - 1)) 298 rs, err = ParseQuoted[types.Decimal128](xs, kase.ns, rs, DefaultParser[types.Decimal128]) 299 require.Nil(t, err) 300 require.Equal(t, rs[len(rs)-1], "NULL") 301 for i := 0; i < len(xs)-1; i++ { 302 unquote := rs[i][1 : len(rs[i])-1] 303 require.Equal(t, xs[i].String(), unquote) 304 } 305 case types.T_date: 306 xs := make([]types.Date, len(kase.xs)) 307 for i, x := range kase.xs { 308 tmp, err := types.ParseDateCast(x) 309 require.Nil(t, err) 310 xs[i] = tmp 311 } 312 xs = append(xs, xs[0]) 313 kase.ns = nulls.NewWithSize(len(xs)) 314 kase.ns.Set(uint64(len(xs) - 1)) 315 rs, err = ParseQuoted[types.Date](xs, kase.ns, rs, DefaultParser[types.Date]) 316 require.Nil(t, err) 317 require.Equal(t, rs[len(rs)-1], "NULL") 318 for i := 0; i < len(xs)-1; i++ { 319 unquote := rs[i][1 : len(rs[i])-1] 320 require.Equal(t, xs[i].String(), unquote) 321 } 322 case types.T_time: 323 xs := make([]types.Time, len(kase.xs)) 324 for i, x := range kase.xs { 325 tmp, err := types.ParseTime(x, kase.tp.Precision) 326 require.Nil(t, err) 327 xs[i] = tmp 328 } 329 xs = append(xs, xs[0]) 330 kase.ns = nulls.NewWithSize(len(xs)) 331 kase.ns.Set(uint64(len(xs) - 1)) 332 rs, err = ParseQuoted[types.Time](xs, kase.ns, rs, DefaultParser[types.Time]) 333 require.Nil(t, err) 334 require.Equal(t, rs[len(rs)-1], "NULL") 335 for i := 0; i < len(xs)-1; i++ { 336 unquote := rs[i][1 : len(rs[i])-1] 337 require.Equal(t, xs[i].String(), unquote) 338 } 339 case types.T_datetime: 340 xs := make([]types.Datetime, len(kase.xs)) 341 for i, x := range kase.xs { 342 tmp, err := types.ParseDatetime(x, kase.tp.Precision) 343 require.Nil(t, err) 344 xs[i] = tmp 345 } 346 xs = append(xs, xs[0]) 347 kase.ns = nulls.NewWithSize(len(xs)) 348 kase.ns.Set(uint64(len(xs) - 1)) 349 rs, err = ParseQuoted[types.Datetime](xs, kase.ns, rs, DefaultParser[types.Datetime]) 350 require.Nil(t, err) 351 require.Equal(t, rs[len(rs)-1], "NULL") 352 for i := 0; i < len(xs)-1; i++ { 353 unquote := rs[i][1 : len(rs[i])-1] 354 require.Equal(t, xs[i].String(), unquote) 355 } 356 case types.T_timestamp: 357 xs := make([]types.Timestamp, len(kase.xs)) 358 for i, x := range kase.xs { 359 tmp, err := types.ParseTimestamp(time.Local, x, kase.tp.Precision) 360 require.Nil(t, err) 361 xs[i] = tmp 362 } 363 xs = append(xs, xs[0]) 364 kase.ns = nulls.NewWithSize(len(xs)) 365 kase.ns.Set(uint64(len(xs) - 1)) 366 rs, err = ParseTimeStamp(xs, kase.ns, rs, time.Local, kase.tp.Precision) 367 require.Nil(t, err) 368 require.Equal(t, rs[len(rs)-1], "NULL") 369 for i := 0; i < len(xs)-1; i++ { 370 unquote := rs[i][1 : len(rs[i])-1] 371 require.Equal(t, xs[i].String2(time.Local, kase.tp.Precision), unquote) 372 } 373 374 case types.T_varchar, types.T_char, types.T_blob: 375 xs := make([]string, len(kase.xs)) 376 copy(xs, kase.xs) 377 xs = append(xs, xs[0]) 378 kase.ns = nulls.NewWithSize(len(xs)) 379 kase.ns.Set(uint64(len(xs) - 1)) 380 rs, err = ParseQuoted[string](xs, kase.ns, rs, DefaultParser[string]) 381 require.Nil(t, err) 382 require.Equal(t, rs[len(rs)-1], "NULL") 383 for i := 0; i < len(xs)-1; i++ { 384 unquote := rs[i][1 : len(rs[i])-1] 385 require.Equal(t, xs[i], unquote) 386 } 387 case types.T_json: 388 xs := make([][]byte, len(kase.xs)) 389 for i, x := range kase.xs { 390 tmp, err := types.ParseStringToByteJson(x) 391 require.Nil(t, err) 392 xs[i], err = tmp.Marshal() 393 require.Nil(t, err) 394 } 395 xs = append(xs, xs[0]) 396 kase.ns = nulls.NewWithSize(len(xs)) 397 kase.ns.Set(uint64(len(xs) - 1)) 398 rs, err = ParseQuoted[[]byte](xs, kase.ns, rs, JsonParser) 399 require.Nil(t, err) 400 require.Equal(t, rs[len(rs)-1], "NULL") 401 for i := 0; i < len(xs)-1; i++ { 402 unquote := rs[i][1 : len(rs[i])-1] 403 require.JSONEq(t, kase.xs[i], unquote) 404 } 405 case types.T_uuid: 406 xs := make([]types.Uuid, len(kase.xs)) 407 for i, x := range kase.xs { 408 tmp, err := types.ParseUuid(x) 409 require.Nil(t, err) 410 xs[i] = tmp 411 } 412 xs = append(xs, xs[0]) 413 kase.ns = nulls.NewWithSize(len(xs)) 414 kase.ns.Set(uint64(len(xs) - 1)) 415 rs, err = ParseUuid(xs, kase.ns, rs) 416 require.Nil(t, err) 417 require.Equal(t, rs[len(rs)-1], "NULL") 418 for i := 0; i < len(xs)-1; i++ { 419 unquote := rs[i][1 : len(rs[i])-1] 420 require.Equal(t, xs[i].ToString(), unquote) 421 } 422 423 default: 424 require.Fail(t, "unsupported type") 425 } 426 } 427 }