github.com/hasnat/dolt/go@v0.0.0-20210628190320-9eb5d843fbb7/libraries/doltcore/sqle/mergeable_indexes_test.go (about)

     1  // Copyright 2020 Dolthub, Inc.
     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 sqle
    16  
    17  import (
    18  	"context"
    19  	"fmt"
    20  	"testing"
    21  
    22  	"github.com/dolthub/go-mysql-server/sql"
    23  	"github.com/stretchr/testify/assert"
    24  	"github.com/stretchr/testify/require"
    25  
    26  	"github.com/dolthub/dolt/go/libraries/doltcore/sqle/lookup"
    27  )
    28  
    29  // This tests mergeable indexes by using the SQL engine and intercepting specific calls. This way, we can verify that
    30  // the engine is intersecting and combining the proper number of lookups, and we can also examine the ranges before
    31  // they're converted into a format that Noms understands to verify that they were handled correctly. Lastly, we ensure
    32  // that the final output is as expected.
    33  func TestMergeableIndexes(t *testing.T) {
    34  	engine, denv, db, indexTuples, initialRoot := setupMergeableIndexes(t, "test", `INSERT INTO test VALUES
    35  		(-3, NULL, NULL),
    36  		(-2, NULL, NULL),
    37  		(-1, NULL, NULL),
    38  		(0, 10, 20),
    39  		(1, 11, 21),
    40  		(2, 12, 22),
    41  		(3, 13, 23),
    42  		(4, 14, 24),
    43  		(5, 15, 25),
    44  		(6, 16, 26),
    45  		(7, 17, 27),
    46  		(8, 18, 28),
    47  		(9, 19, 29);`)
    48  	idxv1, idxv2v1, idxv2v1Gen := indexTuples[0], indexTuples[1], indexTuples[2]
    49  
    50  	tests := []struct {
    51  		whereStmt   string
    52  		finalRanges []lookup.Range
    53  		pks         []int64
    54  	}{
    55  		{
    56  			"v1 = 11",
    57  			[]lookup.Range{
    58  				lookup.MustClosedRange(idxv1.tuple(11), idxv1.tuple(11)),
    59  			},
    60  			[]int64{1},
    61  		},
    62  		{
    63  			"v1 = 11 OR v1 = 15",
    64  			[]lookup.Range{
    65  				lookup.MustClosedRange(idxv1.tuple(11), idxv1.tuple(11)),
    66  				lookup.MustClosedRange(idxv1.tuple(15), idxv1.tuple(15)),
    67  			},
    68  			[]int64{1, 5},
    69  		},
    70  		{
    71  			"v1 = 11 AND v1 = 15",
    72  			[]lookup.Range{
    73  				lookup.EmptyRange(),
    74  			},
    75  			[]int64{},
    76  		},
    77  		{
    78  			"v1 = 11 OR v1 = 15 OR v1 = 19",
    79  			[]lookup.Range{
    80  				lookup.MustClosedRange(idxv1.tuple(11), idxv1.tuple(11)),
    81  				lookup.MustClosedRange(idxv1.tuple(15), idxv1.tuple(15)),
    82  				lookup.MustClosedRange(idxv1.tuple(19), idxv1.tuple(19)),
    83  			},
    84  			[]int64{1, 5, 9},
    85  		},
    86  		{
    87  			"v1 = 11 OR v1 = 15 AND v1 = 19",
    88  			[]lookup.Range{
    89  				lookup.MustClosedRange(idxv1.tuple(11), idxv1.tuple(11)),
    90  			},
    91  			[]int64{1},
    92  		},
    93  		{
    94  			"v1 = 11 AND v1 = 15 AND v1 = 19",
    95  			[]lookup.Range{
    96  				lookup.EmptyRange(),
    97  			},
    98  			[]int64{},
    99  		},
   100  		{
   101  			"v1 = 11 OR v1 != 11",
   102  			[]lookup.Range{
   103  				lookup.AllRange(),
   104  			},
   105  			[]int64{0, 1, 2, 3, 4, 5, 6, 7, 8, 9},
   106  		},
   107  		{
   108  			"v1 = 11 OR v1 != 15",
   109  			[]lookup.Range{
   110  				lookup.LessThanRange(idxv1.tuple(15)),
   111  				lookup.MustGreaterThanRange(idxv1.tuple(15)),
   112  			},
   113  			[]int64{0, 1, 2, 3, 4, 6, 7, 8, 9},
   114  		},
   115  		{
   116  			"v1 = 11 AND v1 != 15",
   117  			[]lookup.Range{
   118  				lookup.MustClosedRange(idxv1.tuple(11), idxv1.tuple(11)),
   119  			},
   120  			[]int64{1},
   121  		},
   122  		{
   123  			"v1 = 11 OR v1 = 15 OR v1 != 19",
   124  			[]lookup.Range{
   125  				lookup.LessThanRange(idxv1.tuple(19)),
   126  				lookup.MustGreaterThanRange(idxv1.tuple(19)),
   127  			},
   128  			[]int64{0, 1, 2, 3, 4, 5, 6, 7, 8},
   129  		},
   130  		{
   131  			"v1 = 11 OR v1 = 15 AND v1 != 19",
   132  			[]lookup.Range{
   133  				lookup.MustClosedRange(idxv1.tuple(11), idxv1.tuple(11)),
   134  				lookup.MustClosedRange(idxv1.tuple(15), idxv1.tuple(15)),
   135  			},
   136  			[]int64{1, 5},
   137  		},
   138  		{
   139  			"v1 = 11 AND v1 = 15 OR v1 != 19",
   140  			[]lookup.Range{
   141  				lookup.LessThanRange(idxv1.tuple(19)),
   142  				lookup.MustGreaterThanRange(idxv1.tuple(19)),
   143  			},
   144  			[]int64{0, 1, 2, 3, 4, 5, 6, 7, 8},
   145  		},
   146  		{
   147  			"v1 = 11 AND v1 = 15 AND v1 != 19",
   148  			[]lookup.Range{
   149  				lookup.EmptyRange(),
   150  			},
   151  			[]int64{},
   152  		},
   153  		{
   154  			"v1 = 11 OR v1 > 15",
   155  			[]lookup.Range{
   156  				lookup.MustClosedRange(idxv1.tuple(11), idxv1.tuple(11)),
   157  				lookup.MustGreaterThanRange(idxv1.tuple(15)),
   158  			},
   159  			[]int64{1, 6, 7, 8, 9},
   160  		},
   161  		{
   162  			"v1 = 11 AND v1 > 15",
   163  			[]lookup.Range{
   164  				lookup.EmptyRange(),
   165  			},
   166  			[]int64{},
   167  		},
   168  		{
   169  			"v1 = 11 OR v1 = 15 OR v1 > 19",
   170  			[]lookup.Range{
   171  				lookup.MustClosedRange(idxv1.tuple(11), idxv1.tuple(11)),
   172  				lookup.MustClosedRange(idxv1.tuple(15), idxv1.tuple(15)),
   173  				lookup.MustGreaterThanRange(idxv1.tuple(19)),
   174  			},
   175  			[]int64{1, 5},
   176  		},
   177  		{
   178  			"v1 = 11 OR v1 = 15 AND v1 > 19",
   179  			[]lookup.Range{
   180  				lookup.MustClosedRange(idxv1.tuple(11), idxv1.tuple(11)),
   181  			},
   182  			[]int64{1},
   183  		},
   184  		{
   185  			"v1 = 11 AND v1 = 15 OR v1 > 19",
   186  			[]lookup.Range{
   187  				lookup.MustGreaterThanRange(idxv1.tuple(19)),
   188  			},
   189  			[]int64{},
   190  		},
   191  		{
   192  			"v1 = 11 AND v1 = 15 AND v1 > 19",
   193  			[]lookup.Range{
   194  				lookup.EmptyRange(),
   195  			},
   196  			[]int64{},
   197  		},
   198  		{
   199  			"v1 = 11 OR v1 >= 15",
   200  			[]lookup.Range{
   201  				lookup.MustClosedRange(idxv1.tuple(11), idxv1.tuple(11)),
   202  				lookup.GreaterOrEqualRange(idxv1.tuple(15)),
   203  			},
   204  			[]int64{1, 5, 6, 7, 8, 9},
   205  		},
   206  		{
   207  			"v1 = 11 AND v1 >= 15",
   208  			[]lookup.Range{
   209  				lookup.EmptyRange(),
   210  			},
   211  			[]int64{},
   212  		},
   213  		{
   214  			"v1 = 11 OR v1 = 15 OR v1 >= 19",
   215  			[]lookup.Range{
   216  				lookup.MustClosedRange(idxv1.tuple(11), idxv1.tuple(11)),
   217  				lookup.MustClosedRange(idxv1.tuple(15), idxv1.tuple(15)),
   218  				lookup.GreaterOrEqualRange(idxv1.tuple(19)),
   219  			},
   220  			[]int64{1, 5, 9},
   221  		},
   222  		{
   223  			"v1 = 11 OR v1 = 15 AND v1 >= 19",
   224  			[]lookup.Range{
   225  				lookup.MustClosedRange(idxv1.tuple(11), idxv1.tuple(11)),
   226  			},
   227  			[]int64{1},
   228  		},
   229  		{
   230  			"v1 = 11 AND v1 = 15 OR v1 >= 19",
   231  			[]lookup.Range{
   232  				lookup.GreaterOrEqualRange(idxv1.tuple(19)),
   233  			},
   234  			[]int64{9},
   235  		},
   236  		{
   237  			"v1 = 11 AND v1 = 15 AND v1 >= 19",
   238  			[]lookup.Range{
   239  				lookup.EmptyRange(),
   240  			},
   241  			[]int64{},
   242  		},
   243  		{
   244  			"v1 = 11 OR v1 < 15",
   245  			[]lookup.Range{
   246  				lookup.LessThanRange(idxv1.tuple(15)),
   247  			},
   248  			[]int64{0, 1, 2, 3, 4},
   249  		},
   250  		{
   251  			"v1 = 11 AND v1 < 15",
   252  			[]lookup.Range{
   253  				lookup.MustClosedRange(idxv1.tuple(11), idxv1.tuple(11)),
   254  			},
   255  			[]int64{1},
   256  		},
   257  		{
   258  			"v1 = 11 OR v1 = 15 OR v1 < 19",
   259  			[]lookup.Range{
   260  				lookup.LessThanRange(idxv1.tuple(19)),
   261  			},
   262  			[]int64{0, 1, 2, 3, 4, 5, 6, 7, 8},
   263  		},
   264  		{
   265  			"v1 = 11 OR v1 = 15 AND v1 < 19",
   266  			[]lookup.Range{
   267  				lookup.MustClosedRange(idxv1.tuple(11), idxv1.tuple(11)),
   268  				lookup.MustClosedRange(idxv1.tuple(15), idxv1.tuple(15)),
   269  			},
   270  			[]int64{1, 5},
   271  		},
   272  		{
   273  			"v1 = 11 AND v1 = 15 OR v1 < 19",
   274  			[]lookup.Range{
   275  				lookup.LessThanRange(idxv1.tuple(19)),
   276  			},
   277  			[]int64{0, 1, 2, 3, 4, 5, 6, 7, 8},
   278  		},
   279  		{
   280  			"v1 = 11 AND v1 = 15 AND v1 < 19",
   281  			[]lookup.Range{
   282  				lookup.EmptyRange(),
   283  			},
   284  			[]int64{},
   285  		},
   286  		{
   287  			"v1 = 11 OR v1 <= 15",
   288  			[]lookup.Range{
   289  				lookup.MustLessOrEqualRange(idxv1.tuple(15)),
   290  			},
   291  			[]int64{0, 1, 2, 3, 4, 5},
   292  		},
   293  		{
   294  			"v1 = 11 AND v1 <= 15",
   295  			[]lookup.Range{
   296  				lookup.MustClosedRange(idxv1.tuple(11), idxv1.tuple(11)),
   297  			},
   298  			[]int64{1},
   299  		},
   300  		{
   301  			"v1 = 11 OR v1 = 15 OR v1 <= 19",
   302  			[]lookup.Range{
   303  				lookup.MustLessOrEqualRange(idxv1.tuple(19)),
   304  			},
   305  			[]int64{0, 1, 2, 3, 4, 5, 6, 7, 8, 9},
   306  		},
   307  		{
   308  			"v1 = 11 OR v1 = 15 AND v1 <= 19",
   309  			[]lookup.Range{
   310  				lookup.MustClosedRange(idxv1.tuple(11), idxv1.tuple(11)),
   311  				lookup.MustClosedRange(idxv1.tuple(15), idxv1.tuple(15)),
   312  			},
   313  			[]int64{1, 5},
   314  		},
   315  		{
   316  			"v1 = 11 AND v1 = 15 OR v1 <= 19",
   317  			[]lookup.Range{
   318  				lookup.MustLessOrEqualRange(idxv1.tuple(19)),
   319  			},
   320  			[]int64{0, 1, 2, 3, 4, 5, 6, 7, 8, 9},
   321  		},
   322  		{
   323  			"v1 = 11 AND v1 = 15 AND v1 <= 19",
   324  			[]lookup.Range{
   325  				lookup.EmptyRange(),
   326  			},
   327  			[]int64{},
   328  		},
   329  		{
   330  			"v1 != 11",
   331  			[]lookup.Range{
   332  				lookup.LessThanRange(idxv1.tuple(11)),
   333  				lookup.MustGreaterThanRange(idxv1.tuple(11)),
   334  			},
   335  			[]int64{0, 2, 3, 4, 5, 6, 7, 8, 9},
   336  		},
   337  		{
   338  			"v1 <> 11",
   339  			[]lookup.Range{
   340  				lookup.LessThanRange(idxv1.tuple(11)),
   341  				lookup.MustGreaterThanRange(idxv1.tuple(11)),
   342  			},
   343  			[]int64{0, 2, 3, 4, 5, 6, 7, 8, 9},
   344  		},
   345  		{
   346  			"v1 != 11 OR v1 != 15",
   347  			[]lookup.Range{
   348  				lookup.AllRange(),
   349  			},
   350  			[]int64{0, 1, 2, 3, 4, 5, 6, 7, 8, 9},
   351  		},
   352  		{
   353  			"v1 <> 11 OR v1 <> 15",
   354  			[]lookup.Range{
   355  				lookup.AllRange(),
   356  			},
   357  			[]int64{0, 1, 2, 3, 4, 5, 6, 7, 8, 9},
   358  		},
   359  		{
   360  			"v1 != 11 AND v1 != 15",
   361  			[]lookup.Range{
   362  				lookup.LessThanRange(idxv1.tuple(11)),
   363  				lookup.MustOpenRange(idxv1.tuple(11), idxv1.tuple(15)),
   364  				lookup.MustGreaterThanRange(idxv1.tuple(15)),
   365  			},
   366  			[]int64{0, 2, 3, 4, 6, 7, 8, 9},
   367  		},
   368  		{
   369  			"v1 <> 11 AND v1 <> 15",
   370  			[]lookup.Range{
   371  				lookup.LessThanRange(idxv1.tuple(11)),
   372  				lookup.MustOpenRange(idxv1.tuple(11), idxv1.tuple(15)),
   373  				lookup.MustGreaterThanRange(idxv1.tuple(15)),
   374  			},
   375  			[]int64{0, 2, 3, 4, 6, 7, 8, 9},
   376  		},
   377  		{
   378  			"v1 != 11 OR v1 != 15 OR v1 != 19",
   379  			[]lookup.Range{
   380  				lookup.AllRange(),
   381  			},
   382  			[]int64{0, 1, 2, 3, 4, 5, 6, 7, 8, 9},
   383  		},
   384  		{
   385  			"v1 <> 11 OR v1 <> 15 OR v1 <> 19",
   386  			[]lookup.Range{
   387  				lookup.AllRange(),
   388  			},
   389  			[]int64{0, 1, 2, 3, 4, 5, 6, 7, 8, 9},
   390  		},
   391  		{
   392  			"v1 != 11 OR v1 != 15 AND v1 != 19",
   393  			[]lookup.Range{
   394  				lookup.AllRange(),
   395  			},
   396  			[]int64{0, 1, 2, 3, 4, 5, 6, 7, 8, 9},
   397  		},
   398  		{
   399  			"v1 <> 11 OR v1 <> 15 AND v1 <> 19",
   400  			[]lookup.Range{
   401  				lookup.AllRange(),
   402  			},
   403  			[]int64{0, 1, 2, 3, 4, 5, 6, 7, 8, 9},
   404  		},
   405  		{
   406  			"v1 != 11 AND v1 != 15 AND v1 != 19",
   407  			[]lookup.Range{
   408  				lookup.LessThanRange(idxv1.tuple(11)),
   409  				lookup.MustOpenRange(idxv1.tuple(11), idxv1.tuple(15)),
   410  				lookup.MustOpenRange(idxv1.tuple(15), idxv1.tuple(19)),
   411  				lookup.MustGreaterThanRange(idxv1.tuple(19)),
   412  			},
   413  			[]int64{0, 2, 3, 4, 6, 7, 8},
   414  		},
   415  		{
   416  			"v1 <> 11 AND v1 <> 15 AND v1 <> 19",
   417  			[]lookup.Range{
   418  				lookup.LessThanRange(idxv1.tuple(11)),
   419  				lookup.MustOpenRange(idxv1.tuple(11), idxv1.tuple(15)),
   420  				lookup.MustOpenRange(idxv1.tuple(15), idxv1.tuple(19)),
   421  				lookup.MustGreaterThanRange(idxv1.tuple(19)),
   422  			},
   423  			[]int64{0, 2, 3, 4, 6, 7, 8},
   424  		},
   425  		{
   426  			"v1 != 11 OR v1 > 15",
   427  			[]lookup.Range{
   428  				lookup.LessThanRange(idxv1.tuple(11)),
   429  				lookup.MustGreaterThanRange(idxv1.tuple(11)),
   430  			},
   431  			[]int64{0, 2, 3, 4, 5, 6, 7, 8, 9},
   432  		},
   433  		{
   434  			"v1 != 11 AND v1 > 15",
   435  			[]lookup.Range{
   436  				lookup.MustGreaterThanRange(idxv1.tuple(15)),
   437  			},
   438  			[]int64{6, 7, 8, 9},
   439  		},
   440  		{
   441  			"v1 != 11 OR v1 != 15 OR v1 > 19",
   442  			[]lookup.Range{
   443  				lookup.AllRange(),
   444  			},
   445  			[]int64{0, 1, 2, 3, 4, 5, 6, 7, 8, 9},
   446  		},
   447  		{
   448  			"v1 != 11 OR v1 != 15 AND v1 > 19",
   449  			[]lookup.Range{
   450  				lookup.LessThanRange(idxv1.tuple(11)),
   451  				lookup.MustGreaterThanRange(idxv1.tuple(11)),
   452  			},
   453  			[]int64{0, 2, 3, 4, 5, 6, 7, 8, 9},
   454  		},
   455  		{
   456  			"v1 != 11 AND v1 != 15 OR v1 > 19",
   457  			[]lookup.Range{
   458  				lookup.LessThanRange(idxv1.tuple(11)),
   459  				lookup.MustOpenRange(idxv1.tuple(11), idxv1.tuple(15)),
   460  				lookup.MustGreaterThanRange(idxv1.tuple(15)),
   461  			},
   462  			[]int64{0, 2, 3, 4, 6, 7, 8, 9},
   463  		},
   464  		{
   465  			"v1 != 11 AND v1 != 15 AND v1 > 19",
   466  			[]lookup.Range{
   467  				lookup.MustGreaterThanRange(idxv1.tuple(19)),
   468  			},
   469  			[]int64{},
   470  		},
   471  		{
   472  			"v1 != 11 OR v1 >= 15",
   473  			[]lookup.Range{
   474  				lookup.LessThanRange(idxv1.tuple(11)),
   475  				lookup.MustGreaterThanRange(idxv1.tuple(11)),
   476  			},
   477  			[]int64{0, 2, 3, 4, 5, 6, 7, 8, 9},
   478  		},
   479  		{
   480  			"v1 != 11 AND v1 >= 15",
   481  			[]lookup.Range{
   482  				lookup.GreaterOrEqualRange(idxv1.tuple(15)),
   483  			},
   484  			[]int64{5, 6, 7, 8, 9},
   485  		},
   486  		{
   487  			"v1 != 11 OR v1 != 15 OR v1 >= 19",
   488  			[]lookup.Range{
   489  				lookup.AllRange(),
   490  			},
   491  			[]int64{0, 1, 2, 3, 4, 5, 6, 7, 8, 9},
   492  		},
   493  		{
   494  			"v1 != 11 OR v1 != 15 AND v1 >= 19",
   495  			[]lookup.Range{
   496  				lookup.LessThanRange(idxv1.tuple(11)),
   497  				lookup.MustGreaterThanRange(idxv1.tuple(11)),
   498  			},
   499  			[]int64{0, 2, 3, 4, 5, 6, 7, 8, 9},
   500  		},
   501  		{
   502  			"v1 != 11 AND v1 != 15 OR v1 >= 19",
   503  			[]lookup.Range{
   504  				lookup.LessThanRange(idxv1.tuple(11)),
   505  				lookup.MustOpenRange(idxv1.tuple(11), idxv1.tuple(15)),
   506  				lookup.MustGreaterThanRange(idxv1.tuple(15)),
   507  			},
   508  			[]int64{0, 2, 3, 4, 6, 7, 8, 9},
   509  		},
   510  		{
   511  			"v1 != 11 AND v1 != 15 AND v1 >= 19",
   512  			[]lookup.Range{
   513  				lookup.GreaterOrEqualRange(idxv1.tuple(19)),
   514  			},
   515  			[]int64{9},
   516  		},
   517  		{
   518  			"v1 != 11 OR v1 < 15",
   519  			[]lookup.Range{
   520  				lookup.AllRange(),
   521  			},
   522  			[]int64{0, 1, 2, 3, 4, 5, 6, 7, 8, 9},
   523  		},
   524  		{
   525  			"v1 != 11 AND v1 < 15",
   526  			[]lookup.Range{
   527  				lookup.LessThanRange(idxv1.tuple(11)),
   528  				lookup.MustOpenRange(idxv1.tuple(11), idxv1.tuple(15)),
   529  			},
   530  			[]int64{0, 2, 3, 4},
   531  		},
   532  		{
   533  			"v1 != 11 OR v1 != 15 OR v1 < 19",
   534  			[]lookup.Range{
   535  				lookup.AllRange(),
   536  			},
   537  			[]int64{0, 1, 2, 3, 4, 5, 6, 7, 8, 9},
   538  		},
   539  		{
   540  			"v1 != 11 OR v1 != 15 AND v1 < 19",
   541  			[]lookup.Range{
   542  				lookup.AllRange(),
   543  			},
   544  			[]int64{0, 1, 2, 3, 4, 5, 6, 7, 8, 9},
   545  		},
   546  		{
   547  			"v1 != 11 AND v1 != 15 OR v1 < 19",
   548  			[]lookup.Range{
   549  				lookup.AllRange(),
   550  			},
   551  			[]int64{0, 1, 2, 3, 4, 5, 6, 7, 8, 9},
   552  		},
   553  		{
   554  			"v1 != 11 AND v1 != 15 AND v1 < 19",
   555  			[]lookup.Range{
   556  				lookup.LessThanRange(idxv1.tuple(11)),
   557  				lookup.MustOpenRange(idxv1.tuple(11), idxv1.tuple(15)),
   558  				lookup.MustOpenRange(idxv1.tuple(15), idxv1.tuple(19)),
   559  			},
   560  			[]int64{0, 2, 3, 4, 6, 7, 8},
   561  		},
   562  		{
   563  			"v1 != 11 OR v1 <= 15",
   564  			[]lookup.Range{
   565  				lookup.AllRange(),
   566  			},
   567  			[]int64{0, 1, 2, 3, 4, 5, 6, 7, 8, 9},
   568  		},
   569  		{
   570  			"v1 != 11 AND v1 <= 15",
   571  			[]lookup.Range{
   572  				lookup.LessThanRange(idxv1.tuple(11)),
   573  				lookup.MustCustomRange(idxv1.tuple(11), idxv1.tuple(15),
   574  					lookup.Open, lookup.Closed),
   575  			},
   576  			[]int64{0, 2, 3, 4, 5},
   577  		},
   578  		{
   579  			"v1 != 11 OR v1 != 15 OR v1 <= 19",
   580  			[]lookup.Range{
   581  				lookup.AllRange(),
   582  			},
   583  			[]int64{0, 1, 2, 3, 4, 5, 6, 7, 8, 9},
   584  		},
   585  		{
   586  			"v1 != 11 OR v1 != 15 AND v1 <= 19",
   587  			[]lookup.Range{
   588  				lookup.AllRange(),
   589  			},
   590  			[]int64{0, 1, 2, 3, 4, 5, 6, 7, 8, 9},
   591  		},
   592  		{
   593  			"v1 != 11 AND v1 != 15 OR v1 <= 19",
   594  			[]lookup.Range{
   595  				lookup.AllRange(),
   596  			},
   597  			[]int64{0, 1, 2, 3, 4, 5, 6, 7, 8, 9},
   598  		},
   599  		{
   600  			"v1 != 11 AND v1 != 15 AND v1 <= 19",
   601  			[]lookup.Range{
   602  				lookup.LessThanRange(idxv1.tuple(11)),
   603  				lookup.MustOpenRange(idxv1.tuple(11), idxv1.tuple(15)),
   604  				lookup.MustCustomRange(idxv1.tuple(15), idxv1.tuple(19),
   605  					lookup.Open, lookup.Closed),
   606  			},
   607  			[]int64{0, 2, 3, 4, 6, 7, 8, 9},
   608  		},
   609  		{
   610  			"v1 > 11",
   611  			[]lookup.Range{
   612  				lookup.MustGreaterThanRange(idxv1.tuple(11)),
   613  			},
   614  			[]int64{2, 3, 4, 5, 6, 7, 8, 9},
   615  		},
   616  		{
   617  			"v1 > 11 OR v1 > 15",
   618  			[]lookup.Range{
   619  				lookup.MustGreaterThanRange(idxv1.tuple(11)),
   620  			},
   621  			[]int64{2, 3, 4, 5, 6, 7, 8, 9},
   622  		},
   623  		{
   624  			"v1 > 11 AND v1 > 15",
   625  			[]lookup.Range{
   626  				lookup.MustGreaterThanRange(idxv1.tuple(15)),
   627  			},
   628  			[]int64{6, 7, 8, 9},
   629  		},
   630  		{
   631  			"v1 > 11 OR v1 > 15 OR v1 > 19",
   632  			[]lookup.Range{
   633  				lookup.MustGreaterThanRange(idxv1.tuple(11)),
   634  			},
   635  			[]int64{2, 3, 4, 5, 6, 7, 8, 9},
   636  		},
   637  		{
   638  			"v1 > 11 OR v1 > 15 AND v1 > 19",
   639  			[]lookup.Range{
   640  				lookup.MustGreaterThanRange(idxv1.tuple(11)),
   641  			},
   642  			[]int64{2, 3, 4, 5, 6, 7, 8, 9},
   643  		},
   644  		{
   645  			"v1 > 11 AND v1 > 15 AND v1 > 19",
   646  			[]lookup.Range{
   647  				lookup.MustGreaterThanRange(idxv1.tuple(19)),
   648  			},
   649  			[]int64{},
   650  		},
   651  		{
   652  			"v1 > 11 OR v1 >= 15",
   653  			[]lookup.Range{
   654  				lookup.MustGreaterThanRange(idxv1.tuple(11)),
   655  			},
   656  			[]int64{2, 3, 4, 5, 6, 7, 8, 9},
   657  		},
   658  		{
   659  			"v1 > 11 AND v1 >= 15",
   660  			[]lookup.Range{
   661  				lookup.GreaterOrEqualRange(idxv1.tuple(15)),
   662  			},
   663  			[]int64{5, 6, 7, 8, 9},
   664  		},
   665  		{
   666  			"v1 > 11 OR v1 > 15 OR v1 >= 19",
   667  			[]lookup.Range{
   668  				lookup.MustGreaterThanRange(idxv1.tuple(11)),
   669  			},
   670  			[]int64{2, 3, 4, 5, 6, 7, 8, 9},
   671  		},
   672  		{
   673  			"v1 > 11 OR v1 > 15 AND v1 >= 19",
   674  			[]lookup.Range{
   675  				lookup.MustGreaterThanRange(idxv1.tuple(11)),
   676  			},
   677  			[]int64{2, 3, 4, 5, 6, 7, 8, 9},
   678  		},
   679  		{
   680  			"v1 > 11 AND v1 > 15 OR v1 >= 19",
   681  			[]lookup.Range{
   682  				lookup.MustGreaterThanRange(idxv1.tuple(15)),
   683  			},
   684  			[]int64{6, 7, 8, 9},
   685  		},
   686  		{
   687  			"v1 > 11 AND v1 > 15 AND v1 >= 19",
   688  			[]lookup.Range{
   689  				lookup.GreaterOrEqualRange(idxv1.tuple(19)),
   690  			},
   691  			[]int64{9},
   692  		},
   693  		{
   694  			"v1 > 11 OR v1 < 15",
   695  			[]lookup.Range{
   696  				lookup.AllRange(),
   697  			},
   698  			[]int64{0, 1, 2, 3, 4, 5, 6, 7, 8, 9},
   699  		},
   700  		{
   701  			"v1 > 11 AND v1 < 15",
   702  			[]lookup.Range{
   703  				lookup.MustOpenRange(idxv1.tuple(11), idxv1.tuple(15)),
   704  			},
   705  			[]int64{2, 3, 4},
   706  		},
   707  		{
   708  			"v1 > 11 OR v1 > 15 OR v1 < 19",
   709  			[]lookup.Range{
   710  				lookup.AllRange(),
   711  			},
   712  			[]int64{0, 1, 2, 3, 4, 5, 6, 7, 8, 9},
   713  		},
   714  		{
   715  			"v1 > 11 OR v1 > 15 AND v1 < 19",
   716  			[]lookup.Range{
   717  				lookup.MustGreaterThanRange(idxv1.tuple(11)),
   718  			},
   719  			[]int64{2, 3, 4, 5, 6, 7, 8, 9},
   720  		},
   721  		{
   722  			"v1 > 11 AND v1 > 15 OR v1 < 19",
   723  			[]lookup.Range{
   724  				lookup.AllRange(),
   725  			},
   726  			[]int64{0, 1, 2, 3, 4, 5, 6, 7, 8, 9},
   727  		},
   728  		{
   729  			"v1 > 11 AND v1 > 15 AND v1 < 19",
   730  			[]lookup.Range{
   731  				lookup.MustOpenRange(idxv1.tuple(15), idxv1.tuple(19)),
   732  			},
   733  			[]int64{6, 7, 8},
   734  		},
   735  		{
   736  			"v1 > 11 OR v1 <= 15",
   737  			[]lookup.Range{
   738  				lookup.AllRange(),
   739  			},
   740  			[]int64{0, 1, 2, 3, 4, 5, 6, 7, 8, 9},
   741  		},
   742  		{
   743  			"v1 > 11 AND v1 <= 15",
   744  			[]lookup.Range{
   745  				lookup.MustCustomRange(idxv1.tuple(11), idxv1.tuple(15),
   746  					lookup.Open, lookup.Closed),
   747  			},
   748  			[]int64{2, 3, 4, 5},
   749  		},
   750  		{
   751  			"v1 > 11 OR v1 > 15 OR v1 <= 19",
   752  			[]lookup.Range{
   753  				lookup.AllRange(),
   754  			},
   755  			[]int64{0, 1, 2, 3, 4, 5, 6, 7, 8, 9},
   756  		},
   757  		{
   758  			"v1 > 11 OR v1 > 15 AND v1 <= 19",
   759  			[]lookup.Range{
   760  				lookup.MustGreaterThanRange(idxv1.tuple(11)),
   761  			},
   762  			[]int64{2, 3, 4, 5, 6, 7, 8, 9},
   763  		},
   764  		{
   765  			"v1 > 11 AND v1 > 15 OR v1 <= 19",
   766  			[]lookup.Range{
   767  				lookup.AllRange(),
   768  			},
   769  			[]int64{0, 1, 2, 3, 4, 5, 6, 7, 8, 9},
   770  		},
   771  		{
   772  			"v1 > 11 AND v1 > 15 AND v1 <= 19",
   773  			[]lookup.Range{
   774  				lookup.MustCustomRange(idxv1.tuple(15), idxv1.tuple(19),
   775  					lookup.Open, lookup.Closed),
   776  			},
   777  			[]int64{6, 7, 8, 9},
   778  		},
   779  		{
   780  			"v1 > 11 AND v1 > 15 AND v1 <= 19",
   781  			[]lookup.Range{
   782  				lookup.MustCustomRange(idxv1.tuple(15), idxv1.tuple(19),
   783  					lookup.Open, lookup.Closed),
   784  			},
   785  			[]int64{6, 7, 8, 9},
   786  		},
   787  		{
   788  			"v1 > 11 AND v1 < 15 OR v1 > 15 AND v1 < 19",
   789  			[]lookup.Range{
   790  				lookup.MustOpenRange(idxv1.tuple(11), idxv1.tuple(15)),
   791  				lookup.MustOpenRange(idxv1.tuple(15), idxv1.tuple(19)),
   792  			},
   793  			[]int64{2, 3, 4, 6, 7, 8},
   794  		},
   795  		{
   796  			"v1 >= 11",
   797  			[]lookup.Range{
   798  				lookup.GreaterOrEqualRange(idxv1.tuple(11)),
   799  			},
   800  			[]int64{1, 2, 3, 4, 5, 6, 7, 8, 9},
   801  		},
   802  		{
   803  			"v1 >= 11 OR v1 >= 15",
   804  			[]lookup.Range{
   805  				lookup.GreaterOrEqualRange(idxv1.tuple(11)),
   806  			},
   807  			[]int64{1, 2, 3, 4, 5, 6, 7, 8, 9},
   808  		},
   809  		{
   810  			"v1 >= 11 AND v1 >= 15",
   811  			[]lookup.Range{
   812  				lookup.GreaterOrEqualRange(idxv1.tuple(15)),
   813  			},
   814  			[]int64{5, 6, 7, 8, 9},
   815  		},
   816  		{
   817  			"v1 >= 11 OR v1 >= 15 OR v1 >= 19",
   818  			[]lookup.Range{
   819  				lookup.GreaterOrEqualRange(idxv1.tuple(11)),
   820  			},
   821  			[]int64{1, 2, 3, 4, 5, 6, 7, 8, 9},
   822  		},
   823  		{
   824  			"v1 >= 11 OR v1 >= 15 AND v1 >= 19",
   825  			[]lookup.Range{
   826  				lookup.GreaterOrEqualRange(idxv1.tuple(11)),
   827  			},
   828  			[]int64{1, 2, 3, 4, 5, 6, 7, 8, 9},
   829  		},
   830  		{
   831  			"v1 >= 11 AND v1 >= 15 AND v1 >= 19",
   832  			[]lookup.Range{
   833  				lookup.GreaterOrEqualRange(idxv1.tuple(19)),
   834  			},
   835  			[]int64{9},
   836  		},
   837  		{
   838  			"v1 >= 11 OR v1 < 15",
   839  			[]lookup.Range{
   840  				lookup.AllRange(),
   841  			},
   842  			[]int64{0, 1, 2, 3, 4, 5, 6, 7, 8, 9},
   843  		},
   844  		{
   845  			"v1 >= 11 AND v1 < 15",
   846  			[]lookup.Range{
   847  				lookup.MustCustomRange(idxv1.tuple(11), idxv1.tuple(15),
   848  					lookup.Closed, lookup.Open),
   849  			},
   850  			[]int64{1, 2, 3, 4},
   851  		},
   852  		{
   853  			"v1 >= 11 OR v1 >= 15 OR v1 < 19",
   854  			[]lookup.Range{
   855  				lookup.AllRange(),
   856  			},
   857  			[]int64{0, 1, 2, 3, 4, 5, 6, 7, 8, 9},
   858  		},
   859  		{
   860  			"v1 >= 11 OR v1 >= 15 AND v1 < 19",
   861  			[]lookup.Range{
   862  				lookup.GreaterOrEqualRange(idxv1.tuple(11)),
   863  			},
   864  			[]int64{1, 2, 3, 4, 5, 6, 7, 8, 9},
   865  		},
   866  		{
   867  			"v1 >= 11 AND v1 >= 15 OR v1 < 19",
   868  			[]lookup.Range{
   869  				lookup.AllRange(),
   870  			},
   871  			[]int64{0, 1, 2, 3, 4, 5, 6, 7, 8, 9},
   872  		},
   873  		{
   874  			"v1 >= 11 AND v1 >= 15 AND v1 < 19",
   875  			[]lookup.Range{
   876  				lookup.MustCustomRange(idxv1.tuple(15), idxv1.tuple(19),
   877  					lookup.Closed, lookup.Open),
   878  			},
   879  			[]int64{5, 6, 7, 8},
   880  		},
   881  		{
   882  			"v1 >= 11 OR v1 <= 15",
   883  			[]lookup.Range{
   884  				lookup.AllRange(),
   885  			},
   886  			[]int64{0, 1, 2, 3, 4, 5, 6, 7, 8, 9},
   887  		},
   888  		{
   889  			"v1 >= 11 AND v1 <= 15",
   890  			[]lookup.Range{
   891  				lookup.MustClosedRange(idxv1.tuple(11), idxv1.tuple(15)),
   892  			},
   893  			[]int64{1, 2, 3, 4, 5},
   894  		},
   895  		{
   896  			"v1 >= 11 OR v1 >= 15 OR v1 <= 19",
   897  			[]lookup.Range{
   898  				lookup.AllRange(),
   899  			},
   900  			[]int64{0, 1, 2, 3, 4, 5, 6, 7, 8, 9},
   901  		},
   902  		{
   903  			"v1 >= 11 OR v1 >= 15 AND v1 <= 19",
   904  			[]lookup.Range{
   905  				lookup.GreaterOrEqualRange(idxv1.tuple(11)),
   906  			},
   907  			[]int64{1, 2, 3, 4, 5, 6, 7, 8, 9},
   908  		},
   909  		{
   910  			"v1 >= 11 AND v1 >= 15 OR v1 <= 19",
   911  			[]lookup.Range{
   912  				lookup.AllRange(),
   913  			},
   914  			[]int64{0, 1, 2, 3, 4, 5, 6, 7, 8, 9},
   915  		},
   916  		{
   917  			"v1 >= 11 AND v1 >= 15 AND v1 <= 19",
   918  			[]lookup.Range{
   919  				lookup.MustClosedRange(idxv1.tuple(15), idxv1.tuple(19)),
   920  			},
   921  			[]int64{5, 6, 7, 8, 9},
   922  		},
   923  		{
   924  			"v1 >= 11 AND v1 <= 14 OR v1 >= 16 AND v1 <= 19",
   925  			[]lookup.Range{
   926  				lookup.MustClosedRange(idxv1.tuple(11), idxv1.tuple(14)),
   927  				lookup.MustClosedRange(idxv1.tuple(16), idxv1.tuple(19)),
   928  			},
   929  			[]int64{1, 2, 3, 4, 6, 7, 8, 9},
   930  		},
   931  		{
   932  			"v1 < 11",
   933  			[]lookup.Range{
   934  				lookup.LessThanRange(idxv1.tuple(11)),
   935  			},
   936  			[]int64{0},
   937  		},
   938  		{
   939  			"v1 < 11 OR v1 < 15",
   940  			[]lookup.Range{
   941  				lookup.LessThanRange(idxv1.tuple(15)),
   942  			},
   943  			[]int64{0, 1, 2, 3, 4},
   944  		},
   945  		{
   946  			"v1 < 11 AND v1 < 15",
   947  			[]lookup.Range{
   948  				lookup.LessThanRange(idxv1.tuple(11)),
   949  			},
   950  			[]int64{0},
   951  		},
   952  		{
   953  			"v1 < 11 OR v1 < 15 OR v1 < 19",
   954  			[]lookup.Range{
   955  				lookup.LessThanRange(idxv1.tuple(19)),
   956  			},
   957  			[]int64{0, 1, 2, 3, 4, 5, 6, 7, 8},
   958  		},
   959  		{
   960  			"v1 < 11 OR v1 < 15 AND v1 < 19",
   961  			[]lookup.Range{
   962  				lookup.LessThanRange(idxv1.tuple(15)),
   963  			},
   964  			[]int64{0, 1, 2, 3, 4},
   965  		},
   966  		{
   967  			"v1 < 11 AND v1 < 15 AND v1 < 19",
   968  			[]lookup.Range{
   969  				lookup.LessThanRange(idxv1.tuple(11)),
   970  			},
   971  			[]int64{0},
   972  		},
   973  		{
   974  			"v1 < 11 OR v1 > 15",
   975  			[]lookup.Range{
   976  				lookup.LessThanRange(idxv1.tuple(11)),
   977  				lookup.MustGreaterThanRange(idxv1.tuple(15)),
   978  			},
   979  			[]int64{0, 6, 7, 8, 9},
   980  		},
   981  		{
   982  			"v1 < 11 AND v1 > 15",
   983  			[]lookup.Range{
   984  				lookup.EmptyRange(),
   985  			},
   986  			[]int64{},
   987  		},
   988  		{
   989  			"v1 < 11 OR v1 <= 15",
   990  			[]lookup.Range{
   991  				lookup.MustLessOrEqualRange(idxv1.tuple(15)),
   992  			},
   993  			[]int64{0, 1, 2, 3, 4, 5},
   994  		},
   995  		{
   996  			"v1 < 11 AND v1 <= 15",
   997  			[]lookup.Range{
   998  				lookup.LessThanRange(idxv1.tuple(11)),
   999  			},
  1000  			[]int64{0},
  1001  		},
  1002  		{
  1003  			"v1 < 11 OR v1 < 15 OR v1 <= 19",
  1004  			[]lookup.Range{
  1005  				lookup.MustLessOrEqualRange(idxv1.tuple(19)),
  1006  			},
  1007  			[]int64{0, 1, 2, 3, 4, 5, 6, 7, 8, 9},
  1008  		},
  1009  		{
  1010  			"v1 < 11 OR v1 < 15 AND v1 <= 19",
  1011  			[]lookup.Range{
  1012  				lookup.LessThanRange(idxv1.tuple(15)),
  1013  			},
  1014  			[]int64{0, 1, 2, 3, 4},
  1015  		},
  1016  		{
  1017  			"v1 < 11 AND v1 < 15 OR v1 <= 19",
  1018  			[]lookup.Range{
  1019  				lookup.MustLessOrEqualRange(idxv1.tuple(19)),
  1020  			},
  1021  			[]int64{0, 1, 2, 3, 4, 5, 6, 7, 8, 9},
  1022  		},
  1023  		{
  1024  			"v1 < 11 AND v1 < 15 AND v1 <= 19",
  1025  			[]lookup.Range{
  1026  				lookup.LessThanRange(idxv1.tuple(11)),
  1027  			},
  1028  			[]int64{0},
  1029  		},
  1030  		{
  1031  			"v1 < 11 OR v1 >= 15",
  1032  			[]lookup.Range{
  1033  				lookup.LessThanRange(idxv1.tuple(11)),
  1034  				lookup.GreaterOrEqualRange(idxv1.tuple(15)),
  1035  			},
  1036  			[]int64{0, 5, 6, 7, 8, 9},
  1037  		},
  1038  		{
  1039  			"v1 < 11 AND v1 >= 15",
  1040  			[]lookup.Range{
  1041  				lookup.EmptyRange(),
  1042  			},
  1043  			[]int64{},
  1044  		},
  1045  		{
  1046  			"(v1 < 13 OR v1 > 16) AND (v1 > 10 OR v1 < 19)",
  1047  			[]lookup.Range{
  1048  				lookup.LessThanRange(idxv1.tuple(13)),
  1049  				lookup.MustGreaterThanRange(idxv1.tuple(16)),
  1050  			},
  1051  			[]int64{0, 1, 2, 7, 8, 9},
  1052  		},
  1053  		{
  1054  			"v1 <= 11",
  1055  			[]lookup.Range{
  1056  				lookup.MustLessOrEqualRange(idxv1.tuple(11)),
  1057  			},
  1058  			[]int64{0, 1},
  1059  		},
  1060  		{
  1061  			"v1 <= 11 OR v1 <= 15",
  1062  			[]lookup.Range{
  1063  				lookup.MustLessOrEqualRange(idxv1.tuple(15)),
  1064  			},
  1065  			[]int64{0, 1, 2, 3, 4, 5},
  1066  		},
  1067  		{
  1068  			"v1 <= 11 AND v1 <= 15",
  1069  			[]lookup.Range{
  1070  				lookup.MustLessOrEqualRange(idxv1.tuple(11)),
  1071  			},
  1072  			[]int64{0, 1},
  1073  		},
  1074  		{
  1075  			"v1 <= 11 OR v1 <= 15 OR v1 <= 19",
  1076  			[]lookup.Range{
  1077  				lookup.MustLessOrEqualRange(idxv1.tuple(19)),
  1078  			},
  1079  			[]int64{0, 1, 2, 3, 4, 5, 6, 7, 8, 9},
  1080  		},
  1081  		{
  1082  			"v1 <= 11 OR v1 <= 15 AND v1 <= 19",
  1083  			[]lookup.Range{
  1084  				lookup.MustLessOrEqualRange(idxv1.tuple(15)),
  1085  			},
  1086  			[]int64{0, 1, 2, 3, 4, 5},
  1087  		},
  1088  		{
  1089  			"v1 <= 11 AND v1 <= 15 AND v1 <= 19",
  1090  			[]lookup.Range{
  1091  				lookup.MustLessOrEqualRange(idxv1.tuple(11)),
  1092  			},
  1093  			[]int64{0, 1},
  1094  		},
  1095  		{
  1096  			"v1 <= 11 OR v1 > 15",
  1097  			[]lookup.Range{
  1098  				lookup.MustLessOrEqualRange(idxv1.tuple(11)),
  1099  				lookup.MustGreaterThanRange(idxv1.tuple(15)),
  1100  			},
  1101  			[]int64{0, 1, 6, 7, 8, 9},
  1102  		},
  1103  		{
  1104  			"v1 <= 11 AND v1 > 15",
  1105  			[]lookup.Range{
  1106  				lookup.EmptyRange(),
  1107  			},
  1108  			[]int64{},
  1109  		},
  1110  		{
  1111  			"v1 <= 11 OR v1 >= 15",
  1112  			[]lookup.Range{
  1113  				lookup.MustLessOrEqualRange(idxv1.tuple(11)),
  1114  				lookup.GreaterOrEqualRange(idxv1.tuple(15)),
  1115  			},
  1116  			[]int64{0, 1, 5, 6, 7, 8, 9},
  1117  		},
  1118  		{
  1119  			"v1 <= 11 AND v1 >= 15",
  1120  			[]lookup.Range{
  1121  				lookup.EmptyRange(),
  1122  			},
  1123  			[]int64{},
  1124  		},
  1125  		{
  1126  			"v1 BETWEEN 11 AND 15",
  1127  			[]lookup.Range{
  1128  				lookup.MustClosedRange(idxv1.tuple(11), idxv1.tuple(15)),
  1129  			},
  1130  			[]int64{1, 2, 3, 4, 5},
  1131  		},
  1132  		{
  1133  			"v1 BETWEEN 11 AND 15 OR v1 BETWEEN 15 AND 19",
  1134  			[]lookup.Range{
  1135  				lookup.MustClosedRange(idxv1.tuple(11), idxv1.tuple(19)),
  1136  			},
  1137  			[]int64{1, 2, 3, 4, 5, 6, 7, 8, 9},
  1138  		},
  1139  		{
  1140  			"v1 BETWEEN 11 AND 15 AND v1 BETWEEN 15 AND 19",
  1141  			[]lookup.Range{
  1142  				lookup.MustClosedRange(idxv1.tuple(15), idxv1.tuple(15)),
  1143  			},
  1144  			[]int64{5},
  1145  		},
  1146  		{
  1147  			"v1 BETWEEN 11 AND 15 OR v1 = 13",
  1148  			[]lookup.Range{
  1149  				lookup.MustClosedRange(idxv1.tuple(11), idxv1.tuple(15)),
  1150  			},
  1151  			[]int64{1, 2, 3, 4, 5},
  1152  		},
  1153  		{
  1154  			"v1 BETWEEN 11 AND 15 OR v1 != 13",
  1155  			[]lookup.Range{
  1156  				lookup.AllRange(),
  1157  			},
  1158  			[]int64{0, 1, 2, 3, 4, 5, 6, 7, 8, 9},
  1159  		},
  1160  		{
  1161  			"v1 BETWEEN 11 AND 15 AND v1 != 13",
  1162  			[]lookup.Range{
  1163  				lookup.MustCustomRange(idxv1.tuple(11), idxv1.tuple(13),
  1164  					lookup.Closed, lookup.Open),
  1165  				lookup.MustCustomRange(idxv1.tuple(13), idxv1.tuple(15),
  1166  					lookup.Open, lookup.Closed),
  1167  			},
  1168  			[]int64{1, 2, 4, 5},
  1169  		},
  1170  		{
  1171  			"v1 BETWEEN 11 AND 15 AND v1 <= 19",
  1172  			[]lookup.Range{
  1173  				lookup.MustClosedRange(idxv1.tuple(11), idxv1.tuple(15)),
  1174  			},
  1175  			[]int64{1, 2, 3, 4, 5},
  1176  		},
  1177  		{
  1178  			"v1 BETWEEN 11 AND 15 AND v1 <= 19",
  1179  			[]lookup.Range{
  1180  				lookup.MustClosedRange(idxv1.tuple(11), idxv1.tuple(15)),
  1181  			},
  1182  			[]int64{1, 2, 3, 4, 5},
  1183  		},
  1184  		{
  1185  			"v1 IN (11, 12, 13)",
  1186  			[]lookup.Range{
  1187  				lookup.MustClosedRange(idxv1.tuple(11), idxv1.tuple(11)),
  1188  				lookup.MustClosedRange(idxv1.tuple(12), idxv1.tuple(12)),
  1189  				lookup.MustClosedRange(idxv1.tuple(13), idxv1.tuple(13)),
  1190  			},
  1191  			[]int64{1, 2, 3},
  1192  		},
  1193  		{
  1194  			"v1 IN (11, 12, 13) OR v1 BETWEEN 11 and 13",
  1195  			[]lookup.Range{
  1196  				lookup.MustClosedRange(idxv1.tuple(11), idxv1.tuple(13)),
  1197  			},
  1198  			[]int64{1, 2, 3},
  1199  		},
  1200  		{
  1201  			"v1 IN (11, 12, 13) AND v1 > 11",
  1202  			[]lookup.Range{
  1203  				lookup.MustClosedRange(idxv1.tuple(12), idxv1.tuple(12)),
  1204  				lookup.MustClosedRange(idxv1.tuple(13), idxv1.tuple(13)),
  1205  			},
  1206  			[]int64{2, 3},
  1207  		},
  1208  		{
  1209  			"v1 IN (11, 12, 13) OR v1 != 12",
  1210  			[]lookup.Range{
  1211  				lookup.AllRange(),
  1212  			},
  1213  			[]int64{0, 1, 2, 3, 4, 5, 6, 7, 8, 9},
  1214  		},
  1215  		{
  1216  			"v1 IN (11, 12, 13) AND v1 != 12",
  1217  			[]lookup.Range{
  1218  				lookup.MustClosedRange(idxv1.tuple(11), idxv1.tuple(11)),
  1219  				lookup.MustClosedRange(idxv1.tuple(13), idxv1.tuple(13)),
  1220  			},
  1221  			[]int64{1, 3},
  1222  		},
  1223  		{
  1224  			"v1 IN (11, 12, 13) OR v1 >= 13 AND v1 < 15",
  1225  			[]lookup.Range{
  1226  				lookup.MustClosedRange(idxv1.tuple(11), idxv1.tuple(11)),
  1227  				lookup.MustClosedRange(idxv1.tuple(12), idxv1.tuple(12)),
  1228  				lookup.MustCustomRange(idxv1.tuple(13), idxv1.tuple(15),
  1229  					lookup.Closed, lookup.Open),
  1230  			},
  1231  			[]int64{1, 2, 3, 4},
  1232  		},
  1233  		{
  1234  			"v2 = 21 AND v1 = 11 OR v2 > 25 AND v1 > 11",
  1235  			[]lookup.Range{
  1236  				lookup.MustClosedRange(idxv2v1.tuple(21, 11), idxv2v1.tuple(21, 11)),
  1237  				lookup.MustGreaterThanRange(idxv2v1.tuple(25, 11)),
  1238  			},
  1239  			[]int64{1, 6, 7, 8, 9},
  1240  		},
  1241  		{
  1242  			"v2 > 21 AND v1 > 11 AND v2 < 25 AND v1 < 15",
  1243  			[]lookup.Range{
  1244  				lookup.MustOpenRange(idxv2v1.tuple(21, 11), idxv2v1.tuple(25, 15)),
  1245  			},
  1246  			[]int64{2, 3, 4},
  1247  		},
  1248  		{
  1249  			"v2 = 21",
  1250  			[]lookup.Range{
  1251  				lookup.MustClosedRange(idxv2v1Gen.tuple(21), idxv2v1Gen.tuple(21)),
  1252  			},
  1253  			[]int64{1},
  1254  		},
  1255  		{
  1256  			"v2 = 21 OR v2 = 25",
  1257  			[]lookup.Range{
  1258  				lookup.MustClosedRange(idxv2v1Gen.tuple(21), idxv2v1Gen.tuple(21)),
  1259  				lookup.MustClosedRange(idxv2v1Gen.tuple(25), idxv2v1Gen.tuple(25)),
  1260  			},
  1261  			[]int64{1, 5},
  1262  		},
  1263  		{
  1264  			"v2 = 21 AND v2 = 25",
  1265  			[]lookup.Range{
  1266  				lookup.EmptyRange(),
  1267  			},
  1268  			[]int64{},
  1269  		},
  1270  		{
  1271  			"v2 = 21 OR v2 = 25 OR v2 = 29",
  1272  			[]lookup.Range{
  1273  				lookup.MustClosedRange(idxv2v1Gen.tuple(21), idxv2v1Gen.tuple(21)),
  1274  				lookup.MustClosedRange(idxv2v1Gen.tuple(25), idxv2v1Gen.tuple(25)),
  1275  				lookup.MustClosedRange(idxv2v1Gen.tuple(29), idxv2v1Gen.tuple(29)),
  1276  			},
  1277  			[]int64{1, 5, 9},
  1278  		},
  1279  		{
  1280  			"v2 = 21 OR v2 = 25 AND v2 = 29",
  1281  			[]lookup.Range{
  1282  				lookup.MustClosedRange(idxv2v1Gen.tuple(21), idxv2v1Gen.tuple(21)),
  1283  			},
  1284  			[]int64{1},
  1285  		},
  1286  		{
  1287  			"v2 = 21 AND v2 = 25 AND v2 = 29",
  1288  			[]lookup.Range{
  1289  				lookup.EmptyRange(),
  1290  			},
  1291  			[]int64{},
  1292  		},
  1293  		{
  1294  			"v2 = 21 OR v2 != 21",
  1295  			[]lookup.Range{
  1296  				lookup.AllRange(),
  1297  			},
  1298  			[]int64{0, 1, 2, 3, 4, 5, 6, 7, 8, 9},
  1299  		},
  1300  		{
  1301  			"v2 = 21 OR v2 != 25",
  1302  			[]lookup.Range{
  1303  				lookup.LessThanRange(idxv2v1Gen.tuple(25)),
  1304  				lookup.MustGreaterThanRange(idxv2v1Gen.tuple(25)),
  1305  			},
  1306  			[]int64{0, 1, 2, 3, 4, 6, 7, 8, 9},
  1307  		},
  1308  		{
  1309  			"v2 = 21 AND v2 != 25",
  1310  			[]lookup.Range{
  1311  				lookup.MustClosedRange(idxv2v1Gen.tuple(21), idxv2v1Gen.tuple(21)),
  1312  			},
  1313  			[]int64{1},
  1314  		},
  1315  		{
  1316  			"v2 = 21 OR v2 = 25 OR v2 != 29",
  1317  			[]lookup.Range{
  1318  				lookup.LessThanRange(idxv2v1Gen.tuple(29)),
  1319  				lookup.MustGreaterThanRange(idxv2v1Gen.tuple(29)),
  1320  			},
  1321  			[]int64{0, 1, 2, 3, 4, 5, 6, 7, 8},
  1322  		},
  1323  		{
  1324  			"v2 = 21 OR v2 = 25 AND v2 != 29",
  1325  			[]lookup.Range{
  1326  				lookup.MustClosedRange(idxv2v1Gen.tuple(21), idxv2v1Gen.tuple(21)),
  1327  				lookup.MustClosedRange(idxv2v1Gen.tuple(25), idxv2v1Gen.tuple(25)),
  1328  			},
  1329  			[]int64{1, 5},
  1330  		},
  1331  		{
  1332  			"v2 = 21 AND v2 = 25 OR v2 != 29",
  1333  			[]lookup.Range{
  1334  				lookup.LessThanRange(idxv2v1Gen.tuple(29)),
  1335  				lookup.MustGreaterThanRange(idxv2v1Gen.tuple(29)),
  1336  			},
  1337  			[]int64{0, 1, 2, 3, 4, 5, 6, 7, 8},
  1338  		},
  1339  		{
  1340  			"v2 = 21 AND v2 = 25 AND v2 != 29",
  1341  			[]lookup.Range{
  1342  				lookup.EmptyRange(),
  1343  			},
  1344  			[]int64{},
  1345  		},
  1346  	}
  1347  
  1348  	for _, test := range tests {
  1349  		t.Run(test.whereStmt, func(t *testing.T) {
  1350  			var finalRanges []lookup.Range
  1351  			db.t = t
  1352  			db.finalRanges = func(ranges []lookup.Range) {
  1353  				finalRanges = ranges
  1354  			}
  1355  
  1356  			ctx := context.Background()
  1357  			sqlCtx := NewTestSQLCtx(ctx)
  1358  			session := DSessFromSess(sqlCtx.Session)
  1359  			err := session.AddDB(sqlCtx, db, denv.DbData())
  1360  			require.NoError(t, err)
  1361  			sqlCtx.SetCurrentDatabase(db.Name())
  1362  			err = session.SetRoot(sqlCtx, db.Name(), initialRoot)
  1363  			require.NoError(t, err)
  1364  
  1365  			_, iter, err := engine.Query(sqlCtx, fmt.Sprintf(`SELECT pk FROM test WHERE %s ORDER BY 1`, test.whereStmt))
  1366  			require.NoError(t, err)
  1367  			res, err := sql.RowIterToRows(sqlCtx, iter)
  1368  			require.NoError(t, err)
  1369  			if assert.Equal(t, len(test.pks), len(res)) {
  1370  				for i, pk := range test.pks {
  1371  					if assert.Equal(t, 1, len(res[i])) {
  1372  						assert.Equal(t, pk, res[i][0])
  1373  					}
  1374  				}
  1375  			}
  1376  
  1377  			if assert.Equal(t, len(test.finalRanges), len(finalRanges)) {
  1378  				for i, r := range test.finalRanges {
  1379  					require.True(t, r.Equals(finalRanges[i]), fmt.Sprintf("Expected: `%v`\nActual:   `%v`", r, finalRanges[i]))
  1380  				}
  1381  			}
  1382  		})
  1383  	}
  1384  }
  1385  
  1386  // TestMergeableIndexesNulls is based on TestMergeableIndexes, but specifically handles IS NULL and IS NOT NULL.
  1387  // For now, some of these tests are broken, but they return the correct end result. As NULL is encoded as being a value
  1388  // larger than all integers, == NULL becomes a subset of > x and >= x, thus the intersection returns == NULL.
  1389  // The correct behavior would be to return the empty range in that example. However, as the SQL engine still filters the
  1390  // returned results, we end up with zero values actually being returned, just like we'd expect from the empty range.
  1391  // As a consequence, I'm leaving these tests in to verify that the overall result is correct, but the intermediate
  1392  // ranges may be incorrect.
  1393  // TODO: disassociate NULL ranges from value ranges and fix the intermediate ranges (finalRanges).
  1394  func TestMergeableIndexesNulls(t *testing.T) {
  1395  	engine, denv, db, indexTuples, initialRoot := setupMergeableIndexes(t, "test", `INSERT INTO test VALUES
  1396  		(0, 10, 20),
  1397  		(1, 11, 21),
  1398  		(2, NULL, NULL),
  1399  		(3, 13, 23),
  1400  		(4, NULL, NULL),
  1401  		(5, 15, 25),
  1402  		(6, NULL, NULL),
  1403  		(7, 17, 27),
  1404  		(8, 18, 28),
  1405  		(9, 19, 29);`)
  1406  	idxv1 := indexTuples[0]
  1407  
  1408  	tests := []struct {
  1409  		whereStmt   string
  1410  		finalRanges []lookup.Range
  1411  		pks         []int64
  1412  	}{
  1413  		{
  1414  			"v1 IS NULL",
  1415  			[]lookup.Range{
  1416  				lookup.MustClosedRange(idxv1.nilTuple(), idxv1.nilTuple()),
  1417  			},
  1418  			[]int64{2, 4, 6},
  1419  		},
  1420  		{
  1421  			"v1 IS NULL OR v1 IS NULL",
  1422  			[]lookup.Range{
  1423  				lookup.MustClosedRange(idxv1.nilTuple(), idxv1.nilTuple()),
  1424  			},
  1425  			[]int64{2, 4, 6},
  1426  		},
  1427  		{
  1428  			"v1 IS NULL AND v1 IS NULL",
  1429  			[]lookup.Range{
  1430  				lookup.MustClosedRange(idxv1.nilTuple(), idxv1.nilTuple()),
  1431  			},
  1432  			[]int64{2, 4, 6},
  1433  		},
  1434  		{
  1435  			"v1 IS NULL OR v1 = 11",
  1436  			[]lookup.Range{
  1437  				lookup.MustClosedRange(idxv1.tuple(11), idxv1.tuple(11)),
  1438  				lookup.MustClosedRange(idxv1.nilTuple(), idxv1.nilTuple()),
  1439  			},
  1440  			[]int64{1, 2, 4, 6},
  1441  		},
  1442  		{
  1443  			"v1 IS NULL OR v1 < 16",
  1444  			[]lookup.Range{
  1445  				lookup.LessThanRange(idxv1.tuple(16)),
  1446  				lookup.MustClosedRange(idxv1.nilTuple(), idxv1.nilTuple()),
  1447  			},
  1448  			[]int64{0, 1, 2, 3, 4, 5, 6},
  1449  		},
  1450  		{
  1451  			"v1 IS NULL OR v1 > 16",
  1452  			[]lookup.Range{
  1453  				lookup.MustGreaterThanRange(idxv1.tuple(16)),
  1454  			},
  1455  			[]int64{2, 4, 6, 7, 8, 9},
  1456  		},
  1457  		{
  1458  			"v1 IS NULL AND v1 < 16",
  1459  			[]lookup.Range{
  1460  				lookup.EmptyRange(),
  1461  			},
  1462  			[]int64{},
  1463  		},
  1464  		{
  1465  			"v1 IS NULL AND v1 > 16",
  1466  			[]lookup.Range{
  1467  				lookup.MustClosedRange(idxv1.nilTuple(), idxv1.nilTuple()),
  1468  			},
  1469  			[]int64{},
  1470  		},
  1471  		{
  1472  			"v1 IS NULL OR v1 IS NOT NULL",
  1473  			[]lookup.Range{
  1474  				lookup.AllRange(),
  1475  			},
  1476  			[]int64{0, 1, 2, 3, 4, 5, 6, 7, 8, 9},
  1477  		},
  1478  		{
  1479  			"v1 IS NULL AND v1 IS NOT NULL",
  1480  			[]lookup.Range{
  1481  				lookup.EmptyRange(),
  1482  			},
  1483  			[]int64{},
  1484  		},
  1485  		{
  1486  			"v1 IS NOT NULL",
  1487  			[]lookup.Range{
  1488  				lookup.LessThanRange(idxv1.nilTuple()),
  1489  				lookup.MustGreaterThanRange(idxv1.nilTuple()),
  1490  			},
  1491  			[]int64{0, 1, 3, 5, 7, 8, 9},
  1492  		},
  1493  		{
  1494  			"v1 IS NOT NULL OR v1 IS NULL",
  1495  			[]lookup.Range{
  1496  				lookup.AllRange(),
  1497  			},
  1498  			[]int64{0, 1, 2, 3, 4, 5, 6, 7, 8, 9},
  1499  		},
  1500  		{
  1501  			"v1 IS NOT NULL AND v1 IS NULL",
  1502  			[]lookup.Range{
  1503  				lookup.EmptyRange(),
  1504  			},
  1505  			[]int64{},
  1506  		},
  1507  		{
  1508  			"v1 IS NOT NULL OR v1 = 15",
  1509  			[]lookup.Range{
  1510  				lookup.LessThanRange(idxv1.nilTuple()),
  1511  				lookup.MustGreaterThanRange(idxv1.nilTuple()),
  1512  			},
  1513  			[]int64{0, 1, 3, 5, 7, 8, 9},
  1514  		},
  1515  		{
  1516  			"v1 IS NOT NULL OR v1 > 16",
  1517  			[]lookup.Range{
  1518  				lookup.AllRange(),
  1519  			},
  1520  			[]int64{0, 1, 3, 5, 7, 8, 9},
  1521  		},
  1522  		{
  1523  			"v1 IS NOT NULL OR v1 < 16",
  1524  			[]lookup.Range{
  1525  				lookup.LessThanRange(idxv1.nilTuple()),
  1526  				lookup.MustGreaterThanRange(idxv1.nilTuple()),
  1527  			},
  1528  			[]int64{0, 1, 3, 5, 7, 8, 9},
  1529  		},
  1530  		{
  1531  			"v1 IS NOT NULL AND v1 = 15",
  1532  			[]lookup.Range{
  1533  				lookup.MustClosedRange(idxv1.tuple(15), idxv1.tuple(15)),
  1534  			},
  1535  			[]int64{5},
  1536  		},
  1537  		{
  1538  			"v1 IS NOT NULL AND v1 > 16",
  1539  			[]lookup.Range{
  1540  				lookup.MustOpenRange(idxv1.tuple(16), idxv1.nilTuple()),
  1541  				lookup.MustGreaterThanRange(idxv1.nilTuple()),
  1542  			},
  1543  			[]int64{7, 8, 9},
  1544  		},
  1545  		{
  1546  			"v1 IS NOT NULL AND v1 < 16",
  1547  			[]lookup.Range{
  1548  				lookup.LessThanRange(idxv1.tuple(16)),
  1549  			},
  1550  			[]int64{0, 1, 3, 5},
  1551  		},
  1552  	}
  1553  
  1554  	for _, test := range tests {
  1555  		t.Run(test.whereStmt, func(t *testing.T) {
  1556  			var finalRanges []lookup.Range
  1557  			db.t = t
  1558  			db.finalRanges = func(ranges []lookup.Range) {
  1559  				finalRanges = ranges
  1560  			}
  1561  
  1562  			ctx := context.Background()
  1563  			sqlCtx := NewTestSQLCtx(ctx)
  1564  			session := DSessFromSess(sqlCtx.Session)
  1565  			err := session.AddDB(sqlCtx, db, denv.DbData())
  1566  			require.NoError(t, err)
  1567  			sqlCtx.SetCurrentDatabase(db.Name())
  1568  			err = session.SetRoot(sqlCtx, db.Name(), initialRoot)
  1569  			require.NoError(t, err)
  1570  
  1571  			_, iter, err := engine.Query(sqlCtx, fmt.Sprintf(`SELECT pk FROM test WHERE %s ORDER BY 1`, test.whereStmt))
  1572  			require.NoError(t, err)
  1573  			res, err := sql.RowIterToRows(sqlCtx, iter)
  1574  			require.NoError(t, err)
  1575  			if assert.Equal(t, len(test.pks), len(res)) {
  1576  				for i, pk := range test.pks {
  1577  					if assert.Equal(t, 1, len(res[i])) {
  1578  						assert.Equal(t, pk, res[i][0])
  1579  					}
  1580  				}
  1581  			}
  1582  
  1583  			if assert.Equal(t, len(test.finalRanges), len(finalRanges)) {
  1584  				for i, r := range test.finalRanges {
  1585  					require.True(t, r.Equals(finalRanges[i]), fmt.Sprintf("Expected: `%v`\nActual:   `%v`", r, finalRanges[i]))
  1586  				}
  1587  			}
  1588  		})
  1589  	}
  1590  }