vitess.io/vitess@v0.16.2/go/vt/vtgate/planbuilder/testdata/select_cases.json (about) 1 [ 2 { 3 "comment": "No column referenced", 4 "query": "select 1 from user", 5 "v3-plan": { 6 "QueryType": "SELECT", 7 "Original": "select 1 from user", 8 "Instructions": { 9 "OperatorType": "Route", 10 "Variant": "Scatter", 11 "Keyspace": { 12 "Name": "user", 13 "Sharded": true 14 }, 15 "FieldQuery": "select 1 from `user` where 1 != 1", 16 "Query": "select 1 from `user`", 17 "Table": "`user`" 18 } 19 }, 20 "gen4-plan": { 21 "QueryType": "SELECT", 22 "Original": "select 1 from user", 23 "Instructions": { 24 "OperatorType": "Route", 25 "Variant": "Scatter", 26 "Keyspace": { 27 "Name": "user", 28 "Sharded": true 29 }, 30 "FieldQuery": "select 1 from `user` where 1 != 1", 31 "Query": "select 1 from `user`", 32 "Table": "`user`" 33 }, 34 "TablesUsed": [ 35 "user.user" 36 ] 37 } 38 }, 39 { 40 "comment": "'*' expression for simple route", 41 "query": "select user.* from user", 42 "v3-plan": { 43 "QueryType": "SELECT", 44 "Original": "select user.* from user", 45 "Instructions": { 46 "OperatorType": "Route", 47 "Variant": "Scatter", 48 "Keyspace": { 49 "Name": "user", 50 "Sharded": true 51 }, 52 "FieldQuery": "select `user`.* from `user` where 1 != 1", 53 "Query": "select `user`.* from `user`", 54 "Table": "`user`" 55 } 56 }, 57 "gen4-plan": { 58 "QueryType": "SELECT", 59 "Original": "select user.* from user", 60 "Instructions": { 61 "OperatorType": "Route", 62 "Variant": "Scatter", 63 "Keyspace": { 64 "Name": "user", 65 "Sharded": true 66 }, 67 "FieldQuery": "select `user`.* from `user` where 1 != 1", 68 "Query": "select `user`.* from `user`", 69 "Table": "`user`" 70 }, 71 "TablesUsed": [ 72 "user.user" 73 ] 74 } 75 }, 76 { 77 "comment": "unqualified '*' expression for simple route", 78 "query": "select * from user", 79 "v3-plan": { 80 "QueryType": "SELECT", 81 "Original": "select * from user", 82 "Instructions": { 83 "OperatorType": "Route", 84 "Variant": "Scatter", 85 "Keyspace": { 86 "Name": "user", 87 "Sharded": true 88 }, 89 "FieldQuery": "select * from `user` where 1 != 1", 90 "Query": "select * from `user`", 91 "Table": "`user`" 92 } 93 }, 94 "gen4-plan": { 95 "QueryType": "SELECT", 96 "Original": "select * from user", 97 "Instructions": { 98 "OperatorType": "Route", 99 "Variant": "Scatter", 100 "Keyspace": { 101 "Name": "user", 102 "Sharded": true 103 }, 104 "FieldQuery": "select * from `user` where 1 != 1", 105 "Query": "select * from `user`", 106 "Table": "`user`" 107 }, 108 "TablesUsed": [ 109 "user.user" 110 ] 111 } 112 }, 113 { 114 "comment": "select with timeout directive sets QueryTimeout in the route", 115 "query": "select /*vt+ QUERY_TIMEOUT_MS=1000 */ * from user", 116 "v3-plan": { 117 "QueryType": "SELECT", 118 "Original": "select /*vt+ QUERY_TIMEOUT_MS=1000 */ * from user", 119 "Instructions": { 120 "OperatorType": "Route", 121 "Variant": "Scatter", 122 "Keyspace": { 123 "Name": "user", 124 "Sharded": true 125 }, 126 "FieldQuery": "select * from `user` where 1 != 1", 127 "Query": "select /*vt+ QUERY_TIMEOUT_MS=1000 */ * from `user`", 128 "QueryTimeout": 1000, 129 "Table": "`user`" 130 } 131 }, 132 "gen4-plan": { 133 "QueryType": "SELECT", 134 "Original": "select /*vt+ QUERY_TIMEOUT_MS=1000 */ * from user", 135 "Instructions": { 136 "OperatorType": "Route", 137 "Variant": "Scatter", 138 "Keyspace": { 139 "Name": "user", 140 "Sharded": true 141 }, 142 "FieldQuery": "select * from `user` where 1 != 1", 143 "Query": "select /*vt+ QUERY_TIMEOUT_MS=1000 */ * from `user`", 144 "QueryTimeout": 1000, 145 "Table": "`user`" 146 }, 147 "TablesUsed": [ 148 "user.user" 149 ] 150 } 151 }, 152 { 153 "comment": "select aggregation with timeout directive sets QueryTimeout in the route", 154 "query": "select /*vt+ QUERY_TIMEOUT_MS=1000 */ count(*) from user", 155 "v3-plan": { 156 "QueryType": "SELECT", 157 "Original": "select /*vt+ QUERY_TIMEOUT_MS=1000 */ count(*) from user", 158 "Instructions": { 159 "OperatorType": "Aggregate", 160 "Variant": "Scalar", 161 "Aggregates": "sum_count(0) AS count", 162 "Inputs": [ 163 { 164 "OperatorType": "Route", 165 "Variant": "Scatter", 166 "Keyspace": { 167 "Name": "user", 168 "Sharded": true 169 }, 170 "FieldQuery": "select count(*) from `user` where 1 != 1", 171 "Query": "select /*vt+ QUERY_TIMEOUT_MS=1000 */ count(*) from `user`", 172 "QueryTimeout": 1000, 173 "Table": "`user`" 174 } 175 ] 176 } 177 }, 178 "gen4-plan": { 179 "QueryType": "SELECT", 180 "Original": "select /*vt+ QUERY_TIMEOUT_MS=1000 */ count(*) from user", 181 "Instructions": { 182 "OperatorType": "Aggregate", 183 "Variant": "Scalar", 184 "Aggregates": "sum_count_star(0) AS count(*)", 185 "Inputs": [ 186 { 187 "OperatorType": "Route", 188 "Variant": "Scatter", 189 "Keyspace": { 190 "Name": "user", 191 "Sharded": true 192 }, 193 "FieldQuery": "select count(*) from `user` where 1 != 1", 194 "Query": "select /*vt+ QUERY_TIMEOUT_MS=1000 */ count(*) from `user`", 195 "QueryTimeout": 1000, 196 "Table": "`user`" 197 } 198 ] 199 }, 200 "TablesUsed": [ 201 "user.user" 202 ] 203 } 204 }, 205 { 206 "comment": "select limit with timeout directive sets QueryTimeout in the route", 207 "query": "select /*vt+ QUERY_TIMEOUT_MS=1000 */ * from user limit 10", 208 "v3-plan": { 209 "QueryType": "SELECT", 210 "Original": "select /*vt+ QUERY_TIMEOUT_MS=1000 */ * from user limit 10", 211 "Instructions": { 212 "OperatorType": "Limit", 213 "Count": "INT64(10)", 214 "Inputs": [ 215 { 216 "OperatorType": "Route", 217 "Variant": "Scatter", 218 "Keyspace": { 219 "Name": "user", 220 "Sharded": true 221 }, 222 "FieldQuery": "select * from `user` where 1 != 1", 223 "Query": "select /*vt+ QUERY_TIMEOUT_MS=1000 */ * from `user` limit :__upper_limit", 224 "QueryTimeout": 1000, 225 "Table": "`user`" 226 } 227 ] 228 } 229 }, 230 "gen4-plan": { 231 "QueryType": "SELECT", 232 "Original": "select /*vt+ QUERY_TIMEOUT_MS=1000 */ * from user limit 10", 233 "Instructions": { 234 "OperatorType": "Limit", 235 "Count": "INT64(10)", 236 "Inputs": [ 237 { 238 "OperatorType": "Route", 239 "Variant": "Scatter", 240 "Keyspace": { 241 "Name": "user", 242 "Sharded": true 243 }, 244 "FieldQuery": "select * from `user` where 1 != 1", 245 "Query": "select /*vt+ QUERY_TIMEOUT_MS=1000 */ * from `user` limit :__upper_limit", 246 "QueryTimeout": 1000, 247 "Table": "`user`" 248 } 249 ] 250 }, 251 "TablesUsed": [ 252 "user.user" 253 ] 254 } 255 }, 256 { 257 "comment": "select limit with timeout directive sets QueryTimeout in the route", 258 "query": "select /*vt+ QUERY_TIMEOUT_MS=1000 */ * from main.unsharded limit 10", 259 "v3-plan": { 260 "QueryType": "SELECT", 261 "Original": "select /*vt+ QUERY_TIMEOUT_MS=1000 */ * from main.unsharded limit 10", 262 "Instructions": { 263 "OperatorType": "Route", 264 "Variant": "Unsharded", 265 "Keyspace": { 266 "Name": "main", 267 "Sharded": false 268 }, 269 "FieldQuery": "select * from unsharded where 1 != 1", 270 "Query": "select /*vt+ QUERY_TIMEOUT_MS=1000 */ * from unsharded limit 10", 271 "QueryTimeout": 1000, 272 "Table": "unsharded" 273 } 274 }, 275 "gen4-plan": { 276 "QueryType": "SELECT", 277 "Original": "select /*vt+ QUERY_TIMEOUT_MS=1000 */ * from main.unsharded limit 10", 278 "Instructions": { 279 "OperatorType": "Route", 280 "Variant": "Unsharded", 281 "Keyspace": { 282 "Name": "main", 283 "Sharded": false 284 }, 285 "FieldQuery": "select * from unsharded where 1 != 1", 286 "Query": "select /*vt+ QUERY_TIMEOUT_MS=1000 */ * from unsharded limit 10", 287 "QueryTimeout": 1000, 288 "Table": "unsharded" 289 }, 290 "TablesUsed": [ 291 "main.unsharded" 292 ] 293 } 294 }, 295 { 296 "comment": "select with partial scatter directive", 297 "query": "select /*vt+ SCATTER_ERRORS_AS_WARNINGS */ * from user", 298 "v3-plan": { 299 "QueryType": "SELECT", 300 "Original": "select /*vt+ SCATTER_ERRORS_AS_WARNINGS */ * from user", 301 "Instructions": { 302 "OperatorType": "Route", 303 "Variant": "Scatter", 304 "Keyspace": { 305 "Name": "user", 306 "Sharded": true 307 }, 308 "FieldQuery": "select * from `user` where 1 != 1", 309 "Query": "select /*vt+ SCATTER_ERRORS_AS_WARNINGS */ * from `user`", 310 "ScatterErrorsAsWarnings": true, 311 "Table": "`user`" 312 } 313 }, 314 "gen4-plan": { 315 "QueryType": "SELECT", 316 "Original": "select /*vt+ SCATTER_ERRORS_AS_WARNINGS */ * from user", 317 "Instructions": { 318 "OperatorType": "Route", 319 "Variant": "Scatter", 320 "Keyspace": { 321 "Name": "user", 322 "Sharded": true 323 }, 324 "FieldQuery": "select * from `user` where 1 != 1", 325 "Query": "select /*vt+ SCATTER_ERRORS_AS_WARNINGS */ * from `user`", 326 "ScatterErrorsAsWarnings": true, 327 "Table": "`user`" 328 }, 329 "TablesUsed": [ 330 "user.user" 331 ] 332 } 333 }, 334 { 335 "comment": "select aggregation with partial scatter directive", 336 "query": "select /*vt+ SCATTER_ERRORS_AS_WARNINGS=1 */ count(*) from user", 337 "v3-plan": { 338 "QueryType": "SELECT", 339 "Original": "select /*vt+ SCATTER_ERRORS_AS_WARNINGS=1 */ count(*) from user", 340 "Instructions": { 341 "OperatorType": "Aggregate", 342 "Variant": "Scalar", 343 "Aggregates": "sum_count(0) AS count", 344 "Inputs": [ 345 { 346 "OperatorType": "Route", 347 "Variant": "Scatter", 348 "Keyspace": { 349 "Name": "user", 350 "Sharded": true 351 }, 352 "FieldQuery": "select count(*) from `user` where 1 != 1", 353 "Query": "select /*vt+ SCATTER_ERRORS_AS_WARNINGS=1 */ count(*) from `user`", 354 "ScatterErrorsAsWarnings": true, 355 "Table": "`user`" 356 } 357 ] 358 } 359 }, 360 "gen4-plan": { 361 "QueryType": "SELECT", 362 "Original": "select /*vt+ SCATTER_ERRORS_AS_WARNINGS=1 */ count(*) from user", 363 "Instructions": { 364 "OperatorType": "Aggregate", 365 "Variant": "Scalar", 366 "Aggregates": "sum_count_star(0) AS count(*)", 367 "Inputs": [ 368 { 369 "OperatorType": "Route", 370 "Variant": "Scatter", 371 "Keyspace": { 372 "Name": "user", 373 "Sharded": true 374 }, 375 "FieldQuery": "select count(*) from `user` where 1 != 1", 376 "Query": "select /*vt+ SCATTER_ERRORS_AS_WARNINGS=1 */ count(*) from `user`", 377 "ScatterErrorsAsWarnings": true, 378 "Table": "`user`" 379 } 380 ] 381 }, 382 "TablesUsed": [ 383 "user.user" 384 ] 385 } 386 }, 387 { 388 "comment": "select aggregation with partial scatter directive - added comments to try to confuse the hint extraction", 389 "query": "/*VT_SPAN_CONTEXT=123*/select /*vt+ SCATTER_ERRORS_AS_WARNINGS=1 */ count(*) from user", 390 "v3-plan": { 391 "QueryType": "SELECT", 392 "Original": "/*VT_SPAN_CONTEXT=123*/select /*vt+ SCATTER_ERRORS_AS_WARNINGS=1 */ count(*) from user", 393 "Instructions": { 394 "OperatorType": "Aggregate", 395 "Variant": "Scalar", 396 "Aggregates": "sum_count(0) AS count", 397 "Inputs": [ 398 { 399 "OperatorType": "Route", 400 "Variant": "Scatter", 401 "Keyspace": { 402 "Name": "user", 403 "Sharded": true 404 }, 405 "FieldQuery": "select count(*) from `user` where 1 != 1", 406 "Query": "select /*vt+ SCATTER_ERRORS_AS_WARNINGS=1 */ count(*) from `user`", 407 "ScatterErrorsAsWarnings": true, 408 "Table": "`user`" 409 } 410 ] 411 } 412 }, 413 "gen4-plan": { 414 "QueryType": "SELECT", 415 "Original": "/*VT_SPAN_CONTEXT=123*/select /*vt+ SCATTER_ERRORS_AS_WARNINGS=1 */ count(*) from user", 416 "Instructions": { 417 "OperatorType": "Aggregate", 418 "Variant": "Scalar", 419 "Aggregates": "sum_count_star(0) AS count(*)", 420 "Inputs": [ 421 { 422 "OperatorType": "Route", 423 "Variant": "Scatter", 424 "Keyspace": { 425 "Name": "user", 426 "Sharded": true 427 }, 428 "FieldQuery": "select count(*) from `user` where 1 != 1", 429 "Query": "select /*vt+ SCATTER_ERRORS_AS_WARNINGS=1 */ count(*) from `user`", 430 "ScatterErrorsAsWarnings": true, 431 "Table": "`user`" 432 } 433 ] 434 }, 435 "TablesUsed": [ 436 "user.user" 437 ] 438 } 439 }, 440 { 441 "comment": "select limit with partial scatter directive", 442 "query": "select /*vt+ SCATTER_ERRORS_AS_WARNINGS=1 */ * from user limit 10", 443 "v3-plan": { 444 "QueryType": "SELECT", 445 "Original": "select /*vt+ SCATTER_ERRORS_AS_WARNINGS=1 */ * from user limit 10", 446 "Instructions": { 447 "OperatorType": "Limit", 448 "Count": "INT64(10)", 449 "Inputs": [ 450 { 451 "OperatorType": "Route", 452 "Variant": "Scatter", 453 "Keyspace": { 454 "Name": "user", 455 "Sharded": true 456 }, 457 "FieldQuery": "select * from `user` where 1 != 1", 458 "Query": "select /*vt+ SCATTER_ERRORS_AS_WARNINGS=1 */ * from `user` limit :__upper_limit", 459 "ScatterErrorsAsWarnings": true, 460 "Table": "`user`" 461 } 462 ] 463 } 464 }, 465 "gen4-plan": { 466 "QueryType": "SELECT", 467 "Original": "select /*vt+ SCATTER_ERRORS_AS_WARNINGS=1 */ * from user limit 10", 468 "Instructions": { 469 "OperatorType": "Limit", 470 "Count": "INT64(10)", 471 "Inputs": [ 472 { 473 "OperatorType": "Route", 474 "Variant": "Scatter", 475 "Keyspace": { 476 "Name": "user", 477 "Sharded": true 478 }, 479 "FieldQuery": "select * from `user` where 1 != 1", 480 "Query": "select /*vt+ SCATTER_ERRORS_AS_WARNINGS=1 */ * from `user` limit :__upper_limit", 481 "ScatterErrorsAsWarnings": true, 482 "Table": "`user`" 483 } 484 ] 485 }, 486 "TablesUsed": [ 487 "user.user" 488 ] 489 } 490 }, 491 { 492 "comment": "qualified '*' expression for simple route", 493 "query": "select user.* from user", 494 "v3-plan": { 495 "QueryType": "SELECT", 496 "Original": "select user.* from user", 497 "Instructions": { 498 "OperatorType": "Route", 499 "Variant": "Scatter", 500 "Keyspace": { 501 "Name": "user", 502 "Sharded": true 503 }, 504 "FieldQuery": "select `user`.* from `user` where 1 != 1", 505 "Query": "select `user`.* from `user`", 506 "Table": "`user`" 507 } 508 }, 509 "gen4-plan": { 510 "QueryType": "SELECT", 511 "Original": "select user.* from user", 512 "Instructions": { 513 "OperatorType": "Route", 514 "Variant": "Scatter", 515 "Keyspace": { 516 "Name": "user", 517 "Sharded": true 518 }, 519 "FieldQuery": "select `user`.* from `user` where 1 != 1", 520 "Query": "select `user`.* from `user`", 521 "Table": "`user`" 522 }, 523 "TablesUsed": [ 524 "user.user" 525 ] 526 } 527 }, 528 { 529 "comment": "fully qualified '*' expression for simple route", 530 "query": "select user.user.* from user.user", 531 "v3-plan": { 532 "QueryType": "SELECT", 533 "Original": "select user.user.* from user.user", 534 "Instructions": { 535 "OperatorType": "Route", 536 "Variant": "Scatter", 537 "Keyspace": { 538 "Name": "user", 539 "Sharded": true 540 }, 541 "FieldQuery": "select `user`.* from `user` where 1 != 1", 542 "Query": "select `user`.* from `user`", 543 "Table": "`user`" 544 } 545 }, 546 "gen4-plan": { 547 "QueryType": "SELECT", 548 "Original": "select user.user.* from user.user", 549 "Instructions": { 550 "OperatorType": "Route", 551 "Variant": "Scatter", 552 "Keyspace": { 553 "Name": "user", 554 "Sharded": true 555 }, 556 "FieldQuery": "select `user`.* from `user` where 1 != 1", 557 "Query": "select `user`.* from `user`", 558 "Table": "`user`" 559 }, 560 "TablesUsed": [ 561 "user.user" 562 ] 563 } 564 }, 565 { 566 "comment": "select * from authoritative table", 567 "query": "select * from authoritative", 568 "v3-plan": { 569 "QueryType": "SELECT", 570 "Original": "select * from authoritative", 571 "Instructions": { 572 "OperatorType": "Route", 573 "Variant": "Scatter", 574 "Keyspace": { 575 "Name": "user", 576 "Sharded": true 577 }, 578 "FieldQuery": "select user_id, col1, col2 from authoritative where 1 != 1", 579 "Query": "select user_id, col1, col2 from authoritative", 580 "Table": "authoritative" 581 } 582 }, 583 "gen4-plan": { 584 "QueryType": "SELECT", 585 "Original": "select * from authoritative", 586 "Instructions": { 587 "OperatorType": "Route", 588 "Variant": "Scatter", 589 "Keyspace": { 590 "Name": "user", 591 "Sharded": true 592 }, 593 "FieldQuery": "select user_id, col1, col2 from authoritative where 1 != 1", 594 "Query": "select user_id, col1, col2 from authoritative", 595 "Table": "authoritative" 596 }, 597 "TablesUsed": [ 598 "user.authoritative" 599 ] 600 } 601 }, 602 { 603 "comment": "select * from join of authoritative tables", 604 "query": "select * from authoritative a join authoritative b on a.user_id=b.user_id", 605 "v3-plan": { 606 "QueryType": "SELECT", 607 "Original": "select * from authoritative a join authoritative b on a.user_id=b.user_id", 608 "Instructions": { 609 "OperatorType": "Route", 610 "Variant": "Scatter", 611 "Keyspace": { 612 "Name": "user", 613 "Sharded": true 614 }, 615 "FieldQuery": "select a.user_id as user_id, a.col1 as col1, a.col2 as col2, b.user_id as user_id, b.col1 as col1, b.col2 as col2 from authoritative as a join authoritative as b on a.user_id = b.user_id where 1 != 1", 616 "Query": "select a.user_id as user_id, a.col1 as col1, a.col2 as col2, b.user_id as user_id, b.col1 as col1, b.col2 as col2 from authoritative as a join authoritative as b on a.user_id = b.user_id", 617 "Table": "authoritative" 618 } 619 }, 620 "gen4-plan": { 621 "QueryType": "SELECT", 622 "Original": "select * from authoritative a join authoritative b on a.user_id=b.user_id", 623 "Instructions": { 624 "OperatorType": "Route", 625 "Variant": "Scatter", 626 "Keyspace": { 627 "Name": "user", 628 "Sharded": true 629 }, 630 "FieldQuery": "select a.user_id as user_id, a.col1 as col1, a.col2 as col2, b.user_id as user_id, b.col1 as col1, b.col2 as col2 from authoritative as a, authoritative as b where 1 != 1", 631 "Query": "select a.user_id as user_id, a.col1 as col1, a.col2 as col2, b.user_id as user_id, b.col1 as col1, b.col2 as col2 from authoritative as a, authoritative as b where a.user_id = b.user_id", 632 "Table": "authoritative" 633 }, 634 "TablesUsed": [ 635 "user.authoritative" 636 ] 637 } 638 }, 639 { 640 "comment": "test table lookup failure for authoritative code path", 641 "query": "select a.* from authoritative", 642 "v3-plan": "VT05004: table 'a' does not exist", 643 "gen4-plan": "Unknown table 'a'" 644 }, 645 { 646 "comment": "select * from qualified authoritative table", 647 "query": "select a.* from authoritative a", 648 "v3-plan": { 649 "QueryType": "SELECT", 650 "Original": "select a.* from authoritative a", 651 "Instructions": { 652 "OperatorType": "Route", 653 "Variant": "Scatter", 654 "Keyspace": { 655 "Name": "user", 656 "Sharded": true 657 }, 658 "FieldQuery": "select a.user_id, a.col1, a.col2 from authoritative as a where 1 != 1", 659 "Query": "select a.user_id, a.col1, a.col2 from authoritative as a", 660 "Table": "authoritative" 661 } 662 }, 663 "gen4-plan": { 664 "QueryType": "SELECT", 665 "Original": "select a.* from authoritative a", 666 "Instructions": { 667 "OperatorType": "Route", 668 "Variant": "Scatter", 669 "Keyspace": { 670 "Name": "user", 671 "Sharded": true 672 }, 673 "FieldQuery": "select a.user_id, a.col1, a.col2 from authoritative as a where 1 != 1", 674 "Query": "select a.user_id, a.col1, a.col2 from authoritative as a", 675 "Table": "authoritative" 676 }, 677 "TablesUsed": [ 678 "user.authoritative" 679 ] 680 } 681 }, 682 { 683 "comment": "select * from intermixing of authoritative table with non-authoritative results in no expansion", 684 "query": "select * from authoritative join user on authoritative.user_id=user.id", 685 "v3-plan": { 686 "QueryType": "SELECT", 687 "Original": "select * from authoritative join user on authoritative.user_id=user.id", 688 "Instructions": { 689 "OperatorType": "Route", 690 "Variant": "Scatter", 691 "Keyspace": { 692 "Name": "user", 693 "Sharded": true 694 }, 695 "FieldQuery": "select * from authoritative join `user` on authoritative.user_id = `user`.id where 1 != 1", 696 "Query": "select * from authoritative join `user` on authoritative.user_id = `user`.id", 697 "Table": "authoritative, `user`" 698 } 699 }, 700 "gen4-plan": { 701 "QueryType": "SELECT", 702 "Original": "select * from authoritative join user on authoritative.user_id=user.id", 703 "Instructions": { 704 "OperatorType": "Route", 705 "Variant": "Scatter", 706 "Keyspace": { 707 "Name": "user", 708 "Sharded": true 709 }, 710 "FieldQuery": "select * from authoritative, `user` where 1 != 1", 711 "Query": "select * from authoritative, `user` where authoritative.user_id = `user`.id", 712 "Table": "`user`, authoritative" 713 }, 714 "TablesUsed": [ 715 "user.authoritative", 716 "user.user" 717 ] 718 } 719 }, 720 { 721 "comment": "select authoritative.* with intermixing still expands", 722 "query": "select user.id, a.*, user.col1 from authoritative a join user on a.user_id=user.id", 723 "v3-plan": { 724 "QueryType": "SELECT", 725 "Original": "select user.id, a.*, user.col1 from authoritative a join user on a.user_id=user.id", 726 "Instructions": { 727 "OperatorType": "Route", 728 "Variant": "Scatter", 729 "Keyspace": { 730 "Name": "user", 731 "Sharded": true 732 }, 733 "FieldQuery": "select `user`.id, a.user_id, a.col1, a.col2, `user`.col1 from authoritative as a join `user` on a.user_id = `user`.id where 1 != 1", 734 "Query": "select `user`.id, a.user_id, a.col1, a.col2, `user`.col1 from authoritative as a join `user` on a.user_id = `user`.id", 735 "Table": "authoritative, `user`" 736 } 737 }, 738 "gen4-plan": { 739 "QueryType": "SELECT", 740 "Original": "select user.id, a.*, user.col1 from authoritative a join user on a.user_id=user.id", 741 "Instructions": { 742 "OperatorType": "Route", 743 "Variant": "Scatter", 744 "Keyspace": { 745 "Name": "user", 746 "Sharded": true 747 }, 748 "FieldQuery": "select `user`.id, a.user_id as user_id, a.col1 as col1, a.col2 as col2, `user`.col1 from authoritative as a, `user` where 1 != 1", 749 "Query": "select `user`.id, a.user_id as user_id, a.col1 as col1, a.col2 as col2, `user`.col1 from authoritative as a, `user` where a.user_id = `user`.id", 750 "Table": "`user`, authoritative" 751 }, 752 "TablesUsed": [ 753 "user.authoritative", 754 "user.user" 755 ] 756 } 757 }, 758 { 759 "comment": "auto-resolve anonymous columns for simple route", 760 "query": "select anon_col from user join user_extra on user.id = user_extra.user_id", 761 "v3-plan": { 762 "QueryType": "SELECT", 763 "Original": "select anon_col from user join user_extra on user.id = user_extra.user_id", 764 "Instructions": { 765 "OperatorType": "Route", 766 "Variant": "Scatter", 767 "Keyspace": { 768 "Name": "user", 769 "Sharded": true 770 }, 771 "FieldQuery": "select anon_col from `user` join user_extra on `user`.id = user_extra.user_id where 1 != 1", 772 "Query": "select anon_col from `user` join user_extra on `user`.id = user_extra.user_id", 773 "Table": "`user`, user_extra" 774 } 775 }, 776 "gen4-plan": { 777 "QueryType": "SELECT", 778 "Original": "select anon_col from user join user_extra on user.id = user_extra.user_id", 779 "Instructions": { 780 "OperatorType": "Route", 781 "Variant": "Scatter", 782 "Keyspace": { 783 "Name": "user", 784 "Sharded": true 785 }, 786 "FieldQuery": "select anon_col from `user`, user_extra where 1 != 1", 787 "Query": "select anon_col from `user`, user_extra where `user`.id = user_extra.user_id", 788 "Table": "`user`, user_extra" 789 }, 790 "TablesUsed": [ 791 "user.user", 792 "user.user_extra" 793 ] 794 } 795 }, 796 { 797 "comment": "Cannot auto-resolve for cross-shard joins", 798 "query": "select col from user join user_extra", 799 "v3-plan": "VT03019: symbol col not found", 800 "gen4-plan": "Column 'col' in field list is ambiguous" 801 }, 802 { 803 "comment": "Auto-resolve should work if unique vindex columns are referenced", 804 "query": "select id, user_id from user join user_extra", 805 "v3-plan": { 806 "QueryType": "SELECT", 807 "Original": "select id, user_id from user join user_extra", 808 "Instructions": { 809 "OperatorType": "Join", 810 "Variant": "Join", 811 "JoinColumnIndexes": "L:0,R:0", 812 "TableName": "`user`_user_extra", 813 "Inputs": [ 814 { 815 "OperatorType": "Route", 816 "Variant": "Scatter", 817 "Keyspace": { 818 "Name": "user", 819 "Sharded": true 820 }, 821 "FieldQuery": "select id from `user` where 1 != 1", 822 "Query": "select id from `user`", 823 "Table": "`user`" 824 }, 825 { 826 "OperatorType": "Route", 827 "Variant": "Scatter", 828 "Keyspace": { 829 "Name": "user", 830 "Sharded": true 831 }, 832 "FieldQuery": "select user_id from user_extra where 1 != 1", 833 "Query": "select user_id from user_extra", 834 "Table": "user_extra" 835 } 836 ] 837 } 838 }, 839 "gen4-plan": { 840 "QueryType": "SELECT", 841 "Original": "select id, user_id from user join user_extra", 842 "Instructions": { 843 "OperatorType": "Join", 844 "Variant": "Join", 845 "JoinColumnIndexes": "L:0,R:0", 846 "TableName": "`user`_user_extra", 847 "Inputs": [ 848 { 849 "OperatorType": "Route", 850 "Variant": "Scatter", 851 "Keyspace": { 852 "Name": "user", 853 "Sharded": true 854 }, 855 "FieldQuery": "select id from `user` where 1 != 1", 856 "Query": "select id from `user`", 857 "Table": "`user`" 858 }, 859 { 860 "OperatorType": "Route", 861 "Variant": "Scatter", 862 "Keyspace": { 863 "Name": "user", 864 "Sharded": true 865 }, 866 "FieldQuery": "select user_id from user_extra where 1 != 1", 867 "Query": "select user_id from user_extra", 868 "Table": "user_extra" 869 } 870 ] 871 }, 872 "TablesUsed": [ 873 "user.user", 874 "user.user_extra" 875 ] 876 } 877 }, 878 { 879 "comment": "database calls should be substituted", 880 "query": "select database() from dual", 881 "v3-plan": { 882 "QueryType": "SELECT", 883 "Original": "select database() from dual", 884 "Instructions": { 885 "OperatorType": "Projection", 886 "Expressions": [ 887 ":__vtdbname as database()" 888 ], 889 "Inputs": [ 890 { 891 "OperatorType": "SingleRow" 892 } 893 ] 894 } 895 }, 896 "gen4-plan": { 897 "QueryType": "SELECT", 898 "Original": "select database() from dual", 899 "Instructions": { 900 "OperatorType": "Projection", 901 "Expressions": [ 902 ":__vtdbname as database()" 903 ], 904 "Inputs": [ 905 { 906 "OperatorType": "SingleRow" 907 } 908 ] 909 }, 910 "TablesUsed": [ 911 "main.dual" 912 ] 913 } 914 }, 915 { 916 "comment": "last_insert_id for unsharded route", 917 "query": "select last_insert_id() as x from main.unsharded", 918 "v3-plan": { 919 "QueryType": "SELECT", 920 "Original": "select last_insert_id() as x from main.unsharded", 921 "Instructions": { 922 "OperatorType": "Route", 923 "Variant": "Unsharded", 924 "Keyspace": { 925 "Name": "main", 926 "Sharded": false 927 }, 928 "FieldQuery": "select :__lastInsertId as x from unsharded where 1 != 1", 929 "Query": "select :__lastInsertId as x from unsharded", 930 "Table": "unsharded" 931 } 932 }, 933 "gen4-plan": { 934 "QueryType": "SELECT", 935 "Original": "select last_insert_id() as x from main.unsharded", 936 "Instructions": { 937 "OperatorType": "Route", 938 "Variant": "Unsharded", 939 "Keyspace": { 940 "Name": "main", 941 "Sharded": false 942 }, 943 "FieldQuery": "select :__lastInsertId as x from unsharded where 1 != 1", 944 "Query": "select :__lastInsertId as x from unsharded", 945 "Table": "unsharded" 946 }, 947 "TablesUsed": [ 948 "main.unsharded" 949 ] 950 } 951 }, 952 { 953 "comment": "select from dual on unqualified keyspace", 954 "query": "select @@session.auto_increment_increment from dual", 955 "v3-plan": { 956 "QueryType": "SELECT", 957 "Original": "select @@session.auto_increment_increment from dual", 958 "Instructions": { 959 "OperatorType": "Route", 960 "Variant": "Reference", 961 "Keyspace": { 962 "Name": "main", 963 "Sharded": false 964 }, 965 "FieldQuery": "select @@auto_increment_increment from dual where 1 != 1", 966 "Query": "select @@auto_increment_increment from dual", 967 "Table": "dual" 968 } 969 }, 970 "gen4-plan": { 971 "QueryType": "SELECT", 972 "Original": "select @@session.auto_increment_increment from dual", 973 "Instructions": { 974 "OperatorType": "Route", 975 "Variant": "Reference", 976 "Keyspace": { 977 "Name": "main", 978 "Sharded": false 979 }, 980 "FieldQuery": "select @@auto_increment_increment from dual where 1 != 1", 981 "Query": "select @@auto_increment_increment from dual", 982 "Table": "dual" 983 }, 984 "TablesUsed": [ 985 "main.dual" 986 ] 987 } 988 }, 989 { 990 "comment": "select from pinned table", 991 "query": "select * from pin_test", 992 "v3-plan": { 993 "QueryType": "SELECT", 994 "Original": "select * from pin_test", 995 "Instructions": { 996 "OperatorType": "Route", 997 "Variant": "EqualUnique", 998 "Keyspace": { 999 "Name": "user", 1000 "Sharded": true 1001 }, 1002 "FieldQuery": "select * from pin_test where 1 != 1", 1003 "Query": "select * from pin_test", 1004 "Table": "pin_test", 1005 "Values": [ 1006 "VARCHAR(\"\\x80\")" 1007 ], 1008 "Vindex": "binary" 1009 } 1010 }, 1011 "gen4-plan": { 1012 "QueryType": "SELECT", 1013 "Original": "select * from pin_test", 1014 "Instructions": { 1015 "OperatorType": "Route", 1016 "Variant": "EqualUnique", 1017 "Keyspace": { 1018 "Name": "user", 1019 "Sharded": true 1020 }, 1021 "FieldQuery": "select * from pin_test where 1 != 1", 1022 "Query": "select * from pin_test", 1023 "Table": "pin_test", 1024 "Values": [ 1025 "VARCHAR(\"\\x80\")" 1026 ], 1027 "Vindex": "binary" 1028 }, 1029 "TablesUsed": [ 1030 "user.pin_test" 1031 ] 1032 } 1033 }, 1034 { 1035 "comment": "select from dual on sharded keyspace", 1036 "query": "select @@session.auto_increment_increment from user.dual", 1037 "v3-plan": { 1038 "QueryType": "SELECT", 1039 "Original": "select @@session.auto_increment_increment from user.dual", 1040 "Instructions": { 1041 "OperatorType": "Route", 1042 "Variant": "Reference", 1043 "Keyspace": { 1044 "Name": "user", 1045 "Sharded": true 1046 }, 1047 "FieldQuery": "select @@auto_increment_increment from dual where 1 != 1", 1048 "Query": "select @@auto_increment_increment from dual", 1049 "Table": "dual" 1050 } 1051 }, 1052 "gen4-plan": { 1053 "QueryType": "SELECT", 1054 "Original": "select @@session.auto_increment_increment from user.dual", 1055 "Instructions": { 1056 "OperatorType": "Route", 1057 "Variant": "Reference", 1058 "Keyspace": { 1059 "Name": "user", 1060 "Sharded": true 1061 }, 1062 "FieldQuery": "select @@auto_increment_increment from dual where 1 != 1", 1063 "Query": "select @@auto_increment_increment from dual", 1064 "Table": "dual" 1065 }, 1066 "TablesUsed": [ 1067 "user.dual" 1068 ] 1069 } 1070 }, 1071 { 1072 "comment": "RHS route referenced", 1073 "query": "select user_extra.id from user join user_extra", 1074 "v3-plan": { 1075 "QueryType": "SELECT", 1076 "Original": "select user_extra.id from user join user_extra", 1077 "Instructions": { 1078 "OperatorType": "Join", 1079 "Variant": "Join", 1080 "JoinColumnIndexes": "R:0", 1081 "TableName": "`user`_user_extra", 1082 "Inputs": [ 1083 { 1084 "OperatorType": "Route", 1085 "Variant": "Scatter", 1086 "Keyspace": { 1087 "Name": "user", 1088 "Sharded": true 1089 }, 1090 "FieldQuery": "select 1 from `user` where 1 != 1", 1091 "Query": "select 1 from `user`", 1092 "Table": "`user`" 1093 }, 1094 { 1095 "OperatorType": "Route", 1096 "Variant": "Scatter", 1097 "Keyspace": { 1098 "Name": "user", 1099 "Sharded": true 1100 }, 1101 "FieldQuery": "select user_extra.id from user_extra where 1 != 1", 1102 "Query": "select user_extra.id from user_extra", 1103 "Table": "user_extra" 1104 } 1105 ] 1106 } 1107 }, 1108 "gen4-plan": { 1109 "QueryType": "SELECT", 1110 "Original": "select user_extra.id from user join user_extra", 1111 "Instructions": { 1112 "OperatorType": "Join", 1113 "Variant": "Join", 1114 "JoinColumnIndexes": "R:0", 1115 "TableName": "`user`_user_extra", 1116 "Inputs": [ 1117 { 1118 "OperatorType": "Route", 1119 "Variant": "Scatter", 1120 "Keyspace": { 1121 "Name": "user", 1122 "Sharded": true 1123 }, 1124 "FieldQuery": "select 1 from `user` where 1 != 1", 1125 "Query": "select 1 from `user`", 1126 "Table": "`user`" 1127 }, 1128 { 1129 "OperatorType": "Route", 1130 "Variant": "Scatter", 1131 "Keyspace": { 1132 "Name": "user", 1133 "Sharded": true 1134 }, 1135 "FieldQuery": "select user_extra.id from user_extra where 1 != 1", 1136 "Query": "select user_extra.id from user_extra", 1137 "Table": "user_extra" 1138 } 1139 ] 1140 }, 1141 "TablesUsed": [ 1142 "user.user", 1143 "user.user_extra" 1144 ] 1145 } 1146 }, 1147 { 1148 "comment": "Both routes referenced", 1149 "query": "select user.col, user_extra.id from user join user_extra", 1150 "v3-plan": { 1151 "QueryType": "SELECT", 1152 "Original": "select user.col, user_extra.id from user join user_extra", 1153 "Instructions": { 1154 "OperatorType": "Join", 1155 "Variant": "Join", 1156 "JoinColumnIndexes": "L:0,R:0", 1157 "TableName": "`user`_user_extra", 1158 "Inputs": [ 1159 { 1160 "OperatorType": "Route", 1161 "Variant": "Scatter", 1162 "Keyspace": { 1163 "Name": "user", 1164 "Sharded": true 1165 }, 1166 "FieldQuery": "select `user`.col from `user` where 1 != 1", 1167 "Query": "select `user`.col from `user`", 1168 "Table": "`user`" 1169 }, 1170 { 1171 "OperatorType": "Route", 1172 "Variant": "Scatter", 1173 "Keyspace": { 1174 "Name": "user", 1175 "Sharded": true 1176 }, 1177 "FieldQuery": "select user_extra.id from user_extra where 1 != 1", 1178 "Query": "select user_extra.id from user_extra", 1179 "Table": "user_extra" 1180 } 1181 ] 1182 } 1183 }, 1184 "gen4-plan": { 1185 "QueryType": "SELECT", 1186 "Original": "select user.col, user_extra.id from user join user_extra", 1187 "Instructions": { 1188 "OperatorType": "Join", 1189 "Variant": "Join", 1190 "JoinColumnIndexes": "L:0,R:0", 1191 "TableName": "`user`_user_extra", 1192 "Inputs": [ 1193 { 1194 "OperatorType": "Route", 1195 "Variant": "Scatter", 1196 "Keyspace": { 1197 "Name": "user", 1198 "Sharded": true 1199 }, 1200 "FieldQuery": "select `user`.col from `user` where 1 != 1", 1201 "Query": "select `user`.col from `user`", 1202 "Table": "`user`" 1203 }, 1204 { 1205 "OperatorType": "Route", 1206 "Variant": "Scatter", 1207 "Keyspace": { 1208 "Name": "user", 1209 "Sharded": true 1210 }, 1211 "FieldQuery": "select user_extra.id from user_extra where 1 != 1", 1212 "Query": "select user_extra.id from user_extra", 1213 "Table": "user_extra" 1214 } 1215 ] 1216 }, 1217 "TablesUsed": [ 1218 "user.user", 1219 "user.user_extra" 1220 ] 1221 } 1222 }, 1223 { 1224 "comment": "Expression with single-route reference", 1225 "query": "select user.col, user_extra.id + user_extra.col from user join user_extra", 1226 "v3-plan": { 1227 "QueryType": "SELECT", 1228 "Original": "select user.col, user_extra.id + user_extra.col from user join user_extra", 1229 "Instructions": { 1230 "OperatorType": "Join", 1231 "Variant": "Join", 1232 "JoinColumnIndexes": "L:0,R:0", 1233 "TableName": "`user`_user_extra", 1234 "Inputs": [ 1235 { 1236 "OperatorType": "Route", 1237 "Variant": "Scatter", 1238 "Keyspace": { 1239 "Name": "user", 1240 "Sharded": true 1241 }, 1242 "FieldQuery": "select `user`.col from `user` where 1 != 1", 1243 "Query": "select `user`.col from `user`", 1244 "Table": "`user`" 1245 }, 1246 { 1247 "OperatorType": "Route", 1248 "Variant": "Scatter", 1249 "Keyspace": { 1250 "Name": "user", 1251 "Sharded": true 1252 }, 1253 "FieldQuery": "select user_extra.id + user_extra.col from user_extra where 1 != 1", 1254 "Query": "select user_extra.id + user_extra.col from user_extra", 1255 "Table": "user_extra" 1256 } 1257 ] 1258 } 1259 }, 1260 "gen4-plan": { 1261 "QueryType": "SELECT", 1262 "Original": "select user.col, user_extra.id + user_extra.col from user join user_extra", 1263 "Instructions": { 1264 "OperatorType": "Join", 1265 "Variant": "Join", 1266 "JoinColumnIndexes": "L:0,R:0", 1267 "TableName": "`user`_user_extra", 1268 "Inputs": [ 1269 { 1270 "OperatorType": "Route", 1271 "Variant": "Scatter", 1272 "Keyspace": { 1273 "Name": "user", 1274 "Sharded": true 1275 }, 1276 "FieldQuery": "select `user`.col from `user` where 1 != 1", 1277 "Query": "select `user`.col from `user`", 1278 "Table": "`user`" 1279 }, 1280 { 1281 "OperatorType": "Route", 1282 "Variant": "Scatter", 1283 "Keyspace": { 1284 "Name": "user", 1285 "Sharded": true 1286 }, 1287 "FieldQuery": "select user_extra.id + user_extra.col from user_extra where 1 != 1", 1288 "Query": "select user_extra.id + user_extra.col from user_extra", 1289 "Table": "user_extra" 1290 } 1291 ] 1292 }, 1293 "TablesUsed": [ 1294 "user.user", 1295 "user.user_extra" 1296 ] 1297 } 1298 }, 1299 { 1300 "comment": "Jumbled references", 1301 "query": "select user.col, user_extra.id, user.col2 from user join user_extra", 1302 "v3-plan": { 1303 "QueryType": "SELECT", 1304 "Original": "select user.col, user_extra.id, user.col2 from user join user_extra", 1305 "Instructions": { 1306 "OperatorType": "Join", 1307 "Variant": "Join", 1308 "JoinColumnIndexes": "L:0,R:0,L:1", 1309 "TableName": "`user`_user_extra", 1310 "Inputs": [ 1311 { 1312 "OperatorType": "Route", 1313 "Variant": "Scatter", 1314 "Keyspace": { 1315 "Name": "user", 1316 "Sharded": true 1317 }, 1318 "FieldQuery": "select `user`.col, `user`.col2 from `user` where 1 != 1", 1319 "Query": "select `user`.col, `user`.col2 from `user`", 1320 "Table": "`user`" 1321 }, 1322 { 1323 "OperatorType": "Route", 1324 "Variant": "Scatter", 1325 "Keyspace": { 1326 "Name": "user", 1327 "Sharded": true 1328 }, 1329 "FieldQuery": "select user_extra.id from user_extra where 1 != 1", 1330 "Query": "select user_extra.id from user_extra", 1331 "Table": "user_extra" 1332 } 1333 ] 1334 } 1335 }, 1336 "gen4-plan": { 1337 "QueryType": "SELECT", 1338 "Original": "select user.col, user_extra.id, user.col2 from user join user_extra", 1339 "Instructions": { 1340 "OperatorType": "Join", 1341 "Variant": "Join", 1342 "JoinColumnIndexes": "L:0,R:0,L:1", 1343 "TableName": "`user`_user_extra", 1344 "Inputs": [ 1345 { 1346 "OperatorType": "Route", 1347 "Variant": "Scatter", 1348 "Keyspace": { 1349 "Name": "user", 1350 "Sharded": true 1351 }, 1352 "FieldQuery": "select `user`.col, `user`.col2 from `user` where 1 != 1", 1353 "Query": "select `user`.col, `user`.col2 from `user`", 1354 "Table": "`user`" 1355 }, 1356 { 1357 "OperatorType": "Route", 1358 "Variant": "Scatter", 1359 "Keyspace": { 1360 "Name": "user", 1361 "Sharded": true 1362 }, 1363 "FieldQuery": "select user_extra.id from user_extra where 1 != 1", 1364 "Query": "select user_extra.id from user_extra", 1365 "Table": "user_extra" 1366 } 1367 ] 1368 }, 1369 "TablesUsed": [ 1370 "user.user", 1371 "user.user_extra" 1372 ] 1373 } 1374 }, 1375 { 1376 "comment": "Comments", 1377 "query": "select /* comment */ user.col from user join user_extra", 1378 "v3-plan": { 1379 "QueryType": "SELECT", 1380 "Original": "select /* comment */ user.col from user join user_extra", 1381 "Instructions": { 1382 "OperatorType": "Join", 1383 "Variant": "Join", 1384 "JoinColumnIndexes": "L:0", 1385 "TableName": "`user`_user_extra", 1386 "Inputs": [ 1387 { 1388 "OperatorType": "Route", 1389 "Variant": "Scatter", 1390 "Keyspace": { 1391 "Name": "user", 1392 "Sharded": true 1393 }, 1394 "FieldQuery": "select `user`.col from `user` where 1 != 1", 1395 "Query": "select /* comment */ `user`.col from `user`", 1396 "Table": "`user`" 1397 }, 1398 { 1399 "OperatorType": "Route", 1400 "Variant": "Scatter", 1401 "Keyspace": { 1402 "Name": "user", 1403 "Sharded": true 1404 }, 1405 "FieldQuery": "select 1 from user_extra where 1 != 1", 1406 "Query": "select /* comment */ 1 from user_extra", 1407 "Table": "user_extra" 1408 } 1409 ] 1410 } 1411 }, 1412 "gen4-plan": { 1413 "QueryType": "SELECT", 1414 "Original": "select /* comment */ user.col from user join user_extra", 1415 "Instructions": { 1416 "OperatorType": "Join", 1417 "Variant": "Join", 1418 "JoinColumnIndexes": "L:0", 1419 "TableName": "`user`_user_extra", 1420 "Inputs": [ 1421 { 1422 "OperatorType": "Route", 1423 "Variant": "Scatter", 1424 "Keyspace": { 1425 "Name": "user", 1426 "Sharded": true 1427 }, 1428 "FieldQuery": "select `user`.col from `user` where 1 != 1", 1429 "Query": "select /* comment */ `user`.col from `user`", 1430 "Table": "`user`" 1431 }, 1432 { 1433 "OperatorType": "Route", 1434 "Variant": "Scatter", 1435 "Keyspace": { 1436 "Name": "user", 1437 "Sharded": true 1438 }, 1439 "FieldQuery": "select 1 from user_extra where 1 != 1", 1440 "Query": "select /* comment */ 1 from user_extra", 1441 "Table": "user_extra" 1442 } 1443 ] 1444 }, 1445 "TablesUsed": [ 1446 "user.user", 1447 "user.user_extra" 1448 ] 1449 } 1450 }, 1451 { 1452 "comment": "for update", 1453 "query": "select user.col from user join user_extra for update", 1454 "v3-plan": { 1455 "QueryType": "SELECT", 1456 "Original": "select user.col from user join user_extra for update", 1457 "Instructions": { 1458 "OperatorType": "Join", 1459 "Variant": "Join", 1460 "JoinColumnIndexes": "L:0", 1461 "TableName": "`user`_user_extra", 1462 "Inputs": [ 1463 { 1464 "OperatorType": "Route", 1465 "Variant": "Scatter", 1466 "Keyspace": { 1467 "Name": "user", 1468 "Sharded": true 1469 }, 1470 "FieldQuery": "select `user`.col from `user` where 1 != 1", 1471 "Query": "select `user`.col from `user` for update", 1472 "Table": "`user`" 1473 }, 1474 { 1475 "OperatorType": "Route", 1476 "Variant": "Scatter", 1477 "Keyspace": { 1478 "Name": "user", 1479 "Sharded": true 1480 }, 1481 "FieldQuery": "select 1 from user_extra where 1 != 1", 1482 "Query": "select 1 from user_extra for update", 1483 "Table": "user_extra" 1484 } 1485 ] 1486 } 1487 }, 1488 "gen4-plan": { 1489 "QueryType": "SELECT", 1490 "Original": "select user.col from user join user_extra for update", 1491 "Instructions": { 1492 "OperatorType": "Join", 1493 "Variant": "Join", 1494 "JoinColumnIndexes": "L:0", 1495 "TableName": "`user`_user_extra", 1496 "Inputs": [ 1497 { 1498 "OperatorType": "Route", 1499 "Variant": "Scatter", 1500 "Keyspace": { 1501 "Name": "user", 1502 "Sharded": true 1503 }, 1504 "FieldQuery": "select `user`.col from `user` where 1 != 1", 1505 "Query": "select `user`.col from `user` for update", 1506 "Table": "`user`" 1507 }, 1508 { 1509 "OperatorType": "Route", 1510 "Variant": "Scatter", 1511 "Keyspace": { 1512 "Name": "user", 1513 "Sharded": true 1514 }, 1515 "FieldQuery": "select 1 from user_extra where 1 != 1", 1516 "Query": "select 1 from user_extra for update", 1517 "Table": "user_extra" 1518 } 1519 ] 1520 }, 1521 "TablesUsed": [ 1522 "user.user", 1523 "user.user_extra" 1524 ] 1525 } 1526 }, 1527 { 1528 "comment": "Field query should work for joins select bind vars", 1529 "query": "select user.id, (select user.id+outm.m+unsharded.m from unsharded) from user join unsharded outm", 1530 "v3-plan": { 1531 "QueryType": "SELECT", 1532 "Original": "select user.id, (select user.id+outm.m+unsharded.m from unsharded) from user join unsharded outm", 1533 "Instructions": { 1534 "OperatorType": "Join", 1535 "Variant": "Join", 1536 "JoinColumnIndexes": "L:0,R:0", 1537 "JoinVars": { 1538 "user_id": 0 1539 }, 1540 "TableName": "`user`_unsharded", 1541 "Inputs": [ 1542 { 1543 "OperatorType": "Route", 1544 "Variant": "Scatter", 1545 "Keyspace": { 1546 "Name": "user", 1547 "Sharded": true 1548 }, 1549 "FieldQuery": "select `user`.id from `user` where 1 != 1", 1550 "Query": "select `user`.id from `user`", 1551 "Table": "`user`" 1552 }, 1553 { 1554 "OperatorType": "Route", 1555 "Variant": "Unsharded", 1556 "Keyspace": { 1557 "Name": "main", 1558 "Sharded": false 1559 }, 1560 "FieldQuery": "select (select :user_id + outm.m + unsharded.m from unsharded where 1 != 1) from unsharded as outm where 1 != 1", 1561 "Query": "select (select :user_id + outm.m + unsharded.m from unsharded) from unsharded as outm", 1562 "Table": "unsharded" 1563 } 1564 ] 1565 } 1566 }, 1567 "gen4-plan": { 1568 "QueryType": "SELECT", 1569 "Original": "select user.id, (select user.id+outm.m+unsharded.m from unsharded) from user join unsharded outm", 1570 "Instructions": { 1571 "OperatorType": "Join", 1572 "Variant": "Join", 1573 "JoinColumnIndexes": "L:0,R:0", 1574 "JoinVars": { 1575 "user_id": 0 1576 }, 1577 "TableName": "`user`_unsharded", 1578 "Inputs": [ 1579 { 1580 "OperatorType": "Route", 1581 "Variant": "Scatter", 1582 "Keyspace": { 1583 "Name": "user", 1584 "Sharded": true 1585 }, 1586 "FieldQuery": "select `user`.id from `user` where 1 != 1", 1587 "Query": "select `user`.id from `user`", 1588 "Table": "`user`" 1589 }, 1590 { 1591 "OperatorType": "Route", 1592 "Variant": "Unsharded", 1593 "Keyspace": { 1594 "Name": "main", 1595 "Sharded": false 1596 }, 1597 "FieldQuery": "select (select :user_id + outm.m + unsharded.m from unsharded where 1 != 1) from unsharded as outm where 1 != 1", 1598 "Query": "select (select :user_id + outm.m + unsharded.m from unsharded) from unsharded as outm", 1599 "Table": "unsharded" 1600 } 1601 ] 1602 }, 1603 "TablesUsed": [ 1604 "main.unsharded", 1605 "user.user" 1606 ] 1607 } 1608 }, 1609 { 1610 "comment": "Case preservation", 1611 "query": "select user.Col, user_extra.Id from user join user_extra", 1612 "v3-plan": { 1613 "QueryType": "SELECT", 1614 "Original": "select user.Col, user_extra.Id from user join user_extra", 1615 "Instructions": { 1616 "OperatorType": "Join", 1617 "Variant": "Join", 1618 "JoinColumnIndexes": "L:0,R:0", 1619 "TableName": "`user`_user_extra", 1620 "Inputs": [ 1621 { 1622 "OperatorType": "Route", 1623 "Variant": "Scatter", 1624 "Keyspace": { 1625 "Name": "user", 1626 "Sharded": true 1627 }, 1628 "FieldQuery": "select `user`.Col from `user` where 1 != 1", 1629 "Query": "select `user`.Col from `user`", 1630 "Table": "`user`" 1631 }, 1632 { 1633 "OperatorType": "Route", 1634 "Variant": "Scatter", 1635 "Keyspace": { 1636 "Name": "user", 1637 "Sharded": true 1638 }, 1639 "FieldQuery": "select user_extra.Id from user_extra where 1 != 1", 1640 "Query": "select user_extra.Id from user_extra", 1641 "Table": "user_extra" 1642 } 1643 ] 1644 } 1645 }, 1646 "gen4-plan": { 1647 "QueryType": "SELECT", 1648 "Original": "select user.Col, user_extra.Id from user join user_extra", 1649 "Instructions": { 1650 "OperatorType": "Join", 1651 "Variant": "Join", 1652 "JoinColumnIndexes": "L:0,R:0", 1653 "TableName": "`user`_user_extra", 1654 "Inputs": [ 1655 { 1656 "OperatorType": "Route", 1657 "Variant": "Scatter", 1658 "Keyspace": { 1659 "Name": "user", 1660 "Sharded": true 1661 }, 1662 "FieldQuery": "select `user`.Col from `user` where 1 != 1", 1663 "Query": "select `user`.Col from `user`", 1664 "Table": "`user`" 1665 }, 1666 { 1667 "OperatorType": "Route", 1668 "Variant": "Scatter", 1669 "Keyspace": { 1670 "Name": "user", 1671 "Sharded": true 1672 }, 1673 "FieldQuery": "select user_extra.Id from user_extra where 1 != 1", 1674 "Query": "select user_extra.Id from user_extra", 1675 "Table": "user_extra" 1676 } 1677 ] 1678 }, 1679 "TablesUsed": [ 1680 "user.user", 1681 "user.user_extra" 1682 ] 1683 } 1684 }, 1685 { 1686 "comment": "syntax error", 1687 "query": "the quick brown fox", 1688 "plan": "syntax error at position 4 near 'the'" 1689 }, 1690 { 1691 "comment": "Hex number is not treated as a simple value", 1692 "query": "select * from user where id = 0x04", 1693 "v3-plan": { 1694 "QueryType": "SELECT", 1695 "Original": "select * from user where id = 0x04", 1696 "Instructions": { 1697 "OperatorType": "Route", 1698 "Variant": "Scatter", 1699 "Keyspace": { 1700 "Name": "user", 1701 "Sharded": true 1702 }, 1703 "FieldQuery": "select * from `user` where 1 != 1", 1704 "Query": "select * from `user` where id = 0x04", 1705 "Table": "`user`" 1706 } 1707 }, 1708 "gen4-plan": { 1709 "QueryType": "SELECT", 1710 "Original": "select * from user where id = 0x04", 1711 "Instructions": { 1712 "OperatorType": "Route", 1713 "Variant": "EqualUnique", 1714 "Keyspace": { 1715 "Name": "user", 1716 "Sharded": true 1717 }, 1718 "FieldQuery": "select * from `user` where 1 != 1", 1719 "Query": "select * from `user` where id = 0x04", 1720 "Table": "`user`", 1721 "Values": [ 1722 "VARBINARY(\"\\x04\")" 1723 ], 1724 "Vindex": "user_index" 1725 }, 1726 "TablesUsed": [ 1727 "user.user" 1728 ] 1729 } 1730 }, 1731 { 1732 "comment": "sharded limit offset", 1733 "query": "select user_id from music order by user_id limit 10, 20", 1734 "v3-plan": { 1735 "QueryType": "SELECT", 1736 "Original": "select user_id from music order by user_id limit 10, 20", 1737 "Instructions": { 1738 "OperatorType": "Limit", 1739 "Count": "INT64(20)", 1740 "Offset": "INT64(10)", 1741 "Inputs": [ 1742 { 1743 "OperatorType": "Route", 1744 "Variant": "Scatter", 1745 "Keyspace": { 1746 "Name": "user", 1747 "Sharded": true 1748 }, 1749 "FieldQuery": "select user_id, weight_string(user_id) from music where 1 != 1", 1750 "OrderBy": "(0|1) ASC", 1751 "Query": "select user_id, weight_string(user_id) from music order by user_id asc limit :__upper_limit", 1752 "ResultColumns": 1, 1753 "Table": "music" 1754 } 1755 ] 1756 } 1757 }, 1758 "gen4-plan": { 1759 "QueryType": "SELECT", 1760 "Original": "select user_id from music order by user_id limit 10, 20", 1761 "Instructions": { 1762 "OperatorType": "Limit", 1763 "Count": "INT64(20)", 1764 "Offset": "INT64(10)", 1765 "Inputs": [ 1766 { 1767 "OperatorType": "Route", 1768 "Variant": "Scatter", 1769 "Keyspace": { 1770 "Name": "user", 1771 "Sharded": true 1772 }, 1773 "FieldQuery": "select user_id, weight_string(user_id) from music where 1 != 1", 1774 "OrderBy": "(0|1) ASC", 1775 "Query": "select user_id, weight_string(user_id) from music order by user_id asc limit :__upper_limit", 1776 "ResultColumns": 1, 1777 "Table": "music" 1778 } 1779 ] 1780 }, 1781 "TablesUsed": [ 1782 "user.music" 1783 ] 1784 } 1785 }, 1786 { 1787 "comment": "Sharding Key Condition in Parenthesis", 1788 "query": "select * from user where name ='abc' AND (id = 4) limit 5", 1789 "v3-plan": { 1790 "QueryType": "SELECT", 1791 "Original": "select * from user where name ='abc' AND (id = 4) limit 5", 1792 "Instructions": { 1793 "OperatorType": "Route", 1794 "Variant": "EqualUnique", 1795 "Keyspace": { 1796 "Name": "user", 1797 "Sharded": true 1798 }, 1799 "FieldQuery": "select * from `user` where 1 != 1", 1800 "Query": "select * from `user` where `name` = 'abc' and id = 4 limit 5", 1801 "Table": "`user`", 1802 "Values": [ 1803 "INT64(4)" 1804 ], 1805 "Vindex": "user_index" 1806 } 1807 }, 1808 "gen4-plan": { 1809 "QueryType": "SELECT", 1810 "Original": "select * from user where name ='abc' AND (id = 4) limit 5", 1811 "Instructions": { 1812 "OperatorType": "Route", 1813 "Variant": "EqualUnique", 1814 "Keyspace": { 1815 "Name": "user", 1816 "Sharded": true 1817 }, 1818 "FieldQuery": "select * from `user` where 1 != 1", 1819 "Query": "select * from `user` where `name` = 'abc' and id = 4 limit 5", 1820 "Table": "`user`", 1821 "Values": [ 1822 "INT64(4)" 1823 ], 1824 "Vindex": "user_index" 1825 }, 1826 "TablesUsed": [ 1827 "user.user" 1828 ] 1829 } 1830 }, 1831 { 1832 "comment": "Multiple parenthesized expressions", 1833 "query": "select * from user where (id = 4) AND (name ='abc') limit 5", 1834 "v3-plan": { 1835 "QueryType": "SELECT", 1836 "Original": "select * from user where (id = 4) AND (name ='abc') limit 5", 1837 "Instructions": { 1838 "OperatorType": "Route", 1839 "Variant": "EqualUnique", 1840 "Keyspace": { 1841 "Name": "user", 1842 "Sharded": true 1843 }, 1844 "FieldQuery": "select * from `user` where 1 != 1", 1845 "Query": "select * from `user` where id = 4 and `name` = 'abc' limit 5", 1846 "Table": "`user`", 1847 "Values": [ 1848 "INT64(4)" 1849 ], 1850 "Vindex": "user_index" 1851 } 1852 }, 1853 "gen4-plan": { 1854 "QueryType": "SELECT", 1855 "Original": "select * from user where (id = 4) AND (name ='abc') limit 5", 1856 "Instructions": { 1857 "OperatorType": "Route", 1858 "Variant": "EqualUnique", 1859 "Keyspace": { 1860 "Name": "user", 1861 "Sharded": true 1862 }, 1863 "FieldQuery": "select * from `user` where 1 != 1", 1864 "Query": "select * from `user` where id = 4 and `name` = 'abc' limit 5", 1865 "Table": "`user`", 1866 "Values": [ 1867 "INT64(4)" 1868 ], 1869 "Vindex": "user_index" 1870 }, 1871 "TablesUsed": [ 1872 "user.user" 1873 ] 1874 } 1875 }, 1876 { 1877 "comment": "Multiple parenthesized expressions", 1878 "query": "select * from user where (id = 4 and name ='abc') limit 5", 1879 "v3-plan": { 1880 "QueryType": "SELECT", 1881 "Original": "select * from user where (id = 4 and name ='abc') limit 5", 1882 "Instructions": { 1883 "OperatorType": "Route", 1884 "Variant": "EqualUnique", 1885 "Keyspace": { 1886 "Name": "user", 1887 "Sharded": true 1888 }, 1889 "FieldQuery": "select * from `user` where 1 != 1", 1890 "Query": "select * from `user` where id = 4 and `name` = 'abc' limit 5", 1891 "Table": "`user`", 1892 "Values": [ 1893 "INT64(4)" 1894 ], 1895 "Vindex": "user_index" 1896 } 1897 }, 1898 "gen4-plan": { 1899 "QueryType": "SELECT", 1900 "Original": "select * from user where (id = 4 and name ='abc') limit 5", 1901 "Instructions": { 1902 "OperatorType": "Route", 1903 "Variant": "EqualUnique", 1904 "Keyspace": { 1905 "Name": "user", 1906 "Sharded": true 1907 }, 1908 "FieldQuery": "select * from `user` where 1 != 1", 1909 "Query": "select * from `user` where id = 4 and `name` = 'abc' limit 5", 1910 "Table": "`user`", 1911 "Values": [ 1912 "INT64(4)" 1913 ], 1914 "Vindex": "user_index" 1915 }, 1916 "TablesUsed": [ 1917 "user.user" 1918 ] 1919 } 1920 }, 1921 { 1922 "comment": "Column Aliasing with Table.Column", 1923 "query": "select user0_.col as col0_ from user user0_ where id = 1 order by user0_.col desc limit 2", 1924 "v3-plan": { 1925 "QueryType": "SELECT", 1926 "Original": "select user0_.col as col0_ from user user0_ where id = 1 order by user0_.col desc limit 2", 1927 "Instructions": { 1928 "OperatorType": "Route", 1929 "Variant": "EqualUnique", 1930 "Keyspace": { 1931 "Name": "user", 1932 "Sharded": true 1933 }, 1934 "FieldQuery": "select user0_.col as col0_ from `user` as user0_ where 1 != 1", 1935 "Query": "select user0_.col as col0_ from `user` as user0_ where id = 1 order by user0_.col desc limit 2", 1936 "Table": "`user`", 1937 "Values": [ 1938 "INT64(1)" 1939 ], 1940 "Vindex": "user_index" 1941 } 1942 }, 1943 "gen4-plan": { 1944 "QueryType": "SELECT", 1945 "Original": "select user0_.col as col0_ from user user0_ where id = 1 order by user0_.col desc limit 2", 1946 "Instructions": { 1947 "OperatorType": "Route", 1948 "Variant": "EqualUnique", 1949 "Keyspace": { 1950 "Name": "user", 1951 "Sharded": true 1952 }, 1953 "FieldQuery": "select user0_.col as col0_ from `user` as user0_ where 1 != 1", 1954 "Query": "select user0_.col as col0_ from `user` as user0_ where id = 1 order by user0_.col desc limit 2", 1955 "Table": "`user`", 1956 "Values": [ 1957 "INT64(1)" 1958 ], 1959 "Vindex": "user_index" 1960 }, 1961 "TablesUsed": [ 1962 "user.user" 1963 ] 1964 } 1965 }, 1966 { 1967 "comment": "Column Aliasing with Column", 1968 "query": "select user0_.col as col0_ from user user0_ where id = 1 order by col0_ desc limit 3", 1969 "v3-plan": { 1970 "QueryType": "SELECT", 1971 "Original": "select user0_.col as col0_ from user user0_ where id = 1 order by col0_ desc limit 3", 1972 "Instructions": { 1973 "OperatorType": "Route", 1974 "Variant": "EqualUnique", 1975 "Keyspace": { 1976 "Name": "user", 1977 "Sharded": true 1978 }, 1979 "FieldQuery": "select user0_.col as col0_ from `user` as user0_ where 1 != 1", 1980 "Query": "select user0_.col as col0_ from `user` as user0_ where id = 1 order by col0_ desc limit 3", 1981 "Table": "`user`", 1982 "Values": [ 1983 "INT64(1)" 1984 ], 1985 "Vindex": "user_index" 1986 } 1987 }, 1988 "gen4-plan": { 1989 "QueryType": "SELECT", 1990 "Original": "select user0_.col as col0_ from user user0_ where id = 1 order by col0_ desc limit 3", 1991 "Instructions": { 1992 "OperatorType": "Route", 1993 "Variant": "EqualUnique", 1994 "Keyspace": { 1995 "Name": "user", 1996 "Sharded": true 1997 }, 1998 "FieldQuery": "select user0_.col as col0_ from `user` as user0_ where 1 != 1", 1999 "Query": "select user0_.col as col0_ from `user` as user0_ where id = 1 order by col0_ desc limit 3", 2000 "Table": "`user`", 2001 "Values": [ 2002 "INT64(1)" 2003 ], 2004 "Vindex": "user_index" 2005 }, 2006 "TablesUsed": [ 2007 "user.user" 2008 ] 2009 } 2010 }, 2011 { 2012 "comment": "Booleans and parenthesis", 2013 "query": "select * from user where (id = 1) AND name = true limit 5", 2014 "v3-plan": { 2015 "QueryType": "SELECT", 2016 "Original": "select * from user where (id = 1) AND name = true limit 5", 2017 "Instructions": { 2018 "OperatorType": "Route", 2019 "Variant": "EqualUnique", 2020 "Keyspace": { 2021 "Name": "user", 2022 "Sharded": true 2023 }, 2024 "FieldQuery": "select * from `user` where 1 != 1", 2025 "Query": "select * from `user` where id = 1 and `name` = true limit 5", 2026 "Table": "`user`", 2027 "Values": [ 2028 "INT64(1)" 2029 ], 2030 "Vindex": "user_index" 2031 } 2032 }, 2033 "gen4-plan": { 2034 "QueryType": "SELECT", 2035 "Original": "select * from user where (id = 1) AND name = true limit 5", 2036 "Instructions": { 2037 "OperatorType": "Route", 2038 "Variant": "EqualUnique", 2039 "Keyspace": { 2040 "Name": "user", 2041 "Sharded": true 2042 }, 2043 "FieldQuery": "select * from `user` where 1 != 1", 2044 "Query": "select * from `user` where id = 1 and `name` = true limit 5", 2045 "Table": "`user`", 2046 "Values": [ 2047 "INT64(1)" 2048 ], 2049 "Vindex": "user_index" 2050 }, 2051 "TablesUsed": [ 2052 "user.user" 2053 ] 2054 } 2055 }, 2056 { 2057 "comment": "Column as boolean-ish", 2058 "query": "select * from user where (id = 1) AND name limit 5", 2059 "v3-plan": { 2060 "QueryType": "SELECT", 2061 "Original": "select * from user where (id = 1) AND name limit 5", 2062 "Instructions": { 2063 "OperatorType": "Route", 2064 "Variant": "EqualUnique", 2065 "Keyspace": { 2066 "Name": "user", 2067 "Sharded": true 2068 }, 2069 "FieldQuery": "select * from `user` where 1 != 1", 2070 "Query": "select * from `user` where id = 1 and `name` limit 5", 2071 "Table": "`user`", 2072 "Values": [ 2073 "INT64(1)" 2074 ], 2075 "Vindex": "user_index" 2076 } 2077 }, 2078 "gen4-plan": { 2079 "QueryType": "SELECT", 2080 "Original": "select * from user where (id = 1) AND name limit 5", 2081 "Instructions": { 2082 "OperatorType": "Route", 2083 "Variant": "EqualUnique", 2084 "Keyspace": { 2085 "Name": "user", 2086 "Sharded": true 2087 }, 2088 "FieldQuery": "select * from `user` where 1 != 1", 2089 "Query": "select * from `user` where id = 1 and `name` limit 5", 2090 "Table": "`user`", 2091 "Values": [ 2092 "INT64(1)" 2093 ], 2094 "Vindex": "user_index" 2095 }, 2096 "TablesUsed": [ 2097 "user.user" 2098 ] 2099 } 2100 }, 2101 { 2102 "comment": "PK as fake boolean, and column as boolean-ish", 2103 "query": "select * from user where (id = 5) AND name = true limit 5", 2104 "v3-plan": { 2105 "QueryType": "SELECT", 2106 "Original": "select * from user where (id = 5) AND name = true limit 5", 2107 "Instructions": { 2108 "OperatorType": "Route", 2109 "Variant": "EqualUnique", 2110 "Keyspace": { 2111 "Name": "user", 2112 "Sharded": true 2113 }, 2114 "FieldQuery": "select * from `user` where 1 != 1", 2115 "Query": "select * from `user` where id = 5 and `name` = true limit 5", 2116 "Table": "`user`", 2117 "Values": [ 2118 "INT64(5)" 2119 ], 2120 "Vindex": "user_index" 2121 } 2122 }, 2123 "gen4-plan": { 2124 "QueryType": "SELECT", 2125 "Original": "select * from user where (id = 5) AND name = true limit 5", 2126 "Instructions": { 2127 "OperatorType": "Route", 2128 "Variant": "EqualUnique", 2129 "Keyspace": { 2130 "Name": "user", 2131 "Sharded": true 2132 }, 2133 "FieldQuery": "select * from `user` where 1 != 1", 2134 "Query": "select * from `user` where id = 5 and `name` = true limit 5", 2135 "Table": "`user`", 2136 "Values": [ 2137 "INT64(5)" 2138 ], 2139 "Vindex": "user_index" 2140 }, 2141 "TablesUsed": [ 2142 "user.user" 2143 ] 2144 } 2145 }, 2146 { 2147 "comment": "top level subquery in select", 2148 "query": "select a, (select col from user) from unsharded", 2149 "v3-plan": { 2150 "QueryType": "SELECT", 2151 "Original": "select a, (select col from user) from unsharded", 2152 "Instructions": { 2153 "OperatorType": "Subquery", 2154 "Variant": "PulloutValue", 2155 "PulloutVars": [ 2156 "__sq_has_values1", 2157 "__sq1" 2158 ], 2159 "Inputs": [ 2160 { 2161 "OperatorType": "Route", 2162 "Variant": "Scatter", 2163 "Keyspace": { 2164 "Name": "user", 2165 "Sharded": true 2166 }, 2167 "FieldQuery": "select col from `user` where 1 != 1", 2168 "Query": "select col from `user`", 2169 "Table": "`user`" 2170 }, 2171 { 2172 "OperatorType": "Route", 2173 "Variant": "Unsharded", 2174 "Keyspace": { 2175 "Name": "main", 2176 "Sharded": false 2177 }, 2178 "FieldQuery": "select a, :__sq1 from unsharded where 1 != 1", 2179 "Query": "select a, :__sq1 from unsharded", 2180 "Table": "unsharded" 2181 } 2182 ] 2183 } 2184 }, 2185 "gen4-plan": { 2186 "QueryType": "SELECT", 2187 "Original": "select a, (select col from user) from unsharded", 2188 "Instructions": { 2189 "OperatorType": "Subquery", 2190 "Variant": "PulloutValue", 2191 "PulloutVars": [ 2192 "__sq1" 2193 ], 2194 "Inputs": [ 2195 { 2196 "OperatorType": "Route", 2197 "Variant": "Scatter", 2198 "Keyspace": { 2199 "Name": "user", 2200 "Sharded": true 2201 }, 2202 "FieldQuery": "select col from `user` where 1 != 1", 2203 "Query": "select col from `user`", 2204 "Table": "`user`" 2205 }, 2206 { 2207 "OperatorType": "Route", 2208 "Variant": "Unsharded", 2209 "Keyspace": { 2210 "Name": "main", 2211 "Sharded": false 2212 }, 2213 "FieldQuery": "select a, :__sq1 from unsharded where 1 != 1", 2214 "Query": "select a, :__sq1 from unsharded", 2215 "Table": "unsharded" 2216 } 2217 ] 2218 }, 2219 "TablesUsed": [ 2220 "main.unsharded", 2221 "user.user" 2222 ] 2223 } 2224 }, 2225 { 2226 "comment": "sub-expression subquery in select", 2227 "query": "select a, 1+(select col from user) from unsharded", 2228 "v3-plan": { 2229 "QueryType": "SELECT", 2230 "Original": "select a, 1+(select col from user) from unsharded", 2231 "Instructions": { 2232 "OperatorType": "Subquery", 2233 "Variant": "PulloutValue", 2234 "PulloutVars": [ 2235 "__sq_has_values1", 2236 "__sq1" 2237 ], 2238 "Inputs": [ 2239 { 2240 "OperatorType": "Route", 2241 "Variant": "Scatter", 2242 "Keyspace": { 2243 "Name": "user", 2244 "Sharded": true 2245 }, 2246 "FieldQuery": "select col from `user` where 1 != 1", 2247 "Query": "select col from `user`", 2248 "Table": "`user`" 2249 }, 2250 { 2251 "OperatorType": "Route", 2252 "Variant": "Unsharded", 2253 "Keyspace": { 2254 "Name": "main", 2255 "Sharded": false 2256 }, 2257 "FieldQuery": "select a, 1 + :__sq1 from unsharded where 1 != 1", 2258 "Query": "select a, 1 + :__sq1 from unsharded", 2259 "Table": "unsharded" 2260 } 2261 ] 2262 } 2263 }, 2264 "gen4-plan": { 2265 "QueryType": "SELECT", 2266 "Original": "select a, 1+(select col from user) from unsharded", 2267 "Instructions": { 2268 "OperatorType": "Subquery", 2269 "Variant": "PulloutValue", 2270 "PulloutVars": [ 2271 "__sq1" 2272 ], 2273 "Inputs": [ 2274 { 2275 "OperatorType": "Route", 2276 "Variant": "Scatter", 2277 "Keyspace": { 2278 "Name": "user", 2279 "Sharded": true 2280 }, 2281 "FieldQuery": "select col from `user` where 1 != 1", 2282 "Query": "select col from `user`", 2283 "Table": "`user`" 2284 }, 2285 { 2286 "OperatorType": "Route", 2287 "Variant": "Unsharded", 2288 "Keyspace": { 2289 "Name": "main", 2290 "Sharded": false 2291 }, 2292 "FieldQuery": "select a, 1 + :__sq1 from unsharded where 1 != 1", 2293 "Query": "select a, 1 + :__sq1 from unsharded", 2294 "Table": "unsharded" 2295 } 2296 ] 2297 }, 2298 "TablesUsed": [ 2299 "main.unsharded", 2300 "user.user" 2301 ] 2302 } 2303 }, 2304 { 2305 "comment": "select * from derived table expands specific columns", 2306 "query": "select * from (select user.id id1, user_extra.id id2 from user join user_extra) as t", 2307 "v3-plan": { 2308 "QueryType": "SELECT", 2309 "Original": "select * from (select user.id id1, user_extra.id id2 from user join user_extra) as t", 2310 "Instructions": { 2311 "OperatorType": "SimpleProjection", 2312 "Columns": [ 2313 0, 2314 1 2315 ], 2316 "Inputs": [ 2317 { 2318 "OperatorType": "Join", 2319 "Variant": "Join", 2320 "JoinColumnIndexes": "L:0,R:0", 2321 "TableName": "`user`_user_extra", 2322 "Inputs": [ 2323 { 2324 "OperatorType": "Route", 2325 "Variant": "Scatter", 2326 "Keyspace": { 2327 "Name": "user", 2328 "Sharded": true 2329 }, 2330 "FieldQuery": "select `user`.id as id1 from `user` where 1 != 1", 2331 "Query": "select `user`.id as id1 from `user`", 2332 "Table": "`user`" 2333 }, 2334 { 2335 "OperatorType": "Route", 2336 "Variant": "Scatter", 2337 "Keyspace": { 2338 "Name": "user", 2339 "Sharded": true 2340 }, 2341 "FieldQuery": "select user_extra.id as id2 from user_extra where 1 != 1", 2342 "Query": "select user_extra.id as id2 from user_extra", 2343 "Table": "user_extra" 2344 } 2345 ] 2346 } 2347 ] 2348 } 2349 }, 2350 "gen4-plan": { 2351 "QueryType": "SELECT", 2352 "Original": "select * from (select user.id id1, user_extra.id id2 from user join user_extra) as t", 2353 "Instructions": { 2354 "OperatorType": "SimpleProjection", 2355 "Columns": [ 2356 0, 2357 1 2358 ], 2359 "Inputs": [ 2360 { 2361 "OperatorType": "Join", 2362 "Variant": "Join", 2363 "JoinColumnIndexes": "L:0,R:0", 2364 "TableName": "`user`_user_extra", 2365 "Inputs": [ 2366 { 2367 "OperatorType": "Route", 2368 "Variant": "Scatter", 2369 "Keyspace": { 2370 "Name": "user", 2371 "Sharded": true 2372 }, 2373 "FieldQuery": "select `user`.id as id1 from `user` where 1 != 1", 2374 "Query": "select `user`.id as id1 from `user`", 2375 "Table": "`user`" 2376 }, 2377 { 2378 "OperatorType": "Route", 2379 "Variant": "Scatter", 2380 "Keyspace": { 2381 "Name": "user", 2382 "Sharded": true 2383 }, 2384 "FieldQuery": "select user_extra.id as id2 from user_extra where 1 != 1", 2385 "Query": "select user_extra.id as id2 from user_extra", 2386 "Table": "user_extra" 2387 } 2388 ] 2389 } 2390 ] 2391 }, 2392 "TablesUsed": [ 2393 "user.user", 2394 "user.user_extra" 2395 ] 2396 } 2397 }, 2398 { 2399 "comment": "duplicate columns not allowed in derived table", 2400 "query": "select * from (select user.id, user_extra.id from user join user_extra) as t", 2401 "v3-plan": "VT12001: unsupported: duplicate column names in subquery: id", 2402 "gen4-plan": "Duplicate column name 'id'" 2403 }, 2404 { 2405 "comment": "non-existent symbol in cross-shard derived table", 2406 "query": "select t.col from (select user.id from user join user_extra) as t", 2407 "v3-plan": "VT03019: symbol t.col not found", 2408 "gen4-plan": "symbol t.col not found" 2409 }, 2410 { 2411 "comment": "union with the same target shard", 2412 "query": "select * from music where user_id = 1 union select * from user where id = 1", 2413 "v3-plan": { 2414 "QueryType": "SELECT", 2415 "Original": "select * from music where user_id = 1 union select * from user where id = 1", 2416 "Instructions": { 2417 "OperatorType": "Route", 2418 "Variant": "EqualUnique", 2419 "Keyspace": { 2420 "Name": "user", 2421 "Sharded": true 2422 }, 2423 "FieldQuery": "select * from music where 1 != 1 union select * from `user` where 1 != 1", 2424 "Query": "select * from music where user_id = 1 union select * from `user` where id = 1", 2425 "Table": "music", 2426 "Values": [ 2427 "INT64(1)" 2428 ], 2429 "Vindex": "user_index" 2430 } 2431 }, 2432 "gen4-plan": { 2433 "QueryType": "SELECT", 2434 "Original": "select * from music where user_id = 1 union select * from user where id = 1", 2435 "Instructions": { 2436 "OperatorType": "Route", 2437 "Variant": "EqualUnique", 2438 "Keyspace": { 2439 "Name": "user", 2440 "Sharded": true 2441 }, 2442 "FieldQuery": "select * from music where 1 != 1 union select * from `user` where 1 != 1", 2443 "Query": "select * from music where user_id = 1 union select * from `user` where id = 1", 2444 "Table": "music", 2445 "Values": [ 2446 "INT64(1)" 2447 ], 2448 "Vindex": "user_index" 2449 }, 2450 "TablesUsed": [ 2451 "user.music", 2452 "user.user" 2453 ] 2454 } 2455 }, 2456 { 2457 "comment": "union with the same target shard last_insert_id", 2458 "query": "select *, last_insert_id() from music where user_id = 1 union select * from user where id = 1", 2459 "v3-plan": { 2460 "QueryType": "SELECT", 2461 "Original": "select *, last_insert_id() from music where user_id = 1 union select * from user where id = 1", 2462 "Instructions": { 2463 "OperatorType": "Route", 2464 "Variant": "EqualUnique", 2465 "Keyspace": { 2466 "Name": "user", 2467 "Sharded": true 2468 }, 2469 "FieldQuery": "select *, :__lastInsertId as `last_insert_id()` from music where 1 != 1 union select * from `user` where 1 != 1", 2470 "Query": "select *, :__lastInsertId as `last_insert_id()` from music where user_id = 1 union select * from `user` where id = 1", 2471 "Table": "music", 2472 "Values": [ 2473 "INT64(1)" 2474 ], 2475 "Vindex": "user_index" 2476 } 2477 }, 2478 "gen4-plan": { 2479 "QueryType": "SELECT", 2480 "Original": "select *, last_insert_id() from music where user_id = 1 union select * from user where id = 1", 2481 "Instructions": { 2482 "OperatorType": "Route", 2483 "Variant": "EqualUnique", 2484 "Keyspace": { 2485 "Name": "user", 2486 "Sharded": true 2487 }, 2488 "FieldQuery": "select *, :__lastInsertId as `last_insert_id()` from music where 1 != 1 union select * from `user` where 1 != 1", 2489 "Query": "select *, :__lastInsertId as `last_insert_id()` from music where user_id = 1 union select * from `user` where id = 1", 2490 "Table": "music", 2491 "Values": [ 2492 "INT64(1)" 2493 ], 2494 "Vindex": "user_index" 2495 }, 2496 "TablesUsed": [ 2497 "user.music", 2498 "user.user" 2499 ] 2500 } 2501 }, 2502 { 2503 "comment": "unsharded union in derived table", 2504 "query": "select * from (select col1, col2 from unsharded where id = 1 union select col1, col2 from unsharded where id = 3) a", 2505 "v3-plan": { 2506 "QueryType": "SELECT", 2507 "Original": "select * from (select col1, col2 from unsharded where id = 1 union select col1, col2 from unsharded where id = 3) a", 2508 "Instructions": { 2509 "OperatorType": "Route", 2510 "Variant": "Unsharded", 2511 "Keyspace": { 2512 "Name": "main", 2513 "Sharded": false 2514 }, 2515 "FieldQuery": "select * from (select col1, col2 from unsharded where 1 != 1 union select col1, col2 from unsharded where 1 != 1) as a where 1 != 1", 2516 "Query": "select * from (select col1, col2 from unsharded where id = 1 union select col1, col2 from unsharded where id = 3) as a", 2517 "Table": "unsharded" 2518 } 2519 }, 2520 "gen4-plan": { 2521 "QueryType": "SELECT", 2522 "Original": "select * from (select col1, col2 from unsharded where id = 1 union select col1, col2 from unsharded where id = 3) a", 2523 "Instructions": { 2524 "OperatorType": "Route", 2525 "Variant": "Unsharded", 2526 "Keyspace": { 2527 "Name": "main", 2528 "Sharded": false 2529 }, 2530 "FieldQuery": "select a.col1, a.col2 from (select col1, col2 from unsharded where 1 != 1 union select col1, col2 from unsharded where 1 != 1) as a where 1 != 1", 2531 "Query": "select a.col1, a.col2 from (select col1, col2 from unsharded where id = 1 union select col1, col2 from unsharded where id = 3) as a", 2532 "Table": "unsharded" 2533 }, 2534 "TablesUsed": [ 2535 "main.unsharded" 2536 ] 2537 } 2538 }, 2539 { 2540 "comment": "unsharded union in subquery", 2541 "query": "select id, name from unsharded where id in (select id from unsharded where id = 1 union select id from unsharded where id = 3)", 2542 "v3-plan": { 2543 "QueryType": "SELECT", 2544 "Original": "select id, name from unsharded where id in (select id from unsharded where id = 1 union select id from unsharded where id = 3)", 2545 "Instructions": { 2546 "OperatorType": "Route", 2547 "Variant": "Unsharded", 2548 "Keyspace": { 2549 "Name": "main", 2550 "Sharded": false 2551 }, 2552 "FieldQuery": "select id, `name` from unsharded where 1 != 1", 2553 "Query": "select id, `name` from unsharded where id in (select id from unsharded where id = 1 union select id from unsharded where id = 3)", 2554 "Table": "unsharded" 2555 } 2556 }, 2557 "gen4-plan": { 2558 "QueryType": "SELECT", 2559 "Original": "select id, name from unsharded where id in (select id from unsharded where id = 1 union select id from unsharded where id = 3)", 2560 "Instructions": { 2561 "OperatorType": "Route", 2562 "Variant": "Unsharded", 2563 "Keyspace": { 2564 "Name": "main", 2565 "Sharded": false 2566 }, 2567 "FieldQuery": "select id, `name` from unsharded where 1 != 1", 2568 "Query": "select id, `name` from unsharded where id in (select id from unsharded where id = 1 union select id from unsharded where id = 3)", 2569 "Table": "unsharded" 2570 }, 2571 "TablesUsed": [ 2572 "main.unsharded" 2573 ] 2574 } 2575 }, 2576 { 2577 "comment": "(select id from unsharded) union (select id from unsharded_auto) order by id limit 5", 2578 "query": "(select id from unsharded) union (select id from unsharded_auto) order by id limit 5", 2579 "v3-plan": { 2580 "QueryType": "SELECT", 2581 "Original": "(select id from unsharded) union (select id from unsharded_auto) order by id limit 5", 2582 "Instructions": { 2583 "OperatorType": "Route", 2584 "Variant": "Unsharded", 2585 "Keyspace": { 2586 "Name": "main", 2587 "Sharded": false 2588 }, 2589 "FieldQuery": "select id from unsharded where 1 != 1 union select id from unsharded_auto where 1 != 1", 2590 "Query": "select id from unsharded union select id from unsharded_auto order by id asc limit 5", 2591 "Table": "unsharded" 2592 } 2593 }, 2594 "gen4-plan": { 2595 "QueryType": "SELECT", 2596 "Original": "(select id from unsharded) union (select id from unsharded_auto) order by id limit 5", 2597 "Instructions": { 2598 "OperatorType": "Route", 2599 "Variant": "Unsharded", 2600 "Keyspace": { 2601 "Name": "main", 2602 "Sharded": false 2603 }, 2604 "FieldQuery": "select id from unsharded where 1 != 1 union select id from unsharded_auto where 1 != 1", 2605 "Query": "select id from unsharded union select id from unsharded_auto order by id asc limit 5", 2606 "Table": "unsharded, unsharded_auto" 2607 }, 2608 "TablesUsed": [ 2609 "main.unsharded", 2610 "main.unsharded_auto" 2611 ] 2612 } 2613 }, 2614 { 2615 "comment": "unsharded union", 2616 "query": "select id from unsharded union select id from unsharded_auto union select id from unsharded_auto where id in (132)", 2617 "v3-plan": { 2618 "QueryType": "SELECT", 2619 "Original": "select id from unsharded union select id from unsharded_auto union select id from unsharded_auto where id in (132)", 2620 "Instructions": { 2621 "OperatorType": "Route", 2622 "Variant": "Unsharded", 2623 "Keyspace": { 2624 "Name": "main", 2625 "Sharded": false 2626 }, 2627 "FieldQuery": "select id from unsharded where 1 != 1 union select id from unsharded_auto where 1 != 1 union select id from unsharded_auto where 1 != 1", 2628 "Query": "select id from unsharded union select id from unsharded_auto union select id from unsharded_auto where id in (132)", 2629 "Table": "unsharded" 2630 } 2631 }, 2632 "gen4-plan": { 2633 "QueryType": "SELECT", 2634 "Original": "select id from unsharded union select id from unsharded_auto union select id from unsharded_auto where id in (132)", 2635 "Instructions": { 2636 "OperatorType": "Route", 2637 "Variant": "Unsharded", 2638 "Keyspace": { 2639 "Name": "main", 2640 "Sharded": false 2641 }, 2642 "FieldQuery": "select id from unsharded where 1 != 1 union select id from unsharded_auto where 1 != 1 union select id from unsharded_auto where 1 != 1", 2643 "Query": "select id from unsharded union select id from unsharded_auto union select id from unsharded_auto where id in (132)", 2644 "Table": "unsharded, unsharded_auto" 2645 }, 2646 "TablesUsed": [ 2647 "main.unsharded", 2648 "main.unsharded_auto" 2649 ] 2650 } 2651 }, 2652 { 2653 "comment": "unsharded nested union", 2654 "query": "(select id from unsharded union select id from unsharded_auto) union (select id from unsharded_auto union select name from unsharded)", 2655 "v3-plan": { 2656 "QueryType": "SELECT", 2657 "Original": "(select id from unsharded union select id from unsharded_auto) union (select id from unsharded_auto union select name from unsharded)", 2658 "Instructions": { 2659 "OperatorType": "Route", 2660 "Variant": "Unsharded", 2661 "Keyspace": { 2662 "Name": "main", 2663 "Sharded": false 2664 }, 2665 "FieldQuery": "select id from unsharded where 1 != 1 union select id from unsharded_auto where 1 != 1 union select id from unsharded_auto where 1 != 1 union select `name` from unsharded where 1 != 1", 2666 "Query": "select id from unsharded union select id from unsharded_auto union select id from unsharded_auto union select `name` from unsharded", 2667 "Table": "unsharded" 2668 } 2669 }, 2670 "gen4-plan": { 2671 "QueryType": "SELECT", 2672 "Original": "(select id from unsharded union select id from unsharded_auto) union (select id from unsharded_auto union select name from unsharded)", 2673 "Instructions": { 2674 "OperatorType": "Route", 2675 "Variant": "Unsharded", 2676 "Keyspace": { 2677 "Name": "main", 2678 "Sharded": false 2679 }, 2680 "FieldQuery": "select id from unsharded where 1 != 1 union select id from unsharded_auto where 1 != 1 union select id from unsharded_auto where 1 != 1 union select `name` from unsharded where 1 != 1", 2681 "Query": "select id from unsharded union select id from unsharded_auto union select id from unsharded_auto union select `name` from unsharded", 2682 "Table": "unsharded, unsharded_auto" 2683 }, 2684 "TablesUsed": [ 2685 "main.unsharded", 2686 "main.unsharded_auto" 2687 ] 2688 } 2689 }, 2690 { 2691 "comment": "unsharded nested union with limit", 2692 "query": "(select id from unsharded order by id asc limit 1) union (select id from unsharded order by id desc limit 1) order by id asc limit 1", 2693 "v3-plan": { 2694 "QueryType": "SELECT", 2695 "Original": "(select id from unsharded order by id asc limit 1) union (select id from unsharded order by id desc limit 1) order by id asc limit 1", 2696 "Instructions": { 2697 "OperatorType": "Route", 2698 "Variant": "Unsharded", 2699 "Keyspace": { 2700 "Name": "main", 2701 "Sharded": false 2702 }, 2703 "FieldQuery": "(select id from unsharded where 1 != 1) union (select id from unsharded where 1 != 1)", 2704 "Query": "(select id from unsharded order by id asc limit 1) union (select id from unsharded order by id desc limit 1) order by id asc limit 1", 2705 "Table": "unsharded" 2706 } 2707 }, 2708 "gen4-plan": { 2709 "QueryType": "SELECT", 2710 "Original": "(select id from unsharded order by id asc limit 1) union (select id from unsharded order by id desc limit 1) order by id asc limit 1", 2711 "Instructions": { 2712 "OperatorType": "Route", 2713 "Variant": "Unsharded", 2714 "Keyspace": { 2715 "Name": "main", 2716 "Sharded": false 2717 }, 2718 "FieldQuery": "(select id from unsharded where 1 != 1) union (select id from unsharded where 1 != 1)", 2719 "Query": "(select id from unsharded order by id asc limit 1) union (select id from unsharded order by id desc limit 1) order by id asc limit 1", 2720 "Table": "unsharded" 2721 }, 2722 "TablesUsed": [ 2723 "main.unsharded" 2724 ] 2725 } 2726 }, 2727 { 2728 "comment": "routing rules: ensure directives are not lost", 2729 "query": "select /*vt+ QUERY_TIMEOUT_MS=1000 */ * from route2", 2730 "v3-plan": { 2731 "QueryType": "SELECT", 2732 "Original": "select /*vt+ QUERY_TIMEOUT_MS=1000 */ * from route2", 2733 "Instructions": { 2734 "OperatorType": "Route", 2735 "Variant": "Unsharded", 2736 "Keyspace": { 2737 "Name": "main", 2738 "Sharded": false 2739 }, 2740 "FieldQuery": "select * from unsharded as route2 where 1 != 1", 2741 "Query": "select /*vt+ QUERY_TIMEOUT_MS=1000 */ * from unsharded as route2", 2742 "QueryTimeout": 1000, 2743 "Table": "unsharded" 2744 } 2745 }, 2746 "gen4-plan": { 2747 "QueryType": "SELECT", 2748 "Original": "select /*vt+ QUERY_TIMEOUT_MS=1000 */ * from route2", 2749 "Instructions": { 2750 "OperatorType": "Route", 2751 "Variant": "Unsharded", 2752 "Keyspace": { 2753 "Name": "main", 2754 "Sharded": false 2755 }, 2756 "FieldQuery": "select * from unsharded as route2 where 1 != 1", 2757 "Query": "select /*vt+ QUERY_TIMEOUT_MS=1000 */ * from unsharded as route2", 2758 "QueryTimeout": 1000, 2759 "Table": "unsharded" 2760 }, 2761 "TablesUsed": [ 2762 "main.unsharded" 2763 ] 2764 } 2765 }, 2766 { 2767 "comment": "testing SingleRow Projection", 2768 "query": "select 42", 2769 "v3-plan": { 2770 "QueryType": "SELECT", 2771 "Original": "select 42", 2772 "Instructions": { 2773 "OperatorType": "Projection", 2774 "Expressions": [ 2775 "INT64(42) as 42" 2776 ], 2777 "Inputs": [ 2778 { 2779 "OperatorType": "SingleRow" 2780 } 2781 ] 2782 } 2783 }, 2784 "gen4-plan": { 2785 "QueryType": "SELECT", 2786 "Original": "select 42", 2787 "Instructions": { 2788 "OperatorType": "Projection", 2789 "Expressions": [ 2790 "INT64(42) as 42" 2791 ], 2792 "Inputs": [ 2793 { 2794 "OperatorType": "SingleRow" 2795 } 2796 ] 2797 }, 2798 "TablesUsed": [ 2799 "main.dual" 2800 ] 2801 } 2802 }, 2803 { 2804 "comment": "don't filter on the vtgate", 2805 "query": "select 42 from dual where false", 2806 "v3-plan": { 2807 "QueryType": "SELECT", 2808 "Original": "select 42 from dual where false", 2809 "Instructions": { 2810 "OperatorType": "Route", 2811 "Variant": "Reference", 2812 "Keyspace": { 2813 "Name": "main", 2814 "Sharded": false 2815 }, 2816 "FieldQuery": "select 42 from dual where 1 != 1", 2817 "Query": "select 42 from dual where false", 2818 "Table": "dual" 2819 } 2820 }, 2821 "gen4-plan": { 2822 "QueryType": "SELECT", 2823 "Original": "select 42 from dual where false", 2824 "Instructions": { 2825 "OperatorType": "Route", 2826 "Variant": "Reference", 2827 "Keyspace": { 2828 "Name": "main", 2829 "Sharded": false 2830 }, 2831 "FieldQuery": "select 42 from dual where 1 != 1", 2832 "Query": "select 42 from dual where false", 2833 "Table": "dual" 2834 }, 2835 "TablesUsed": [ 2836 "main.dual" 2837 ] 2838 } 2839 }, 2840 { 2841 "comment": "testing SingleRow Projection with arithmetics", 2842 "query": "select 42+2", 2843 "v3-plan": { 2844 "QueryType": "SELECT", 2845 "Original": "select 42+2", 2846 "Instructions": { 2847 "OperatorType": "Projection", 2848 "Expressions": [ 2849 "INT64(44) as 42 + 2" 2850 ], 2851 "Inputs": [ 2852 { 2853 "OperatorType": "SingleRow" 2854 } 2855 ] 2856 } 2857 }, 2858 "gen4-plan": { 2859 "QueryType": "SELECT", 2860 "Original": "select 42+2", 2861 "Instructions": { 2862 "OperatorType": "Projection", 2863 "Expressions": [ 2864 "INT64(44) as 42 + 2" 2865 ], 2866 "Inputs": [ 2867 { 2868 "OperatorType": "SingleRow" 2869 } 2870 ] 2871 }, 2872 "TablesUsed": [ 2873 "main.dual" 2874 ] 2875 } 2876 }, 2877 { 2878 "comment": "sql_calc_found_rows without limit", 2879 "query": "select sql_calc_found_rows * from music where user_id = 1", 2880 "v3-plan": { 2881 "QueryType": "SELECT", 2882 "Original": "select sql_calc_found_rows * from music where user_id = 1", 2883 "Instructions": { 2884 "OperatorType": "Route", 2885 "Variant": "EqualUnique", 2886 "Keyspace": { 2887 "Name": "user", 2888 "Sharded": true 2889 }, 2890 "FieldQuery": "select * from music where 1 != 1", 2891 "Query": "select * from music where user_id = 1", 2892 "Table": "music", 2893 "Values": [ 2894 "INT64(1)" 2895 ], 2896 "Vindex": "user_index" 2897 } 2898 }, 2899 "gen4-plan": { 2900 "QueryType": "SELECT", 2901 "Original": "select sql_calc_found_rows * from music where user_id = 1", 2902 "Instructions": { 2903 "OperatorType": "Route", 2904 "Variant": "EqualUnique", 2905 "Keyspace": { 2906 "Name": "user", 2907 "Sharded": true 2908 }, 2909 "FieldQuery": "select * from music where 1 != 1", 2910 "Query": "select * from music where user_id = 1", 2911 "Table": "music", 2912 "Values": [ 2913 "INT64(1)" 2914 ], 2915 "Vindex": "user_index" 2916 }, 2917 "TablesUsed": [ 2918 "user.music" 2919 ] 2920 } 2921 }, 2922 { 2923 "comment": "sql_calc_found_rows with limit", 2924 "query": "select sql_calc_found_rows * from music limit 100", 2925 "v3-plan": { 2926 "QueryType": "SELECT", 2927 "Original": "select sql_calc_found_rows * from music limit 100", 2928 "Instructions": { 2929 "OperatorType": "SQL_CALC_FOUND_ROWS", 2930 "Inputs": [ 2931 { 2932 "OperatorType": "Limit", 2933 "Count": "INT64(100)", 2934 "Inputs": [ 2935 { 2936 "OperatorType": "Route", 2937 "Variant": "Scatter", 2938 "Keyspace": { 2939 "Name": "user", 2940 "Sharded": true 2941 }, 2942 "FieldQuery": "select * from music where 1 != 1", 2943 "Query": "select * from music limit :__upper_limit", 2944 "Table": "music" 2945 } 2946 ] 2947 }, 2948 { 2949 "OperatorType": "Aggregate", 2950 "Variant": "Scalar", 2951 "Aggregates": "sum_count(0) AS count", 2952 "Inputs": [ 2953 { 2954 "OperatorType": "Route", 2955 "Variant": "Scatter", 2956 "Keyspace": { 2957 "Name": "user", 2958 "Sharded": true 2959 }, 2960 "FieldQuery": "select count(*) from music where 1 != 1", 2961 "Query": "select count(*) from music", 2962 "Table": "music" 2963 } 2964 ] 2965 } 2966 ] 2967 } 2968 }, 2969 "gen4-plan": { 2970 "QueryType": "SELECT", 2971 "Original": "select sql_calc_found_rows * from music limit 100", 2972 "Instructions": { 2973 "OperatorType": "SQL_CALC_FOUND_ROWS", 2974 "Inputs": [ 2975 { 2976 "OperatorType": "Limit", 2977 "Count": "INT64(100)", 2978 "Inputs": [ 2979 { 2980 "OperatorType": "Route", 2981 "Variant": "Scatter", 2982 "Keyspace": { 2983 "Name": "user", 2984 "Sharded": true 2985 }, 2986 "FieldQuery": "select * from music where 1 != 1", 2987 "Query": "select * from music limit :__upper_limit", 2988 "Table": "music" 2989 } 2990 ] 2991 }, 2992 { 2993 "OperatorType": "Aggregate", 2994 "Variant": "Scalar", 2995 "Aggregates": "sum_count_star(0) AS count(*)", 2996 "Inputs": [ 2997 { 2998 "OperatorType": "Route", 2999 "Variant": "Scatter", 3000 "Keyspace": { 3001 "Name": "user", 3002 "Sharded": true 3003 }, 3004 "FieldQuery": "select count(*) from music where 1 != 1", 3005 "Query": "select count(*) from music", 3006 "Table": "music" 3007 } 3008 ] 3009 } 3010 ] 3011 }, 3012 "TablesUsed": [ 3013 "user.music" 3014 ] 3015 } 3016 }, 3017 { 3018 "comment": "sql_calc_found_rows with SelectEqualUnique plans", 3019 "query": "select sql_calc_found_rows * from music where user_id = 1 limit 2", 3020 "v3-plan": { 3021 "QueryType": "SELECT", 3022 "Original": "select sql_calc_found_rows * from music where user_id = 1 limit 2", 3023 "Instructions": { 3024 "OperatorType": "SQL_CALC_FOUND_ROWS", 3025 "Inputs": [ 3026 { 3027 "OperatorType": "Route", 3028 "Variant": "EqualUnique", 3029 "Keyspace": { 3030 "Name": "user", 3031 "Sharded": true 3032 }, 3033 "FieldQuery": "select * from music where 1 != 1", 3034 "Query": "select * from music where user_id = 1 limit 2", 3035 "Table": "music", 3036 "Values": [ 3037 "INT64(1)" 3038 ], 3039 "Vindex": "user_index" 3040 }, 3041 { 3042 "OperatorType": "Route", 3043 "Variant": "EqualUnique", 3044 "Keyspace": { 3045 "Name": "user", 3046 "Sharded": true 3047 }, 3048 "FieldQuery": "select count(*) from music where 1 != 1", 3049 "Query": "select count(*) from music where user_id = 1", 3050 "Table": "music", 3051 "Values": [ 3052 "INT64(1)" 3053 ], 3054 "Vindex": "user_index" 3055 } 3056 ] 3057 } 3058 }, 3059 "gen4-plan": { 3060 "QueryType": "SELECT", 3061 "Original": "select sql_calc_found_rows * from music where user_id = 1 limit 2", 3062 "Instructions": { 3063 "OperatorType": "SQL_CALC_FOUND_ROWS", 3064 "Inputs": [ 3065 { 3066 "OperatorType": "Route", 3067 "Variant": "EqualUnique", 3068 "Keyspace": { 3069 "Name": "user", 3070 "Sharded": true 3071 }, 3072 "FieldQuery": "select * from music where 1 != 1", 3073 "Query": "select * from music where user_id = 1 limit 2", 3074 "Table": "music", 3075 "Values": [ 3076 "INT64(1)" 3077 ], 3078 "Vindex": "user_index" 3079 }, 3080 { 3081 "OperatorType": "Route", 3082 "Variant": "EqualUnique", 3083 "Keyspace": { 3084 "Name": "user", 3085 "Sharded": true 3086 }, 3087 "FieldQuery": "select count(*) from music where 1 != 1", 3088 "Query": "select count(*) from music where user_id = 1", 3089 "Table": "music", 3090 "Values": [ 3091 "INT64(1)" 3092 ], 3093 "Vindex": "user_index" 3094 } 3095 ] 3096 }, 3097 "TablesUsed": [ 3098 "user.music" 3099 ] 3100 } 3101 }, 3102 { 3103 "comment": "sql_calc_found_rows with group by and having", 3104 "query": "select sql_calc_found_rows user_id, count(id) from music group by user_id having count(user_id) = 1 order by user_id limit 2", 3105 "v3-plan": { 3106 "QueryType": "SELECT", 3107 "Original": "select sql_calc_found_rows user_id, count(id) from music group by user_id having count(user_id) = 1 order by user_id limit 2", 3108 "Instructions": { 3109 "OperatorType": "SQL_CALC_FOUND_ROWS", 3110 "Inputs": [ 3111 { 3112 "OperatorType": "Limit", 3113 "Count": "INT64(2)", 3114 "Inputs": [ 3115 { 3116 "OperatorType": "Route", 3117 "Variant": "Scatter", 3118 "Keyspace": { 3119 "Name": "user", 3120 "Sharded": true 3121 }, 3122 "FieldQuery": "select user_id, count(id), weight_string(user_id) from music where 1 != 1 group by user_id", 3123 "OrderBy": "(0|2) ASC", 3124 "Query": "select user_id, count(id), weight_string(user_id) from music group by user_id having count(user_id) = 1 order by user_id asc limit :__upper_limit", 3125 "ResultColumns": 2, 3126 "Table": "music" 3127 } 3128 ] 3129 }, 3130 { 3131 "OperatorType": "Aggregate", 3132 "Variant": "Scalar", 3133 "Aggregates": "sum_count(0) AS count", 3134 "Inputs": [ 3135 { 3136 "OperatorType": "Route", 3137 "Variant": "Scatter", 3138 "Keyspace": { 3139 "Name": "user", 3140 "Sharded": true 3141 }, 3142 "FieldQuery": "select count(*) from (select user_id, count(id) from music where 1 != 1 group by user_id) as t where 1 != 1", 3143 "Query": "select count(*) from (select user_id, count(id) from music group by user_id having count(user_id) = 1) as t", 3144 "Table": "music" 3145 } 3146 ] 3147 } 3148 ] 3149 } 3150 }, 3151 "gen4-plan": { 3152 "QueryType": "SELECT", 3153 "Original": "select sql_calc_found_rows user_id, count(id) from music group by user_id having count(user_id) = 1 order by user_id limit 2", 3154 "Instructions": { 3155 "OperatorType": "SQL_CALC_FOUND_ROWS", 3156 "Inputs": [ 3157 { 3158 "OperatorType": "Limit", 3159 "Count": "INT64(2)", 3160 "Inputs": [ 3161 { 3162 "OperatorType": "Route", 3163 "Variant": "Scatter", 3164 "Keyspace": { 3165 "Name": "user", 3166 "Sharded": true 3167 }, 3168 "FieldQuery": "select user_id, count(id), weight_string(user_id) from music where 1 != 1 group by user_id", 3169 "OrderBy": "(0|2) ASC", 3170 "Query": "select user_id, count(id), weight_string(user_id) from music group by user_id having count(user_id) = 1 order by user_id asc limit :__upper_limit", 3171 "ResultColumns": 2, 3172 "Table": "music" 3173 } 3174 ] 3175 }, 3176 { 3177 "OperatorType": "Aggregate", 3178 "Variant": "Scalar", 3179 "Aggregates": "sum_count_star(0) AS count(*)", 3180 "Inputs": [ 3181 { 3182 "OperatorType": "Route", 3183 "Variant": "Scatter", 3184 "Keyspace": { 3185 "Name": "user", 3186 "Sharded": true 3187 }, 3188 "FieldQuery": "select count(*) from (select user_id, count(id) from music where 1 != 1 group by user_id) as t where 1 != 1", 3189 "Query": "select count(*) from (select user_id, count(id) from music group by user_id having count(user_id) = 1) as t", 3190 "Table": "music" 3191 } 3192 ] 3193 } 3194 ] 3195 }, 3196 "TablesUsed": [ 3197 "user.music" 3198 ] 3199 } 3200 }, 3201 { 3202 "comment": "sql_calc_found_rows in sub queries", 3203 "query": "select * from music where user_id IN (select sql_calc_found_rows * from music limit 10)", 3204 "v3-plan": "VT03008: incorrect usage/placement of 'SQL_CALC_FOUND_ROWS'", 3205 "gen4-plan": "Incorrect usage/placement of 'SQL_CALC_FOUND_ROWS'" 3206 }, 3207 { 3208 "comment": "sql_calc_found_rows in derived table", 3209 "query": "select sql_calc_found_rows * from (select sql_calc_found_rows * from music limit 10) t limit 1", 3210 "v3-plan": "VT03008: incorrect usage/placement of 'SQL_CALC_FOUND_ROWS'", 3211 "gen4-plan": "Incorrect usage/placement of 'SQL_CALC_FOUND_ROWS'" 3212 }, 3213 { 3214 "comment": "select from unsharded keyspace into dumpfile", 3215 "query": "select * from main.unsharded into Dumpfile 'x.txt'", 3216 "v3-plan": { 3217 "QueryType": "SELECT", 3218 "Original": "select * from main.unsharded into Dumpfile 'x.txt'", 3219 "Instructions": { 3220 "OperatorType": "Route", 3221 "Variant": "Unsharded", 3222 "Keyspace": { 3223 "Name": "main", 3224 "Sharded": false 3225 }, 3226 "FieldQuery": "select * from unsharded where 1 != 1", 3227 "Query": "select * from unsharded into dumpfile 'x.txt'", 3228 "Table": "unsharded" 3229 } 3230 }, 3231 "gen4-plan": { 3232 "QueryType": "SELECT", 3233 "Original": "select * from main.unsharded into Dumpfile 'x.txt'", 3234 "Instructions": { 3235 "OperatorType": "Route", 3236 "Variant": "Unsharded", 3237 "Keyspace": { 3238 "Name": "main", 3239 "Sharded": false 3240 }, 3241 "FieldQuery": "select * from unsharded where 1 != 1", 3242 "Query": "select * from unsharded into dumpfile 'x.txt'", 3243 "Table": "unsharded" 3244 }, 3245 "TablesUsed": [ 3246 "main.unsharded" 3247 ] 3248 } 3249 }, 3250 { 3251 "comment": "select from unsharded keyspace into outfile", 3252 "query": "select * from main.unsharded into outfile 'x.txt' character set binary fields terminated by 'term' optionally enclosed by 'c' escaped by 'e' lines starting by 'a' terminated by '\n'", 3253 "v3-plan": { 3254 "QueryType": "SELECT", 3255 "Original": "select * from main.unsharded into outfile 'x.txt' character set binary fields terminated by 'term' optionally enclosed by 'c' escaped by 'e' lines starting by 'a' terminated by '\n'", 3256 "Instructions": { 3257 "OperatorType": "Route", 3258 "Variant": "Unsharded", 3259 "Keyspace": { 3260 "Name": "main", 3261 "Sharded": false 3262 }, 3263 "FieldQuery": "select * from unsharded where 1 != 1", 3264 "Query": "select * from unsharded into outfile 'x.txt' character set binary fields terminated by 'term' optionally enclosed by 'c' escaped by 'e' lines starting by 'a' terminated by '\\n'", 3265 "Table": "unsharded" 3266 } 3267 }, 3268 "gen4-plan": { 3269 "QueryType": "SELECT", 3270 "Original": "select * from main.unsharded into outfile 'x.txt' character set binary fields terminated by 'term' optionally enclosed by 'c' escaped by 'e' lines starting by 'a' terminated by '\n'", 3271 "Instructions": { 3272 "OperatorType": "Route", 3273 "Variant": "Unsharded", 3274 "Keyspace": { 3275 "Name": "main", 3276 "Sharded": false 3277 }, 3278 "FieldQuery": "select * from unsharded where 1 != 1", 3279 "Query": "select * from unsharded into outfile 'x.txt' character set binary fields terminated by 'term' optionally enclosed by 'c' escaped by 'e' lines starting by 'a' terminated by '\\n'", 3280 "Table": "unsharded" 3281 }, 3282 "TablesUsed": [ 3283 "main.unsharded" 3284 ] 3285 } 3286 }, 3287 { 3288 "comment": "select from unsharded keyspace into outfile s3", 3289 "query": "select * from main.unsharded into outfile s3 'out_file_name' character set binary format csv header fields terminated by 'term' optionally enclosed by 'c' escaped by 'e' lines starting by 'a' terminated by '\n' manifest on overwrite off", 3290 "v3-plan": { 3291 "QueryType": "SELECT", 3292 "Original": "select * from main.unsharded into outfile s3 'out_file_name' character set binary format csv header fields terminated by 'term' optionally enclosed by 'c' escaped by 'e' lines starting by 'a' terminated by '\n' manifest on overwrite off", 3293 "Instructions": { 3294 "OperatorType": "Route", 3295 "Variant": "Unsharded", 3296 "Keyspace": { 3297 "Name": "main", 3298 "Sharded": false 3299 }, 3300 "FieldQuery": "select * from unsharded where 1 != 1", 3301 "Query": "select * from unsharded into outfile s3 'out_file_name' character set binary format csv header fields terminated by 'term' optionally enclosed by 'c' escaped by 'e' lines starting by 'a' terminated by '\\n' manifest on overwrite off", 3302 "Table": "unsharded" 3303 } 3304 }, 3305 "gen4-plan": { 3306 "QueryType": "SELECT", 3307 "Original": "select * from main.unsharded into outfile s3 'out_file_name' character set binary format csv header fields terminated by 'term' optionally enclosed by 'c' escaped by 'e' lines starting by 'a' terminated by '\n' manifest on overwrite off", 3308 "Instructions": { 3309 "OperatorType": "Route", 3310 "Variant": "Unsharded", 3311 "Keyspace": { 3312 "Name": "main", 3313 "Sharded": false 3314 }, 3315 "FieldQuery": "select * from unsharded where 1 != 1", 3316 "Query": "select * from unsharded into outfile s3 'out_file_name' character set binary format csv header fields terminated by 'term' optionally enclosed by 'c' escaped by 'e' lines starting by 'a' terminated by '\\n' manifest on overwrite off", 3317 "Table": "unsharded" 3318 }, 3319 "TablesUsed": [ 3320 "main.unsharded" 3321 ] 3322 } 3323 }, 3324 { 3325 "comment": "Union after into outfile is incorrect", 3326 "query": "select id from user into outfile 'out_file_name' union all select id from music", 3327 "plan": "syntax error at position 55 near 'union'" 3328 }, 3329 { 3330 "comment": "Into outfile s3 in derived table is incorrect", 3331 "query": "select id from (select id from user into outfile s3 'inner_outfile') as t2", 3332 "plan": "syntax error at position 41 near 'into'" 3333 }, 3334 { 3335 "comment": "Into outfile s3 in derived table with union incorrect", 3336 "query": "select id from (select id from user into outfile s3 'inner_outfile' union select 1) as t2", 3337 "plan": "syntax error at position 41 near 'into'" 3338 }, 3339 { 3340 "comment": "select (select u.id from user as u where u.id = 1), a.id from user as a where a.id = 1", 3341 "query": "select (select u.id from user as u where u.id = 1), a.id from user as a where a.id = 1", 3342 "v3-plan": { 3343 "QueryType": "SELECT", 3344 "Original": "select (select u.id from user as u where u.id = 1), a.id from user as a where a.id = 1", 3345 "Instructions": { 3346 "OperatorType": "Route", 3347 "Variant": "EqualUnique", 3348 "Keyspace": { 3349 "Name": "user", 3350 "Sharded": true 3351 }, 3352 "FieldQuery": "select (select u.id from `user` as u where 1 != 1), a.id from `user` as a where 1 != 1", 3353 "Query": "select (select u.id from `user` as u where u.id = 1), a.id from `user` as a where a.id = 1", 3354 "Table": "`user`", 3355 "Values": [ 3356 "INT64(1)" 3357 ], 3358 "Vindex": "user_index" 3359 } 3360 }, 3361 "gen4-plan": { 3362 "QueryType": "SELECT", 3363 "Original": "select (select u.id from user as u where u.id = 1), a.id from user as a where a.id = 1", 3364 "Instructions": { 3365 "OperatorType": "Route", 3366 "Variant": "EqualUnique", 3367 "Keyspace": { 3368 "Name": "user", 3369 "Sharded": true 3370 }, 3371 "FieldQuery": "select (select u.id from `user` as u where 1 != 1), a.id from `user` as a where 1 != 1", 3372 "Query": "select (select u.id from `user` as u where u.id = 1), a.id from `user` as a where a.id = 1", 3373 "Table": "`user`", 3374 "Values": [ 3375 "INT64(1)" 3376 ], 3377 "Vindex": "user_index" 3378 }, 3379 "TablesUsed": [ 3380 "user.user" 3381 ] 3382 } 3383 }, 3384 { 3385 "comment": "Add two tables with the same column in a join", 3386 "query": "select t.id, s.id from user t join user_extra s on t.id = s.user_id join unsharded", 3387 "v3-plan": { 3388 "QueryType": "SELECT", 3389 "Original": "select t.id, s.id from user t join user_extra s on t.id = s.user_id join unsharded", 3390 "Instructions": { 3391 "OperatorType": "Join", 3392 "Variant": "Join", 3393 "JoinColumnIndexes": "L:0,L:1", 3394 "TableName": "`user`, user_extra_unsharded", 3395 "Inputs": [ 3396 { 3397 "OperatorType": "Route", 3398 "Variant": "Scatter", 3399 "Keyspace": { 3400 "Name": "user", 3401 "Sharded": true 3402 }, 3403 "FieldQuery": "select t.id, s.id from `user` as t join user_extra as s on t.id = s.user_id where 1 != 1", 3404 "Query": "select t.id, s.id from `user` as t join user_extra as s on t.id = s.user_id", 3405 "Table": "`user`, user_extra" 3406 }, 3407 { 3408 "OperatorType": "Route", 3409 "Variant": "Unsharded", 3410 "Keyspace": { 3411 "Name": "main", 3412 "Sharded": false 3413 }, 3414 "FieldQuery": "select 1 from unsharded where 1 != 1", 3415 "Query": "select 1 from unsharded", 3416 "Table": "unsharded" 3417 } 3418 ] 3419 } 3420 }, 3421 "gen4-plan": { 3422 "QueryType": "SELECT", 3423 "Original": "select t.id, s.id from user t join user_extra s on t.id = s.user_id join unsharded", 3424 "Instructions": { 3425 "OperatorType": "Join", 3426 "Variant": "Join", 3427 "JoinColumnIndexes": "R:0,R:1", 3428 "TableName": "unsharded_`user`, user_extra", 3429 "Inputs": [ 3430 { 3431 "OperatorType": "Route", 3432 "Variant": "Unsharded", 3433 "Keyspace": { 3434 "Name": "main", 3435 "Sharded": false 3436 }, 3437 "FieldQuery": "select 1 from unsharded where 1 != 1", 3438 "Query": "select 1 from unsharded", 3439 "Table": "unsharded" 3440 }, 3441 { 3442 "OperatorType": "Route", 3443 "Variant": "Scatter", 3444 "Keyspace": { 3445 "Name": "user", 3446 "Sharded": true 3447 }, 3448 "FieldQuery": "select t.id, s.id from `user` as t, user_extra as s where 1 != 1", 3449 "Query": "select t.id, s.id from `user` as t, user_extra as s where t.id = s.user_id", 3450 "Table": "`user`, user_extra" 3451 } 3452 ] 3453 }, 3454 "TablesUsed": [ 3455 "main.unsharded", 3456 "user.user", 3457 "user.user_extra" 3458 ] 3459 } 3460 }, 3461 { 3462 "comment": "((((select 1))))", 3463 "query": "((((select 1))))", 3464 "v3-plan": { 3465 "QueryType": "SELECT", 3466 "Original": "((((select 1))))", 3467 "Instructions": { 3468 "OperatorType": "Projection", 3469 "Expressions": [ 3470 "INT64(1) as 1" 3471 ], 3472 "Inputs": [ 3473 { 3474 "OperatorType": "SingleRow" 3475 } 3476 ] 3477 } 3478 }, 3479 "gen4-plan": { 3480 "QueryType": "SELECT", 3481 "Original": "((((select 1))))", 3482 "Instructions": { 3483 "OperatorType": "Projection", 3484 "Expressions": [ 3485 "INT64(1) as 1" 3486 ], 3487 "Inputs": [ 3488 { 3489 "OperatorType": "SingleRow" 3490 } 3491 ] 3492 }, 3493 "TablesUsed": [ 3494 "main.dual" 3495 ] 3496 } 3497 }, 3498 { 3499 "comment": "Merging dual with user", 3500 "query": "select 42, id from dual, user", 3501 "v3-plan": { 3502 "QueryType": "SELECT", 3503 "Original": "select 42, id from dual, user", 3504 "Instructions": { 3505 "OperatorType": "Join", 3506 "Variant": "Join", 3507 "JoinColumnIndexes": "L:0,R:0", 3508 "TableName": "dual_`user`", 3509 "Inputs": [ 3510 { 3511 "OperatorType": "Route", 3512 "Variant": "Reference", 3513 "Keyspace": { 3514 "Name": "main", 3515 "Sharded": false 3516 }, 3517 "FieldQuery": "select 42 from dual where 1 != 1", 3518 "Query": "select 42 from dual", 3519 "Table": "dual" 3520 }, 3521 { 3522 "OperatorType": "Route", 3523 "Variant": "Scatter", 3524 "Keyspace": { 3525 "Name": "user", 3526 "Sharded": true 3527 }, 3528 "FieldQuery": "select id from `user` where 1 != 1", 3529 "Query": "select id from `user`", 3530 "Table": "`user`" 3531 } 3532 ] 3533 } 3534 }, 3535 "gen4-plan": { 3536 "QueryType": "SELECT", 3537 "Original": "select 42, id from dual, user", 3538 "Instructions": { 3539 "OperatorType": "Route", 3540 "Variant": "Scatter", 3541 "Keyspace": { 3542 "Name": "user", 3543 "Sharded": true 3544 }, 3545 "FieldQuery": "select 42, id from dual, `user` where 1 != 1", 3546 "Query": "select 42, id from dual, `user`", 3547 "Table": "`user`, dual" 3548 }, 3549 "TablesUsed": [ 3550 "main.dual", 3551 "user.user" 3552 ] 3553 } 3554 }, 3555 { 3556 "comment": "Table named \"dual\" with a qualifier joined on user should not be merged", 3557 "query": "select 42, user.id from main.dual, user", 3558 "v3-plan": { 3559 "QueryType": "SELECT", 3560 "Original": "select 42, user.id from main.dual, user", 3561 "Instructions": { 3562 "OperatorType": "Join", 3563 "Variant": "Join", 3564 "JoinColumnIndexes": "L:0,R:0", 3565 "TableName": "dual_`user`", 3566 "Inputs": [ 3567 { 3568 "OperatorType": "Route", 3569 "Variant": "Reference", 3570 "Keyspace": { 3571 "Name": "main", 3572 "Sharded": false 3573 }, 3574 "FieldQuery": "select 42 from dual where 1 != 1", 3575 "Query": "select 42 from dual", 3576 "Table": "dual" 3577 }, 3578 { 3579 "OperatorType": "Route", 3580 "Variant": "Scatter", 3581 "Keyspace": { 3582 "Name": "user", 3583 "Sharded": true 3584 }, 3585 "FieldQuery": "select `user`.id from `user` where 1 != 1", 3586 "Query": "select `user`.id from `user`", 3587 "Table": "`user`" 3588 } 3589 ] 3590 } 3591 }, 3592 "gen4-plan": { 3593 "QueryType": "SELECT", 3594 "Original": "select 42, user.id from main.dual, user", 3595 "Instructions": { 3596 "OperatorType": "Join", 3597 "Variant": "Join", 3598 "JoinColumnIndexes": "L:0,R:0", 3599 "TableName": "dual_`user`", 3600 "Inputs": [ 3601 { 3602 "OperatorType": "Route", 3603 "Variant": "Reference", 3604 "Keyspace": { 3605 "Name": "main", 3606 "Sharded": false 3607 }, 3608 "FieldQuery": "select 42 from dual where 1 != 1", 3609 "Query": "select 42 from dual", 3610 "Table": "dual" 3611 }, 3612 { 3613 "OperatorType": "Route", 3614 "Variant": "Scatter", 3615 "Keyspace": { 3616 "Name": "user", 3617 "Sharded": true 3618 }, 3619 "FieldQuery": "select `user`.id from `user` where 1 != 1", 3620 "Query": "select `user`.id from `user`", 3621 "Table": "`user`" 3622 } 3623 ] 3624 }, 3625 "TablesUsed": [ 3626 "main.dual", 3627 "user.user" 3628 ] 3629 } 3630 }, 3631 { 3632 "comment": "select (select col from user limit 1) as a from user join user_extra order by a", 3633 "query": "select (select col from user limit 1) as a from user join user_extra order by a", 3634 "v3-plan": { 3635 "QueryType": "SELECT", 3636 "Original": "select (select col from user limit 1) as a from user join user_extra order by a", 3637 "Instructions": { 3638 "OperatorType": "Subquery", 3639 "Variant": "PulloutValue", 3640 "PulloutVars": [ 3641 "__sq_has_values1", 3642 "__sq1" 3643 ], 3644 "Inputs": [ 3645 { 3646 "OperatorType": "Limit", 3647 "Count": "INT64(1)", 3648 "Inputs": [ 3649 { 3650 "OperatorType": "Route", 3651 "Variant": "Scatter", 3652 "Keyspace": { 3653 "Name": "user", 3654 "Sharded": true 3655 }, 3656 "FieldQuery": "select col from `user` where 1 != 1", 3657 "Query": "select col from `user` limit :__upper_limit", 3658 "Table": "`user`" 3659 } 3660 ] 3661 }, 3662 { 3663 "OperatorType": "Join", 3664 "Variant": "Join", 3665 "JoinColumnIndexes": "L:0", 3666 "TableName": "`user`_user_extra", 3667 "Inputs": [ 3668 { 3669 "OperatorType": "Route", 3670 "Variant": "Scatter", 3671 "Keyspace": { 3672 "Name": "user", 3673 "Sharded": true 3674 }, 3675 "FieldQuery": "select :__sq1 as a, weight_string(:__sq1) from `user` where 1 != 1", 3676 "OrderBy": "(0|1) ASC", 3677 "Query": "select :__sq1 as a, weight_string(:__sq1) from `user` order by a asc", 3678 "ResultColumns": 1, 3679 "Table": "`user`" 3680 }, 3681 { 3682 "OperatorType": "Route", 3683 "Variant": "Scatter", 3684 "Keyspace": { 3685 "Name": "user", 3686 "Sharded": true 3687 }, 3688 "FieldQuery": "select 1 from user_extra where 1 != 1", 3689 "Query": "select 1 from user_extra", 3690 "Table": "user_extra" 3691 } 3692 ] 3693 } 3694 ] 3695 } 3696 }, 3697 "gen4-plan": { 3698 "QueryType": "SELECT", 3699 "Original": "select (select col from user limit 1) as a from user join user_extra order by a", 3700 "Instructions": { 3701 "OperatorType": "Subquery", 3702 "Variant": "PulloutValue", 3703 "PulloutVars": [ 3704 "__sq1" 3705 ], 3706 "Inputs": [ 3707 { 3708 "OperatorType": "Limit", 3709 "Count": "INT64(1)", 3710 "Inputs": [ 3711 { 3712 "OperatorType": "Route", 3713 "Variant": "Scatter", 3714 "Keyspace": { 3715 "Name": "user", 3716 "Sharded": true 3717 }, 3718 "FieldQuery": "select col from `user` where 1 != 1", 3719 "Query": "select col from `user` limit :__upper_limit", 3720 "Table": "`user`" 3721 } 3722 ] 3723 }, 3724 { 3725 "OperatorType": "Join", 3726 "Variant": "Join", 3727 "JoinColumnIndexes": "L:0", 3728 "TableName": "`user`_user_extra", 3729 "Inputs": [ 3730 { 3731 "OperatorType": "Route", 3732 "Variant": "Scatter", 3733 "Keyspace": { 3734 "Name": "user", 3735 "Sharded": true 3736 }, 3737 "FieldQuery": "select :__sq1 as a, weight_string(:__sq1) from `user` where 1 != 1", 3738 "OrderBy": "(0|1) ASC", 3739 "Query": "select :__sq1 as a, weight_string(:__sq1) from `user` order by a asc", 3740 "Table": "`user`" 3741 }, 3742 { 3743 "OperatorType": "Route", 3744 "Variant": "Scatter", 3745 "Keyspace": { 3746 "Name": "user", 3747 "Sharded": true 3748 }, 3749 "FieldQuery": "select 1 from user_extra where 1 != 1", 3750 "Query": "select 1 from user_extra", 3751 "Table": "user_extra" 3752 } 3753 ] 3754 } 3755 ] 3756 }, 3757 "TablesUsed": [ 3758 "user.user", 3759 "user.user_extra" 3760 ] 3761 } 3762 }, 3763 { 3764 "comment": "select t.a from (select (select col from user limit 1) as a from user join user_extra) t", 3765 "query": "select t.a from (select (select col from user limit 1) as a from user join user_extra) t", 3766 "v3-plan": { 3767 "QueryType": "SELECT", 3768 "Original": "select t.a from (select (select col from user limit 1) as a from user join user_extra) t", 3769 "Instructions": { 3770 "OperatorType": "SimpleProjection", 3771 "Columns": [ 3772 0 3773 ], 3774 "Inputs": [ 3775 { 3776 "OperatorType": "Subquery", 3777 "Variant": "PulloutValue", 3778 "PulloutVars": [ 3779 "__sq_has_values1", 3780 "__sq1" 3781 ], 3782 "Inputs": [ 3783 { 3784 "OperatorType": "Limit", 3785 "Count": "INT64(1)", 3786 "Inputs": [ 3787 { 3788 "OperatorType": "Route", 3789 "Variant": "Scatter", 3790 "Keyspace": { 3791 "Name": "user", 3792 "Sharded": true 3793 }, 3794 "FieldQuery": "select col from `user` where 1 != 1", 3795 "Query": "select col from `user` limit :__upper_limit", 3796 "Table": "`user`" 3797 } 3798 ] 3799 }, 3800 { 3801 "OperatorType": "Join", 3802 "Variant": "Join", 3803 "JoinColumnIndexes": "L:0", 3804 "TableName": "`user`_user_extra", 3805 "Inputs": [ 3806 { 3807 "OperatorType": "Route", 3808 "Variant": "Scatter", 3809 "Keyspace": { 3810 "Name": "user", 3811 "Sharded": true 3812 }, 3813 "FieldQuery": "select :__sq1 as a from `user` where 1 != 1", 3814 "Query": "select :__sq1 as a from `user`", 3815 "Table": "`user`" 3816 }, 3817 { 3818 "OperatorType": "Route", 3819 "Variant": "Scatter", 3820 "Keyspace": { 3821 "Name": "user", 3822 "Sharded": true 3823 }, 3824 "FieldQuery": "select 1 from user_extra where 1 != 1", 3825 "Query": "select 1 from user_extra", 3826 "Table": "user_extra" 3827 } 3828 ] 3829 } 3830 ] 3831 } 3832 ] 3833 } 3834 }, 3835 "gen4-plan": { 3836 "QueryType": "SELECT", 3837 "Original": "select t.a from (select (select col from user limit 1) as a from user join user_extra) t", 3838 "Instructions": { 3839 "OperatorType": "SimpleProjection", 3840 "Columns": [ 3841 0 3842 ], 3843 "Inputs": [ 3844 { 3845 "OperatorType": "Subquery", 3846 "Variant": "PulloutValue", 3847 "PulloutVars": [ 3848 "__sq1" 3849 ], 3850 "Inputs": [ 3851 { 3852 "OperatorType": "Limit", 3853 "Count": "INT64(1)", 3854 "Inputs": [ 3855 { 3856 "OperatorType": "Route", 3857 "Variant": "Scatter", 3858 "Keyspace": { 3859 "Name": "user", 3860 "Sharded": true 3861 }, 3862 "FieldQuery": "select col from `user` where 1 != 1", 3863 "Query": "select col from `user` limit :__upper_limit", 3864 "Table": "`user`" 3865 } 3866 ] 3867 }, 3868 { 3869 "OperatorType": "Join", 3870 "Variant": "Join", 3871 "JoinColumnIndexes": "L:0", 3872 "TableName": "`user`_user_extra", 3873 "Inputs": [ 3874 { 3875 "OperatorType": "Route", 3876 "Variant": "Scatter", 3877 "Keyspace": { 3878 "Name": "user", 3879 "Sharded": true 3880 }, 3881 "FieldQuery": "select :__sq1 as a from `user` where 1 != 1", 3882 "Query": "select :__sq1 as a from `user`", 3883 "Table": "`user`" 3884 }, 3885 { 3886 "OperatorType": "Route", 3887 "Variant": "Scatter", 3888 "Keyspace": { 3889 "Name": "user", 3890 "Sharded": true 3891 }, 3892 "FieldQuery": "select 1 from user_extra where 1 != 1", 3893 "Query": "select 1 from user_extra", 3894 "Table": "user_extra" 3895 } 3896 ] 3897 } 3898 ] 3899 } 3900 ] 3901 }, 3902 "TablesUsed": [ 3903 "user.user", 3904 "user.user_extra" 3905 ] 3906 } 3907 }, 3908 { 3909 "comment": "select (select col from user where user_extra.id = 4 limit 1) as a from user join user_extra", 3910 "query": "select (select col from user where user_extra.id = 4 limit 1) as a from user join user_extra", 3911 "plan": "VT12001: unsupported: cross-shard correlated subquery" 3912 }, 3913 { 3914 "comment": "plan test for a natural character set string", 3915 "query": "select N'string' from dual", 3916 "v3-plan": { 3917 "QueryType": "SELECT", 3918 "Original": "select N'string' from dual", 3919 "Instructions": { 3920 "OperatorType": "Projection", 3921 "Expressions": [ 3922 "VARCHAR(\"string\") as N'string'" 3923 ], 3924 "Inputs": [ 3925 { 3926 "OperatorType": "SingleRow" 3927 } 3928 ] 3929 } 3930 }, 3931 "gen4-plan": { 3932 "QueryType": "SELECT", 3933 "Original": "select N'string' from dual", 3934 "Instructions": { 3935 "OperatorType": "Projection", 3936 "Expressions": [ 3937 "VARCHAR(\"string\") as N'string'" 3938 ], 3939 "Inputs": [ 3940 { 3941 "OperatorType": "SingleRow" 3942 } 3943 ] 3944 }, 3945 "TablesUsed": [ 3946 "main.dual" 3947 ] 3948 } 3949 }, 3950 { 3951 "comment": "select expression having dependencies on both sides of a join", 3952 "query": "select user.id * user_id as amount from user, user_extra", 3953 "v3-plan": { 3954 "QueryType": "SELECT", 3955 "Original": "select user.id * user_id as amount from user, user_extra", 3956 "Instructions": { 3957 "OperatorType": "Join", 3958 "Variant": "Join", 3959 "JoinColumnIndexes": "R:0", 3960 "JoinVars": { 3961 "user_id": 0 3962 }, 3963 "TableName": "`user`_user_extra", 3964 "Inputs": [ 3965 { 3966 "OperatorType": "Route", 3967 "Variant": "Scatter", 3968 "Keyspace": { 3969 "Name": "user", 3970 "Sharded": true 3971 }, 3972 "FieldQuery": "select `user`.id from `user` where 1 != 1", 3973 "Query": "select `user`.id from `user`", 3974 "Table": "`user`" 3975 }, 3976 { 3977 "OperatorType": "Route", 3978 "Variant": "Scatter", 3979 "Keyspace": { 3980 "Name": "user", 3981 "Sharded": true 3982 }, 3983 "FieldQuery": "select :user_id * user_id as amount from user_extra where 1 != 1", 3984 "Query": "select :user_id * user_id as amount from user_extra", 3985 "Table": "user_extra" 3986 } 3987 ] 3988 } 3989 }, 3990 "gen4-plan": { 3991 "QueryType": "SELECT", 3992 "Original": "select user.id * user_id as amount from user, user_extra", 3993 "Instructions": { 3994 "OperatorType": "Join", 3995 "Variant": "Join", 3996 "JoinColumnIndexes": "R:0", 3997 "JoinVars": { 3998 "user_id": 0 3999 }, 4000 "TableName": "`user`_user_extra", 4001 "Inputs": [ 4002 { 4003 "OperatorType": "Route", 4004 "Variant": "Scatter", 4005 "Keyspace": { 4006 "Name": "user", 4007 "Sharded": true 4008 }, 4009 "FieldQuery": "select `user`.id from `user` where 1 != 1", 4010 "Query": "select `user`.id from `user`", 4011 "Table": "`user`" 4012 }, 4013 { 4014 "OperatorType": "Route", 4015 "Variant": "Scatter", 4016 "Keyspace": { 4017 "Name": "user", 4018 "Sharded": true 4019 }, 4020 "FieldQuery": "select :user_id * user_id as amount from user_extra where 1 != 1", 4021 "Query": "select :user_id * user_id as amount from user_extra", 4022 "Table": "user_extra" 4023 } 4024 ] 4025 }, 4026 "TablesUsed": [ 4027 "user.user", 4028 "user.user_extra" 4029 ] 4030 } 4031 }, 4032 { 4033 "comment": "correlated subquery in exists clause", 4034 "query": "select col from user where exists(select user_id from user_extra where user_id = 3 and user_id < user.id)", 4035 "v3-plan": "VT12001: unsupported: cross-shard correlated subquery", 4036 "gen4-plan": { 4037 "QueryType": "SELECT", 4038 "Original": "select col from user where exists(select user_id from user_extra where user_id = 3 and user_id < user.id)", 4039 "Instructions": { 4040 "OperatorType": "SemiJoin", 4041 "JoinVars": { 4042 "user_id": 0 4043 }, 4044 "ProjectedIndexes": "-2", 4045 "TableName": "`user`_user_extra", 4046 "Inputs": [ 4047 { 4048 "OperatorType": "Route", 4049 "Variant": "Scatter", 4050 "Keyspace": { 4051 "Name": "user", 4052 "Sharded": true 4053 }, 4054 "FieldQuery": "select `user`.id, col from `user` where 1 != 1", 4055 "Query": "select `user`.id, col from `user`", 4056 "Table": "`user`" 4057 }, 4058 { 4059 "OperatorType": "Route", 4060 "Variant": "EqualUnique", 4061 "Keyspace": { 4062 "Name": "user", 4063 "Sharded": true 4064 }, 4065 "FieldQuery": "select 1 from user_extra where 1 != 1", 4066 "Query": "select 1 from user_extra where user_id = 3 and user_id < :user_id", 4067 "Table": "user_extra", 4068 "Values": [ 4069 "INT64(3)" 4070 ], 4071 "Vindex": "user_index" 4072 } 4073 ] 4074 }, 4075 "TablesUsed": [ 4076 "user.user", 4077 "user.user_extra" 4078 ] 4079 } 4080 }, 4081 { 4082 "comment": "correlated subquery in exists clause with an order by", 4083 "query": "select col from user where exists(select user_id from user_extra where user_id = 3 and user_id < user.id) order by col", 4084 "v3-plan": "VT12001: unsupported: cross-shard correlated subquery", 4085 "gen4-plan": { 4086 "QueryType": "SELECT", 4087 "Original": "select col from user where exists(select user_id from user_extra where user_id = 3 and user_id < user.id) order by col", 4088 "Instructions": { 4089 "OperatorType": "SemiJoin", 4090 "JoinVars": { 4091 "user_id": 0 4092 }, 4093 "ProjectedIndexes": "-2", 4094 "TableName": "`user`_user_extra", 4095 "Inputs": [ 4096 { 4097 "OperatorType": "Route", 4098 "Variant": "Scatter", 4099 "Keyspace": { 4100 "Name": "user", 4101 "Sharded": true 4102 }, 4103 "FieldQuery": "select `user`.id, col from `user` where 1 != 1", 4104 "OrderBy": "1 ASC", 4105 "Query": "select `user`.id, col from `user` order by col asc", 4106 "Table": "`user`" 4107 }, 4108 { 4109 "OperatorType": "Route", 4110 "Variant": "EqualUnique", 4111 "Keyspace": { 4112 "Name": "user", 4113 "Sharded": true 4114 }, 4115 "FieldQuery": "select 1 from user_extra where 1 != 1", 4116 "Query": "select 1 from user_extra where user_id = 3 and user_id < :user_id", 4117 "Table": "user_extra", 4118 "Values": [ 4119 "INT64(3)" 4120 ], 4121 "Vindex": "user_index" 4122 } 4123 ] 4124 }, 4125 "TablesUsed": [ 4126 "user.user", 4127 "user.user_extra" 4128 ] 4129 } 4130 }, 4131 { 4132 "comment": "correlated subquery having dependencies on two tables", 4133 "query": "select 1 from user u1, user u2 where exists (select 1 from user_extra ue where ue.col = u1.col and ue.col = u2.col)", 4134 "v3-plan": "VT12001: unsupported: cross-shard correlated subquery", 4135 "gen4-plan": { 4136 "QueryType": "SELECT", 4137 "Original": "select 1 from user u1, user u2 where exists (select 1 from user_extra ue where ue.col = u1.col and ue.col = u2.col)", 4138 "Instructions": { 4139 "OperatorType": "SemiJoin", 4140 "JoinVars": { 4141 "u1_col": 0, 4142 "u2_col": 1 4143 }, 4144 "ProjectedIndexes": "-3", 4145 "TableName": "`user`_`user`_user_extra", 4146 "Inputs": [ 4147 { 4148 "OperatorType": "Join", 4149 "Variant": "Join", 4150 "JoinColumnIndexes": "L:0,R:0,L:1", 4151 "TableName": "`user`_`user`", 4152 "Inputs": [ 4153 { 4154 "OperatorType": "Route", 4155 "Variant": "Scatter", 4156 "Keyspace": { 4157 "Name": "user", 4158 "Sharded": true 4159 }, 4160 "FieldQuery": "select u1.col, 1 from `user` as u1 where 1 != 1", 4161 "Query": "select u1.col, 1 from `user` as u1", 4162 "Table": "`user`" 4163 }, 4164 { 4165 "OperatorType": "Route", 4166 "Variant": "Scatter", 4167 "Keyspace": { 4168 "Name": "user", 4169 "Sharded": true 4170 }, 4171 "FieldQuery": "select u2.col from `user` as u2 where 1 != 1", 4172 "Query": "select u2.col from `user` as u2", 4173 "Table": "`user`" 4174 } 4175 ] 4176 }, 4177 { 4178 "OperatorType": "Route", 4179 "Variant": "Scatter", 4180 "Keyspace": { 4181 "Name": "user", 4182 "Sharded": true 4183 }, 4184 "FieldQuery": "select 1 from user_extra as ue where 1 != 1", 4185 "Query": "select 1 from user_extra as ue where ue.col = :u1_col and ue.col = :u2_col", 4186 "Table": "user_extra" 4187 } 4188 ] 4189 }, 4190 "TablesUsed": [ 4191 "user.user", 4192 "user.user_extra" 4193 ] 4194 } 4195 }, 4196 { 4197 "comment": "correlated subquery using a column twice", 4198 "query": "select 1 from user u where exists (select 1 from user_extra ue where ue.col = u.col and u.col = ue.col2)", 4199 "v3-plan": "VT12001: unsupported: cross-shard correlated subquery", 4200 "gen4-plan": { 4201 "QueryType": "SELECT", 4202 "Original": "select 1 from user u where exists (select 1 from user_extra ue where ue.col = u.col and u.col = ue.col2)", 4203 "Instructions": { 4204 "OperatorType": "SemiJoin", 4205 "JoinVars": { 4206 "u_col": 0 4207 }, 4208 "ProjectedIndexes": "-2", 4209 "TableName": "`user`_user_extra", 4210 "Inputs": [ 4211 { 4212 "OperatorType": "Route", 4213 "Variant": "Scatter", 4214 "Keyspace": { 4215 "Name": "user", 4216 "Sharded": true 4217 }, 4218 "FieldQuery": "select u.col, 1 from `user` as u where 1 != 1", 4219 "Query": "select u.col, 1 from `user` as u", 4220 "Table": "`user`" 4221 }, 4222 { 4223 "OperatorType": "Route", 4224 "Variant": "Scatter", 4225 "Keyspace": { 4226 "Name": "user", 4227 "Sharded": true 4228 }, 4229 "FieldQuery": "select 1 from user_extra as ue where 1 != 1", 4230 "Query": "select 1 from user_extra as ue where ue.col = :u_col and ue.col2 = :u_col", 4231 "Table": "user_extra" 4232 } 4233 ] 4234 }, 4235 "TablesUsed": [ 4236 "user.user", 4237 "user.user_extra" 4238 ] 4239 } 4240 }, 4241 { 4242 "comment": "correlated subquery part of an OR clause", 4243 "query": "select 1 from user u where u.col = 6 or exists (select 1 from user_extra ue where ue.col = u.col and u.col = ue.col2)", 4244 "v3-plan": "VT12001: unsupported: cross-shard correlated subquery", 4245 "gen4-plan": "VT12001: unsupported: EXISTS sub-queries are only supported with AND clause" 4246 }, 4247 { 4248 "comment": "correlated subquery that is dependent on one side of a join, fully mergeable", 4249 "query": "SELECT music.id FROM music INNER JOIN user ON music.user_id = user.id WHERE music.user_id = 5 AND music.id = (SELECT MAX(m2.id) FROM music m2 WHERE m2.user_id = user.id)", 4250 "v3-plan": { 4251 "QueryType": "SELECT", 4252 "Original": "SELECT music.id FROM music INNER JOIN user ON music.user_id = user.id WHERE music.user_id = 5 AND music.id = (SELECT MAX(m2.id) FROM music m2 WHERE m2.user_id = user.id)", 4253 "Instructions": { 4254 "OperatorType": "Route", 4255 "Variant": "EqualUnique", 4256 "Keyspace": { 4257 "Name": "user", 4258 "Sharded": true 4259 }, 4260 "FieldQuery": "select music.id from music join `user` on music.user_id = `user`.id where 1 != 1", 4261 "Query": "select music.id from music join `user` on music.user_id = `user`.id where music.user_id = 5 and music.id = (select max(m2.id) from music as m2 where m2.user_id = `user`.id)", 4262 "Table": "music, `user`", 4263 "Values": [ 4264 "INT64(5)" 4265 ], 4266 "Vindex": "user_index" 4267 } 4268 }, 4269 "gen4-plan": { 4270 "QueryType": "SELECT", 4271 "Original": "SELECT music.id FROM music INNER JOIN user ON music.user_id = user.id WHERE music.user_id = 5 AND music.id = (SELECT MAX(m2.id) FROM music m2 WHERE m2.user_id = user.id)", 4272 "Instructions": { 4273 "OperatorType": "Route", 4274 "Variant": "EqualUnique", 4275 "Keyspace": { 4276 "Name": "user", 4277 "Sharded": true 4278 }, 4279 "FieldQuery": "select music.id from music, `user` where 1 != 1", 4280 "Query": "select music.id from music, `user` where music.user_id = 5 and music.id = (select max(m2.id) from music as m2 where m2.user_id = `user`.id) and music.user_id = `user`.id", 4281 "Table": "`user`, music", 4282 "Values": [ 4283 "INT64(5)" 4284 ], 4285 "Vindex": "user_index" 4286 }, 4287 "TablesUsed": [ 4288 "user.music", 4289 "user.user" 4290 ] 4291 } 4292 }, 4293 { 4294 "comment": "union as a derived table", 4295 "query": "select found from (select id as found from user union all (select id from unsharded)) as t", 4296 "v3-plan": { 4297 "QueryType": "SELECT", 4298 "Original": "select found from (select id as found from user union all (select id from unsharded)) as t", 4299 "Instructions": { 4300 "OperatorType": "SimpleProjection", 4301 "Columns": [ 4302 0 4303 ], 4304 "Inputs": [ 4305 { 4306 "OperatorType": "Concatenate", 4307 "Inputs": [ 4308 { 4309 "OperatorType": "Route", 4310 "Variant": "Scatter", 4311 "Keyspace": { 4312 "Name": "user", 4313 "Sharded": true 4314 }, 4315 "FieldQuery": "select id as found from `user` where 1 != 1", 4316 "Query": "select id as found from `user`", 4317 "Table": "`user`" 4318 }, 4319 { 4320 "OperatorType": "Route", 4321 "Variant": "Unsharded", 4322 "Keyspace": { 4323 "Name": "main", 4324 "Sharded": false 4325 }, 4326 "FieldQuery": "select id from unsharded where 1 != 1", 4327 "Query": "select id from unsharded", 4328 "Table": "unsharded" 4329 } 4330 ] 4331 } 4332 ] 4333 } 4334 }, 4335 "gen4-plan": { 4336 "QueryType": "SELECT", 4337 "Original": "select found from (select id as found from user union all (select id from unsharded)) as t", 4338 "Instructions": { 4339 "OperatorType": "SimpleProjection", 4340 "Columns": [ 4341 0 4342 ], 4343 "Inputs": [ 4344 { 4345 "OperatorType": "Concatenate", 4346 "Inputs": [ 4347 { 4348 "OperatorType": "Route", 4349 "Variant": "Scatter", 4350 "Keyspace": { 4351 "Name": "user", 4352 "Sharded": true 4353 }, 4354 "FieldQuery": "select id as found from `user` where 1 != 1", 4355 "Query": "select id as found from `user`", 4356 "Table": "`user`" 4357 }, 4358 { 4359 "OperatorType": "Route", 4360 "Variant": "Unsharded", 4361 "Keyspace": { 4362 "Name": "main", 4363 "Sharded": false 4364 }, 4365 "FieldQuery": "select id from unsharded where 1 != 1", 4366 "Query": "select id from unsharded", 4367 "Table": "unsharded" 4368 } 4369 ] 4370 } 4371 ] 4372 }, 4373 "TablesUsed": [ 4374 "main.unsharded", 4375 "user.user" 4376 ] 4377 } 4378 }, 4379 { 4380 "comment": "use output column containing data from both sides of the join", 4381 "query": "select user_extra.col + user.col from user join user_extra on user.id = user_extra.id", 4382 "v3-plan": { 4383 "QueryType": "SELECT", 4384 "Original": "select user_extra.col + user.col from user join user_extra on user.id = user_extra.id", 4385 "Instructions": { 4386 "OperatorType": "Join", 4387 "Variant": "Join", 4388 "JoinColumnIndexes": "R:0", 4389 "JoinVars": { 4390 "user_col": 0, 4391 "user_id": 1 4392 }, 4393 "TableName": "`user`_user_extra", 4394 "Inputs": [ 4395 { 4396 "OperatorType": "Route", 4397 "Variant": "Scatter", 4398 "Keyspace": { 4399 "Name": "user", 4400 "Sharded": true 4401 }, 4402 "FieldQuery": "select `user`.col, `user`.id from `user` where 1 != 1", 4403 "Query": "select `user`.col, `user`.id from `user`", 4404 "Table": "`user`" 4405 }, 4406 { 4407 "OperatorType": "Route", 4408 "Variant": "Scatter", 4409 "Keyspace": { 4410 "Name": "user", 4411 "Sharded": true 4412 }, 4413 "FieldQuery": "select user_extra.col + :user_col from user_extra where 1 != 1", 4414 "Query": "select user_extra.col + :user_col from user_extra where user_extra.id = :user_id", 4415 "Table": "user_extra" 4416 } 4417 ] 4418 } 4419 }, 4420 "gen4-plan": { 4421 "QueryType": "SELECT", 4422 "Original": "select user_extra.col + user.col from user join user_extra on user.id = user_extra.id", 4423 "Instructions": { 4424 "OperatorType": "Join", 4425 "Variant": "Join", 4426 "JoinColumnIndexes": "R:0", 4427 "JoinVars": { 4428 "user_extra_col": 1, 4429 "user_extra_id": 0 4430 }, 4431 "TableName": "user_extra_`user`", 4432 "Inputs": [ 4433 { 4434 "OperatorType": "Route", 4435 "Variant": "Scatter", 4436 "Keyspace": { 4437 "Name": "user", 4438 "Sharded": true 4439 }, 4440 "FieldQuery": "select user_extra.id, user_extra.col from user_extra where 1 != 1", 4441 "Query": "select user_extra.id, user_extra.col from user_extra", 4442 "Table": "user_extra" 4443 }, 4444 { 4445 "OperatorType": "Route", 4446 "Variant": "EqualUnique", 4447 "Keyspace": { 4448 "Name": "user", 4449 "Sharded": true 4450 }, 4451 "FieldQuery": "select :user_extra_col + `user`.col from `user` where 1 != 1", 4452 "Query": "select :user_extra_col + `user`.col from `user` where `user`.id = :user_extra_id", 4453 "Table": "`user`", 4454 "Values": [ 4455 ":user_extra_id" 4456 ], 4457 "Vindex": "user_index" 4458 } 4459 ] 4460 }, 4461 "TablesUsed": [ 4462 "user.user", 4463 "user.user_extra" 4464 ] 4465 } 4466 }, 4467 { 4468 "comment": "mergeable derived table with order by and limit", 4469 "query": "select 1 from (select col from main.unsharded order by main.unsharded.col1 desc limit 12 offset 0) as f left join unsharded as u on f.col = u.id", 4470 "plan": { 4471 "QueryType": "SELECT", 4472 "Original": "select 1 from (select col from main.unsharded order by main.unsharded.col1 desc limit 12 offset 0) as f left join unsharded as u on f.col = u.id", 4473 "Instructions": { 4474 "OperatorType": "Route", 4475 "Variant": "Unsharded", 4476 "Keyspace": { 4477 "Name": "main", 4478 "Sharded": false 4479 }, 4480 "FieldQuery": "select 1 from (select col from unsharded where 1 != 1) as f left join unsharded as u on f.col = u.id where 1 != 1", 4481 "Query": "select 1 from (select col from unsharded order by unsharded.col1 desc limit 0, 12) as f left join unsharded as u on f.col = u.id", 4482 "Table": "unsharded" 4483 }, 4484 "TablesUsed": [ 4485 "main.unsharded" 4486 ] 4487 } 4488 }, 4489 { 4490 "comment": "mergeable derived table with group by and limit", 4491 "query": "select 1 from (select col, count(*) as a from main.unsharded group by col having a > 0 limit 12 offset 0) as f left join unsharded as u on f.col = u.id", 4492 "plan": { 4493 "QueryType": "SELECT", 4494 "Original": "select 1 from (select col, count(*) as a from main.unsharded group by col having a > 0 limit 12 offset 0) as f left join unsharded as u on f.col = u.id", 4495 "Instructions": { 4496 "OperatorType": "Route", 4497 "Variant": "Unsharded", 4498 "Keyspace": { 4499 "Name": "main", 4500 "Sharded": false 4501 }, 4502 "FieldQuery": "select 1 from (select col, count(*) as a from unsharded where 1 != 1 group by col) as f left join unsharded as u on f.col = u.id where 1 != 1", 4503 "Query": "select 1 from (select col, count(*) as a from unsharded group by col having count(*) > 0 limit 0, 12) as f left join unsharded as u on f.col = u.id", 4504 "Table": "unsharded" 4505 }, 4506 "TablesUsed": [ 4507 "main.unsharded" 4508 ] 4509 } 4510 }, 4511 { 4512 "comment": "select user.id, trim(leading 'x' from user.name) from user", 4513 "query": "select user.id, trim(leading 'x' from user.name) from user", 4514 "v3-plan": { 4515 "QueryType": "SELECT", 4516 "Original": "select user.id, trim(leading 'x' from user.name) from user", 4517 "Instructions": { 4518 "OperatorType": "Route", 4519 "Variant": "Scatter", 4520 "Keyspace": { 4521 "Name": "user", 4522 "Sharded": true 4523 }, 4524 "FieldQuery": "select `user`.id, trim(leading 'x' from `user`.`name`) from `user` where 1 != 1", 4525 "Query": "select `user`.id, trim(leading 'x' from `user`.`name`) from `user`", 4526 "Table": "`user`" 4527 } 4528 }, 4529 "gen4-plan": { 4530 "QueryType": "SELECT", 4531 "Original": "select user.id, trim(leading 'x' from user.name) from user", 4532 "Instructions": { 4533 "OperatorType": "Route", 4534 "Variant": "Scatter", 4535 "Keyspace": { 4536 "Name": "user", 4537 "Sharded": true 4538 }, 4539 "FieldQuery": "select `user`.id, trim(leading 'x' from `user`.`name`) from `user` where 1 != 1", 4540 "Query": "select `user`.id, trim(leading 'x' from `user`.`name`) from `user`", 4541 "Table": "`user`" 4542 }, 4543 "TablesUsed": [ 4544 "user.user" 4545 ] 4546 } 4547 }, 4548 { 4549 "comment": "json utility functions", 4550 "query": "select jcol, JSON_STORAGE_SIZE(jcol), JSON_STORAGE_FREE(jcol), JSON_PRETTY(jcol) from user", 4551 "v3-plan": { 4552 "QueryType": "SELECT", 4553 "Original": "select jcol, JSON_STORAGE_SIZE(jcol), JSON_STORAGE_FREE(jcol), JSON_PRETTY(jcol) from user", 4554 "Instructions": { 4555 "OperatorType": "Route", 4556 "Variant": "Scatter", 4557 "Keyspace": { 4558 "Name": "user", 4559 "Sharded": true 4560 }, 4561 "FieldQuery": "select jcol, json_storage_size(jcol), json_storage_free(jcol), json_pretty(jcol) from `user` where 1 != 1", 4562 "Query": "select jcol, json_storage_size(jcol), json_storage_free(jcol), json_pretty(jcol) from `user`", 4563 "Table": "`user`" 4564 } 4565 }, 4566 "gen4-plan": { 4567 "QueryType": "SELECT", 4568 "Original": "select jcol, JSON_STORAGE_SIZE(jcol), JSON_STORAGE_FREE(jcol), JSON_PRETTY(jcol) from user", 4569 "Instructions": { 4570 "OperatorType": "Route", 4571 "Variant": "Scatter", 4572 "Keyspace": { 4573 "Name": "user", 4574 "Sharded": true 4575 }, 4576 "FieldQuery": "select jcol, json_storage_size(jcol), json_storage_free(jcol), json_pretty(jcol) from `user` where 1 != 1", 4577 "Query": "select jcol, json_storage_size(jcol), json_storage_free(jcol), json_pretty(jcol) from `user`", 4578 "Table": "`user`" 4579 }, 4580 "TablesUsed": [ 4581 "user.user" 4582 ] 4583 } 4584 }, 4585 { 4586 "comment": "dual query with exists clause", 4587 "query": "select 1 from dual where exists (select 1 from information_schema.TABLES where information_schema.TABLES.TABLE_NAME = 'proc' and information_schema.TABLES.TABLE_SCHEMA = 'mysql')", 4588 "v3-plan": { 4589 "QueryType": "SELECT", 4590 "Original": "select 1 from dual where exists (select 1 from information_schema.TABLES where information_schema.TABLES.TABLE_NAME = 'proc' and information_schema.TABLES.TABLE_SCHEMA = 'mysql')", 4591 "Instructions": { 4592 "OperatorType": "Route", 4593 "Variant": "DBA", 4594 "Keyspace": { 4595 "Name": "main", 4596 "Sharded": false 4597 }, 4598 "FieldQuery": "select 1 from dual where 1 != 1", 4599 "Query": "select 1 from dual where exists (select 1 from information_schema.`TABLES` where information_schema.`TABLES`.TABLE_NAME = :TABLES_TABLE_NAME and information_schema.`TABLES`.TABLE_SCHEMA = :__vtschemaname limit 1)", 4600 "SysTableTableName": "[TABLES_TABLE_NAME:VARCHAR(\"proc\")]", 4601 "SysTableTableSchema": "[VARCHAR(\"mysql\")]", 4602 "Table": "dual" 4603 } 4604 }, 4605 "gen4-plan": { 4606 "QueryType": "SELECT", 4607 "Original": "select 1 from dual where exists (select 1 from information_schema.TABLES where information_schema.TABLES.TABLE_NAME = 'proc' and information_schema.TABLES.TABLE_SCHEMA = 'mysql')", 4608 "Instructions": { 4609 "OperatorType": "Route", 4610 "Variant": "DBA", 4611 "Keyspace": { 4612 "Name": "main", 4613 "Sharded": false 4614 }, 4615 "FieldQuery": "select 1 from dual where 1 != 1", 4616 "Query": "select 1 from dual where exists (select 1 from information_schema.`TABLES` where `TABLES`.TABLE_NAME = :TABLES_TABLE_NAME and `TABLES`.TABLE_SCHEMA = :__vtschemaname limit 1)", 4617 "SysTableTableName": "[TABLES_TABLE_NAME:VARCHAR(\"proc\")]", 4618 "SysTableTableSchema": "[VARCHAR(\"mysql\")]", 4619 "Table": "dual" 4620 }, 4621 "TablesUsed": [ 4622 "main.dual" 4623 ] 4624 } 4625 }, 4626 { 4627 "comment": "json_quote, json_object and json_array", 4628 "query": "SELECT JSON_QUOTE('null'), JSON_QUOTE('\"null\"'), JSON_OBJECT(BIN(1),2,'abc',ASCII(4)), JSON_ARRAY(1, \"abc\", NULL, TRUE, CURTIME())", 4629 "v3-plan": { 4630 "QueryType": "SELECT", 4631 "Original": "SELECT JSON_QUOTE('null'), JSON_QUOTE('\"null\"'), JSON_OBJECT(BIN(1),2,'abc',ASCII(4)), JSON_ARRAY(1, \"abc\", NULL, TRUE, CURTIME())", 4632 "Instructions": { 4633 "OperatorType": "Route", 4634 "Variant": "Reference", 4635 "Keyspace": { 4636 "Name": "main", 4637 "Sharded": false 4638 }, 4639 "FieldQuery": "select json_quote('null'), json_quote('\\\"null\\\"'), json_object(BIN(1), 2, 'abc', ASCII(4)), json_array(1, 'abc', null, true, CURTIME()) from dual where 1 != 1", 4640 "Query": "select json_quote('null'), json_quote('\\\"null\\\"'), json_object(BIN(1), 2, 'abc', ASCII(4)), json_array(1, 'abc', null, true, CURTIME()) from dual", 4641 "Table": "dual" 4642 } 4643 }, 4644 "gen4-plan": { 4645 "QueryType": "SELECT", 4646 "Original": "SELECT JSON_QUOTE('null'), JSON_QUOTE('\"null\"'), JSON_OBJECT(BIN(1),2,'abc',ASCII(4)), JSON_ARRAY(1, \"abc\", NULL, TRUE, CURTIME())", 4647 "Instructions": { 4648 "OperatorType": "Route", 4649 "Variant": "Reference", 4650 "Keyspace": { 4651 "Name": "main", 4652 "Sharded": false 4653 }, 4654 "FieldQuery": "select json_quote('null'), json_quote('\\\"null\\\"'), json_object(BIN(1), 2, 'abc', ASCII(4)), json_array(1, 'abc', null, true, CURTIME()) from dual where 1 != 1", 4655 "Query": "select json_quote('null'), json_quote('\\\"null\\\"'), json_object(BIN(1), 2, 'abc', ASCII(4)), json_array(1, 'abc', null, true, CURTIME()) from dual", 4656 "Table": "dual" 4657 }, 4658 "TablesUsed": [ 4659 "main.dual" 4660 ] 4661 } 4662 }, 4663 { 4664 "comment": "select (select id from user order by id limit 1) from user_extra", 4665 "query": "select (select id from user order by id limit 1) from user_extra", 4666 "v3-plan": { 4667 "QueryType": "SELECT", 4668 "Original": "select (select id from user order by id limit 1) from user_extra", 4669 "Instructions": { 4670 "OperatorType": "Subquery", 4671 "Variant": "PulloutValue", 4672 "PulloutVars": [ 4673 "__sq_has_values1", 4674 "__sq1" 4675 ], 4676 "Inputs": [ 4677 { 4678 "OperatorType": "Limit", 4679 "Count": "INT64(1)", 4680 "Inputs": [ 4681 { 4682 "OperatorType": "Route", 4683 "Variant": "Scatter", 4684 "Keyspace": { 4685 "Name": "user", 4686 "Sharded": true 4687 }, 4688 "FieldQuery": "select id, weight_string(id) from `user` where 1 != 1", 4689 "OrderBy": "(0|1) ASC", 4690 "Query": "select id, weight_string(id) from `user` order by id asc limit :__upper_limit", 4691 "ResultColumns": 1, 4692 "Table": "`user`" 4693 } 4694 ] 4695 }, 4696 { 4697 "OperatorType": "Route", 4698 "Variant": "Scatter", 4699 "Keyspace": { 4700 "Name": "user", 4701 "Sharded": true 4702 }, 4703 "FieldQuery": "select :__sq1 from user_extra where 1 != 1", 4704 "Query": "select :__sq1 from user_extra", 4705 "Table": "user_extra" 4706 } 4707 ] 4708 } 4709 }, 4710 "gen4-plan": { 4711 "QueryType": "SELECT", 4712 "Original": "select (select id from user order by id limit 1) from user_extra", 4713 "Instructions": { 4714 "OperatorType": "Subquery", 4715 "Variant": "PulloutValue", 4716 "PulloutVars": [ 4717 "__sq1" 4718 ], 4719 "Inputs": [ 4720 { 4721 "OperatorType": "Limit", 4722 "Count": "INT64(1)", 4723 "Inputs": [ 4724 { 4725 "OperatorType": "Route", 4726 "Variant": "Scatter", 4727 "Keyspace": { 4728 "Name": "user", 4729 "Sharded": true 4730 }, 4731 "FieldQuery": "select id, weight_string(id) from `user` where 1 != 1", 4732 "OrderBy": "(0|1) ASC", 4733 "Query": "select id, weight_string(id) from `user` order by id asc limit :__upper_limit", 4734 "ResultColumns": 1, 4735 "Table": "`user`" 4736 } 4737 ] 4738 }, 4739 { 4740 "OperatorType": "Route", 4741 "Variant": "Scatter", 4742 "Keyspace": { 4743 "Name": "user", 4744 "Sharded": true 4745 }, 4746 "FieldQuery": "select :__sq1 from user_extra where 1 != 1", 4747 "Query": "select :__sq1 from user_extra", 4748 "Table": "user_extra" 4749 } 4750 ] 4751 }, 4752 "TablesUsed": [ 4753 "user.user", 4754 "user.user_extra" 4755 ] 4756 } 4757 }, 4758 { 4759 "comment": "yeah, it does not make sense, but it's valid", 4760 "query": "select exists(select 1) from user where id = 5", 4761 "v3-plan": { 4762 "QueryType": "SELECT", 4763 "Original": "select exists(select 1) from user where id = 5", 4764 "Instructions": { 4765 "OperatorType": "Subquery", 4766 "Variant": "PulloutExists", 4767 "PulloutVars": [ 4768 "__sq_has_values1", 4769 "__sq1" 4770 ], 4771 "Inputs": [ 4772 { 4773 "OperatorType": "Route", 4774 "Variant": "Reference", 4775 "Keyspace": { 4776 "Name": "main", 4777 "Sharded": false 4778 }, 4779 "FieldQuery": "select 1 from dual where 1 != 1", 4780 "Query": "select 1 from dual limit 1", 4781 "Table": "dual" 4782 }, 4783 { 4784 "OperatorType": "Route", 4785 "Variant": "EqualUnique", 4786 "Keyspace": { 4787 "Name": "user", 4788 "Sharded": true 4789 }, 4790 "FieldQuery": "select :__sq_has_values1 from `user` where 1 != 1", 4791 "Query": "select :__sq_has_values1 from `user` where id = 5", 4792 "Table": "`user`", 4793 "Values": [ 4794 "INT64(5)" 4795 ], 4796 "Vindex": "user_index" 4797 } 4798 ] 4799 } 4800 }, 4801 "gen4-plan": { 4802 "QueryType": "SELECT", 4803 "Original": "select exists(select 1) from user where id = 5", 4804 "Instructions": { 4805 "OperatorType": "Route", 4806 "Variant": "EqualUnique", 4807 "Keyspace": { 4808 "Name": "user", 4809 "Sharded": true 4810 }, 4811 "FieldQuery": "select exists (select 1 from dual where 1 != 1) from `user` where 1 != 1", 4812 "Query": "select exists (select 1 from dual limit 1) from `user` where id = 5", 4813 "Table": "`user`", 4814 "Values": [ 4815 "INT64(5)" 4816 ], 4817 "Vindex": "user_index" 4818 }, 4819 "TablesUsed": [ 4820 "main.dual", 4821 "user.user" 4822 ] 4823 } 4824 }, 4825 { 4826 "comment": "json schema validation functions", 4827 "query": "SELECT JSON_SCHEMA_VALID('{\"type\":\"string\",\"pattern\":\"(\"}', '\"abc\"'), JSON_SCHEMA_VALIDATION_REPORT('{\"type\":\"string\",\"pattern\":\"(\"}', '\"abc\"')", 4828 "v3-plan": { 4829 "QueryType": "SELECT", 4830 "Original": "SELECT JSON_SCHEMA_VALID('{\"type\":\"string\",\"pattern\":\"(\"}', '\"abc\"'), JSON_SCHEMA_VALIDATION_REPORT('{\"type\":\"string\",\"pattern\":\"(\"}', '\"abc\"')", 4831 "Instructions": { 4832 "OperatorType": "Route", 4833 "Variant": "Reference", 4834 "Keyspace": { 4835 "Name": "main", 4836 "Sharded": false 4837 }, 4838 "FieldQuery": "select json_schema_valid('{\\\"type\\\":\\\"string\\\",\\\"pattern\\\":\\\"(\\\"}', '\\\"abc\\\"'), json_schema_validation_report('{\\\"type\\\":\\\"string\\\",\\\"pattern\\\":\\\"(\\\"}', '\\\"abc\\\"') from dual where 1 != 1", 4839 "Query": "select json_schema_valid('{\\\"type\\\":\\\"string\\\",\\\"pattern\\\":\\\"(\\\"}', '\\\"abc\\\"'), json_schema_validation_report('{\\\"type\\\":\\\"string\\\",\\\"pattern\\\":\\\"(\\\"}', '\\\"abc\\\"') from dual", 4840 "Table": "dual" 4841 } 4842 }, 4843 "gen4-plan": { 4844 "QueryType": "SELECT", 4845 "Original": "SELECT JSON_SCHEMA_VALID('{\"type\":\"string\",\"pattern\":\"(\"}', '\"abc\"'), JSON_SCHEMA_VALIDATION_REPORT('{\"type\":\"string\",\"pattern\":\"(\"}', '\"abc\"')", 4846 "Instructions": { 4847 "OperatorType": "Route", 4848 "Variant": "Reference", 4849 "Keyspace": { 4850 "Name": "main", 4851 "Sharded": false 4852 }, 4853 "FieldQuery": "select json_schema_valid('{\\\"type\\\":\\\"string\\\",\\\"pattern\\\":\\\"(\\\"}', '\\\"abc\\\"'), json_schema_validation_report('{\\\"type\\\":\\\"string\\\",\\\"pattern\\\":\\\"(\\\"}', '\\\"abc\\\"') from dual where 1 != 1", 4854 "Query": "select json_schema_valid('{\\\"type\\\":\\\"string\\\",\\\"pattern\\\":\\\"(\\\"}', '\\\"abc\\\"'), json_schema_validation_report('{\\\"type\\\":\\\"string\\\",\\\"pattern\\\":\\\"(\\\"}', '\\\"abc\\\"') from dual", 4855 "Table": "dual" 4856 }, 4857 "TablesUsed": [ 4858 "main.dual" 4859 ] 4860 } 4861 }, 4862 { 4863 "comment": "json search functions", 4864 "query": "SELECT JSON_CONTAINS('{\"a\": 1, \"b\": 2, \"c\": {\"d\": 4}}', '1'), JSON_CONTAINS_PATH('{\"a\": 1, \"b\": 2, \"c\": {\"d\": 4}}', 'one', '$.a', '$.e'), JSON_EXTRACT('[10, 20, [30, 40]]', '$[1]'), JSON_UNQUOTE(JSON_EXTRACT('[\"a\",\"b\"]', '$[1]')), JSON_KEYS('{\"a\": 1, \"b\": {\"c\": 30}}'), JSON_OVERLAPS(\"[1,3,5,7]\", \"[2,5,7]\"), JSON_SEARCH('[\"abc\"]', 'one', 'abc'), JSON_VALUE('{\"fname\": \"Joe\", \"lname\": \"Palmer\"}', '$.fname'), JSON_ARRAY(4,5) MEMBER OF('[[3,4],[4,5]]')", 4865 "v3-plan": { 4866 "QueryType": "SELECT", 4867 "Original": "SELECT JSON_CONTAINS('{\"a\": 1, \"b\": 2, \"c\": {\"d\": 4}}', '1'), JSON_CONTAINS_PATH('{\"a\": 1, \"b\": 2, \"c\": {\"d\": 4}}', 'one', '$.a', '$.e'), JSON_EXTRACT('[10, 20, [30, 40]]', '$[1]'), JSON_UNQUOTE(JSON_EXTRACT('[\"a\",\"b\"]', '$[1]')), JSON_KEYS('{\"a\": 1, \"b\": {\"c\": 30}}'), JSON_OVERLAPS(\"[1,3,5,7]\", \"[2,5,7]\"), JSON_SEARCH('[\"abc\"]', 'one', 'abc'), JSON_VALUE('{\"fname\": \"Joe\", \"lname\": \"Palmer\"}', '$.fname'), JSON_ARRAY(4,5) MEMBER OF('[[3,4],[4,5]]')", 4868 "Instructions": { 4869 "OperatorType": "Route", 4870 "Variant": "Reference", 4871 "Keyspace": { 4872 "Name": "main", 4873 "Sharded": false 4874 }, 4875 "FieldQuery": "select json_contains('{\\\"a\\\": 1, \\\"b\\\": 2, \\\"c\\\": {\\\"d\\\": 4}}', '1'), json_contains_path('{\\\"a\\\": 1, \\\"b\\\": 2, \\\"c\\\": {\\\"d\\\": 4}}', 'one', '$.a', '$.e'), json_extract('[10, 20, [30, 40]]', '$[1]'), json_unquote(json_extract('[\\\"a\\\",\\\"b\\\"]', '$[1]')), json_keys('{\\\"a\\\": 1, \\\"b\\\": {\\\"c\\\": 30}}'), json_overlaps('[1,3,5,7]', '[2,5,7]'), json_search('[\\\"abc\\\"]', 'one', 'abc'), json_value('{\\\"fname\\\": \\\"Joe\\\", \\\"lname\\\": \\\"Palmer\\\"}', '$.fname'), json_array(4, 5) member of ('[[3,4],[4,5]]') from dual where 1 != 1", 4876 "Query": "select json_contains('{\\\"a\\\": 1, \\\"b\\\": 2, \\\"c\\\": {\\\"d\\\": 4}}', '1'), json_contains_path('{\\\"a\\\": 1, \\\"b\\\": 2, \\\"c\\\": {\\\"d\\\": 4}}', 'one', '$.a', '$.e'), json_extract('[10, 20, [30, 40]]', '$[1]'), json_unquote(json_extract('[\\\"a\\\",\\\"b\\\"]', '$[1]')), json_keys('{\\\"a\\\": 1, \\\"b\\\": {\\\"c\\\": 30}}'), json_overlaps('[1,3,5,7]', '[2,5,7]'), json_search('[\\\"abc\\\"]', 'one', 'abc'), json_value('{\\\"fname\\\": \\\"Joe\\\", \\\"lname\\\": \\\"Palmer\\\"}', '$.fname'), json_array(4, 5) member of ('[[3,4],[4,5]]') from dual", 4877 "Table": "dual" 4878 } 4879 }, 4880 "gen4-plan": { 4881 "QueryType": "SELECT", 4882 "Original": "SELECT JSON_CONTAINS('{\"a\": 1, \"b\": 2, \"c\": {\"d\": 4}}', '1'), JSON_CONTAINS_PATH('{\"a\": 1, \"b\": 2, \"c\": {\"d\": 4}}', 'one', '$.a', '$.e'), JSON_EXTRACT('[10, 20, [30, 40]]', '$[1]'), JSON_UNQUOTE(JSON_EXTRACT('[\"a\",\"b\"]', '$[1]')), JSON_KEYS('{\"a\": 1, \"b\": {\"c\": 30}}'), JSON_OVERLAPS(\"[1,3,5,7]\", \"[2,5,7]\"), JSON_SEARCH('[\"abc\"]', 'one', 'abc'), JSON_VALUE('{\"fname\": \"Joe\", \"lname\": \"Palmer\"}', '$.fname'), JSON_ARRAY(4,5) MEMBER OF('[[3,4],[4,5]]')", 4883 "Instructions": { 4884 "OperatorType": "Route", 4885 "Variant": "Reference", 4886 "Keyspace": { 4887 "Name": "main", 4888 "Sharded": false 4889 }, 4890 "FieldQuery": "select json_contains('{\\\"a\\\": 1, \\\"b\\\": 2, \\\"c\\\": {\\\"d\\\": 4}}', '1'), json_contains_path('{\\\"a\\\": 1, \\\"b\\\": 2, \\\"c\\\": {\\\"d\\\": 4}}', 'one', '$.a', '$.e'), json_extract('[10, 20, [30, 40]]', '$[1]'), json_unquote(json_extract('[\\\"a\\\",\\\"b\\\"]', '$[1]')), json_keys('{\\\"a\\\": 1, \\\"b\\\": {\\\"c\\\": 30}}'), json_overlaps('[1,3,5,7]', '[2,5,7]'), json_search('[\\\"abc\\\"]', 'one', 'abc'), json_value('{\\\"fname\\\": \\\"Joe\\\", \\\"lname\\\": \\\"Palmer\\\"}', '$.fname'), json_array(4, 5) member of ('[[3,4],[4,5]]') from dual where 1 != 1", 4891 "Query": "select json_contains('{\\\"a\\\": 1, \\\"b\\\": 2, \\\"c\\\": {\\\"d\\\": 4}}', '1'), json_contains_path('{\\\"a\\\": 1, \\\"b\\\": 2, \\\"c\\\": {\\\"d\\\": 4}}', 'one', '$.a', '$.e'), json_extract('[10, 20, [30, 40]]', '$[1]'), json_unquote(json_extract('[\\\"a\\\",\\\"b\\\"]', '$[1]')), json_keys('{\\\"a\\\": 1, \\\"b\\\": {\\\"c\\\": 30}}'), json_overlaps('[1,3,5,7]', '[2,5,7]'), json_search('[\\\"abc\\\"]', 'one', 'abc'), json_value('{\\\"fname\\\": \\\"Joe\\\", \\\"lname\\\": \\\"Palmer\\\"}', '$.fname'), json_array(4, 5) member of ('[[3,4],[4,5]]') from dual", 4892 "Table": "dual" 4893 }, 4894 "TablesUsed": [ 4895 "main.dual" 4896 ] 4897 } 4898 }, 4899 { 4900 "comment": "Json extract and json unquote shorthands", 4901 "query": "SELECT a->\"$[4]\", a->>\"$[3]\" FROM user", 4902 "v3-plan": { 4903 "QueryType": "SELECT", 4904 "Original": "SELECT a->\"$[4]\", a->>\"$[3]\" FROM user", 4905 "Instructions": { 4906 "OperatorType": "Route", 4907 "Variant": "Scatter", 4908 "Keyspace": { 4909 "Name": "user", 4910 "Sharded": true 4911 }, 4912 "FieldQuery": "select a -> '$[4]', a ->> '$[3]' from `user` where 1 != 1", 4913 "Query": "select a -> '$[4]', a ->> '$[3]' from `user`", 4914 "Table": "`user`" 4915 } 4916 }, 4917 "gen4-plan": { 4918 "QueryType": "SELECT", 4919 "Original": "SELECT a->\"$[4]\", a->>\"$[3]\" FROM user", 4920 "Instructions": { 4921 "OperatorType": "Route", 4922 "Variant": "Scatter", 4923 "Keyspace": { 4924 "Name": "user", 4925 "Sharded": true 4926 }, 4927 "FieldQuery": "select a -> '$[4]', a ->> '$[3]' from `user` where 1 != 1", 4928 "Query": "select a -> '$[4]', a ->> '$[3]' from `user`", 4929 "Table": "`user`" 4930 }, 4931 "TablesUsed": [ 4932 "user.user" 4933 ] 4934 } 4935 }, 4936 { 4937 "comment": "groupe by with non aggregated columns and table alias", 4938 "query": "select u.id, u.age from user u group by u.id", 4939 "v3-plan": { 4940 "QueryType": "SELECT", 4941 "Original": "select u.id, u.age from user u group by u.id", 4942 "Instructions": { 4943 "OperatorType": "Route", 4944 "Variant": "Scatter", 4945 "Keyspace": { 4946 "Name": "user", 4947 "Sharded": true 4948 }, 4949 "FieldQuery": "select u.id, u.age from `user` as u where 1 != 1 group by u.id", 4950 "Query": "select u.id, u.age from `user` as u group by u.id", 4951 "Table": "`user`" 4952 } 4953 }, 4954 "gen4-plan": { 4955 "QueryType": "SELECT", 4956 "Original": "select u.id, u.age from user u group by u.id", 4957 "Instructions": { 4958 "OperatorType": "Route", 4959 "Variant": "Scatter", 4960 "Keyspace": { 4961 "Name": "user", 4962 "Sharded": true 4963 }, 4964 "FieldQuery": "select u.id, u.age from `user` as u where 1 != 1 group by u.id", 4965 "Query": "select u.id, u.age from `user` as u group by u.id", 4966 "Table": "`user`" 4967 }, 4968 "TablesUsed": [ 4969 "user.user" 4970 ] 4971 } 4972 }, 4973 { 4974 "comment": "Functions that return JSON value attributes", 4975 "query": "select JSON_DEPTH('{}'), JSON_LENGTH('{\"a\": 1, \"b\": {\"c\": 30}}', '$.b'), JSON_TYPE(JSON_EXTRACT('{\"a\": [10, true]}', '$.a')), JSON_VALID('{\"a\": 1}')", 4976 "v3-plan": { 4977 "QueryType": "SELECT", 4978 "Original": "select JSON_DEPTH('{}'), JSON_LENGTH('{\"a\": 1, \"b\": {\"c\": 30}}', '$.b'), JSON_TYPE(JSON_EXTRACT('{\"a\": [10, true]}', '$.a')), JSON_VALID('{\"a\": 1}')", 4979 "Instructions": { 4980 "OperatorType": "Route", 4981 "Variant": "Reference", 4982 "Keyspace": { 4983 "Name": "main", 4984 "Sharded": false 4985 }, 4986 "FieldQuery": "select json_depth('{}'), json_length('{\\\"a\\\": 1, \\\"b\\\": {\\\"c\\\": 30}}', '$.b'), json_type(json_extract('{\\\"a\\\": [10, true]}', '$.a')), json_valid('{\\\"a\\\": 1}') from dual where 1 != 1", 4987 "Query": "select json_depth('{}'), json_length('{\\\"a\\\": 1, \\\"b\\\": {\\\"c\\\": 30}}', '$.b'), json_type(json_extract('{\\\"a\\\": [10, true]}', '$.a')), json_valid('{\\\"a\\\": 1}') from dual", 4988 "Table": "dual" 4989 } 4990 }, 4991 "gen4-plan": { 4992 "QueryType": "SELECT", 4993 "Original": "select JSON_DEPTH('{}'), JSON_LENGTH('{\"a\": 1, \"b\": {\"c\": 30}}', '$.b'), JSON_TYPE(JSON_EXTRACT('{\"a\": [10, true]}', '$.a')), JSON_VALID('{\"a\": 1}')", 4994 "Instructions": { 4995 "OperatorType": "Route", 4996 "Variant": "Reference", 4997 "Keyspace": { 4998 "Name": "main", 4999 "Sharded": false 5000 }, 5001 "FieldQuery": "select json_depth('{}'), json_length('{\\\"a\\\": 1, \\\"b\\\": {\\\"c\\\": 30}}', '$.b'), json_type(json_extract('{\\\"a\\\": [10, true]}', '$.a')), json_valid('{\\\"a\\\": 1}') from dual where 1 != 1", 5002 "Query": "select json_depth('{}'), json_length('{\\\"a\\\": 1, \\\"b\\\": {\\\"c\\\": 30}}', '$.b'), json_type(json_extract('{\\\"a\\\": [10, true]}', '$.a')), json_valid('{\\\"a\\\": 1}') from dual", 5003 "Table": "dual" 5004 }, 5005 "TablesUsed": [ 5006 "main.dual" 5007 ] 5008 } 5009 }, 5010 { 5011 "comment": "Json array functions", 5012 "query": "select JSON_ARRAY_APPEND('{\"a\": 1}', '$', 'z'), JSON_ARRAY_INSERT('[\"a\", {\"b\": [1, 2]}, [3, 4]]', '$[0]', 'x', '$[2][1]', 'y'), JSON_INSERT('{ \"a\": 1, \"b\": [2, 3]}', '$.a', 10, '$.c', CAST('[true, false]' AS JSON))", 5013 "v3-plan": { 5014 "QueryType": "SELECT", 5015 "Original": "select JSON_ARRAY_APPEND('{\"a\": 1}', '$', 'z'), JSON_ARRAY_INSERT('[\"a\", {\"b\": [1, 2]}, [3, 4]]', '$[0]', 'x', '$[2][1]', 'y'), JSON_INSERT('{ \"a\": 1, \"b\": [2, 3]}', '$.a', 10, '$.c', CAST('[true, false]' AS JSON))", 5016 "Instructions": { 5017 "OperatorType": "Route", 5018 "Variant": "Reference", 5019 "Keyspace": { 5020 "Name": "main", 5021 "Sharded": false 5022 }, 5023 "FieldQuery": "select json_array_append('{\\\"a\\\": 1}', '$', 'z'), json_array_insert('[\\\"a\\\", {\\\"b\\\": [1, 2]}, [3, 4]]', '$[0]', 'x', '$[2][1]', 'y'), json_insert('{ \\\"a\\\": 1, \\\"b\\\": [2, 3]}', '$.a', 10, '$.c', cast('[true, false]' as JSON)) from dual where 1 != 1", 5024 "Query": "select json_array_append('{\\\"a\\\": 1}', '$', 'z'), json_array_insert('[\\\"a\\\", {\\\"b\\\": [1, 2]}, [3, 4]]', '$[0]', 'x', '$[2][1]', 'y'), json_insert('{ \\\"a\\\": 1, \\\"b\\\": [2, 3]}', '$.a', 10, '$.c', cast('[true, false]' as JSON)) from dual", 5025 "Table": "dual" 5026 } 5027 }, 5028 "gen4-plan": { 5029 "QueryType": "SELECT", 5030 "Original": "select JSON_ARRAY_APPEND('{\"a\": 1}', '$', 'z'), JSON_ARRAY_INSERT('[\"a\", {\"b\": [1, 2]}, [3, 4]]', '$[0]', 'x', '$[2][1]', 'y'), JSON_INSERT('{ \"a\": 1, \"b\": [2, 3]}', '$.a', 10, '$.c', CAST('[true, false]' AS JSON))", 5031 "Instructions": { 5032 "OperatorType": "Route", 5033 "Variant": "Reference", 5034 "Keyspace": { 5035 "Name": "main", 5036 "Sharded": false 5037 }, 5038 "FieldQuery": "select json_array_append('{\\\"a\\\": 1}', '$', 'z'), json_array_insert('[\\\"a\\\", {\\\"b\\\": [1, 2]}, [3, 4]]', '$[0]', 'x', '$[2][1]', 'y'), json_insert('{ \\\"a\\\": 1, \\\"b\\\": [2, 3]}', '$.a', 10, '$.c', cast('[true, false]' as JSON)) from dual where 1 != 1", 5039 "Query": "select json_array_append('{\\\"a\\\": 1}', '$', 'z'), json_array_insert('[\\\"a\\\", {\\\"b\\\": [1, 2]}, [3, 4]]', '$[0]', 'x', '$[2][1]', 'y'), json_insert('{ \\\"a\\\": 1, \\\"b\\\": [2, 3]}', '$.a', 10, '$.c', cast('[true, false]' as JSON)) from dual", 5040 "Table": "dual" 5041 }, 5042 "TablesUsed": [ 5043 "main.dual" 5044 ] 5045 } 5046 }, 5047 { 5048 "comment": "Json merge functions", 5049 "query": "select JSON_MERGE('[1, 2]', '[true, false]'), JSON_MERGE_PATCH('{\"name\": \"x\"}', '{\"id\": 47}'), JSON_MERGE_PRESERVE('[1, 2]', '{\"id\": 47}')", 5050 "v3-plan": { 5051 "QueryType": "SELECT", 5052 "Original": "select JSON_MERGE('[1, 2]', '[true, false]'), JSON_MERGE_PATCH('{\"name\": \"x\"}', '{\"id\": 47}'), JSON_MERGE_PRESERVE('[1, 2]', '{\"id\": 47}')", 5053 "Instructions": { 5054 "OperatorType": "Route", 5055 "Variant": "Reference", 5056 "Keyspace": { 5057 "Name": "main", 5058 "Sharded": false 5059 }, 5060 "FieldQuery": "select json_merge('[1, 2]', '[true, false]'), json_merge_patch('{\\\"name\\\": \\\"x\\\"}', '{\\\"id\\\": 47}'), json_merge_preserve('[1, 2]', '{\\\"id\\\": 47}') from dual where 1 != 1", 5061 "Query": "select json_merge('[1, 2]', '[true, false]'), json_merge_patch('{\\\"name\\\": \\\"x\\\"}', '{\\\"id\\\": 47}'), json_merge_preserve('[1, 2]', '{\\\"id\\\": 47}') from dual", 5062 "Table": "dual" 5063 } 5064 }, 5065 "gen4-plan": { 5066 "QueryType": "SELECT", 5067 "Original": "select JSON_MERGE('[1, 2]', '[true, false]'), JSON_MERGE_PATCH('{\"name\": \"x\"}', '{\"id\": 47}'), JSON_MERGE_PRESERVE('[1, 2]', '{\"id\": 47}')", 5068 "Instructions": { 5069 "OperatorType": "Route", 5070 "Variant": "Reference", 5071 "Keyspace": { 5072 "Name": "main", 5073 "Sharded": false 5074 }, 5075 "FieldQuery": "select json_merge('[1, 2]', '[true, false]'), json_merge_patch('{\\\"name\\\": \\\"x\\\"}', '{\\\"id\\\": 47}'), json_merge_preserve('[1, 2]', '{\\\"id\\\": 47}') from dual where 1 != 1", 5076 "Query": "select json_merge('[1, 2]', '[true, false]'), json_merge_patch('{\\\"name\\\": \\\"x\\\"}', '{\\\"id\\\": 47}'), json_merge_preserve('[1, 2]', '{\\\"id\\\": 47}') from dual", 5077 "Table": "dual" 5078 }, 5079 "TablesUsed": [ 5080 "main.dual" 5081 ] 5082 } 5083 }, 5084 { 5085 "comment": "JSON modifier functions", 5086 "query": "select JSON_REMOVE('[1, [2, 3], 4]', '$[1]'), JSON_REPLACE('{ \"a\": 1, \"b\": [2, 3]}', '$.a', 10, '$.c', '[true, false]'), JSON_SET('{ \"a\": 1, \"b\": [2, 3]}', '$.a', 10, '$.c', '[true, false]'), JSON_UNQUOTE('\"abc\"')", 5087 "v3-plan": { 5088 "QueryType": "SELECT", 5089 "Original": "select JSON_REMOVE('[1, [2, 3], 4]', '$[1]'), JSON_REPLACE('{ \"a\": 1, \"b\": [2, 3]}', '$.a', 10, '$.c', '[true, false]'), JSON_SET('{ \"a\": 1, \"b\": [2, 3]}', '$.a', 10, '$.c', '[true, false]'), JSON_UNQUOTE('\"abc\"')", 5090 "Instructions": { 5091 "OperatorType": "Route", 5092 "Variant": "Reference", 5093 "Keyspace": { 5094 "Name": "main", 5095 "Sharded": false 5096 }, 5097 "FieldQuery": "select json_remove('[1, [2, 3], 4]', '$[1]'), json_replace('{ \\\"a\\\": 1, \\\"b\\\": [2, 3]}', '$.a', 10, '$.c', '[true, false]'), json_set('{ \\\"a\\\": 1, \\\"b\\\": [2, 3]}', '$.a', 10, '$.c', '[true, false]'), json_unquote('\\\"abc\\\"') from dual where 1 != 1", 5098 "Query": "select json_remove('[1, [2, 3], 4]', '$[1]'), json_replace('{ \\\"a\\\": 1, \\\"b\\\": [2, 3]}', '$.a', 10, '$.c', '[true, false]'), json_set('{ \\\"a\\\": 1, \\\"b\\\": [2, 3]}', '$.a', 10, '$.c', '[true, false]'), json_unquote('\\\"abc\\\"') from dual", 5099 "Table": "dual" 5100 } 5101 }, 5102 "gen4-plan": { 5103 "QueryType": "SELECT", 5104 "Original": "select JSON_REMOVE('[1, [2, 3], 4]', '$[1]'), JSON_REPLACE('{ \"a\": 1, \"b\": [2, 3]}', '$.a', 10, '$.c', '[true, false]'), JSON_SET('{ \"a\": 1, \"b\": [2, 3]}', '$.a', 10, '$.c', '[true, false]'), JSON_UNQUOTE('\"abc\"')", 5105 "Instructions": { 5106 "OperatorType": "Route", 5107 "Variant": "Reference", 5108 "Keyspace": { 5109 "Name": "main", 5110 "Sharded": false 5111 }, 5112 "FieldQuery": "select json_remove('[1, [2, 3], 4]', '$[1]'), json_replace('{ \\\"a\\\": 1, \\\"b\\\": [2, 3]}', '$.a', 10, '$.c', '[true, false]'), json_set('{ \\\"a\\\": 1, \\\"b\\\": [2, 3]}', '$.a', 10, '$.c', '[true, false]'), json_unquote('\\\"abc\\\"') from dual where 1 != 1", 5113 "Query": "select json_remove('[1, [2, 3], 4]', '$[1]'), json_replace('{ \\\"a\\\": 1, \\\"b\\\": [2, 3]}', '$.a', 10, '$.c', '[true, false]'), json_set('{ \\\"a\\\": 1, \\\"b\\\": [2, 3]}', '$.a', 10, '$.c', '[true, false]'), json_unquote('\\\"abc\\\"') from dual", 5114 "Table": "dual" 5115 }, 5116 "TablesUsed": [ 5117 "main.dual" 5118 ] 5119 } 5120 }, 5121 { 5122 "comment": "Reference with a subquery which can be merged", 5123 "query": "select exists(select id from user where id = 4)", 5124 "v3-plan": { 5125 "QueryType": "SELECT", 5126 "Original": "select exists(select id from user where id = 4)", 5127 "Instructions": { 5128 "OperatorType": "Subquery", 5129 "Variant": "PulloutExists", 5130 "PulloutVars": [ 5131 "__sq_has_values1", 5132 "__sq1" 5133 ], 5134 "Inputs": [ 5135 { 5136 "OperatorType": "Route", 5137 "Variant": "EqualUnique", 5138 "Keyspace": { 5139 "Name": "user", 5140 "Sharded": true 5141 }, 5142 "FieldQuery": "select 1 from `user` where 1 != 1", 5143 "Query": "select 1 from `user` where id = 4 limit 1", 5144 "Table": "`user`", 5145 "Values": [ 5146 "INT64(4)" 5147 ], 5148 "Vindex": "user_index" 5149 }, 5150 { 5151 "OperatorType": "Route", 5152 "Variant": "Reference", 5153 "Keyspace": { 5154 "Name": "main", 5155 "Sharded": false 5156 }, 5157 "FieldQuery": "select :__sq_has_values1 from dual where 1 != 1", 5158 "Query": "select :__sq_has_values1 from dual", 5159 "Table": "dual" 5160 } 5161 ] 5162 } 5163 }, 5164 "gen4-plan": { 5165 "QueryType": "SELECT", 5166 "Original": "select exists(select id from user where id = 4)", 5167 "Instructions": { 5168 "OperatorType": "Route", 5169 "Variant": "EqualUnique", 5170 "Keyspace": { 5171 "Name": "user", 5172 "Sharded": true 5173 }, 5174 "FieldQuery": "select exists (select 1 from `user` where 1 != 1) from dual where 1 != 1", 5175 "Query": "select exists (select 1 from `user` where id = 4 limit 1) from dual", 5176 "Table": "dual", 5177 "Values": [ 5178 "INT64(4)" 5179 ], 5180 "Vindex": "user_index" 5181 }, 5182 "TablesUsed": [ 5183 "main.dual", 5184 "user.user" 5185 ] 5186 } 5187 }, 5188 { 5189 "comment": "Reference with a subquery which cannot be merged", 5190 "query": "select exists(select * from user)", 5191 "v3-plan": { 5192 "QueryType": "SELECT", 5193 "Original": "select exists(select * from user)", 5194 "Instructions": { 5195 "OperatorType": "Subquery", 5196 "Variant": "PulloutExists", 5197 "PulloutVars": [ 5198 "__sq_has_values1", 5199 "__sq1" 5200 ], 5201 "Inputs": [ 5202 { 5203 "OperatorType": "Limit", 5204 "Count": "INT64(1)", 5205 "Inputs": [ 5206 { 5207 "OperatorType": "Route", 5208 "Variant": "Scatter", 5209 "Keyspace": { 5210 "Name": "user", 5211 "Sharded": true 5212 }, 5213 "FieldQuery": "select 1 from `user` where 1 != 1", 5214 "Query": "select 1 from `user` limit :__upper_limit", 5215 "Table": "`user`" 5216 } 5217 ] 5218 }, 5219 { 5220 "OperatorType": "Route", 5221 "Variant": "Reference", 5222 "Keyspace": { 5223 "Name": "main", 5224 "Sharded": false 5225 }, 5226 "FieldQuery": "select :__sq_has_values1 from dual where 1 != 1", 5227 "Query": "select :__sq_has_values1 from dual", 5228 "Table": "dual" 5229 } 5230 ] 5231 } 5232 }, 5233 "gen4-plan": { 5234 "QueryType": "SELECT", 5235 "Original": "select exists(select * from user)", 5236 "Instructions": { 5237 "OperatorType": "Subquery", 5238 "Variant": "PulloutExists", 5239 "PulloutVars": [ 5240 "__sq_has_values1" 5241 ], 5242 "Inputs": [ 5243 { 5244 "OperatorType": "Limit", 5245 "Count": "INT64(1)", 5246 "Inputs": [ 5247 { 5248 "OperatorType": "Route", 5249 "Variant": "Scatter", 5250 "Keyspace": { 5251 "Name": "user", 5252 "Sharded": true 5253 }, 5254 "FieldQuery": "select 1 from `user` where 1 != 1", 5255 "Query": "select 1 from `user` limit :__upper_limit", 5256 "Table": "`user`" 5257 } 5258 ] 5259 }, 5260 { 5261 "OperatorType": "Route", 5262 "Variant": "Reference", 5263 "Keyspace": { 5264 "Name": "main", 5265 "Sharded": false 5266 }, 5267 "FieldQuery": "select :__sq_has_values1 from dual where 1 != 1", 5268 "Query": "select :__sq_has_values1 from dual", 5269 "Table": "dual" 5270 } 5271 ] 5272 }, 5273 "TablesUsed": [ 5274 "main.dual", 5275 "user.user" 5276 ] 5277 } 5278 }, 5279 { 5280 "comment": "insert function not requiring any table", 5281 "query": "select insert('Quadratic', 3, 4, 'What')", 5282 "v3-plan": { 5283 "QueryType": "SELECT", 5284 "Original": "select insert('Quadratic', 3, 4, 'What')", 5285 "Instructions": { 5286 "OperatorType": "Route", 5287 "Variant": "Reference", 5288 "Keyspace": { 5289 "Name": "main", 5290 "Sharded": false 5291 }, 5292 "FieldQuery": "select insert('Quadratic', 3, 4, 'What') from dual where 1 != 1", 5293 "Query": "select insert('Quadratic', 3, 4, 'What') from dual", 5294 "Table": "dual" 5295 } 5296 }, 5297 "gen4-plan": { 5298 "QueryType": "SELECT", 5299 "Original": "select insert('Quadratic', 3, 4, 'What')", 5300 "Instructions": { 5301 "OperatorType": "Route", 5302 "Variant": "Reference", 5303 "Keyspace": { 5304 "Name": "main", 5305 "Sharded": false 5306 }, 5307 "FieldQuery": "select insert('Quadratic', 3, 4, 'What') from dual where 1 != 1", 5308 "Query": "select insert('Quadratic', 3, 4, 'What') from dual", 5309 "Table": "dual" 5310 }, 5311 "TablesUsed": [ 5312 "main.dual" 5313 ] 5314 } 5315 }, 5316 { 5317 "comment": "insert function using column names as arguments", 5318 "query": "select insert(tcol1, id, 3, tcol2) from user", 5319 "v3-plan": { 5320 "QueryType": "SELECT", 5321 "Original": "select insert(tcol1, id, 3, tcol2) from user", 5322 "Instructions": { 5323 "OperatorType": "Route", 5324 "Variant": "Scatter", 5325 "Keyspace": { 5326 "Name": "user", 5327 "Sharded": true 5328 }, 5329 "FieldQuery": "select insert(tcol1, id, 3, tcol2) from `user` where 1 != 1", 5330 "Query": "select insert(tcol1, id, 3, tcol2) from `user`", 5331 "Table": "`user`" 5332 } 5333 }, 5334 "gen4-plan": { 5335 "QueryType": "SELECT", 5336 "Original": "select insert(tcol1, id, 3, tcol2) from user", 5337 "Instructions": { 5338 "OperatorType": "Route", 5339 "Variant": "Scatter", 5340 "Keyspace": { 5341 "Name": "user", 5342 "Sharded": true 5343 }, 5344 "FieldQuery": "select insert(tcol1, id, 3, tcol2) from `user` where 1 != 1", 5345 "Query": "select insert(tcol1, id, 3, tcol2) from `user`", 5346 "Table": "`user`" 5347 }, 5348 "TablesUsed": [ 5349 "user.user" 5350 ] 5351 } 5352 }, 5353 { 5354 "comment": "gtid functions", 5355 "query": "select gtid_subset('3E11FA47-71CA-11E1-9E33-C80AA9429562:23','3E11FA47-71CA-11E1-9E33-C80AA9429562:21-57'), gtid_subtract('3E11FA47-71CA-11E1-9E33-C80AA9429562:23','3E11FA47-71CA-11E1-9E33-C80AA9429562:21-57')", 5356 "v3-plan": { 5357 "QueryType": "SELECT", 5358 "Original": "select gtid_subset('3E11FA47-71CA-11E1-9E33-C80AA9429562:23','3E11FA47-71CA-11E1-9E33-C80AA9429562:21-57'), gtid_subtract('3E11FA47-71CA-11E1-9E33-C80AA9429562:23','3E11FA47-71CA-11E1-9E33-C80AA9429562:21-57')", 5359 "Instructions": { 5360 "OperatorType": "Route", 5361 "Variant": "Reference", 5362 "Keyspace": { 5363 "Name": "main", 5364 "Sharded": false 5365 }, 5366 "FieldQuery": "select gtid_subset('3E11FA47-71CA-11E1-9E33-C80AA9429562:23', '3E11FA47-71CA-11E1-9E33-C80AA9429562:21-57'), gtid_subtract('3E11FA47-71CA-11E1-9E33-C80AA9429562:23', '3E11FA47-71CA-11E1-9E33-C80AA9429562:21-57') from dual where 1 != 1", 5367 "Query": "select gtid_subset('3E11FA47-71CA-11E1-9E33-C80AA9429562:23', '3E11FA47-71CA-11E1-9E33-C80AA9429562:21-57'), gtid_subtract('3E11FA47-71CA-11E1-9E33-C80AA9429562:23', '3E11FA47-71CA-11E1-9E33-C80AA9429562:21-57') from dual", 5368 "Table": "dual" 5369 } 5370 }, 5371 "gen4-plan": { 5372 "QueryType": "SELECT", 5373 "Original": "select gtid_subset('3E11FA47-71CA-11E1-9E33-C80AA9429562:23','3E11FA47-71CA-11E1-9E33-C80AA9429562:21-57'), gtid_subtract('3E11FA47-71CA-11E1-9E33-C80AA9429562:23','3E11FA47-71CA-11E1-9E33-C80AA9429562:21-57')", 5374 "Instructions": { 5375 "OperatorType": "Route", 5376 "Variant": "Reference", 5377 "Keyspace": { 5378 "Name": "main", 5379 "Sharded": false 5380 }, 5381 "FieldQuery": "select gtid_subset('3E11FA47-71CA-11E1-9E33-C80AA9429562:23', '3E11FA47-71CA-11E1-9E33-C80AA9429562:21-57'), gtid_subtract('3E11FA47-71CA-11E1-9E33-C80AA9429562:23', '3E11FA47-71CA-11E1-9E33-C80AA9429562:21-57') from dual where 1 != 1", 5382 "Query": "select gtid_subset('3E11FA47-71CA-11E1-9E33-C80AA9429562:23', '3E11FA47-71CA-11E1-9E33-C80AA9429562:21-57'), gtid_subtract('3E11FA47-71CA-11E1-9E33-C80AA9429562:23', '3E11FA47-71CA-11E1-9E33-C80AA9429562:21-57') from dual", 5383 "Table": "dual" 5384 }, 5385 "TablesUsed": [ 5386 "main.dual" 5387 ] 5388 } 5389 }, 5390 { 5391 "comment": "Predicate in apply join which is merged", 5392 "query": "select user.col, user_metadata.user_id from user join user_extra on user.col = user_extra.col join user_metadata on user_extra.user_id = user_metadata.user_id where user.textcol1 = 'alice@gmail.com'", 5393 "v3-plan": { 5394 "QueryType": "SELECT", 5395 "Original": "select user.col, user_metadata.user_id from user join user_extra on user.col = user_extra.col join user_metadata on user_extra.user_id = user_metadata.user_id where user.textcol1 = 'alice@gmail.com'", 5396 "Instructions": { 5397 "OperatorType": "Join", 5398 "Variant": "Join", 5399 "JoinColumnIndexes": "L:0,R:0", 5400 "JoinVars": { 5401 "user_extra_user_id": 1 5402 }, 5403 "TableName": "`user`_user_extra_user_metadata", 5404 "Inputs": [ 5405 { 5406 "OperatorType": "Join", 5407 "Variant": "Join", 5408 "JoinColumnIndexes": "L:0,R:0", 5409 "JoinVars": { 5410 "user_col": 0 5411 }, 5412 "TableName": "`user`_user_extra", 5413 "Inputs": [ 5414 { 5415 "OperatorType": "Route", 5416 "Variant": "Scatter", 5417 "Keyspace": { 5418 "Name": "user", 5419 "Sharded": true 5420 }, 5421 "FieldQuery": "select `user`.col from `user` where 1 != 1", 5422 "Query": "select `user`.col from `user` where `user`.textcol1 = 'alice@gmail.com'", 5423 "Table": "`user`" 5424 }, 5425 { 5426 "OperatorType": "Route", 5427 "Variant": "Scatter", 5428 "Keyspace": { 5429 "Name": "user", 5430 "Sharded": true 5431 }, 5432 "FieldQuery": "select user_extra.user_id from user_extra where 1 != 1", 5433 "Query": "select user_extra.user_id from user_extra where user_extra.col = :user_col", 5434 "Table": "user_extra" 5435 } 5436 ] 5437 }, 5438 { 5439 "OperatorType": "Route", 5440 "Variant": "EqualUnique", 5441 "Keyspace": { 5442 "Name": "user", 5443 "Sharded": true 5444 }, 5445 "FieldQuery": "select user_metadata.user_id from user_metadata where 1 != 1", 5446 "Query": "select user_metadata.user_id from user_metadata where user_metadata.user_id = :user_extra_user_id", 5447 "Table": "user_metadata", 5448 "Values": [ 5449 ":user_extra_user_id" 5450 ], 5451 "Vindex": "user_index" 5452 } 5453 ] 5454 } 5455 }, 5456 "gen4-plan": { 5457 "QueryType": "SELECT", 5458 "Original": "select user.col, user_metadata.user_id from user join user_extra on user.col = user_extra.col join user_metadata on user_extra.user_id = user_metadata.user_id where user.textcol1 = 'alice@gmail.com'", 5459 "Instructions": { 5460 "OperatorType": "Join", 5461 "Variant": "Join", 5462 "JoinColumnIndexes": "L:0,R:0", 5463 "JoinVars": { 5464 "user_col": 0 5465 }, 5466 "TableName": "`user`_user_extra, user_metadata", 5467 "Inputs": [ 5468 { 5469 "OperatorType": "Route", 5470 "Variant": "Scatter", 5471 "Keyspace": { 5472 "Name": "user", 5473 "Sharded": true 5474 }, 5475 "FieldQuery": "select `user`.col from `user` where 1 != 1", 5476 "Query": "select `user`.col from `user` where `user`.textcol1 = 'alice@gmail.com'", 5477 "Table": "`user`" 5478 }, 5479 { 5480 "OperatorType": "Route", 5481 "Variant": "Scatter", 5482 "Keyspace": { 5483 "Name": "user", 5484 "Sharded": true 5485 }, 5486 "FieldQuery": "select user_metadata.user_id from user_extra, user_metadata where 1 != 1", 5487 "Query": "select user_metadata.user_id from user_extra, user_metadata where user_extra.col = :user_col and user_extra.user_id = user_metadata.user_id", 5488 "Table": "user_extra, user_metadata" 5489 } 5490 ] 5491 }, 5492 "TablesUsed": [ 5493 "user.user", 5494 "user.user_extra", 5495 "user.user_metadata" 5496 ] 5497 } 5498 }, 5499 { 5500 "comment": "Join across multiple tables, with conditions on different vindexes, but mergeable through join predicates", 5501 "query": "SELECT user.id FROM user INNER JOIN music_extra ON user.id = music_extra.user_id INNER JOIN music ON music_extra.user_id = music.user_id WHERE user.id = 123 and music.id = 456", 5502 "v3-plan": { 5503 "QueryType": "SELECT", 5504 "Original": "SELECT user.id FROM user INNER JOIN music_extra ON user.id = music_extra.user_id INNER JOIN music ON music_extra.user_id = music.user_id WHERE user.id = 123 and music.id = 456", 5505 "Instructions": { 5506 "OperatorType": "Route", 5507 "Variant": "EqualUnique", 5508 "Keyspace": { 5509 "Name": "user", 5510 "Sharded": true 5511 }, 5512 "FieldQuery": "select `user`.id from `user` join music_extra on `user`.id = music_extra.user_id join music on music_extra.user_id = music.user_id where 1 != 1", 5513 "Query": "select `user`.id from `user` join music_extra on `user`.id = music_extra.user_id join music on music_extra.user_id = music.user_id where `user`.id = 123 and music.id = 456", 5514 "Table": "`user`, music_extra, music", 5515 "Values": [ 5516 "INT64(123)" 5517 ], 5518 "Vindex": "user_index" 5519 } 5520 }, 5521 "gen4-plan": { 5522 "QueryType": "SELECT", 5523 "Original": "SELECT user.id FROM user INNER JOIN music_extra ON user.id = music_extra.user_id INNER JOIN music ON music_extra.user_id = music.user_id WHERE user.id = 123 and music.id = 456", 5524 "Instructions": { 5525 "OperatorType": "Route", 5526 "Variant": "EqualUnique", 5527 "Keyspace": { 5528 "Name": "user", 5529 "Sharded": true 5530 }, 5531 "FieldQuery": "select `user`.id from `user`, music_extra, music where 1 != 1", 5532 "Query": "select `user`.id from `user`, music_extra, music where music.id = 456 and `user`.id = 123 and `user`.id = music_extra.user_id and music_extra.user_id = music.user_id", 5533 "Table": "`user`, music, music_extra", 5534 "Values": [ 5535 "INT64(123)" 5536 ], 5537 "Vindex": "user_index" 5538 }, 5539 "TablesUsed": [ 5540 "user.music", 5541 "user.music_extra", 5542 "user.user" 5543 ] 5544 } 5545 }, 5546 { 5547 "comment": "SQL_CALC_FOUND_ROWS with vindex lookup", 5548 "query": "select SQL_CALC_FOUND_ROWS id, name from user where name = 'aa' order by id limit 2", 5549 "v3-plan": { 5550 "QueryType": "SELECT", 5551 "Original": "select SQL_CALC_FOUND_ROWS id, name from user where name = 'aa' order by id limit 2", 5552 "Instructions": { 5553 "OperatorType": "SQL_CALC_FOUND_ROWS", 5554 "Inputs": [ 5555 { 5556 "OperatorType": "Limit", 5557 "Count": "INT64(2)", 5558 "Inputs": [ 5559 { 5560 "OperatorType": "Route", 5561 "Variant": "Equal", 5562 "Keyspace": { 5563 "Name": "user", 5564 "Sharded": true 5565 }, 5566 "FieldQuery": "select id, `name`, weight_string(id) from `user` where 1 != 1", 5567 "OrderBy": "(0|2) ASC", 5568 "Query": "select id, `name`, weight_string(id) from `user` where `name` = 'aa' order by id asc limit :__upper_limit", 5569 "ResultColumns": 2, 5570 "Table": "`user`", 5571 "Values": [ 5572 "VARCHAR(\"aa\")" 5573 ], 5574 "Vindex": "name_user_map" 5575 } 5576 ] 5577 }, 5578 { 5579 "OperatorType": "Aggregate", 5580 "Variant": "Scalar", 5581 "Aggregates": "sum_count(0) AS count", 5582 "Inputs": [ 5583 { 5584 "OperatorType": "Route", 5585 "Variant": "Equal", 5586 "Keyspace": { 5587 "Name": "user", 5588 "Sharded": true 5589 }, 5590 "FieldQuery": "select count(*) from `user` where 1 != 1", 5591 "Query": "select count(*) from `user` where `name` = 'aa'", 5592 "Table": "`user`", 5593 "Values": [ 5594 "VARCHAR(\"aa\")" 5595 ], 5596 "Vindex": "name_user_map" 5597 } 5598 ] 5599 } 5600 ] 5601 } 5602 }, 5603 "gen4-plan": { 5604 "QueryType": "SELECT", 5605 "Original": "select SQL_CALC_FOUND_ROWS id, name from user where name = 'aa' order by id limit 2", 5606 "Instructions": { 5607 "OperatorType": "SQL_CALC_FOUND_ROWS", 5608 "Inputs": [ 5609 { 5610 "OperatorType": "Limit", 5611 "Count": "INT64(2)", 5612 "Inputs": [ 5613 { 5614 "OperatorType": "VindexLookup", 5615 "Variant": "Equal", 5616 "Keyspace": { 5617 "Name": "user", 5618 "Sharded": true 5619 }, 5620 "Values": [ 5621 "VARCHAR(\"aa\")" 5622 ], 5623 "Vindex": "name_user_map", 5624 "Inputs": [ 5625 { 5626 "OperatorType": "Route", 5627 "Variant": "IN", 5628 "Keyspace": { 5629 "Name": "user", 5630 "Sharded": true 5631 }, 5632 "FieldQuery": "select `name`, keyspace_id from name_user_vdx where 1 != 1", 5633 "Query": "select `name`, keyspace_id from name_user_vdx where `name` in ::__vals", 5634 "Table": "name_user_vdx", 5635 "Values": [ 5636 ":name" 5637 ], 5638 "Vindex": "user_index" 5639 }, 5640 { 5641 "OperatorType": "Route", 5642 "Variant": "ByDestination", 5643 "Keyspace": { 5644 "Name": "user", 5645 "Sharded": true 5646 }, 5647 "FieldQuery": "select id, `name`, weight_string(id) from `user` where 1 != 1", 5648 "OrderBy": "(0|2) ASC", 5649 "Query": "select id, `name`, weight_string(id) from `user` where `name` = 'aa' order by id asc limit :__upper_limit", 5650 "ResultColumns": 2, 5651 "Table": "`user`" 5652 } 5653 ] 5654 } 5655 ] 5656 }, 5657 { 5658 "OperatorType": "Aggregate", 5659 "Variant": "Scalar", 5660 "Aggregates": "sum_count_star(0) AS count(*)", 5661 "Inputs": [ 5662 { 5663 "OperatorType": "VindexLookup", 5664 "Variant": "Equal", 5665 "Keyspace": { 5666 "Name": "user", 5667 "Sharded": true 5668 }, 5669 "Values": [ 5670 "VARCHAR(\"aa\")" 5671 ], 5672 "Vindex": "name_user_map", 5673 "Inputs": [ 5674 { 5675 "OperatorType": "Route", 5676 "Variant": "IN", 5677 "Keyspace": { 5678 "Name": "user", 5679 "Sharded": true 5680 }, 5681 "FieldQuery": "select `name`, keyspace_id from name_user_vdx where 1 != 1", 5682 "Query": "select `name`, keyspace_id from name_user_vdx where `name` in ::__vals", 5683 "Table": "name_user_vdx", 5684 "Values": [ 5685 ":name" 5686 ], 5687 "Vindex": "user_index" 5688 }, 5689 { 5690 "OperatorType": "Route", 5691 "Variant": "ByDestination", 5692 "Keyspace": { 5693 "Name": "user", 5694 "Sharded": true 5695 }, 5696 "FieldQuery": "select count(*) from `user` where 1 != 1", 5697 "Query": "select count(*) from `user` where `name` = 'aa'", 5698 "Table": "`user`" 5699 } 5700 ] 5701 } 5702 ] 5703 } 5704 ] 5705 }, 5706 "TablesUsed": [ 5707 "user.user" 5708 ] 5709 } 5710 }, 5711 { 5712 "comment": "`None` route being merged with another route via join predicate on Vindex columns", 5713 "query": "SELECT `music`.id FROM `music` INNER JOIN `user` ON music.user_id = user.id WHERE music.user_id IN (NULL) AND user.id = 5", 5714 "v3-plan": { 5715 "QueryType": "SELECT", 5716 "Original": "SELECT `music`.id FROM `music` INNER JOIN `user` ON music.user_id = user.id WHERE music.user_id IN (NULL) AND user.id = 5", 5717 "Instructions": { 5718 "OperatorType": "Route", 5719 "Variant": "None", 5720 "Keyspace": { 5721 "Name": "user", 5722 "Sharded": true 5723 }, 5724 "FieldQuery": "select music.id from music join `user` on music.user_id = `user`.id where 1 != 1", 5725 "Query": "select music.id from music join `user` on music.user_id = `user`.id where music.user_id in (null) and `user`.id = 5", 5726 "Table": "music, `user`" 5727 } 5728 }, 5729 "gen4-plan": { 5730 "QueryType": "SELECT", 5731 "Original": "SELECT `music`.id FROM `music` INNER JOIN `user` ON music.user_id = user.id WHERE music.user_id IN (NULL) AND user.id = 5", 5732 "Instructions": { 5733 "OperatorType": "Route", 5734 "Variant": "None", 5735 "Keyspace": { 5736 "Name": "user", 5737 "Sharded": true 5738 }, 5739 "FieldQuery": "select music.id from music, `user` where 1 != 1", 5740 "Query": "select music.id from music, `user` where music.user_id in (null) and `user`.id = 5 and music.user_id = `user`.id", 5741 "Table": "`user`, music" 5742 }, 5743 "TablesUsed": [ 5744 "user.music", 5745 "user.user" 5746 ] 5747 } 5748 }, 5749 { 5750 "comment": "Treating single value tuples as `EqualUnique` routes", 5751 "query": "SELECT music.id FROM music WHERE music.id IN (SELECT music.id FROM music WHERE music.user_id IN (5)) AND music.user_id = 5", 5752 "v3-plan": { 5753 "QueryType": "SELECT", 5754 "Original": "SELECT music.id FROM music WHERE music.id IN (SELECT music.id FROM music WHERE music.user_id IN (5)) AND music.user_id = 5", 5755 "Instructions": { 5756 "OperatorType": "Subquery", 5757 "Variant": "PulloutIn", 5758 "PulloutVars": [ 5759 "__sq_has_values1", 5760 "__sq1" 5761 ], 5762 "Inputs": [ 5763 { 5764 "OperatorType": "Route", 5765 "Variant": "IN", 5766 "Keyspace": { 5767 "Name": "user", 5768 "Sharded": true 5769 }, 5770 "FieldQuery": "select music.id from music where 1 != 1", 5771 "Query": "select music.id from music where music.user_id in ::__vals", 5772 "Table": "music", 5773 "Values": [ 5774 "(INT64(5))" 5775 ], 5776 "Vindex": "user_index" 5777 }, 5778 { 5779 "OperatorType": "Route", 5780 "Variant": "EqualUnique", 5781 "Keyspace": { 5782 "Name": "user", 5783 "Sharded": true 5784 }, 5785 "FieldQuery": "select music.id from music where 1 != 1", 5786 "Query": "select music.id from music where music.user_id = 5 and :__sq_has_values1 = 1 and music.id in ::__sq1", 5787 "Table": "music", 5788 "Values": [ 5789 "INT64(5)" 5790 ], 5791 "Vindex": "user_index" 5792 } 5793 ] 5794 } 5795 }, 5796 "gen4-plan": { 5797 "QueryType": "SELECT", 5798 "Original": "SELECT music.id FROM music WHERE music.id IN (SELECT music.id FROM music WHERE music.user_id IN (5)) AND music.user_id = 5", 5799 "Instructions": { 5800 "OperatorType": "Route", 5801 "Variant": "EqualUnique", 5802 "Keyspace": { 5803 "Name": "user", 5804 "Sharded": true 5805 }, 5806 "FieldQuery": "select music.id from music where 1 != 1", 5807 "Query": "select music.id from music where music.id in (select music.id from music where music.user_id in (5)) and music.user_id = 5", 5808 "Table": "music", 5809 "Values": [ 5810 "INT64(5)" 5811 ], 5812 "Vindex": "user_index" 5813 }, 5814 "TablesUsed": [ 5815 "user.music" 5816 ] 5817 } 5818 }, 5819 { 5820 "comment": "Subquery with `IN` condition using columns with matching lookup vindexes", 5821 "query": "SELECT music.id FROM music WHERE music.id IN (SELECT music.id FROM music WHERE music.user_id IN (1, 2, 3))", 5822 "v3-plan": { 5823 "QueryType": "SELECT", 5824 "Original": "SELECT music.id FROM music WHERE music.id IN (SELECT music.id FROM music WHERE music.user_id IN (1, 2, 3))", 5825 "Instructions": { 5826 "OperatorType": "Subquery", 5827 "Variant": "PulloutIn", 5828 "PulloutVars": [ 5829 "__sq_has_values1", 5830 "__sq1" 5831 ], 5832 "Inputs": [ 5833 { 5834 "OperatorType": "Route", 5835 "Variant": "IN", 5836 "Keyspace": { 5837 "Name": "user", 5838 "Sharded": true 5839 }, 5840 "FieldQuery": "select music.id from music where 1 != 1", 5841 "Query": "select music.id from music where music.user_id in ::__vals", 5842 "Table": "music", 5843 "Values": [ 5844 "(INT64(1), INT64(2), INT64(3))" 5845 ], 5846 "Vindex": "user_index" 5847 }, 5848 { 5849 "OperatorType": "Route", 5850 "Variant": "IN", 5851 "Keyspace": { 5852 "Name": "user", 5853 "Sharded": true 5854 }, 5855 "FieldQuery": "select music.id from music where 1 != 1", 5856 "Query": "select music.id from music where :__sq_has_values1 = 1 and music.id in ::__vals", 5857 "Table": "music", 5858 "Values": [ 5859 ":__sq1" 5860 ], 5861 "Vindex": "music_user_map" 5862 } 5863 ] 5864 } 5865 }, 5866 "gen4-plan": { 5867 "QueryType": "SELECT", 5868 "Original": "SELECT music.id FROM music WHERE music.id IN (SELECT music.id FROM music WHERE music.user_id IN (1, 2, 3))", 5869 "Instructions": { 5870 "OperatorType": "Route", 5871 "Variant": "IN", 5872 "Keyspace": { 5873 "Name": "user", 5874 "Sharded": true 5875 }, 5876 "FieldQuery": "select music.id from music where 1 != 1", 5877 "Query": "select music.id from music where music.id in (select music.id from music where music.user_id in ::__vals)", 5878 "Table": "music", 5879 "Values": [ 5880 "(INT64(1), INT64(2), INT64(3))" 5881 ], 5882 "Vindex": "user_index" 5883 }, 5884 "TablesUsed": [ 5885 "user.music" 5886 ] 5887 } 5888 }, 5889 { 5890 "comment": "Subquery with `IN` condition using columns with matching lookup vindexes, with derived table", 5891 "query": "SELECT music.id FROM music WHERE music.id IN (SELECT * FROM (SELECT music.id FROM music WHERE music.user_id IN (1, 2, 3)) _inner)", 5892 "v3-plan": { 5893 "QueryType": "SELECT", 5894 "Original": "SELECT music.id FROM music WHERE music.id IN (SELECT * FROM (SELECT music.id FROM music WHERE music.user_id IN (1, 2, 3)) _inner)", 5895 "Instructions": { 5896 "OperatorType": "Subquery", 5897 "Variant": "PulloutIn", 5898 "PulloutVars": [ 5899 "__sq_has_values1", 5900 "__sq1" 5901 ], 5902 "Inputs": [ 5903 { 5904 "OperatorType": "Route", 5905 "Variant": "IN", 5906 "Keyspace": { 5907 "Name": "user", 5908 "Sharded": true 5909 }, 5910 "FieldQuery": "select * from (select music.id from music where 1 != 1) as _inner where 1 != 1", 5911 "Query": "select * from (select music.id from music where music.user_id in ::__vals) as _inner", 5912 "Table": "music", 5913 "Values": [ 5914 "(INT64(1), INT64(2), INT64(3))" 5915 ], 5916 "Vindex": "user_index" 5917 }, 5918 { 5919 "OperatorType": "Route", 5920 "Variant": "IN", 5921 "Keyspace": { 5922 "Name": "user", 5923 "Sharded": true 5924 }, 5925 "FieldQuery": "select music.id from music where 1 != 1", 5926 "Query": "select music.id from music where :__sq_has_values1 = 1 and music.id in ::__vals", 5927 "Table": "music", 5928 "Values": [ 5929 ":__sq1" 5930 ], 5931 "Vindex": "music_user_map" 5932 } 5933 ] 5934 } 5935 }, 5936 "gen4-plan": { 5937 "QueryType": "SELECT", 5938 "Original": "SELECT music.id FROM music WHERE music.id IN (SELECT * FROM (SELECT music.id FROM music WHERE music.user_id IN (1, 2, 3)) _inner)", 5939 "Instructions": { 5940 "OperatorType": "Route", 5941 "Variant": "IN", 5942 "Keyspace": { 5943 "Name": "user", 5944 "Sharded": true 5945 }, 5946 "FieldQuery": "select music.id from music where 1 != 1", 5947 "Query": "select music.id from music where music.id in (select _inner.id from (select music.id from music where music.user_id in ::__vals) as _inner)", 5948 "Table": "music", 5949 "Values": [ 5950 "(INT64(1), INT64(2), INT64(3))" 5951 ], 5952 "Vindex": "user_index" 5953 }, 5954 "TablesUsed": [ 5955 "user.music" 5956 ] 5957 } 5958 }, 5959 { 5960 "comment": "Subquery with `IN` condition using columns with matching lookup vindexes, with inner scatter query", 5961 "query": "SELECT music.id FROM music WHERE music.id IN (SELECT music.id FROM music WHERE music.foo = 'bar') AND music.user_id IN (3, 4, 5)", 5962 "v3-plan": { 5963 "QueryType": "SELECT", 5964 "Original": "SELECT music.id FROM music WHERE music.id IN (SELECT music.id FROM music WHERE music.foo = 'bar') AND music.user_id IN (3, 4, 5)", 5965 "Instructions": { 5966 "OperatorType": "Subquery", 5967 "Variant": "PulloutIn", 5968 "PulloutVars": [ 5969 "__sq_has_values1", 5970 "__sq1" 5971 ], 5972 "Inputs": [ 5973 { 5974 "OperatorType": "Route", 5975 "Variant": "Scatter", 5976 "Keyspace": { 5977 "Name": "user", 5978 "Sharded": true 5979 }, 5980 "FieldQuery": "select music.id from music where 1 != 1", 5981 "Query": "select music.id from music where music.foo = 'bar'", 5982 "Table": "music" 5983 }, 5984 { 5985 "OperatorType": "Route", 5986 "Variant": "IN", 5987 "Keyspace": { 5988 "Name": "user", 5989 "Sharded": true 5990 }, 5991 "FieldQuery": "select music.id from music where 1 != 1", 5992 "Query": "select music.id from music where music.user_id in ::__vals and :__sq_has_values1 = 1 and music.id in ::__sq1", 5993 "Table": "music", 5994 "Values": [ 5995 "(INT64(3), INT64(4), INT64(5))" 5996 ], 5997 "Vindex": "user_index" 5998 } 5999 ] 6000 } 6001 }, 6002 "gen4-plan": { 6003 "QueryType": "SELECT", 6004 "Original": "SELECT music.id FROM music WHERE music.id IN (SELECT music.id FROM music WHERE music.foo = 'bar') AND music.user_id IN (3, 4, 5)", 6005 "Instructions": { 6006 "OperatorType": "Route", 6007 "Variant": "IN", 6008 "Keyspace": { 6009 "Name": "user", 6010 "Sharded": true 6011 }, 6012 "FieldQuery": "select music.id from music where 1 != 1", 6013 "Query": "select music.id from music where music.id in (select music.id from music where music.foo = 'bar') and music.user_id in ::__vals", 6014 "Table": "music", 6015 "Values": [ 6016 "(INT64(3), INT64(4), INT64(5))" 6017 ], 6018 "Vindex": "user_index" 6019 }, 6020 "TablesUsed": [ 6021 "user.music" 6022 ] 6023 } 6024 }, 6025 { 6026 "comment": "Subquery with `IN` condition using columns with matching lookup vindexes", 6027 "query": "SELECT music.id FROM music WHERE music.id IN (SELECT music.id FROM music WHERE music.user_id IN (1, 2, 3)) and music.user_id = 5", 6028 "v3-plan": { 6029 "QueryType": "SELECT", 6030 "Original": "SELECT music.id FROM music WHERE music.id IN (SELECT music.id FROM music WHERE music.user_id IN (1, 2, 3)) and music.user_id = 5", 6031 "Instructions": { 6032 "OperatorType": "Subquery", 6033 "Variant": "PulloutIn", 6034 "PulloutVars": [ 6035 "__sq_has_values1", 6036 "__sq1" 6037 ], 6038 "Inputs": [ 6039 { 6040 "OperatorType": "Route", 6041 "Variant": "IN", 6042 "Keyspace": { 6043 "Name": "user", 6044 "Sharded": true 6045 }, 6046 "FieldQuery": "select music.id from music where 1 != 1", 6047 "Query": "select music.id from music where music.user_id in ::__vals", 6048 "Table": "music", 6049 "Values": [ 6050 "(INT64(1), INT64(2), INT64(3))" 6051 ], 6052 "Vindex": "user_index" 6053 }, 6054 { 6055 "OperatorType": "Route", 6056 "Variant": "EqualUnique", 6057 "Keyspace": { 6058 "Name": "user", 6059 "Sharded": true 6060 }, 6061 "FieldQuery": "select music.id from music where 1 != 1", 6062 "Query": "select music.id from music where music.user_id = 5 and :__sq_has_values1 = 1 and music.id in ::__sq1", 6063 "Table": "music", 6064 "Values": [ 6065 "INT64(5)" 6066 ], 6067 "Vindex": "user_index" 6068 } 6069 ] 6070 } 6071 }, 6072 "gen4-plan": { 6073 "QueryType": "SELECT", 6074 "Original": "SELECT music.id FROM music WHERE music.id IN (SELECT music.id FROM music WHERE music.user_id IN (1, 2, 3)) and music.user_id = 5", 6075 "Instructions": { 6076 "OperatorType": "Route", 6077 "Variant": "EqualUnique", 6078 "Keyspace": { 6079 "Name": "user", 6080 "Sharded": true 6081 }, 6082 "FieldQuery": "select music.id from music where 1 != 1", 6083 "Query": "select music.id from music where music.id in (select music.id from music where music.user_id in (1, 2, 3)) and music.user_id = 5", 6084 "Table": "music", 6085 "Values": [ 6086 "INT64(5)" 6087 ], 6088 "Vindex": "user_index" 6089 }, 6090 "TablesUsed": [ 6091 "user.music" 6092 ] 6093 } 6094 }, 6095 { 6096 "comment": "Subquery with `IN` condition using columns with matching lookup vindexes, but not a top level predicate", 6097 "query": "SELECT music.id FROM music WHERE music.id IN (SELECT music.id FROM music WHERE music.user_id IN (1, 2, 3)) OR music.user_id = 5", 6098 "v3-plan": { 6099 "QueryType": "SELECT", 6100 "Original": "SELECT music.id FROM music WHERE music.id IN (SELECT music.id FROM music WHERE music.user_id IN (1, 2, 3)) OR music.user_id = 5", 6101 "Instructions": { 6102 "OperatorType": "Subquery", 6103 "Variant": "PulloutIn", 6104 "PulloutVars": [ 6105 "__sq_has_values1", 6106 "__sq1" 6107 ], 6108 "Inputs": [ 6109 { 6110 "OperatorType": "Route", 6111 "Variant": "IN", 6112 "Keyspace": { 6113 "Name": "user", 6114 "Sharded": true 6115 }, 6116 "FieldQuery": "select music.id from music where 1 != 1", 6117 "Query": "select music.id from music where music.user_id in ::__vals", 6118 "Table": "music", 6119 "Values": [ 6120 "(INT64(1), INT64(2), INT64(3))" 6121 ], 6122 "Vindex": "user_index" 6123 }, 6124 { 6125 "OperatorType": "Route", 6126 "Variant": "Scatter", 6127 "Keyspace": { 6128 "Name": "user", 6129 "Sharded": true 6130 }, 6131 "FieldQuery": "select music.id from music where 1 != 1", 6132 "Query": "select music.id from music where :__sq_has_values1 = 1 and music.id in ::__sq1 or music.user_id = 5", 6133 "Table": "music" 6134 } 6135 ] 6136 } 6137 }, 6138 "gen4-plan": { 6139 "QueryType": "SELECT", 6140 "Original": "SELECT music.id FROM music WHERE music.id IN (SELECT music.id FROM music WHERE music.user_id IN (1, 2, 3)) OR music.user_id = 5", 6141 "Instructions": { 6142 "OperatorType": "Route", 6143 "Variant": "Scatter", 6144 "Keyspace": { 6145 "Name": "user", 6146 "Sharded": true 6147 }, 6148 "FieldQuery": "select music.id from music where 1 != 1", 6149 "Query": "select music.id from music where music.id in (select music.id from music where music.user_id in (1, 2, 3)) or music.user_id = 5", 6150 "Table": "music" 6151 }, 6152 "TablesUsed": [ 6153 "user.music" 6154 ] 6155 } 6156 }, 6157 { 6158 "comment": "`IN` comparison on Vindex with `None` subquery, as routing predicate", 6159 "query": "SELECT `music`.id FROM `music` WHERE music.id IN (SELECT music.id FROM music WHERE music.user_id IN (NULL)) AND music.user_id = 5", 6160 "v3-plan": { 6161 "QueryType": "SELECT", 6162 "Original": "SELECT `music`.id FROM `music` WHERE music.id IN (SELECT music.id FROM music WHERE music.user_id IN (NULL)) AND music.user_id = 5", 6163 "Instructions": { 6164 "OperatorType": "Subquery", 6165 "Variant": "PulloutIn", 6166 "PulloutVars": [ 6167 "__sq_has_values1", 6168 "__sq1" 6169 ], 6170 "Inputs": [ 6171 { 6172 "OperatorType": "Route", 6173 "Variant": "None", 6174 "Keyspace": { 6175 "Name": "user", 6176 "Sharded": true 6177 }, 6178 "FieldQuery": "select music.id from music where 1 != 1", 6179 "Query": "select music.id from music where music.user_id in (null)", 6180 "Table": "music" 6181 }, 6182 { 6183 "OperatorType": "Route", 6184 "Variant": "EqualUnique", 6185 "Keyspace": { 6186 "Name": "user", 6187 "Sharded": true 6188 }, 6189 "FieldQuery": "select music.id from music where 1 != 1", 6190 "Query": "select music.id from music where music.user_id = 5 and :__sq_has_values1 = 1 and music.id in ::__sq1", 6191 "Table": "music", 6192 "Values": [ 6193 "INT64(5)" 6194 ], 6195 "Vindex": "user_index" 6196 } 6197 ] 6198 } 6199 }, 6200 "gen4-plan": { 6201 "QueryType": "SELECT", 6202 "Original": "SELECT `music`.id FROM `music` WHERE music.id IN (SELECT music.id FROM music WHERE music.user_id IN (NULL)) AND music.user_id = 5", 6203 "Instructions": { 6204 "OperatorType": "Route", 6205 "Variant": "None", 6206 "Keyspace": { 6207 "Name": "user", 6208 "Sharded": true 6209 }, 6210 "FieldQuery": "select music.id from music where 1 != 1", 6211 "Query": "select music.id from music where music.id in (select music.id from music where music.user_id in (null)) and music.user_id = 5", 6212 "Table": "music" 6213 }, 6214 "TablesUsed": [ 6215 "user.music" 6216 ] 6217 } 6218 }, 6219 { 6220 "comment": "`IN` comparison on Vindex with `None` subquery, as non-routing predicate", 6221 "query": "SELECT `music`.id FROM `music` WHERE music.id IN (SELECT music.id FROM music WHERE music.user_id IN (NULL)) OR music.user_id = 5", 6222 "v3-plan": { 6223 "QueryType": "SELECT", 6224 "Original": "SELECT `music`.id FROM `music` WHERE music.id IN (SELECT music.id FROM music WHERE music.user_id IN (NULL)) OR music.user_id = 5", 6225 "Instructions": { 6226 "OperatorType": "Subquery", 6227 "Variant": "PulloutIn", 6228 "PulloutVars": [ 6229 "__sq_has_values1", 6230 "__sq1" 6231 ], 6232 "Inputs": [ 6233 { 6234 "OperatorType": "Route", 6235 "Variant": "None", 6236 "Keyspace": { 6237 "Name": "user", 6238 "Sharded": true 6239 }, 6240 "FieldQuery": "select music.id from music where 1 != 1", 6241 "Query": "select music.id from music where music.user_id in (null)", 6242 "Table": "music" 6243 }, 6244 { 6245 "OperatorType": "Route", 6246 "Variant": "Scatter", 6247 "Keyspace": { 6248 "Name": "user", 6249 "Sharded": true 6250 }, 6251 "FieldQuery": "select music.id from music where 1 != 1", 6252 "Query": "select music.id from music where :__sq_has_values1 = 1 and music.id in ::__sq1 or music.user_id = 5", 6253 "Table": "music" 6254 } 6255 ] 6256 } 6257 }, 6258 "gen4-plan": { 6259 "QueryType": "SELECT", 6260 "Original": "SELECT `music`.id FROM `music` WHERE music.id IN (SELECT music.id FROM music WHERE music.user_id IN (NULL)) OR music.user_id = 5", 6261 "Instructions": { 6262 "OperatorType": "Route", 6263 "Variant": "Scatter", 6264 "Keyspace": { 6265 "Name": "user", 6266 "Sharded": true 6267 }, 6268 "FieldQuery": "select music.id from music where 1 != 1", 6269 "Query": "select music.id from music where music.id in (select music.id from music where music.user_id in (null)) or music.user_id = 5", 6270 "Table": "music" 6271 }, 6272 "TablesUsed": [ 6273 "user.music" 6274 ] 6275 } 6276 }, 6277 { 6278 "comment": "Mergeable scatter subquery", 6279 "query": "SELECT music.id FROM music WHERE music.id IN (SELECT music.id FROM music WHERE music.genre = 'pop')", 6280 "v3-plan": { 6281 "QueryType": "SELECT", 6282 "Original": "SELECT music.id FROM music WHERE music.id IN (SELECT music.id FROM music WHERE music.genre = 'pop')", 6283 "Instructions": { 6284 "OperatorType": "Subquery", 6285 "Variant": "PulloutIn", 6286 "PulloutVars": [ 6287 "__sq_has_values1", 6288 "__sq1" 6289 ], 6290 "Inputs": [ 6291 { 6292 "OperatorType": "Route", 6293 "Variant": "Scatter", 6294 "Keyspace": { 6295 "Name": "user", 6296 "Sharded": true 6297 }, 6298 "FieldQuery": "select music.id from music where 1 != 1", 6299 "Query": "select music.id from music where music.genre = 'pop'", 6300 "Table": "music" 6301 }, 6302 { 6303 "OperatorType": "Route", 6304 "Variant": "IN", 6305 "Keyspace": { 6306 "Name": "user", 6307 "Sharded": true 6308 }, 6309 "FieldQuery": "select music.id from music where 1 != 1", 6310 "Query": "select music.id from music where :__sq_has_values1 = 1 and music.id in ::__vals", 6311 "Table": "music", 6312 "Values": [ 6313 ":__sq1" 6314 ], 6315 "Vindex": "music_user_map" 6316 } 6317 ] 6318 } 6319 }, 6320 "gen4-plan": { 6321 "QueryType": "SELECT", 6322 "Original": "SELECT music.id FROM music WHERE music.id IN (SELECT music.id FROM music WHERE music.genre = 'pop')", 6323 "Instructions": { 6324 "OperatorType": "Route", 6325 "Variant": "Scatter", 6326 "Keyspace": { 6327 "Name": "user", 6328 "Sharded": true 6329 }, 6330 "FieldQuery": "select music.id from music where 1 != 1", 6331 "Query": "select music.id from music where music.id in (select music.id from music where music.genre = 'pop')", 6332 "Table": "music" 6333 }, 6334 "TablesUsed": [ 6335 "user.music" 6336 ] 6337 } 6338 }, 6339 { 6340 "comment": "Mergeable scatter subquery with `GROUP BY` on unique vindex column", 6341 "query": "SELECT music.id FROM music WHERE music.id IN (SELECT music.id FROM music WHERE music.genre = 'pop' GROUP BY music.id)", 6342 "v3-plan": { 6343 "QueryType": "SELECT", 6344 "Original": "SELECT music.id FROM music WHERE music.id IN (SELECT music.id FROM music WHERE music.genre = 'pop' GROUP BY music.id)", 6345 "Instructions": { 6346 "OperatorType": "Subquery", 6347 "Variant": "PulloutIn", 6348 "PulloutVars": [ 6349 "__sq_has_values1", 6350 "__sq1" 6351 ], 6352 "Inputs": [ 6353 { 6354 "OperatorType": "Route", 6355 "Variant": "Scatter", 6356 "Keyspace": { 6357 "Name": "user", 6358 "Sharded": true 6359 }, 6360 "FieldQuery": "select music.id from music where 1 != 1 group by music.id", 6361 "Query": "select music.id from music where music.genre = 'pop' group by music.id", 6362 "Table": "music" 6363 }, 6364 { 6365 "OperatorType": "Route", 6366 "Variant": "IN", 6367 "Keyspace": { 6368 "Name": "user", 6369 "Sharded": true 6370 }, 6371 "FieldQuery": "select music.id from music where 1 != 1", 6372 "Query": "select music.id from music where :__sq_has_values1 = 1 and music.id in ::__vals", 6373 "Table": "music", 6374 "Values": [ 6375 ":__sq1" 6376 ], 6377 "Vindex": "music_user_map" 6378 } 6379 ] 6380 } 6381 }, 6382 "gen4-plan": { 6383 "QueryType": "SELECT", 6384 "Original": "SELECT music.id FROM music WHERE music.id IN (SELECT music.id FROM music WHERE music.genre = 'pop' GROUP BY music.id)", 6385 "Instructions": { 6386 "OperatorType": "Route", 6387 "Variant": "Scatter", 6388 "Keyspace": { 6389 "Name": "user", 6390 "Sharded": true 6391 }, 6392 "FieldQuery": "select music.id from music where 1 != 1", 6393 "Query": "select music.id from music where music.id in (select music.id from music where music.genre = 'pop' group by music.id)", 6394 "Table": "music" 6395 }, 6396 "TablesUsed": [ 6397 "user.music" 6398 ] 6399 } 6400 }, 6401 { 6402 "comment": "Unmergeable scatter subquery with `GROUP BY` on-non vindex column", 6403 "query": "SELECT music.id FROM music WHERE music.id IN (SELECT music.id FROM music WHERE music.genre = 'pop' GROUP BY music.genre)", 6404 "v3-plan": "VT12001: unsupported: in scatter query: GROUP BY column must reference column in SELECT list", 6405 "gen4-plan": { 6406 "QueryType": "SELECT", 6407 "Original": "SELECT music.id FROM music WHERE music.id IN (SELECT music.id FROM music WHERE music.genre = 'pop' GROUP BY music.genre)", 6408 "Instructions": { 6409 "OperatorType": "Subquery", 6410 "Variant": "PulloutIn", 6411 "PulloutVars": [ 6412 "__sq_has_values1", 6413 "__sq1" 6414 ], 6415 "Inputs": [ 6416 { 6417 "OperatorType": "Aggregate", 6418 "Variant": "Ordered", 6419 "Aggregates": "random(0) AS id", 6420 "GroupBy": "(1|2)", 6421 "ResultColumns": 1, 6422 "Inputs": [ 6423 { 6424 "OperatorType": "Route", 6425 "Variant": "Scatter", 6426 "Keyspace": { 6427 "Name": "user", 6428 "Sharded": true 6429 }, 6430 "FieldQuery": "select music.id, music.genre, weight_string(music.genre) from music where 1 != 1 group by music.genre, weight_string(music.genre)", 6431 "OrderBy": "(1|2) ASC", 6432 "Query": "select music.id, music.genre, weight_string(music.genre) from music where music.genre = 'pop' group by music.genre, weight_string(music.genre) order by music.genre asc", 6433 "Table": "music" 6434 } 6435 ] 6436 }, 6437 { 6438 "OperatorType": "Route", 6439 "Variant": "IN", 6440 "Keyspace": { 6441 "Name": "user", 6442 "Sharded": true 6443 }, 6444 "FieldQuery": "select music.id from music where 1 != 1", 6445 "Query": "select music.id from music where :__sq_has_values1 = 1 and music.id in ::__vals", 6446 "Table": "music", 6447 "Values": [ 6448 ":__sq1" 6449 ], 6450 "Vindex": "music_user_map" 6451 } 6452 ] 6453 }, 6454 "TablesUsed": [ 6455 "user.music" 6456 ] 6457 } 6458 }, 6459 { 6460 "comment": "Unmergeable scatter subquery with LIMIT", 6461 "query": "SELECT music.id FROM music WHERE music.id IN (SELECT music.id FROM music WHERE music.genre = 'pop' LIMIT 10)", 6462 "v3-plan": { 6463 "QueryType": "SELECT", 6464 "Original": "SELECT music.id FROM music WHERE music.id IN (SELECT music.id FROM music WHERE music.genre = 'pop' LIMIT 10)", 6465 "Instructions": { 6466 "OperatorType": "Subquery", 6467 "Variant": "PulloutIn", 6468 "PulloutVars": [ 6469 "__sq_has_values1", 6470 "__sq1" 6471 ], 6472 "Inputs": [ 6473 { 6474 "OperatorType": "Limit", 6475 "Count": "INT64(10)", 6476 "Inputs": [ 6477 { 6478 "OperatorType": "Route", 6479 "Variant": "Scatter", 6480 "Keyspace": { 6481 "Name": "user", 6482 "Sharded": true 6483 }, 6484 "FieldQuery": "select music.id from music where 1 != 1", 6485 "Query": "select music.id from music where music.genre = 'pop' limit :__upper_limit", 6486 "Table": "music" 6487 } 6488 ] 6489 }, 6490 { 6491 "OperatorType": "Route", 6492 "Variant": "IN", 6493 "Keyspace": { 6494 "Name": "user", 6495 "Sharded": true 6496 }, 6497 "FieldQuery": "select music.id from music where 1 != 1", 6498 "Query": "select music.id from music where :__sq_has_values1 = 1 and music.id in ::__vals", 6499 "Table": "music", 6500 "Values": [ 6501 ":__sq1" 6502 ], 6503 "Vindex": "music_user_map" 6504 } 6505 ] 6506 } 6507 }, 6508 "gen4-plan": { 6509 "QueryType": "SELECT", 6510 "Original": "SELECT music.id FROM music WHERE music.id IN (SELECT music.id FROM music WHERE music.genre = 'pop' LIMIT 10)", 6511 "Instructions": { 6512 "OperatorType": "Subquery", 6513 "Variant": "PulloutIn", 6514 "PulloutVars": [ 6515 "__sq_has_values1", 6516 "__sq1" 6517 ], 6518 "Inputs": [ 6519 { 6520 "OperatorType": "Limit", 6521 "Count": "INT64(10)", 6522 "Inputs": [ 6523 { 6524 "OperatorType": "Route", 6525 "Variant": "Scatter", 6526 "Keyspace": { 6527 "Name": "user", 6528 "Sharded": true 6529 }, 6530 "FieldQuery": "select music.id from music where 1 != 1", 6531 "Query": "select music.id from music where music.genre = 'pop' limit :__upper_limit", 6532 "Table": "music" 6533 } 6534 ] 6535 }, 6536 { 6537 "OperatorType": "Route", 6538 "Variant": "IN", 6539 "Keyspace": { 6540 "Name": "user", 6541 "Sharded": true 6542 }, 6543 "FieldQuery": "select music.id from music where 1 != 1", 6544 "Query": "select music.id from music where :__sq_has_values1 = 1 and music.id in ::__vals", 6545 "Table": "music", 6546 "Values": [ 6547 ":__sq1" 6548 ], 6549 "Vindex": "music_user_map" 6550 } 6551 ] 6552 }, 6553 "TablesUsed": [ 6554 "user.music" 6555 ] 6556 } 6557 }, 6558 { 6559 "comment": "Mergeable subquery with `MAX` aggregate and grouped by unique vindex", 6560 "query": "SELECT music.id FROM music WHERE music.id IN (SELECT MAX(music.id) FROM music WHERE music.user_id IN (5, 6) GROUP BY music.user_id)", 6561 "v3-plan": { 6562 "QueryType": "SELECT", 6563 "Original": "SELECT music.id FROM music WHERE music.id IN (SELECT MAX(music.id) FROM music WHERE music.user_id IN (5, 6) GROUP BY music.user_id)", 6564 "Instructions": { 6565 "OperatorType": "Subquery", 6566 "Variant": "PulloutIn", 6567 "PulloutVars": [ 6568 "__sq_has_values1", 6569 "__sq1" 6570 ], 6571 "Inputs": [ 6572 { 6573 "OperatorType": "Route", 6574 "Variant": "IN", 6575 "Keyspace": { 6576 "Name": "user", 6577 "Sharded": true 6578 }, 6579 "FieldQuery": "select max(music.id) from music where 1 != 1 group by music.user_id", 6580 "Query": "select max(music.id) from music where music.user_id in ::__vals group by music.user_id", 6581 "Table": "music", 6582 "Values": [ 6583 "(INT64(5), INT64(6))" 6584 ], 6585 "Vindex": "user_index" 6586 }, 6587 { 6588 "OperatorType": "Route", 6589 "Variant": "IN", 6590 "Keyspace": { 6591 "Name": "user", 6592 "Sharded": true 6593 }, 6594 "FieldQuery": "select music.id from music where 1 != 1", 6595 "Query": "select music.id from music where :__sq_has_values1 = 1 and music.id in ::__vals", 6596 "Table": "music", 6597 "Values": [ 6598 ":__sq1" 6599 ], 6600 "Vindex": "music_user_map" 6601 } 6602 ] 6603 } 6604 }, 6605 "gen4-plan": { 6606 "QueryType": "SELECT", 6607 "Original": "SELECT music.id FROM music WHERE music.id IN (SELECT MAX(music.id) FROM music WHERE music.user_id IN (5, 6) GROUP BY music.user_id)", 6608 "Instructions": { 6609 "OperatorType": "Route", 6610 "Variant": "IN", 6611 "Keyspace": { 6612 "Name": "user", 6613 "Sharded": true 6614 }, 6615 "FieldQuery": "select music.id from music where 1 != 1", 6616 "Query": "select music.id from music where music.id in (select max(music.id) from music where music.user_id in ::__vals group by music.user_id)", 6617 "Table": "music", 6618 "Values": [ 6619 "(INT64(5), INT64(6))" 6620 ], 6621 "Vindex": "user_index" 6622 }, 6623 "TablesUsed": [ 6624 "user.music" 6625 ] 6626 } 6627 }, 6628 { 6629 "comment": "Unmergeable subquery with `MAX` aggregate", 6630 "query": "SELECT music.id FROM music WHERE music.id IN (SELECT MAX(music.id) FROM music WHERE music.user_id IN (5, 6))", 6631 "v3-plan": { 6632 "QueryType": "SELECT", 6633 "Original": "SELECT music.id FROM music WHERE music.id IN (SELECT MAX(music.id) FROM music WHERE music.user_id IN (5, 6))", 6634 "Instructions": { 6635 "OperatorType": "Subquery", 6636 "Variant": "PulloutIn", 6637 "PulloutVars": [ 6638 "__sq_has_values1", 6639 "__sq1" 6640 ], 6641 "Inputs": [ 6642 { 6643 "OperatorType": "Aggregate", 6644 "Variant": "Scalar", 6645 "Aggregates": "max(0)", 6646 "Inputs": [ 6647 { 6648 "OperatorType": "Route", 6649 "Variant": "IN", 6650 "Keyspace": { 6651 "Name": "user", 6652 "Sharded": true 6653 }, 6654 "FieldQuery": "select max(music.id) from music where 1 != 1", 6655 "Query": "select max(music.id) from music where music.user_id in ::__vals", 6656 "Table": "music", 6657 "Values": [ 6658 "(INT64(5), INT64(6))" 6659 ], 6660 "Vindex": "user_index" 6661 } 6662 ] 6663 }, 6664 { 6665 "OperatorType": "Route", 6666 "Variant": "IN", 6667 "Keyspace": { 6668 "Name": "user", 6669 "Sharded": true 6670 }, 6671 "FieldQuery": "select music.id from music where 1 != 1", 6672 "Query": "select music.id from music where :__sq_has_values1 = 1 and music.id in ::__vals", 6673 "Table": "music", 6674 "Values": [ 6675 ":__sq1" 6676 ], 6677 "Vindex": "music_user_map" 6678 } 6679 ] 6680 } 6681 }, 6682 "gen4-plan": { 6683 "QueryType": "SELECT", 6684 "Original": "SELECT music.id FROM music WHERE music.id IN (SELECT MAX(music.id) FROM music WHERE music.user_id IN (5, 6))", 6685 "Instructions": { 6686 "OperatorType": "Subquery", 6687 "Variant": "PulloutIn", 6688 "PulloutVars": [ 6689 "__sq_has_values1", 6690 "__sq1" 6691 ], 6692 "Inputs": [ 6693 { 6694 "OperatorType": "Aggregate", 6695 "Variant": "Scalar", 6696 "Aggregates": "max(0) AS max(music.id)", 6697 "Inputs": [ 6698 { 6699 "OperatorType": "Route", 6700 "Variant": "IN", 6701 "Keyspace": { 6702 "Name": "user", 6703 "Sharded": true 6704 }, 6705 "FieldQuery": "select max(music.id) from music where 1 != 1", 6706 "Query": "select max(music.id) from music where music.user_id in ::__vals", 6707 "Table": "music", 6708 "Values": [ 6709 "(INT64(5), INT64(6))" 6710 ], 6711 "Vindex": "user_index" 6712 } 6713 ] 6714 }, 6715 { 6716 "OperatorType": "Route", 6717 "Variant": "IN", 6718 "Keyspace": { 6719 "Name": "user", 6720 "Sharded": true 6721 }, 6722 "FieldQuery": "select music.id from music where 1 != 1", 6723 "Query": "select music.id from music where :__sq_has_values1 = 1 and music.id in ::__vals", 6724 "Table": "music", 6725 "Values": [ 6726 ":__sq1" 6727 ], 6728 "Vindex": "music_user_map" 6729 } 6730 ] 6731 }, 6732 "TablesUsed": [ 6733 "user.music" 6734 ] 6735 } 6736 }, 6737 { 6738 "comment": "Mergeable subquery with `MAX` aggregate with `EqualUnique` route operator", 6739 "query": "SELECT music.id FROM music WHERE music.id IN (SELECT MAX(music.id) FROM music WHERE music.user_id = 5)", 6740 "v3-plan": { 6741 "QueryType": "SELECT", 6742 "Original": "SELECT music.id FROM music WHERE music.id IN (SELECT MAX(music.id) FROM music WHERE music.user_id = 5)", 6743 "Instructions": { 6744 "OperatorType": "Subquery", 6745 "Variant": "PulloutIn", 6746 "PulloutVars": [ 6747 "__sq_has_values1", 6748 "__sq1" 6749 ], 6750 "Inputs": [ 6751 { 6752 "OperatorType": "Route", 6753 "Variant": "EqualUnique", 6754 "Keyspace": { 6755 "Name": "user", 6756 "Sharded": true 6757 }, 6758 "FieldQuery": "select max(music.id) from music where 1 != 1", 6759 "Query": "select max(music.id) from music where music.user_id = 5", 6760 "Table": "music", 6761 "Values": [ 6762 "INT64(5)" 6763 ], 6764 "Vindex": "user_index" 6765 }, 6766 { 6767 "OperatorType": "Route", 6768 "Variant": "IN", 6769 "Keyspace": { 6770 "Name": "user", 6771 "Sharded": true 6772 }, 6773 "FieldQuery": "select music.id from music where 1 != 1", 6774 "Query": "select music.id from music where :__sq_has_values1 = 1 and music.id in ::__vals", 6775 "Table": "music", 6776 "Values": [ 6777 ":__sq1" 6778 ], 6779 "Vindex": "music_user_map" 6780 } 6781 ] 6782 } 6783 }, 6784 "gen4-plan": { 6785 "QueryType": "SELECT", 6786 "Original": "SELECT music.id FROM music WHERE music.id IN (SELECT MAX(music.id) FROM music WHERE music.user_id = 5)", 6787 "Instructions": { 6788 "OperatorType": "Subquery", 6789 "Variant": "PulloutIn", 6790 "PulloutVars": [ 6791 "__sq_has_values1", 6792 "__sq1" 6793 ], 6794 "Inputs": [ 6795 { 6796 "OperatorType": "Route", 6797 "Variant": "EqualUnique", 6798 "Keyspace": { 6799 "Name": "user", 6800 "Sharded": true 6801 }, 6802 "FieldQuery": "select max(music.id) from music where 1 != 1", 6803 "Query": "select max(music.id) from music where music.user_id = 5", 6804 "Table": "music", 6805 "Values": [ 6806 "INT64(5)" 6807 ], 6808 "Vindex": "user_index" 6809 }, 6810 { 6811 "OperatorType": "Route", 6812 "Variant": "IN", 6813 "Keyspace": { 6814 "Name": "user", 6815 "Sharded": true 6816 }, 6817 "FieldQuery": "select music.id from music where 1 != 1", 6818 "Query": "select music.id from music where :__sq_has_values1 = 1 and music.id in ::__vals", 6819 "Table": "music", 6820 "Values": [ 6821 ":__sq1" 6822 ], 6823 "Vindex": "music_user_map" 6824 } 6825 ] 6826 }, 6827 "TablesUsed": [ 6828 "user.music" 6829 ] 6830 } 6831 }, 6832 { 6833 "comment": "Mergeable subquery with `LIMIT` due to `EqualUnique` route", 6834 "query": "SELECT music.id FROM music WHERE music.id IN (SELECT MAX(music.id) FROM music WHERE music.user_id = 5 LIMIT 10)", 6835 "v3-plan": { 6836 "QueryType": "SELECT", 6837 "Original": "SELECT music.id FROM music WHERE music.id IN (SELECT MAX(music.id) FROM music WHERE music.user_id = 5 LIMIT 10)", 6838 "Instructions": { 6839 "OperatorType": "Subquery", 6840 "Variant": "PulloutIn", 6841 "PulloutVars": [ 6842 "__sq_has_values1", 6843 "__sq1" 6844 ], 6845 "Inputs": [ 6846 { 6847 "OperatorType": "Route", 6848 "Variant": "EqualUnique", 6849 "Keyspace": { 6850 "Name": "user", 6851 "Sharded": true 6852 }, 6853 "FieldQuery": "select max(music.id) from music where 1 != 1", 6854 "Query": "select max(music.id) from music where music.user_id = 5 limit 10", 6855 "Table": "music", 6856 "Values": [ 6857 "INT64(5)" 6858 ], 6859 "Vindex": "user_index" 6860 }, 6861 { 6862 "OperatorType": "Route", 6863 "Variant": "IN", 6864 "Keyspace": { 6865 "Name": "user", 6866 "Sharded": true 6867 }, 6868 "FieldQuery": "select music.id from music where 1 != 1", 6869 "Query": "select music.id from music where :__sq_has_values1 = 1 and music.id in ::__vals", 6870 "Table": "music", 6871 "Values": [ 6872 ":__sq1" 6873 ], 6874 "Vindex": "music_user_map" 6875 } 6876 ] 6877 } 6878 }, 6879 "gen4-plan": { 6880 "QueryType": "SELECT", 6881 "Original": "SELECT music.id FROM music WHERE music.id IN (SELECT MAX(music.id) FROM music WHERE music.user_id = 5 LIMIT 10)", 6882 "Instructions": { 6883 "OperatorType": "Subquery", 6884 "Variant": "PulloutIn", 6885 "PulloutVars": [ 6886 "__sq_has_values1", 6887 "__sq1" 6888 ], 6889 "Inputs": [ 6890 { 6891 "OperatorType": "Route", 6892 "Variant": "EqualUnique", 6893 "Keyspace": { 6894 "Name": "user", 6895 "Sharded": true 6896 }, 6897 "FieldQuery": "select max(music.id) from music where 1 != 1", 6898 "Query": "select max(music.id) from music where music.user_id = 5 limit 10", 6899 "Table": "music", 6900 "Values": [ 6901 "INT64(5)" 6902 ], 6903 "Vindex": "user_index" 6904 }, 6905 { 6906 "OperatorType": "Route", 6907 "Variant": "IN", 6908 "Keyspace": { 6909 "Name": "user", 6910 "Sharded": true 6911 }, 6912 "FieldQuery": "select music.id from music where 1 != 1", 6913 "Query": "select music.id from music where :__sq_has_values1 = 1 and music.id in ::__vals", 6914 "Table": "music", 6915 "Values": [ 6916 ":__sq1" 6917 ], 6918 "Vindex": "music_user_map" 6919 } 6920 ] 6921 }, 6922 "TablesUsed": [ 6923 "user.music" 6924 ] 6925 } 6926 }, 6927 { 6928 "comment": "Mergeable subquery with multiple levels of derived statements", 6929 "query": "SELECT music.id FROM music WHERE music.id IN (SELECT * FROM (SELECT * FROM (SELECT music.id FROM music WHERE music.user_id = 5 LIMIT 10) subquery_for_limit) subquery_for_limit)", 6930 "v3-plan": { 6931 "QueryType": "SELECT", 6932 "Original": "SELECT music.id FROM music WHERE music.id IN (SELECT * FROM (SELECT * FROM (SELECT music.id FROM music WHERE music.user_id = 5 LIMIT 10) subquery_for_limit) subquery_for_limit)", 6933 "Instructions": { 6934 "OperatorType": "Subquery", 6935 "Variant": "PulloutIn", 6936 "PulloutVars": [ 6937 "__sq_has_values1", 6938 "__sq1" 6939 ], 6940 "Inputs": [ 6941 { 6942 "OperatorType": "Route", 6943 "Variant": "EqualUnique", 6944 "Keyspace": { 6945 "Name": "user", 6946 "Sharded": true 6947 }, 6948 "FieldQuery": "select * from (select * from (select music.id from music where 1 != 1) as subquery_for_limit where 1 != 1) as subquery_for_limit where 1 != 1", 6949 "Query": "select * from (select * from (select music.id from music where music.user_id = 5 limit 10) as subquery_for_limit) as subquery_for_limit", 6950 "Table": "music", 6951 "Values": [ 6952 "INT64(5)" 6953 ], 6954 "Vindex": "user_index" 6955 }, 6956 { 6957 "OperatorType": "Route", 6958 "Variant": "IN", 6959 "Keyspace": { 6960 "Name": "user", 6961 "Sharded": true 6962 }, 6963 "FieldQuery": "select music.id from music where 1 != 1", 6964 "Query": "select music.id from music where :__sq_has_values1 = 1 and music.id in ::__vals", 6965 "Table": "music", 6966 "Values": [ 6967 ":__sq1" 6968 ], 6969 "Vindex": "music_user_map" 6970 } 6971 ] 6972 } 6973 }, 6974 "gen4-plan": { 6975 "QueryType": "SELECT", 6976 "Original": "SELECT music.id FROM music WHERE music.id IN (SELECT * FROM (SELECT * FROM (SELECT music.id FROM music WHERE music.user_id = 5 LIMIT 10) subquery_for_limit) subquery_for_limit)", 6977 "Instructions": { 6978 "OperatorType": "Route", 6979 "Variant": "EqualUnique", 6980 "Keyspace": { 6981 "Name": "user", 6982 "Sharded": true 6983 }, 6984 "FieldQuery": "select music.id from music where 1 != 1", 6985 "Query": "select music.id from music where music.id in (select subquery_for_limit.id from (select subquery_for_limit.id from (select music.id from music where music.user_id = 5 limit 10) as subquery_for_limit) as subquery_for_limit)", 6986 "Table": "music", 6987 "Values": [ 6988 "INT64(5)" 6989 ], 6990 "Vindex": "user_index" 6991 }, 6992 "TablesUsed": [ 6993 "user.music" 6994 ] 6995 } 6996 }, 6997 { 6998 "comment": "Mergeable subquery with multiple levels of derived statements, using a single value `IN` predicate", 6999 "query": "SELECT music.id FROM music WHERE music.id IN (SELECT * FROM (SELECT * FROM (SELECT music.id FROM music WHERE music.user_id IN (5) LIMIT 10) subquery_for_limit) subquery_for_limit)", 7000 "v3-plan": { 7001 "QueryType": "SELECT", 7002 "Original": "SELECT music.id FROM music WHERE music.id IN (SELECT * FROM (SELECT * FROM (SELECT music.id FROM music WHERE music.user_id IN (5) LIMIT 10) subquery_for_limit) subquery_for_limit)", 7003 "Instructions": { 7004 "OperatorType": "Subquery", 7005 "Variant": "PulloutIn", 7006 "PulloutVars": [ 7007 "__sq_has_values1", 7008 "__sq1" 7009 ], 7010 "Inputs": [ 7011 { 7012 "OperatorType": "SimpleProjection", 7013 "Columns": [ 7014 0 7015 ], 7016 "Inputs": [ 7017 { 7018 "OperatorType": "SimpleProjection", 7019 "Columns": [ 7020 0 7021 ], 7022 "Inputs": [ 7023 { 7024 "OperatorType": "Limit", 7025 "Count": "INT64(10)", 7026 "Inputs": [ 7027 { 7028 "OperatorType": "Route", 7029 "Variant": "IN", 7030 "Keyspace": { 7031 "Name": "user", 7032 "Sharded": true 7033 }, 7034 "FieldQuery": "select music.id from music where 1 != 1", 7035 "Query": "select music.id from music where music.user_id in ::__vals limit :__upper_limit", 7036 "Table": "music", 7037 "Values": [ 7038 "(INT64(5))" 7039 ], 7040 "Vindex": "user_index" 7041 } 7042 ] 7043 } 7044 ] 7045 } 7046 ] 7047 }, 7048 { 7049 "OperatorType": "Route", 7050 "Variant": "IN", 7051 "Keyspace": { 7052 "Name": "user", 7053 "Sharded": true 7054 }, 7055 "FieldQuery": "select music.id from music where 1 != 1", 7056 "Query": "select music.id from music where :__sq_has_values1 = 1 and music.id in ::__vals", 7057 "Table": "music", 7058 "Values": [ 7059 ":__sq1" 7060 ], 7061 "Vindex": "music_user_map" 7062 } 7063 ] 7064 } 7065 }, 7066 "gen4-plan": { 7067 "QueryType": "SELECT", 7068 "Original": "SELECT music.id FROM music WHERE music.id IN (SELECT * FROM (SELECT * FROM (SELECT music.id FROM music WHERE music.user_id IN (5) LIMIT 10) subquery_for_limit) subquery_for_limit)", 7069 "Instructions": { 7070 "OperatorType": "Route", 7071 "Variant": "EqualUnique", 7072 "Keyspace": { 7073 "Name": "user", 7074 "Sharded": true 7075 }, 7076 "FieldQuery": "select music.id from music where 1 != 1", 7077 "Query": "select music.id from music where music.id in (select subquery_for_limit.id from (select subquery_for_limit.id from (select music.id from music where music.user_id in (5) limit 10) as subquery_for_limit) as subquery_for_limit)", 7078 "Table": "music", 7079 "Values": [ 7080 "INT64(5)" 7081 ], 7082 "Vindex": "user_index" 7083 }, 7084 "TablesUsed": [ 7085 "user.music" 7086 ] 7087 } 7088 }, 7089 { 7090 "comment": "Unmergeable subquery with multiple levels of derived statements, using a multi value `IN` predicate", 7091 "query": "SELECT music.id FROM music WHERE music.id IN (SELECT * FROM (SELECT * FROM (SELECT music.id FROM music WHERE music.user_id IN (5, 6) LIMIT 10) subquery_for_limit) subquery_for_limit)", 7092 "v3-plan": { 7093 "QueryType": "SELECT", 7094 "Original": "SELECT music.id FROM music WHERE music.id IN (SELECT * FROM (SELECT * FROM (SELECT music.id FROM music WHERE music.user_id IN (5, 6) LIMIT 10) subquery_for_limit) subquery_for_limit)", 7095 "Instructions": { 7096 "OperatorType": "Subquery", 7097 "Variant": "PulloutIn", 7098 "PulloutVars": [ 7099 "__sq_has_values1", 7100 "__sq1" 7101 ], 7102 "Inputs": [ 7103 { 7104 "OperatorType": "SimpleProjection", 7105 "Columns": [ 7106 0 7107 ], 7108 "Inputs": [ 7109 { 7110 "OperatorType": "SimpleProjection", 7111 "Columns": [ 7112 0 7113 ], 7114 "Inputs": [ 7115 { 7116 "OperatorType": "Limit", 7117 "Count": "INT64(10)", 7118 "Inputs": [ 7119 { 7120 "OperatorType": "Route", 7121 "Variant": "IN", 7122 "Keyspace": { 7123 "Name": "user", 7124 "Sharded": true 7125 }, 7126 "FieldQuery": "select music.id from music where 1 != 1", 7127 "Query": "select music.id from music where music.user_id in ::__vals limit :__upper_limit", 7128 "Table": "music", 7129 "Values": [ 7130 "(INT64(5), INT64(6))" 7131 ], 7132 "Vindex": "user_index" 7133 } 7134 ] 7135 } 7136 ] 7137 } 7138 ] 7139 }, 7140 { 7141 "OperatorType": "Route", 7142 "Variant": "IN", 7143 "Keyspace": { 7144 "Name": "user", 7145 "Sharded": true 7146 }, 7147 "FieldQuery": "select music.id from music where 1 != 1", 7148 "Query": "select music.id from music where :__sq_has_values1 = 1 and music.id in ::__vals", 7149 "Table": "music", 7150 "Values": [ 7151 ":__sq1" 7152 ], 7153 "Vindex": "music_user_map" 7154 } 7155 ] 7156 } 7157 }, 7158 "gen4-plan": { 7159 "QueryType": "SELECT", 7160 "Original": "SELECT music.id FROM music WHERE music.id IN (SELECT * FROM (SELECT * FROM (SELECT music.id FROM music WHERE music.user_id IN (5, 6) LIMIT 10) subquery_for_limit) subquery_for_limit)", 7161 "Instructions": { 7162 "OperatorType": "Subquery", 7163 "Variant": "PulloutIn", 7164 "PulloutVars": [ 7165 "__sq_has_values1", 7166 "__sq1" 7167 ], 7168 "Inputs": [ 7169 { 7170 "OperatorType": "SimpleProjection", 7171 "Columns": [ 7172 0 7173 ], 7174 "Inputs": [ 7175 { 7176 "OperatorType": "Limit", 7177 "Count": "INT64(10)", 7178 "Inputs": [ 7179 { 7180 "OperatorType": "Route", 7181 "Variant": "IN", 7182 "Keyspace": { 7183 "Name": "user", 7184 "Sharded": true 7185 }, 7186 "FieldQuery": "select music.id from music where 1 != 1", 7187 "Query": "select music.id from music where music.user_id in ::__vals limit :__upper_limit", 7188 "Table": "music", 7189 "Values": [ 7190 "(INT64(5), INT64(6))" 7191 ], 7192 "Vindex": "user_index" 7193 } 7194 ] 7195 } 7196 ] 7197 }, 7198 { 7199 "OperatorType": "Route", 7200 "Variant": "IN", 7201 "Keyspace": { 7202 "Name": "user", 7203 "Sharded": true 7204 }, 7205 "FieldQuery": "select music.id from music where 1 != 1", 7206 "Query": "select music.id from music where :__sq_has_values1 = 1 and music.id in ::__vals", 7207 "Table": "music", 7208 "Values": [ 7209 ":__sq1" 7210 ], 7211 "Vindex": "music_user_map" 7212 } 7213 ] 7214 }, 7215 "TablesUsed": [ 7216 "user.music" 7217 ] 7218 } 7219 }, 7220 { 7221 "comment": "Unmergeable subquery with multiple levels of derived statements", 7222 "query": "SELECT music.id FROM music WHERE music.id IN (SELECT * FROM (SELECT * FROM (SELECT music.id FROM music LIMIT 10) subquery_for_limit) subquery_for_limit)", 7223 "v3-plan": { 7224 "QueryType": "SELECT", 7225 "Original": "SELECT music.id FROM music WHERE music.id IN (SELECT * FROM (SELECT * FROM (SELECT music.id FROM music LIMIT 10) subquery_for_limit) subquery_for_limit)", 7226 "Instructions": { 7227 "OperatorType": "Subquery", 7228 "Variant": "PulloutIn", 7229 "PulloutVars": [ 7230 "__sq_has_values1", 7231 "__sq1" 7232 ], 7233 "Inputs": [ 7234 { 7235 "OperatorType": "SimpleProjection", 7236 "Columns": [ 7237 0 7238 ], 7239 "Inputs": [ 7240 { 7241 "OperatorType": "SimpleProjection", 7242 "Columns": [ 7243 0 7244 ], 7245 "Inputs": [ 7246 { 7247 "OperatorType": "Limit", 7248 "Count": "INT64(10)", 7249 "Inputs": [ 7250 { 7251 "OperatorType": "Route", 7252 "Variant": "Scatter", 7253 "Keyspace": { 7254 "Name": "user", 7255 "Sharded": true 7256 }, 7257 "FieldQuery": "select music.id from music where 1 != 1", 7258 "Query": "select music.id from music limit :__upper_limit", 7259 "Table": "music" 7260 } 7261 ] 7262 } 7263 ] 7264 } 7265 ] 7266 }, 7267 { 7268 "OperatorType": "Route", 7269 "Variant": "IN", 7270 "Keyspace": { 7271 "Name": "user", 7272 "Sharded": true 7273 }, 7274 "FieldQuery": "select music.id from music where 1 != 1", 7275 "Query": "select music.id from music where :__sq_has_values1 = 1 and music.id in ::__vals", 7276 "Table": "music", 7277 "Values": [ 7278 ":__sq1" 7279 ], 7280 "Vindex": "music_user_map" 7281 } 7282 ] 7283 } 7284 }, 7285 "gen4-plan": { 7286 "QueryType": "SELECT", 7287 "Original": "SELECT music.id FROM music WHERE music.id IN (SELECT * FROM (SELECT * FROM (SELECT music.id FROM music LIMIT 10) subquery_for_limit) subquery_for_limit)", 7288 "Instructions": { 7289 "OperatorType": "Subquery", 7290 "Variant": "PulloutIn", 7291 "PulloutVars": [ 7292 "__sq_has_values1", 7293 "__sq1" 7294 ], 7295 "Inputs": [ 7296 { 7297 "OperatorType": "SimpleProjection", 7298 "Columns": [ 7299 0 7300 ], 7301 "Inputs": [ 7302 { 7303 "OperatorType": "Limit", 7304 "Count": "INT64(10)", 7305 "Inputs": [ 7306 { 7307 "OperatorType": "Route", 7308 "Variant": "Scatter", 7309 "Keyspace": { 7310 "Name": "user", 7311 "Sharded": true 7312 }, 7313 "FieldQuery": "select music.id from music where 1 != 1", 7314 "Query": "select music.id from music limit :__upper_limit", 7315 "Table": "music" 7316 } 7317 ] 7318 } 7319 ] 7320 }, 7321 { 7322 "OperatorType": "Route", 7323 "Variant": "IN", 7324 "Keyspace": { 7325 "Name": "user", 7326 "Sharded": true 7327 }, 7328 "FieldQuery": "select music.id from music where 1 != 1", 7329 "Query": "select music.id from music where :__sq_has_values1 = 1 and music.id in ::__vals", 7330 "Table": "music", 7331 "Values": [ 7332 ":__sq1" 7333 ], 7334 "Vindex": "music_user_map" 7335 } 7336 ] 7337 }, 7338 "TablesUsed": [ 7339 "user.music" 7340 ] 7341 } 7342 }, 7343 { 7344 "comment": "`None` subquery as top level predicate - outer query changes from `Scatter` to `None` on merge", 7345 "query": "SELECT music.id FROM music WHERE music.id IN (SELECT music.id FROM music WHERE music.user_id IN (NULL))", 7346 "v3-plan": { 7347 "QueryType": "SELECT", 7348 "Original": "SELECT music.id FROM music WHERE music.id IN (SELECT music.id FROM music WHERE music.user_id IN (NULL))", 7349 "Instructions": { 7350 "OperatorType": "Subquery", 7351 "Variant": "PulloutIn", 7352 "PulloutVars": [ 7353 "__sq_has_values1", 7354 "__sq1" 7355 ], 7356 "Inputs": [ 7357 { 7358 "OperatorType": "Route", 7359 "Variant": "None", 7360 "Keyspace": { 7361 "Name": "user", 7362 "Sharded": true 7363 }, 7364 "FieldQuery": "select music.id from music where 1 != 1", 7365 "Query": "select music.id from music where music.user_id in (null)", 7366 "Table": "music" 7367 }, 7368 { 7369 "OperatorType": "Route", 7370 "Variant": "IN", 7371 "Keyspace": { 7372 "Name": "user", 7373 "Sharded": true 7374 }, 7375 "FieldQuery": "select music.id from music where 1 != 1", 7376 "Query": "select music.id from music where :__sq_has_values1 = 1 and music.id in ::__vals", 7377 "Table": "music", 7378 "Values": [ 7379 ":__sq1" 7380 ], 7381 "Vindex": "music_user_map" 7382 } 7383 ] 7384 } 7385 }, 7386 "gen4-plan": { 7387 "QueryType": "SELECT", 7388 "Original": "SELECT music.id FROM music WHERE music.id IN (SELECT music.id FROM music WHERE music.user_id IN (NULL))", 7389 "Instructions": { 7390 "OperatorType": "Route", 7391 "Variant": "None", 7392 "Keyspace": { 7393 "Name": "user", 7394 "Sharded": true 7395 }, 7396 "FieldQuery": "select music.id from music where 1 != 1", 7397 "Query": "select music.id from music where music.id in (select music.id from music where music.user_id in (null))", 7398 "Table": "music" 7399 }, 7400 "TablesUsed": [ 7401 "user.music" 7402 ] 7403 } 7404 }, 7405 { 7406 "comment": "`None` subquery as top level predicate - outer query changes from `EqualUnique` to `None` on merge", 7407 "query": "SELECT music.id FROM music WHERE music.id IN (SELECT music.id FROM music WHERE music.user_id IN (NULL)) AND music.user_id = 5", 7408 "v3-plan": { 7409 "QueryType": "SELECT", 7410 "Original": "SELECT music.id FROM music WHERE music.id IN (SELECT music.id FROM music WHERE music.user_id IN (NULL)) AND music.user_id = 5", 7411 "Instructions": { 7412 "OperatorType": "Subquery", 7413 "Variant": "PulloutIn", 7414 "PulloutVars": [ 7415 "__sq_has_values1", 7416 "__sq1" 7417 ], 7418 "Inputs": [ 7419 { 7420 "OperatorType": "Route", 7421 "Variant": "None", 7422 "Keyspace": { 7423 "Name": "user", 7424 "Sharded": true 7425 }, 7426 "FieldQuery": "select music.id from music where 1 != 1", 7427 "Query": "select music.id from music where music.user_id in (null)", 7428 "Table": "music" 7429 }, 7430 { 7431 "OperatorType": "Route", 7432 "Variant": "EqualUnique", 7433 "Keyspace": { 7434 "Name": "user", 7435 "Sharded": true 7436 }, 7437 "FieldQuery": "select music.id from music where 1 != 1", 7438 "Query": "select music.id from music where music.user_id = 5 and :__sq_has_values1 = 1 and music.id in ::__sq1", 7439 "Table": "music", 7440 "Values": [ 7441 "INT64(5)" 7442 ], 7443 "Vindex": "user_index" 7444 } 7445 ] 7446 } 7447 }, 7448 "gen4-plan": { 7449 "QueryType": "SELECT", 7450 "Original": "SELECT music.id FROM music WHERE music.id IN (SELECT music.id FROM music WHERE music.user_id IN (NULL)) AND music.user_id = 5", 7451 "Instructions": { 7452 "OperatorType": "Route", 7453 "Variant": "None", 7454 "Keyspace": { 7455 "Name": "user", 7456 "Sharded": true 7457 }, 7458 "FieldQuery": "select music.id from music where 1 != 1", 7459 "Query": "select music.id from music where music.id in (select music.id from music where music.user_id in (null)) and music.user_id = 5", 7460 "Table": "music" 7461 }, 7462 "TablesUsed": [ 7463 "user.music" 7464 ] 7465 } 7466 }, 7467 { 7468 "comment": "`None` subquery nested inside `OR` expression - outer query keeps routing information", 7469 "query": "SELECT music.id FROM music WHERE (music.id IN (SELECT music.id FROM music WHERE music.user_id IN (NULL)) OR music.user_id = 5)", 7470 "v3-plan": { 7471 "QueryType": "SELECT", 7472 "Original": "SELECT music.id FROM music WHERE (music.id IN (SELECT music.id FROM music WHERE music.user_id IN (NULL)) OR music.user_id = 5)", 7473 "Instructions": { 7474 "OperatorType": "Subquery", 7475 "Variant": "PulloutIn", 7476 "PulloutVars": [ 7477 "__sq_has_values1", 7478 "__sq1" 7479 ], 7480 "Inputs": [ 7481 { 7482 "OperatorType": "Route", 7483 "Variant": "None", 7484 "Keyspace": { 7485 "Name": "user", 7486 "Sharded": true 7487 }, 7488 "FieldQuery": "select music.id from music where 1 != 1", 7489 "Query": "select music.id from music where music.user_id in (null)", 7490 "Table": "music" 7491 }, 7492 { 7493 "OperatorType": "Route", 7494 "Variant": "Scatter", 7495 "Keyspace": { 7496 "Name": "user", 7497 "Sharded": true 7498 }, 7499 "FieldQuery": "select music.id from music where 1 != 1", 7500 "Query": "select music.id from music where :__sq_has_values1 = 1 and music.id in ::__sq1 or music.user_id = 5", 7501 "Table": "music" 7502 } 7503 ] 7504 } 7505 }, 7506 "gen4-plan": { 7507 "QueryType": "SELECT", 7508 "Original": "SELECT music.id FROM music WHERE (music.id IN (SELECT music.id FROM music WHERE music.user_id IN (NULL)) OR music.user_id = 5)", 7509 "Instructions": { 7510 "OperatorType": "Route", 7511 "Variant": "Scatter", 7512 "Keyspace": { 7513 "Name": "user", 7514 "Sharded": true 7515 }, 7516 "FieldQuery": "select music.id from music where 1 != 1", 7517 "Query": "select music.id from music where music.id in (select music.id from music where music.user_id in (null)) or music.user_id = 5", 7518 "Table": "music" 7519 }, 7520 "TablesUsed": [ 7521 "user.music" 7522 ] 7523 } 7524 }, 7525 { 7526 "comment": "Joining with a subquery that uses an aggregate column and an `EqualUnique` route can be merged together", 7527 "query": "SELECT music.id FROM music INNER JOIN (SELECT MAX(id) as maxt FROM music WHERE music.user_id = 5) other ON other.maxt = music.id", 7528 "v3-plan": { 7529 "QueryType": "SELECT", 7530 "Original": "SELECT music.id FROM music INNER JOIN (SELECT MAX(id) as maxt FROM music WHERE music.user_id = 5) other ON other.maxt = music.id", 7531 "Instructions": { 7532 "OperatorType": "Join", 7533 "Variant": "Join", 7534 "JoinColumnIndexes": "L:0", 7535 "JoinVars": { 7536 "music_id": 0 7537 }, 7538 "TableName": "music_music", 7539 "Inputs": [ 7540 { 7541 "OperatorType": "Route", 7542 "Variant": "Scatter", 7543 "Keyspace": { 7544 "Name": "user", 7545 "Sharded": true 7546 }, 7547 "FieldQuery": "select music.id from music where 1 != 1", 7548 "Query": "select music.id from music", 7549 "Table": "music" 7550 }, 7551 { 7552 "OperatorType": "Route", 7553 "Variant": "EqualUnique", 7554 "Keyspace": { 7555 "Name": "user", 7556 "Sharded": true 7557 }, 7558 "FieldQuery": "select 1 from (select max(id) as maxt from music where 1 != 1) as other where 1 != 1", 7559 "Query": "select 1 from (select max(id) as maxt from music where music.user_id = 5) as other where other.maxt = :music_id", 7560 "Table": "music", 7561 "Values": [ 7562 "INT64(5)" 7563 ], 7564 "Vindex": "user_index" 7565 } 7566 ] 7567 } 7568 }, 7569 "gen4-plan": { 7570 "QueryType": "SELECT", 7571 "Original": "SELECT music.id FROM music INNER JOIN (SELECT MAX(id) as maxt FROM music WHERE music.user_id = 5) other ON other.maxt = music.id", 7572 "Instructions": { 7573 "OperatorType": "Route", 7574 "Variant": "EqualUnique", 7575 "Keyspace": { 7576 "Name": "user", 7577 "Sharded": true 7578 }, 7579 "FieldQuery": "select music.id from music, (select max(id) as maxt from music where 1 != 1) as other where 1 != 1", 7580 "Query": "select music.id from music, (select max(id) as maxt from music where music.user_id = 5) as other where other.maxt = music.id", 7581 "Table": "music", 7582 "Values": [ 7583 "INT64(5)" 7584 ], 7585 "Vindex": "user_index" 7586 }, 7587 "TablesUsed": [ 7588 "user.music" 7589 ] 7590 } 7591 }, 7592 { 7593 "comment": "Joining with a subquery that uses an `EqualUnique` route can be merged", 7594 "query": "SELECT music.id FROM music INNER JOIN (SELECT id FROM music WHERE music.user_id = 5) other ON other.id = music.id", 7595 "v3-plan": { 7596 "QueryType": "SELECT", 7597 "Original": "SELECT music.id FROM music INNER JOIN (SELECT id FROM music WHERE music.user_id = 5) other ON other.id = music.id", 7598 "Instructions": { 7599 "OperatorType": "Route", 7600 "Variant": "Scatter", 7601 "Keyspace": { 7602 "Name": "user", 7603 "Sharded": true 7604 }, 7605 "FieldQuery": "select music.id from music join (select id from music where 1 != 1) as other on other.id = music.id where 1 != 1", 7606 "Query": "select music.id from music join (select id from music where music.user_id = 5) as other on other.id = music.id", 7607 "Table": "music" 7608 } 7609 }, 7610 "gen4-plan": { 7611 "QueryType": "SELECT", 7612 "Original": "SELECT music.id FROM music INNER JOIN (SELECT id FROM music WHERE music.user_id = 5) other ON other.id = music.id", 7613 "Instructions": { 7614 "OperatorType": "Route", 7615 "Variant": "EqualUnique", 7616 "Keyspace": { 7617 "Name": "user", 7618 "Sharded": true 7619 }, 7620 "FieldQuery": "select music.id from music, (select id from music where 1 != 1) as other where 1 != 1", 7621 "Query": "select music.id from music, (select id from music where music.user_id = 5) as other where other.id = music.id", 7622 "Table": "music", 7623 "Values": [ 7624 "INT64(5)" 7625 ], 7626 "Vindex": "user_index" 7627 }, 7628 "TablesUsed": [ 7629 "user.music" 7630 ] 7631 } 7632 }, 7633 { 7634 "comment": "Joining with a subquery that has an `IN` route can be merged", 7635 "query": "SELECT music.id FROM music INNER JOIN (SELECT id FROM music WHERE music.user_id IN (5, 6, 7)) other ON other.id = music.id", 7636 "v3-plan": { 7637 "QueryType": "SELECT", 7638 "Original": "SELECT music.id FROM music INNER JOIN (SELECT id FROM music WHERE music.user_id IN (5, 6, 7)) other ON other.id = music.id", 7639 "Instructions": { 7640 "OperatorType": "Route", 7641 "Variant": "Scatter", 7642 "Keyspace": { 7643 "Name": "user", 7644 "Sharded": true 7645 }, 7646 "FieldQuery": "select music.id from music join (select id from music where 1 != 1) as other on other.id = music.id where 1 != 1", 7647 "Query": "select music.id from music join (select id from music where music.user_id in (5, 6, 7)) as other on other.id = music.id", 7648 "Table": "music" 7649 } 7650 }, 7651 "gen4-plan": { 7652 "QueryType": "SELECT", 7653 "Original": "SELECT music.id FROM music INNER JOIN (SELECT id FROM music WHERE music.user_id IN (5, 6, 7)) other ON other.id = music.id", 7654 "Instructions": { 7655 "OperatorType": "Route", 7656 "Variant": "IN", 7657 "Keyspace": { 7658 "Name": "user", 7659 "Sharded": true 7660 }, 7661 "FieldQuery": "select music.id from music, (select id from music where 1 != 1) as other where 1 != 1", 7662 "Query": "select music.id from music, (select id from music where music.user_id in ::__vals) as other where other.id = music.id", 7663 "Table": "music", 7664 "Values": [ 7665 "(INT64(5), INT64(6), INT64(7))" 7666 ], 7667 "Vindex": "user_index" 7668 }, 7669 "TablesUsed": [ 7670 "user.music" 7671 ] 7672 } 7673 }, 7674 { 7675 "comment": "limit on the vtgate has to be executed on the LHS of a join", 7676 "query": "select id from user join (select user_id from user_extra limit 10) ue on user.id = ue.user_id", 7677 "v3-plan": "VT12001: unsupported: filtering on results of cross-shard subquery", 7678 "gen4-plan": { 7679 "QueryType": "SELECT", 7680 "Original": "select id from user join (select user_id from user_extra limit 10) ue on user.id = ue.user_id", 7681 "Instructions": { 7682 "OperatorType": "Join", 7683 "Variant": "Join", 7684 "JoinColumnIndexes": "R:0", 7685 "JoinVars": { 7686 "ue_user_id": 0 7687 }, 7688 "TableName": "user_extra_`user`", 7689 "Inputs": [ 7690 { 7691 "OperatorType": "SimpleProjection", 7692 "Columns": [ 7693 0 7694 ], 7695 "Inputs": [ 7696 { 7697 "OperatorType": "Limit", 7698 "Count": "INT64(10)", 7699 "Inputs": [ 7700 { 7701 "OperatorType": "Route", 7702 "Variant": "Scatter", 7703 "Keyspace": { 7704 "Name": "user", 7705 "Sharded": true 7706 }, 7707 "FieldQuery": "select user_id from user_extra where 1 != 1", 7708 "Query": "select user_id from user_extra limit :__upper_limit", 7709 "Table": "user_extra" 7710 } 7711 ] 7712 } 7713 ] 7714 }, 7715 { 7716 "OperatorType": "Route", 7717 "Variant": "EqualUnique", 7718 "Keyspace": { 7719 "Name": "user", 7720 "Sharded": true 7721 }, 7722 "FieldQuery": "select id from `user` where 1 != 1", 7723 "Query": "select id from `user` where `user`.id = :ue_user_id", 7724 "Table": "`user`", 7725 "Values": [ 7726 ":ue_user_id" 7727 ], 7728 "Vindex": "user_index" 7729 } 7730 ] 7731 }, 7732 "TablesUsed": [ 7733 "user.user", 7734 "user.user_extra" 7735 ] 7736 } 7737 }, 7738 { 7739 "comment": "select user.a, t.b from user join (select id, count(*) b, req from user_extra group by req, id) as t on user.id = t.id", 7740 "query": "select user.a, t.b from user join (select id, count(*) b, req from user_extra group by req, id) as t on user.id = t.id", 7741 "v3-plan": "VT12001: unsupported: filtering on results of cross-shard subquery", 7742 "gen4-plan": { 7743 "QueryType": "SELECT", 7744 "Original": "select user.a, t.b from user join (select id, count(*) b, req from user_extra group by req, id) as t on user.id = t.id", 7745 "Instructions": { 7746 "OperatorType": "Join", 7747 "Variant": "Join", 7748 "JoinColumnIndexes": "R:0,L:1", 7749 "JoinVars": { 7750 "t_id": 0 7751 }, 7752 "TableName": "user_extra_`user`", 7753 "Inputs": [ 7754 { 7755 "OperatorType": "SimpleProjection", 7756 "Columns": [ 7757 0, 7758 1 7759 ], 7760 "Inputs": [ 7761 { 7762 "OperatorType": "Aggregate", 7763 "Variant": "Ordered", 7764 "Aggregates": "sum_count_star(1) AS b", 7765 "GroupBy": "(0|3), (2|4)", 7766 "Inputs": [ 7767 { 7768 "OperatorType": "Route", 7769 "Variant": "Scatter", 7770 "Keyspace": { 7771 "Name": "user", 7772 "Sharded": true 7773 }, 7774 "FieldQuery": "select id, count(*) as b, req, weight_string(id), weight_string(req) from user_extra where 1 != 1 group by id, weight_string(id), req, weight_string(req)", 7775 "OrderBy": "(0|3) ASC, (2|4) ASC", 7776 "Query": "select id, count(*) as b, req, weight_string(id), weight_string(req) from user_extra group by id, weight_string(id), req, weight_string(req) order by id asc, req asc", 7777 "Table": "user_extra" 7778 } 7779 ] 7780 } 7781 ] 7782 }, 7783 { 7784 "OperatorType": "Route", 7785 "Variant": "EqualUnique", 7786 "Keyspace": { 7787 "Name": "user", 7788 "Sharded": true 7789 }, 7790 "FieldQuery": "select `user`.a from `user` where 1 != 1", 7791 "Query": "select `user`.a from `user` where `user`.id = :t_id", 7792 "Table": "`user`", 7793 "Values": [ 7794 ":t_id" 7795 ], 7796 "Vindex": "user_index" 7797 } 7798 ] 7799 }, 7800 "TablesUsed": [ 7801 "user.user", 7802 "user.user_extra" 7803 ] 7804 } 7805 }, 7806 { 7807 "comment": "cant switch sides for outer joins", 7808 "query": "select id from user left join (select user_id from user_extra limit 10) ue on user.id = ue.user_id", 7809 "plan": "VT12001: unsupported: LEFT JOIN with derived tables" 7810 }, 7811 { 7812 "comment": "limit on both sides means that we can't evaluate this at all", 7813 "query": "select id from (select id from user limit 10) u join (select user_id from user_extra limit 10) ue on u.id = ue.user_id", 7814 "v3-plan": "VT12001: unsupported: filtering on results of cross-shard subquery", 7815 "gen4-plan": "VT12001: unsupported: JOIN between derived tables" 7816 }, 7817 { 7818 "comment": "SELECT music.id FROM (SELECT MAX(id) as maxt FROM music WHERE music.user_id = 5) other JOIN music ON other.maxt = music.id", 7819 "query": "SELECT music.id FROM (SELECT MAX(id) as maxt FROM music WHERE music.user_id = 5) other JOIN music ON other.maxt = music.id", 7820 "v3-plan": { 7821 "QueryType": "SELECT", 7822 "Original": "SELECT music.id FROM (SELECT MAX(id) as maxt FROM music WHERE music.user_id = 5) other JOIN music ON other.maxt = music.id", 7823 "Instructions": { 7824 "OperatorType": "Join", 7825 "Variant": "Join", 7826 "JoinColumnIndexes": "R:0", 7827 "JoinVars": { 7828 "other_maxt": 0 7829 }, 7830 "TableName": "music_music", 7831 "Inputs": [ 7832 { 7833 "OperatorType": "Route", 7834 "Variant": "EqualUnique", 7835 "Keyspace": { 7836 "Name": "user", 7837 "Sharded": true 7838 }, 7839 "FieldQuery": "select other.maxt from (select max(id) as maxt from music where 1 != 1) as other where 1 != 1", 7840 "Query": "select other.maxt from (select max(id) as maxt from music where music.user_id = 5) as other", 7841 "Table": "music", 7842 "Values": [ 7843 "INT64(5)" 7844 ], 7845 "Vindex": "user_index" 7846 }, 7847 { 7848 "OperatorType": "Route", 7849 "Variant": "EqualUnique", 7850 "Keyspace": { 7851 "Name": "user", 7852 "Sharded": true 7853 }, 7854 "FieldQuery": "select music.id from music where 1 != 1", 7855 "Query": "select music.id from music where music.id = :other_maxt", 7856 "Table": "music", 7857 "Values": [ 7858 ":other_maxt" 7859 ], 7860 "Vindex": "music_user_map" 7861 } 7862 ] 7863 } 7864 }, 7865 "gen4-plan": { 7866 "QueryType": "SELECT", 7867 "Original": "SELECT music.id FROM (SELECT MAX(id) as maxt FROM music WHERE music.user_id = 5) other JOIN music ON other.maxt = music.id", 7868 "Instructions": { 7869 "OperatorType": "Route", 7870 "Variant": "EqualUnique", 7871 "Keyspace": { 7872 "Name": "user", 7873 "Sharded": true 7874 }, 7875 "FieldQuery": "select music.id from (select max(id) as maxt from music where 1 != 1) as other, music where 1 != 1", 7876 "Query": "select music.id from (select max(id) as maxt from music where music.user_id = 5) as other, music where other.maxt = music.id", 7877 "Table": "music", 7878 "Values": [ 7879 "INT64(5)" 7880 ], 7881 "Vindex": "user_index" 7882 }, 7883 "TablesUsed": [ 7884 "user.music" 7885 ] 7886 } 7887 }, 7888 { 7889 "comment": "Earlier columns are in scope in subqueries https://github.com/vitessio/vitess/issues/11246", 7890 "query": "SELECT 1 as x, (SELECT x)", 7891 "v3-plan": { 7892 "QueryType": "SELECT", 7893 "Original": "SELECT 1 as x, (SELECT x)", 7894 "Instructions": { 7895 "OperatorType": "Route", 7896 "Variant": "Reference", 7897 "Keyspace": { 7898 "Name": "main", 7899 "Sharded": false 7900 }, 7901 "FieldQuery": "select 1 as x, (select x from dual where 1 != 1) from dual where 1 != 1", 7902 "Query": "select 1 as x, (select x from dual) from dual", 7903 "Table": "dual" 7904 } 7905 }, 7906 "gen4-plan": { 7907 "QueryType": "SELECT", 7908 "Original": "SELECT 1 as x, (SELECT x)", 7909 "Instructions": { 7910 "OperatorType": "Route", 7911 "Variant": "Reference", 7912 "Keyspace": { 7913 "Name": "main", 7914 "Sharded": false 7915 }, 7916 "FieldQuery": "select 1 as x, (select x from dual where 1 != 1) from dual where 1 != 1", 7917 "Query": "select 1 as x, (select x from dual) from dual", 7918 "Table": "dual" 7919 }, 7920 "TablesUsed": [ 7921 "main.dual" 7922 ] 7923 } 7924 }, 7925 { 7926 "comment": "(OR 1 = 0) doesn't cause unnecessary scatter", 7927 "query": "select * from user where id = 1 or 1 = 0", 7928 "v3-plan": { 7929 "QueryType": "SELECT", 7930 "Original": "select * from user where id = 1 or 1 = 0", 7931 "Instructions": { 7932 "OperatorType": "Route", 7933 "Variant": "Scatter", 7934 "Keyspace": { 7935 "Name": "user", 7936 "Sharded": true 7937 }, 7938 "FieldQuery": "select * from `user` where 1 != 1", 7939 "Query": "select * from `user` where id = 1 or 1 = 0", 7940 "Table": "`user`" 7941 } 7942 }, 7943 "gen4-plan": { 7944 "QueryType": "SELECT", 7945 "Original": "select * from user where id = 1 or 1 = 0", 7946 "Instructions": { 7947 "OperatorType": "Route", 7948 "Variant": "EqualUnique", 7949 "Keyspace": { 7950 "Name": "user", 7951 "Sharded": true 7952 }, 7953 "FieldQuery": "select * from `user` where 1 != 1", 7954 "Query": "select * from `user` where id = 1", 7955 "Table": "`user`", 7956 "Values": [ 7957 "INT64(1)" 7958 ], 7959 "Vindex": "user_index" 7960 }, 7961 "TablesUsed": [ 7962 "user.user" 7963 ] 7964 } 7965 }, 7966 { 7967 "comment": "(OR 2 < 1) doesn't cause unnecessary scatter", 7968 "query": "select * from user where id = 1 or 2 < 1", 7969 "v3-plan": { 7970 "QueryType": "SELECT", 7971 "Original": "select * from user where id = 1 or 2 < 1", 7972 "Instructions": { 7973 "OperatorType": "Route", 7974 "Variant": "Scatter", 7975 "Keyspace": { 7976 "Name": "user", 7977 "Sharded": true 7978 }, 7979 "FieldQuery": "select * from `user` where 1 != 1", 7980 "Query": "select * from `user` where id = 1 or 2 < 1", 7981 "Table": "`user`" 7982 } 7983 }, 7984 "gen4-plan": { 7985 "QueryType": "SELECT", 7986 "Original": "select * from user where id = 1 or 2 < 1", 7987 "Instructions": { 7988 "OperatorType": "Route", 7989 "Variant": "EqualUnique", 7990 "Keyspace": { 7991 "Name": "user", 7992 "Sharded": true 7993 }, 7994 "FieldQuery": "select * from `user` where 1 != 1", 7995 "Query": "select * from `user` where id = 1", 7996 "Table": "`user`", 7997 "Values": [ 7998 "INT64(1)" 7999 ], 8000 "Vindex": "user_index" 8001 }, 8002 "TablesUsed": [ 8003 "user.user" 8004 ] 8005 } 8006 }, 8007 { 8008 "comment": "query with a derived table and dual table in unsharded keyspace", 8009 "query": "SELECT * FROM unsharded_a AS t1 JOIN (SELECT trim((SELECT MAX(name) FROM unsharded_a)) AS name) AS t2 WHERE t1.name >= t2.name ORDER BY t1.name ASC LIMIT 1;", 8010 "v3-plan": { 8011 "Instructions": { 8012 "FieldQuery": "select * from unsharded_a as t1 join (select trim((select max(`name`) from unsharded_a where 1 != 1)) as `name` from dual where 1 != 1) as t2 where 1 != 1", 8013 "Keyspace": { 8014 "Name": "main", 8015 "Sharded": false 8016 }, 8017 "OperatorType": "Route", 8018 "Query": "select * from unsharded_a as t1 join (select trim((select max(`name`) from unsharded_a)) as `name` from dual) as t2 where t1.`name` >= t2.`name` order by t1.`name` asc limit 1", 8019 "Table": "unsharded_a, dual", 8020 "Variant": "Unsharded" 8021 }, 8022 "Original": "SELECT * FROM unsharded_a AS t1 JOIN (SELECT trim((SELECT MAX(name) FROM unsharded_a)) AS name) AS t2 WHERE t1.name >= t2.name ORDER BY t1.name ASC LIMIT 1;", 8023 "QueryType": "SELECT" 8024 }, 8025 "gen4-plan": { 8026 "Instructions": { 8027 "FieldQuery": "select * from unsharded_a as t1 join (select trim((select max(`name`) from unsharded_a where 1 != 1)) as `name` from dual where 1 != 1) as t2 where 1 != 1", 8028 "Keyspace": { 8029 "Name": "main", 8030 "Sharded": false 8031 }, 8032 "OperatorType": "Route", 8033 "Query": "select * from unsharded_a as t1 join (select trim((select max(`name`) from unsharded_a)) as `name` from dual) as t2 where t1.`name` >= t2.`name` order by t1.`name` asc limit 1", 8034 "Table": "dual, unsharded_a", 8035 "Variant": "Unsharded" 8036 }, 8037 "Original": "SELECT * FROM unsharded_a AS t1 JOIN (SELECT trim((SELECT MAX(name) FROM unsharded_a)) AS name) AS t2 WHERE t1.name >= t2.name ORDER BY t1.name ASC LIMIT 1;", 8038 "QueryType": "SELECT", 8039 "TablesUsed": [ 8040 "main.dual", 8041 "main.unsharded_a" 8042 ] 8043 } 8044 }, 8045 { 8046 "comment": "subquery having join table on clause, using column reference of outer select table", 8047 "query": "select (select 1 from user u1 join user u2 on u1.id = u2.id and u1.id = u3.id) subquery from user u3 where u3.id = 1", 8048 "v3-plan": "VT03019: symbol u3.id not found", 8049 "gen4-plan": { 8050 "QueryType": "SELECT", 8051 "Original": "select (select 1 from user u1 join user u2 on u1.id = u2.id and u1.id = u3.id) subquery from user u3 where u3.id = 1", 8052 "Instructions": { 8053 "OperatorType": "Route", 8054 "Variant": "EqualUnique", 8055 "Keyspace": { 8056 "Name": "user", 8057 "Sharded": true 8058 }, 8059 "FieldQuery": "select (select 1 from `user` as u1 join `user` as u2 on u1.id = u2.id and u1.id = u3.id where 1 != 1) as subquery from `user` as u3 where 1 != 1", 8060 "Query": "select (select 1 from `user` as u1 join `user` as u2 on u1.id = u2.id and u1.id = u3.id) as subquery from `user` as u3 where u3.id = 1", 8061 "Table": "`user`", 8062 "Values": [ 8063 "INT64(1)" 8064 ], 8065 "Vindex": "user_index" 8066 }, 8067 "TablesUsed": [ 8068 "user.user" 8069 ] 8070 } 8071 }, 8072 { 8073 "comment": "allow last_insert_id with argument", 8074 "query": "select last_insert_id(id) from user", 8075 "v3-plan": { 8076 "QueryType": "SELECT", 8077 "Original": "select last_insert_id(id) from user", 8078 "Instructions": { 8079 "OperatorType": "Route", 8080 "Variant": "Scatter", 8081 "Keyspace": { 8082 "Name": "user", 8083 "Sharded": true 8084 }, 8085 "FieldQuery": "select last_insert_id(id) from `user` where 1 != 1", 8086 "Query": "select last_insert_id(id) from `user`", 8087 "Table": "`user`" 8088 } 8089 }, 8090 "gen4-plan": { 8091 "QueryType": "SELECT", 8092 "Original": "select last_insert_id(id) from user", 8093 "Instructions": { 8094 "OperatorType": "Route", 8095 "Variant": "Scatter", 8096 "Keyspace": { 8097 "Name": "user", 8098 "Sharded": true 8099 }, 8100 "FieldQuery": "select last_insert_id(id) from `user` where 1 != 1", 8101 "Query": "select last_insert_id(id) from `user`", 8102 "Table": "`user`" 8103 }, 8104 "TablesUsed": [ 8105 "user.user" 8106 ] 8107 } 8108 } 8109 ]