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 }