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  }