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  }