vitess.io/vitess@v0.16.2/go/vt/vttablet/endtoend/queries_test.go (about) 1 /* 2 Copyright 2019 The Vitess Authors. 3 4 Licensed under the Apache License, Version 2.0 (the "License"); 5 you may not use this file except in compliance with the License. 6 You may obtain a copy of the License at 7 8 http://www.apache.org/licenses/LICENSE-2.0 9 10 Unless required by applicable law or agreed to in writing, software 11 distributed under the License is distributed on an "AS IS" BASIS, 12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 See the License for the specific language governing permissions and 14 limitations under the License. 15 */ 16 17 package endtoend 18 19 import ( 20 "fmt" 21 "math/rand" 22 "testing" 23 24 "github.com/stretchr/testify/require" 25 26 "vitess.io/vitess/go/sqltypes" 27 "vitess.io/vitess/go/test/utils" 28 "vitess.io/vitess/go/vt/vttablet/endtoend/framework" 29 30 querypb "vitess.io/vitess/go/vt/proto/query" 31 ) 32 33 var frameworkErrors = `fail failed: 34 Result mismatch: 35 '[[1 1] [1 2]]' does not match 36 '[[2 1] [1 2]]' 37 RowsReturned mismatch: 2, want 1 38 Rewritten mismatch: 39 '["select /* fail */ eid, id from vitess_a union select eid, id from vitess_b limit 10001"]' does not match 40 '["select eid id from vitess_a where 1 != 1 union select eid, id from vitess_b where 1 != 1" "select /* fail */ eid, id from vitess_a union select eid, id from vitess_b"]' 41 Plan mismatch: Select, want aa` 42 43 func TestTheFramework(t *testing.T) { 44 client := framework.NewClient() 45 46 expectFail := framework.TestCase{ 47 Name: "fail", 48 Query: "select /* fail */ eid, id from vitess_a union select eid, id from vitess_b", 49 Result: [][]string{ 50 {"2", "1"}, 51 {"1", "2"}, 52 }, 53 RowsReturned: 1, 54 Rewritten: []string{ 55 "select eid id from vitess_a where 1 != 1 union select eid, id from vitess_b where 1 != 1", 56 "select /* fail */ eid, id from vitess_a union select eid, id from vitess_b", 57 }, 58 Plan: "aa", 59 Table: "bb", 60 } 61 err := expectFail.Test("", client) 62 require.Error(t, err) 63 utils.MustMatch(t, frameworkErrors, err.Error()) 64 } 65 66 var TestQueryCases = []framework.Testable{ 67 &framework.TestCase{ 68 Name: "union", 69 Query: "select /* union */ eid, id from vitess_a union select eid, id from vitess_b", 70 Result: [][]string{ 71 {"1", "1"}, 72 {"1", "2"}, 73 }, 74 Rewritten: []string{ 75 "select /* union */ eid, id from vitess_a union select eid, id from vitess_b limit 10001", 76 }, 77 RowsReturned: 2, 78 }, 79 &framework.TestCase{ 80 Name: "double union", 81 Query: "select /* double union */ eid, id from vitess_a union select eid, id from vitess_b union select eid, id from vitess_d", 82 Result: [][]string{ 83 {"1", "1"}, 84 {"1", "2"}, 85 }, 86 Rewritten: []string{ 87 "select /* double union */ eid, id from vitess_a union select eid, id from vitess_b union select eid, id from vitess_d limit 10001", 88 }, 89 RowsReturned: 2, 90 }, 91 &framework.TestCase{ 92 Name: "distinct", 93 Query: "select /* distinct */ distinct * from vitess_a", 94 Result: [][]string{ 95 {"1", "1", "abcd", "efgh"}, 96 {"1", "2", "bcde", "fghi"}, 97 }, 98 Rewritten: []string{ 99 "select /* distinct */ distinct * from vitess_a limit 10001", 100 }, 101 }, 102 &framework.TestCase{ 103 Name: "group by", 104 Query: "select /* group by */ eid, sum(id) from vitess_a group by eid", 105 Result: [][]string{ 106 {"1", "3"}, 107 }, 108 Rewritten: []string{ 109 "select /* group by */ eid, sum(id) from vitess_a group by eid limit 10001", 110 }, 111 RowsReturned: 1, 112 }, 113 &framework.TestCase{ 114 Name: "having", 115 Query: "select /* having */ sum(id) from vitess_a having sum(id) = 3", 116 Result: [][]string{ 117 {"3"}, 118 }, 119 Rewritten: []string{ 120 "select /* having */ sum(id) from vitess_a having sum(id) = 3 limit 10001", 121 }, 122 RowsReturned: 1, 123 }, 124 &framework.TestCase{ 125 Name: "limit", 126 Query: "select /* limit */ eid, id from vitess_a limit :a", 127 BindVars: map[string]*querypb.BindVariable{ 128 "a": sqltypes.Int64BindVariable(1), 129 }, 130 Result: [][]string{ 131 {"1", "1"}, 132 }, 133 Rewritten: []string{ 134 "select /* limit */ eid, id from vitess_a limit 1", 135 }, 136 RowsReturned: 1, 137 }, 138 &framework.TestCase{ 139 Name: "multi-table", 140 Query: "select /* multi-table */ a.eid, a.id, b.eid, b.id from vitess_a as a, vitess_b as b order by a.eid, a.id, b.eid, b.id", 141 Result: [][]string{ 142 {"1", "1", "1", "1"}, 143 {"1", "1", "1", "2"}, 144 {"1", "2", "1", "1"}, 145 {"1", "2", "1", "2"}, 146 }, 147 Rewritten: []string{ 148 "select /* multi-table */ a.eid, a.id, b.eid, b.id from vitess_a as a, vitess_b as b order by a.eid asc, a.id asc, b.eid asc, b.id asc limit 10001", 149 }, 150 RowsReturned: 4, 151 }, 152 &framework.TestCase{ 153 Name: "join", 154 Query: "select /* join */ a.eid, a.id, b.eid, b.id from vitess_a as a join vitess_b as b on a.eid = b.eid and a.id = b.id", 155 Result: [][]string{ 156 {"1", "1", "1", "1"}, 157 {"1", "2", "1", "2"}, 158 }, 159 Rewritten: []string{ 160 "select /* join */ a.eid, a.id, b.eid, b.id from vitess_a as a join vitess_b as b on a.eid = b.eid and a.id = b.id limit 10001", 161 }, 162 RowsReturned: 2, 163 }, 164 &framework.TestCase{ 165 Name: "straight_join", 166 Query: "select /* straight_join */ a.eid, a.id, b.eid, b.id from vitess_a as a straight_join vitess_b as b on a.eid = b.eid and a.id = b.id", 167 Result: [][]string{ 168 {"1", "1", "1", "1"}, 169 {"1", "2", "1", "2"}, 170 }, 171 Rewritten: []string{ 172 "select /* straight_join */ a.eid, a.id, b.eid, b.id from vitess_a as a straight_join vitess_b as b on a.eid = b.eid and a.id = b.id limit 10001", 173 }, 174 RowsReturned: 2, 175 }, 176 &framework.TestCase{ 177 Name: "cross join", 178 Query: "select /* cross join */ a.eid, a.id, b.eid, b.id from vitess_a as a cross join vitess_b as b on a.eid = b.eid and a.id = b.id", 179 Result: [][]string{ 180 {"1", "1", "1", "1"}, 181 {"1", "2", "1", "2"}, 182 }, 183 Rewritten: []string{ 184 "select /* cross join */ a.eid, a.id, b.eid, b.id from vitess_a as a join vitess_b as b on a.eid = b.eid and a.id = b.id limit 10001", 185 }, 186 RowsReturned: 2, 187 }, 188 &framework.TestCase{ 189 Name: "natural join", 190 Query: "select /* natural join */ a.eid, a.id, b.eid, b.id from vitess_a as a natural join vitess_b as b", 191 Result: [][]string{ 192 {"1", "1", "1", "1"}, 193 {"1", "2", "1", "2"}, 194 }, 195 Rewritten: []string{ 196 "select /* natural join */ a.eid, a.id, b.eid, b.id from vitess_a as a natural join vitess_b as b limit 10001", 197 }, 198 RowsReturned: 2, 199 }, 200 &framework.TestCase{ 201 Name: "left join", 202 Query: "select /* left join */ a.eid, a.id, b.eid, b.id from vitess_a as a left join vitess_b as b on a.eid = b.eid and a.id = b.id", 203 Result: [][]string{ 204 {"1", "1", "1", "1"}, 205 {"1", "2", "1", "2"}, 206 }, 207 Rewritten: []string{ 208 "select /* left join */ a.eid, a.id, b.eid, b.id from vitess_a as a left join vitess_b as b on a.eid = b.eid and a.id = b.id limit 10001", 209 }, 210 RowsReturned: 2, 211 }, 212 &framework.TestCase{ 213 Name: "right join", 214 Query: "select /* right join */ a.eid, a.id, b.eid, b.id from vitess_a as a right join vitess_b as b on a.eid = b.eid and a.id = b.id", 215 Result: [][]string{ 216 {"1", "1", "1", "1"}, 217 {"1", "2", "1", "2"}, 218 }, 219 Rewritten: []string{ 220 "select /* right join */ a.eid, a.id, b.eid, b.id from vitess_a as a right join vitess_b as b on a.eid = b.eid and a.id = b.id limit 10001", 221 }, 222 RowsReturned: 2, 223 }, 224 &framework.TestCase{ 225 Name: "complex select list", 226 Query: "select /* complex select list */ eid+1, id from vitess_a", 227 Result: [][]string{ 228 {"2", "1"}, 229 {"2", "2"}, 230 }, 231 Rewritten: []string{ 232 "select /* complex select list */ eid + 1, id from vitess_a limit 10001", 233 }, 234 RowsReturned: 2, 235 }, 236 &framework.TestCase{ 237 Name: "*", 238 Query: "select /* * */ * from vitess_a", 239 Result: [][]string{ 240 {"1", "1", "abcd", "efgh"}, 241 {"1", "2", "bcde", "fghi"}, 242 }, 243 Rewritten: []string{ 244 "select /* * */ * from vitess_a limit 10001", 245 }, 246 RowsReturned: 2, 247 }, 248 &framework.TestCase{ 249 Name: "table alias", 250 Query: "select /* table alias */ a.eid from vitess_a as a where a.eid=1", 251 Result: [][]string{ 252 {"1"}, 253 {"1"}, 254 }, 255 Rewritten: []string{ 256 "select /* table alias */ a.eid from vitess_a as a where a.eid = 1 limit 10001", 257 }, 258 RowsReturned: 2, 259 }, 260 &framework.TestCase{ 261 Name: "parenthesised col", 262 Query: "select /* parenthesised col */ (eid) from vitess_a where eid = 1 and id = 1", 263 Result: [][]string{ 264 {"1"}, 265 }, 266 Rewritten: []string{ 267 "select /* parenthesised col */ eid from vitess_a where eid = 1 and id = 1 limit 10001", 268 }, 269 RowsReturned: 1, 270 }, 271 &framework.MultiCase{ 272 Name: "for update", 273 Cases: []framework.Testable{ 274 framework.TestQuery("begin"), 275 &framework.TestCase{ 276 Query: "select /* for update */ eid from vitess_a where eid = 1 and id = 1 for update", 277 Result: [][]string{ 278 {"1"}, 279 }, 280 Rewritten: []string{ 281 "select /* for update */ eid from vitess_a where eid = 1 and id = 1 limit 10001 for update", 282 }, 283 RowsReturned: 1, 284 }, 285 framework.TestQuery("commit"), 286 }, 287 }, 288 &framework.MultiCase{ 289 Name: "lock in share mode", 290 Cases: []framework.Testable{ 291 framework.TestQuery("begin"), 292 &framework.TestCase{ 293 Query: "select /* for update */ eid from vitess_a where eid = 1 and id = 1 lock in share mode", 294 Result: [][]string{ 295 {"1"}, 296 }, 297 Rewritten: []string{ 298 "select /* for update */ eid from vitess_a where eid = 1 and id = 1 limit 10001 lock in share mode", 299 }, 300 RowsReturned: 1, 301 }, 302 framework.TestQuery("commit"), 303 }, 304 }, 305 &framework.TestCase{ 306 Name: "complex where", 307 Query: "select /* complex where */ id from vitess_a where id+1 = 2", 308 Result: [][]string{ 309 {"1"}, 310 }, 311 Rewritten: []string{ 312 "select /* complex where */ id from vitess_a where id + 1 = 2 limit 10001", 313 }, 314 RowsReturned: 1, 315 }, 316 &framework.TestCase{ 317 Name: "complex where (non-value operand)", 318 Query: "select /* complex where (non-value operand) */ eid, id from vitess_a where eid = id", 319 Result: [][]string{ 320 {"1", "1"}, 321 }, 322 Rewritten: []string{ 323 "select /* complex where (non-value operand) */ eid, id from vitess_a where eid = id limit 10001", 324 }, 325 RowsReturned: 1, 326 }, 327 &framework.TestCase{ 328 Name: "(condition)", 329 Query: "select /* (condition) */ * from vitess_a where (eid = 1)", 330 Result: [][]string{ 331 {"1", "1", "abcd", "efgh"}, 332 {"1", "2", "bcde", "fghi"}, 333 }, 334 Rewritten: []string{ 335 "select /* (condition) */ * from vitess_a where eid = 1 limit 10001", 336 }, 337 RowsReturned: 2, 338 }, 339 &framework.TestCase{ 340 Name: "inequality", 341 Query: "select /* inequality */ * from vitess_a where id > 1", 342 Result: [][]string{ 343 {"1", "2", "bcde", "fghi"}, 344 }, 345 Rewritten: []string{ 346 "select /* inequality */ * from vitess_a where id > 1 limit 10001", 347 }, 348 RowsReturned: 1, 349 }, 350 &framework.TestCase{ 351 Name: "in", 352 Query: "select /* in */ * from vitess_a where id in (1, 2)", 353 Result: [][]string{ 354 {"1", "1", "abcd", "efgh"}, 355 {"1", "2", "bcde", "fghi"}, 356 }, 357 Rewritten: []string{ 358 "select /* in */ * from vitess_a where id in (1, 2) limit 10001", 359 }, 360 RowsReturned: 2, 361 }, 362 &framework.TestCase{ 363 Name: "between", 364 Query: "select /* between */ * from vitess_a where id between 1 and 2", 365 Result: [][]string{ 366 {"1", "1", "abcd", "efgh"}, 367 {"1", "2", "bcde", "fghi"}, 368 }, 369 Rewritten: []string{ 370 "select /* between */ * from vitess_a where id between 1 and 2 limit 10001", 371 }, 372 RowsReturned: 2, 373 }, 374 &framework.TestCase{ 375 Name: "order", 376 Query: "select /* order */ * from vitess_a order by id desc", 377 Result: [][]string{ 378 {"1", "2", "bcde", "fghi"}, 379 {"1", "1", "abcd", "efgh"}, 380 }, 381 Rewritten: []string{ 382 "select /* order */ * from vitess_a order by id desc limit 10001", 383 }, 384 RowsReturned: 2, 385 }, 386 &framework.TestCase{ 387 Name: "select in select list", 388 Query: "select (select eid from vitess_a where id = 1), eid from vitess_a where id = 2", 389 Result: [][]string{ 390 {"1", "1"}, 391 }, 392 Rewritten: []string{ 393 "select (select eid from vitess_a where id = 1), eid from vitess_a where id = 2 limit 10001", 394 }, 395 RowsReturned: 1, 396 }, 397 &framework.TestCase{ 398 Name: "select in from clause", 399 Query: "select eid from (select eid from vitess_a where id=2) as a", 400 Result: [][]string{ 401 {"1"}, 402 }, 403 Rewritten: []string{ 404 "select eid from (select eid from vitess_a where id = 2) as a limit 10001", 405 }, 406 RowsReturned: 1, 407 }, 408 &framework.MultiCase{ 409 Name: "select in transaction", 410 Cases: []framework.Testable{ 411 framework.TestQuery("begin"), 412 &framework.TestCase{ 413 Query: "select * from vitess_a where eid = 2 and id = 1", 414 Rewritten: []string{ 415 "select * from vitess_a where eid = 2 and id = 1 limit 10001", 416 }, 417 }, 418 &framework.TestCase{ 419 Query: "select * from vitess_a where eid = 2 and id = 1", 420 Rewritten: []string{ 421 "select * from vitess_a where eid = 2 and id = 1 limit 10001", 422 }, 423 }, 424 &framework.TestCase{ 425 Query: "select :bv from vitess_a where eid = 2 and id = 1", 426 BindVars: map[string]*querypb.BindVariable{ 427 "bv": sqltypes.Int64BindVariable(1), 428 }, 429 Rewritten: []string{ 430 "select 1 from vitess_a where eid = 2 and id = 1 limit 10001", 431 }, 432 }, 433 &framework.TestCase{ 434 Query: "select :bv from vitess_a where eid = 2 and id = 1", 435 BindVars: map[string]*querypb.BindVariable{ 436 "bv": sqltypes.StringBindVariable("abcd"), 437 }, 438 Rewritten: []string{ 439 "select 'abcd' from vitess_a where eid = 2 and id = 1 limit 10001", 440 }, 441 }, 442 framework.TestQuery("commit"), 443 }, 444 }, 445 &framework.MultiCase{ 446 Name: "simple insert", 447 Cases: []framework.Testable{ 448 framework.TestQuery("begin"), 449 &framework.TestCase{ 450 Query: "insert /* simple */ into vitess_a values (2, 1, 'aaaa', 'bbbb')", 451 Rewritten: []string{ 452 "insert /* simple */ into vitess_a values (2, 1, 'aaaa', 'bbbb')", 453 }, 454 RowsAffected: 1, 455 }, 456 framework.TestQuery("commit"), 457 &framework.TestCase{ 458 Query: "select * from vitess_a where eid = 2 and id = 1", 459 Result: [][]string{ 460 {"2", "1", "aaaa", "bbbb"}, 461 }, 462 }, 463 framework.TestQuery("begin"), 464 framework.TestQuery("delete from vitess_a where eid>1"), 465 framework.TestQuery("commit"), 466 }, 467 }, 468 &framework.MultiCase{ 469 Name: "insert ignore", 470 Cases: []framework.Testable{ 471 framework.TestQuery("begin"), 472 &framework.TestCase{ 473 Query: "insert /* simple */ ignore into vitess_a values (2, 1, 'aaaa', 'bbbb')", 474 Rewritten: []string{ 475 "insert /* simple */ ignore into vitess_a values (2, 1, 'aaaa', 'bbbb')", 476 }, 477 RowsAffected: 1, 478 }, 479 framework.TestQuery("commit"), 480 &framework.TestCase{ 481 Query: "select * from vitess_a where eid = 2 and id = 1", 482 Result: [][]string{ 483 {"2", "1", "aaaa", "bbbb"}, 484 }, 485 }, 486 framework.TestQuery("begin"), 487 &framework.TestCase{ 488 Query: "insert /* simple */ ignore into vitess_a values (2, 1, 'cccc', 'cccc')", 489 Rewritten: []string{ 490 "insert /* simple */ ignore into vitess_a values (2, 1, 'cccc', 'cccc')", 491 }, 492 }, 493 framework.TestQuery("commit"), 494 &framework.TestCase{ 495 Query: "select * from vitess_a where eid = 2 and id = 1", 496 Result: [][]string{ 497 {"2", "1", "aaaa", "bbbb"}, 498 }, 499 }, 500 framework.TestQuery("begin"), 501 framework.TestQuery("delete from vitess_a where eid>1"), 502 framework.TestQuery("commit"), 503 }, 504 }, 505 &framework.MultiCase{ 506 Name: "qualified insert", 507 Cases: []framework.Testable{ 508 framework.TestQuery("begin"), 509 &framework.TestCase{ 510 Query: "insert /* qualified */ into vitess_a(eid, id, name, foo) values (3, 1, 'aaaa', 'cccc')", 511 Rewritten: []string{ 512 "insert /* qualified */ into vitess_a(eid, id, `name`, foo) values (3, 1, 'aaaa', 'cccc')", 513 }, 514 RowsAffected: 1, 515 }, 516 framework.TestQuery("commit"), 517 &framework.TestCase{ 518 Query: "select * from vitess_a where eid = 3 and id = 1", 519 Result: [][]string{ 520 {"3", "1", "aaaa", "cccc"}, 521 }, 522 }, 523 framework.TestQuery("begin"), 524 framework.TestQuery("delete from vitess_a where eid>1"), 525 framework.TestQuery("commit"), 526 }, 527 }, 528 &framework.MultiCase{ 529 Name: "insert with mixed case column names", 530 Cases: []framework.Testable{ 531 framework.TestQuery("begin"), 532 &framework.TestCase{ 533 Query: "insert into vitess_mixed_case(col1, col2) values(1, 2)", 534 Rewritten: []string{ 535 "insert into vitess_mixed_case(col1, col2) values (1, 2)", 536 }, 537 RowsAffected: 1, 538 }, 539 framework.TestQuery("commit"), 540 &framework.TestCase{ 541 Query: "select COL1, COL2 from vitess_mixed_case", 542 Result: [][]string{ 543 {"1", "2"}, 544 }, 545 }, 546 framework.TestQuery("begin"), 547 framework.TestQuery("delete from vitess_mixed_case"), 548 framework.TestQuery("commit"), 549 }, 550 }, 551 &framework.MultiCase{ 552 Name: "insert auto_increment", 553 Cases: []framework.Testable{ 554 framework.TestQuery("alter table vitess_e auto_increment = 1"), 555 framework.TestQuery("begin"), 556 &framework.TestCase{ 557 Query: "insert /* auto_increment */ into vitess_e(name, foo) values ('aaaa', 'cccc')", 558 Rewritten: []string{ 559 "insert /* auto_increment */ into vitess_e(`name`, foo) values ('aaaa', 'cccc')", 560 }, 561 RowsAffected: 1, 562 }, 563 framework.TestQuery("commit"), 564 &framework.TestCase{ 565 Query: "select * from vitess_e", 566 Result: [][]string{ 567 {"1", "1", "aaaa", "cccc"}, 568 }, 569 }, 570 framework.TestQuery("begin"), 571 framework.TestQuery("delete from vitess_e"), 572 framework.TestQuery("commit"), 573 }, 574 }, 575 &framework.MultiCase{ 576 Name: "insert with null auto_increment", 577 Cases: []framework.Testable{ 578 framework.TestQuery("alter table vitess_e auto_increment = 1"), 579 framework.TestQuery("begin"), 580 &framework.TestCase{ 581 Query: "insert /* auto_increment */ into vitess_e(eid, name, foo) values (NULL, 'aaaa', 'cccc')", 582 Rewritten: []string{ 583 "insert /* auto_increment */ into vitess_e(eid, `name`, foo) values (null, 'aaaa', 'cccc')", 584 }, 585 RowsAffected: 1, 586 }, 587 framework.TestQuery("commit"), 588 &framework.TestCase{ 589 Query: "select * from vitess_e", 590 Result: [][]string{ 591 {"1", "1", "aaaa", "cccc"}, 592 }, 593 }, 594 framework.TestQuery("begin"), 595 framework.TestQuery("delete from vitess_e"), 596 framework.TestQuery("commit"), 597 }, 598 }, 599 &framework.MultiCase{ 600 Name: "insert with number default value", 601 Cases: []framework.Testable{ 602 framework.TestQuery("begin"), 603 &framework.TestCase{ 604 Query: "insert /* num default */ into vitess_a(eid, name, foo) values (3, 'aaaa', 'cccc')", 605 Rewritten: []string{ 606 "insert /* num default */ into vitess_a(eid, `name`, foo) values (3, 'aaaa', 'cccc')", 607 }, 608 RowsAffected: 1, 609 }, 610 framework.TestQuery("commit"), 611 &framework.TestCase{ 612 Query: "select * from vitess_a where eid = 3 and id = 1", 613 Result: [][]string{ 614 {"3", "1", "aaaa", "cccc"}, 615 }, 616 }, 617 framework.TestQuery("begin"), 618 framework.TestQuery("delete from vitess_a where eid>1"), 619 framework.TestQuery("commit"), 620 }, 621 }, 622 &framework.MultiCase{ 623 Name: "insert with string default value", 624 Cases: []framework.Testable{ 625 framework.TestQuery("begin"), 626 &framework.TestCase{ 627 Query: "insert /* string default */ into vitess_f(id) values (1)", 628 Rewritten: []string{ 629 "insert /* string default */ into vitess_f(id) values (1)", 630 }, 631 RowsAffected: 1, 632 }, 633 framework.TestQuery("commit"), 634 &framework.TestCase{ 635 Query: "select * from vitess_f", 636 Result: [][]string{ 637 {"ab", "1"}, 638 }, 639 }, 640 framework.TestQuery("begin"), 641 framework.TestQuery("delete from vitess_f"), 642 framework.TestQuery("commit"), 643 }, 644 }, 645 &framework.MultiCase{ 646 Name: "bind values", 647 Cases: []framework.Testable{ 648 framework.TestQuery("begin"), 649 &framework.TestCase{ 650 Query: "insert /* bind values */ into vitess_a(eid, id, name, foo) values (:eid, :id, :name, :foo)", 651 BindVars: map[string]*querypb.BindVariable{ 652 "foo": sqltypes.StringBindVariable("cccc"), 653 "eid": sqltypes.Int64BindVariable(4), 654 "name": sqltypes.StringBindVariable("aaaa"), 655 "id": sqltypes.Int64BindVariable(1), 656 }, 657 Rewritten: []string{ 658 "insert /* bind values */ into vitess_a(eid, id, `name`, foo) values (4, 1, 'aaaa', 'cccc')", 659 }, 660 RowsAffected: 1, 661 }, 662 framework.TestQuery("commit"), 663 &framework.TestCase{ 664 Query: "select * from vitess_a where eid = 4 and id = 1", 665 Result: [][]string{ 666 {"4", "1", "aaaa", "cccc"}, 667 }, 668 }, 669 framework.TestQuery("begin"), 670 framework.TestQuery("delete from vitess_a where eid>1"), 671 framework.TestQuery("commit"), 672 }, 673 }, 674 &framework.MultiCase{ 675 Name: "positional values", 676 Cases: []framework.Testable{ 677 framework.TestQuery("begin"), 678 &framework.TestCase{ 679 Query: "insert /* positional values */ into vitess_a(eid, id, name, foo) values (?, ?, ?, ?)", 680 BindVars: map[string]*querypb.BindVariable{ 681 "v1": sqltypes.Int64BindVariable(4), 682 "v2": sqltypes.Int64BindVariable(1), 683 "v3": sqltypes.StringBindVariable("aaaa"), 684 "v4": sqltypes.StringBindVariable("cccc"), 685 }, 686 Rewritten: []string{ 687 "insert /* positional values */ into vitess_a(eid, id, `name`, foo) values (4, 1, 'aaaa', 'cccc')", 688 }, 689 RowsAffected: 1, 690 }, 691 framework.TestQuery("commit"), 692 &framework.TestCase{ 693 Query: "select * from vitess_a where eid = 4 and id = 1", 694 Result: [][]string{ 695 {"4", "1", "aaaa", "cccc"}, 696 }, 697 }, 698 framework.TestQuery("begin"), 699 framework.TestQuery("delete from vitess_a where eid>1"), 700 framework.TestQuery("commit"), 701 }, 702 }, 703 &framework.MultiCase{ 704 Name: "out of sequence columns", 705 Cases: []framework.Testable{ 706 framework.TestQuery("begin"), 707 &framework.TestCase{ 708 Query: "insert into vitess_a(id, eid, foo, name) values (-1, 5, 'aaa', 'bbb')", 709 Rewritten: []string{ 710 "insert into vitess_a(id, eid, foo, `name`) values (-1, 5, 'aaa', 'bbb')", 711 }, 712 RowsAffected: 1, 713 }, 714 framework.TestQuery("commit"), 715 &framework.TestCase{ 716 Query: "select * from vitess_a where eid = 5 and id = -1", 717 Result: [][]string{ 718 {"5", "-1", "bbb", "aaa"}, 719 }, 720 }, 721 framework.TestQuery("begin"), 722 framework.TestQuery("delete from vitess_a where eid>1"), 723 framework.TestQuery("commit"), 724 }, 725 }, 726 &framework.MultiCase{ 727 Name: "subquery", 728 Cases: []framework.Testable{ 729 framework.TestQuery("begin"), 730 &framework.TestCase{ 731 Query: "insert /* subquery */ into vitess_a(eid, name, foo) select eid, name, foo from vitess_c", 732 Rewritten: []string{ 733 "insert /* subquery */ into vitess_a(eid, `name`, foo) select eid, `name`, foo from vitess_c", 734 }, 735 RowsAffected: 2, 736 }, 737 framework.TestQuery("commit"), 738 &framework.TestCase{ 739 Query: "select * from vitess_a where eid in (10, 11)", 740 Result: [][]string{ 741 {"10", "1", "abcd", "20"}, 742 {"11", "1", "bcde", "30"}, 743 }, 744 }, 745 framework.TestQuery("alter table vitess_e auto_increment = 20"), 746 framework.TestQuery("begin"), 747 &framework.TestCase{ 748 Query: "insert into vitess_e(id, name, foo) select eid, name, foo from vitess_c", 749 Rewritten: []string{ 750 "insert into vitess_e(id, `name`, foo) select eid, `name`, foo from vitess_c", 751 }, 752 RowsAffected: 2, 753 }, 754 framework.TestQuery("commit"), 755 &framework.TestCase{ 756 Query: "select eid, id, name, foo from vitess_e", 757 Result: [][]string{ 758 {"20", "10", "abcd", "20"}, 759 {"21", "11", "bcde", "30"}, 760 }, 761 }, 762 framework.TestQuery("begin"), 763 framework.TestQuery("delete from vitess_a where eid>1"), 764 framework.TestQuery("delete from vitess_c where eid<10"), 765 framework.TestQuery("commit"), 766 }, 767 }, 768 &framework.MultiCase{ 769 Name: "multi-value", 770 Cases: []framework.Testable{ 771 framework.TestQuery("begin"), 772 &framework.TestCase{ 773 Query: "insert into vitess_a(eid, id, name, foo) values (5, 1, '', ''), (7, 1, '', '')", 774 Rewritten: []string{ 775 "insert into vitess_a(eid, id, `name`, foo) values (5, 1, '', ''), (7, 1, '', '')", 776 }, 777 RowsAffected: 2, 778 }, 779 framework.TestQuery("commit"), 780 &framework.TestCase{ 781 Query: "select * from vitess_a where eid>1", 782 Result: [][]string{ 783 {"5", "1", "", ""}, 784 {"7", "1", "", ""}, 785 }, 786 }, 787 framework.TestQuery("begin"), 788 framework.TestQuery("delete from vitess_a where eid>1"), 789 framework.TestQuery("commit"), 790 }, 791 }, 792 &framework.MultiCase{ 793 Name: "upsert single row present/absent", 794 Cases: []framework.Testable{ 795 framework.TestQuery("begin"), 796 &framework.TestCase{ 797 Query: "insert into upsert_test(id1, id2) values (1, 1) on duplicate key update id2 = 1", 798 Rewritten: []string{ 799 "insert into upsert_test(id1, id2) values (1, 1) on duplicate key update id2 = 1", 800 }, 801 RowsAffected: 1, 802 }, 803 &framework.TestCase{ 804 Query: "select * from upsert_test", 805 Result: [][]string{ 806 {"1", "1"}, 807 }, 808 }, 809 &framework.TestCase{ 810 Query: "insert into upsert_test(id1, id2) values (1, 2) on duplicate key update id2 = 2", 811 Rewritten: []string{ 812 "insert into upsert_test(id1, id2) values (1, 2) on duplicate key update id2 = 2", 813 }, 814 RowsAffected: 2, 815 }, 816 &framework.TestCase{ 817 Query: "select * from upsert_test", 818 Result: [][]string{ 819 {"1", "2"}, 820 }, 821 }, 822 &framework.TestCase{ 823 Query: "insert into upsert_test(id1, id2) values (1, 2) on duplicate key update id2 = 2", 824 Rewritten: []string{ 825 "insert into upsert_test(id1, id2) values (1, 2) on duplicate key update id2 = 2", 826 }, 827 }, 828 &framework.TestCase{ 829 Query: "insert ignore into upsert_test(id1, id2) values (1, 3) on duplicate key update id2 = 3", 830 Rewritten: []string{ 831 "insert ignore into upsert_test(id1, id2) values (1, 3) on duplicate key update id2 = 3", 832 }, 833 RowsAffected: 2, 834 }, 835 &framework.TestCase{ 836 Query: "select * from upsert_test", 837 Result: [][]string{ 838 {"1", "3"}, 839 }, 840 }, 841 framework.TestQuery("commit"), 842 framework.TestQuery("begin"), 843 framework.TestQuery("delete from upsert_test"), 844 framework.TestQuery("commit"), 845 }, 846 }, 847 &framework.MultiCase{ 848 Name: "upsert changes pk", 849 Cases: []framework.Testable{ 850 framework.TestQuery("begin"), 851 &framework.TestCase{ 852 Query: "insert into upsert_test(id1, id2) values (1, 1) on duplicate key update id1 = 1", 853 Rewritten: []string{ 854 "insert into upsert_test(id1, id2) values (1, 1) on duplicate key update id1 = 1", 855 }, 856 RowsAffected: 1, 857 }, 858 &framework.TestCase{ 859 Query: "select * from upsert_test", 860 Result: [][]string{ 861 {"1", "1"}, 862 }, 863 }, 864 &framework.TestCase{ 865 Query: "insert into upsert_test(id1, id2) values (1, 2) on duplicate key update id1 = 2", 866 Rewritten: []string{ 867 "insert into upsert_test(id1, id2) values (1, 2) on duplicate key update id1 = 2", 868 }, 869 RowsAffected: 2, 870 }, 871 &framework.TestCase{ 872 Query: "select * from upsert_test", 873 Result: [][]string{ 874 {"2", "1"}, 875 }, 876 }, 877 framework.TestQuery("commit"), 878 framework.TestQuery("begin"), 879 framework.TestQuery("delete from upsert_test"), 880 framework.TestQuery("commit"), 881 }, 882 }, 883 &framework.MultiCase{ 884 Name: "upsert single row with values()", 885 Cases: []framework.Testable{ 886 framework.TestQuery("begin"), 887 &framework.TestCase{ 888 Query: "insert into upsert_test(id1, id2) values (1, 1) on duplicate key update id2 = values(id2) + 1", 889 Rewritten: []string{ 890 "insert into upsert_test(id1, id2) values (1, 1) on duplicate key update id2 = values(id2) + 1", 891 }, 892 RowsAffected: 1, 893 }, 894 &framework.TestCase{ 895 Query: "select * from upsert_test", 896 Result: [][]string{ 897 {"1", "1"}, 898 }, 899 }, 900 &framework.TestCase{ 901 Query: "insert into upsert_test(id1, id2) values (1, 2) on duplicate key update id2 = values(id2) + 1", 902 Rewritten: []string{ 903 "insert into upsert_test(id1, id2) values (1, 2) on duplicate key update id2 = values(id2) + 1", 904 }, 905 RowsAffected: 2, 906 }, 907 &framework.TestCase{ 908 Query: "select * from upsert_test", 909 Result: [][]string{ 910 {"1", "3"}, 911 }, 912 }, 913 &framework.TestCase{ 914 Query: "insert into upsert_test(id1, id2) values (1, 2) on duplicate key update id2 = values(id1)", 915 Rewritten: []string{ 916 "insert into upsert_test(id1, id2) values (1, 2) on duplicate key update id2 = values(id1)", 917 }, 918 }, 919 &framework.TestCase{ 920 Query: "select * from upsert_test", 921 Result: [][]string{ 922 {"1", "1"}, 923 }, 924 }, 925 &framework.TestCase{ 926 Query: "insert ignore into upsert_test(id1, id2) values (1, 3) on duplicate key update id2 = greatest(values(id1), values(id2))", 927 Rewritten: []string{ 928 "insert ignore into upsert_test(id1, id2) values (1, 3) on duplicate key update id2 = greatest(values(id1), values(id2))", 929 }, 930 RowsAffected: 2, 931 }, 932 &framework.TestCase{ 933 Query: "select * from upsert_test", 934 Result: [][]string{ 935 {"1", "3"}, 936 }, 937 }, 938 framework.TestQuery("commit"), 939 framework.TestQuery("begin"), 940 framework.TestQuery("delete from upsert_test"), 941 framework.TestQuery("commit"), 942 }, 943 }, 944 &framework.MultiCase{ 945 Name: "update", 946 Cases: []framework.Testable{ 947 framework.TestQuery("begin"), 948 &framework.TestCase{ 949 Query: "update /* pk */ vitess_a set foo='bar' where eid = 1 and id = 1", 950 Rewritten: []string{ 951 "update /* pk */ vitess_a set foo = 'bar' where eid = 1 and id = 1 limit 10001", 952 }, 953 RowsAffected: 1, 954 }, 955 framework.TestQuery("commit"), 956 &framework.TestCase{ 957 Query: "select foo from vitess_a where id = 1", 958 Result: [][]string{ 959 {"bar"}, 960 }, 961 }, 962 framework.TestQuery("begin"), 963 framework.TestQuery("update vitess_a set foo='efgh' where id=1"), 964 framework.TestQuery("commit"), 965 }, 966 }, 967 &framework.MultiCase{ 968 Name: "single in update", 969 Cases: []framework.Testable{ 970 framework.TestQuery("begin"), 971 &framework.TestCase{ 972 Query: "update /* pk */ vitess_a set foo='bar' where eid = 1 and id in (1, 2)", 973 Rewritten: []string{ 974 "update /* pk */ vitess_a set foo = 'bar' where eid = 1 and id in (1, 2) limit 10001", 975 }, 976 RowsAffected: 2, 977 }, 978 framework.TestQuery("commit"), 979 &framework.TestCase{ 980 Query: "select foo from vitess_a where id = 1", 981 Result: [][]string{ 982 {"bar"}, 983 }, 984 }, 985 framework.TestQuery("begin"), 986 framework.TestQuery("update vitess_a set foo='efgh' where id=1"), 987 framework.TestQuery("update vitess_a set foo='fghi' where id=2"), 988 framework.TestQuery("commit"), 989 }, 990 }, 991 &framework.MultiCase{ 992 Name: "double in update", 993 Cases: []framework.Testable{ 994 framework.TestQuery("begin"), 995 &framework.TestCase{ 996 Query: "update /* pk */ vitess_a set foo='bar' where eid in (1) and id in (1, 2)", 997 Rewritten: []string{ 998 "update /* pk */ vitess_a set foo = 'bar' where eid in (1) and id in (1, 2) limit 10001", 999 }, 1000 RowsAffected: 2, 1001 }, 1002 framework.TestQuery("commit"), 1003 &framework.TestCase{ 1004 Query: "select foo from vitess_a where id = 1", 1005 Result: [][]string{ 1006 {"bar"}, 1007 }, 1008 }, 1009 framework.TestQuery("begin"), 1010 framework.TestQuery("update vitess_a set foo='efgh' where id=1"), 1011 framework.TestQuery("update vitess_a set foo='fghi' where id=2"), 1012 framework.TestQuery("commit"), 1013 }, 1014 }, 1015 &framework.MultiCase{ 1016 Name: "double in 2 update", 1017 Cases: []framework.Testable{ 1018 framework.TestQuery("begin"), 1019 &framework.TestCase{ 1020 Query: "update /* pk */ vitess_a set foo='bar' where eid in (1, 2) and id in (1, 2)", 1021 Rewritten: []string{ 1022 "update /* pk */ vitess_a set foo = 'bar' where eid in (1, 2) and id in (1, 2) limit 10001", 1023 }, 1024 RowsAffected: 2, 1025 }, 1026 framework.TestQuery("commit"), 1027 &framework.TestCase{ 1028 Query: "select foo from vitess_a where id = 1", 1029 Result: [][]string{ 1030 {"bar"}, 1031 }, 1032 }, 1033 framework.TestQuery("begin"), 1034 framework.TestQuery("update vitess_a set foo='efgh' where id=1"), 1035 framework.TestQuery("update vitess_a set foo='fghi' where id=2"), 1036 framework.TestQuery("commit"), 1037 }, 1038 }, 1039 &framework.MultiCase{ 1040 Name: "pk change update", 1041 Cases: []framework.Testable{ 1042 framework.TestQuery("begin"), 1043 &framework.TestCase{ 1044 Query: "update vitess_a set eid = 2 where eid = 1 and id = 1", 1045 Rewritten: []string{ 1046 "update vitess_a set eid = 2 where eid = 1 and id = 1 limit 10001", 1047 }, 1048 RowsAffected: 1, 1049 }, 1050 framework.TestQuery("commit"), 1051 &framework.TestCase{ 1052 Query: "select eid from vitess_a where id = 1", 1053 Result: [][]string{ 1054 {"2"}, 1055 }, 1056 }, 1057 framework.TestQuery("begin"), 1058 framework.TestQuery("update vitess_a set eid=1 where id=1"), 1059 framework.TestQuery("commit"), 1060 }, 1061 }, 1062 &framework.MultiCase{ 1063 Name: "partial pk update", 1064 Cases: []framework.Testable{ 1065 framework.TestQuery("begin"), 1066 &framework.TestCase{ 1067 Query: "update /* pk */ vitess_a set foo='bar' where id = 1", 1068 Rewritten: []string{ 1069 "update /* pk */ vitess_a set foo = 'bar' where id = 1 limit 10001", 1070 }, 1071 RowsAffected: 1, 1072 }, 1073 framework.TestQuery("commit"), 1074 &framework.TestCase{ 1075 Query: "select foo from vitess_a where id = 1", 1076 Result: [][]string{ 1077 {"bar"}, 1078 }, 1079 }, 1080 framework.TestQuery("begin"), 1081 framework.TestQuery("update vitess_a set foo='efgh' where id=1"), 1082 framework.TestQuery("commit"), 1083 }, 1084 }, 1085 &framework.MultiCase{ 1086 Name: "limit update", 1087 Cases: []framework.Testable{ 1088 framework.TestQuery("begin"), 1089 &framework.TestCase{ 1090 Query: "update /* pk */ vitess_a set foo='bar' where eid = 1 limit 1", 1091 Rewritten: []string{ 1092 "update /* pk */ vitess_a set foo = 'bar' where eid = 1 limit 1", 1093 }, 1094 RowsAffected: 1, 1095 }, 1096 framework.TestQuery("commit"), 1097 &framework.TestCase{ 1098 Query: "select foo from vitess_a where id = 1", 1099 Result: [][]string{ 1100 {"bar"}, 1101 }, 1102 }, 1103 framework.TestQuery("begin"), 1104 framework.TestQuery("update vitess_a set foo='efgh' where id=1"), 1105 framework.TestQuery("commit"), 1106 }, 1107 }, 1108 &framework.MultiCase{ 1109 Name: "order by update", 1110 Cases: []framework.Testable{ 1111 framework.TestQuery("begin"), 1112 &framework.TestCase{ 1113 Query: "update /* pk */ vitess_a set foo='bar' where eid = 1 order by id desc limit 1", 1114 Rewritten: []string{ 1115 "update /* pk */ vitess_a set foo = 'bar' where eid = 1 order by id desc limit 1", 1116 }, 1117 RowsAffected: 1, 1118 }, 1119 framework.TestQuery("commit"), 1120 &framework.TestCase{ 1121 Query: "select foo from vitess_a where id = 2", 1122 Result: [][]string{ 1123 {"bar"}, 1124 }, 1125 }, 1126 framework.TestQuery("begin"), 1127 framework.TestQuery("update vitess_a set foo='fghi' where id=2"), 1128 framework.TestQuery("commit"), 1129 }, 1130 }, 1131 &framework.MultiCase{ 1132 Name: "missing where update", 1133 Cases: []framework.Testable{ 1134 framework.TestQuery("begin"), 1135 &framework.TestCase{ 1136 Query: "update vitess_a set foo='bar'", 1137 Rewritten: []string{ 1138 "update vitess_a set foo = 'bar' limit 10001", 1139 }, 1140 RowsAffected: 2, 1141 }, 1142 framework.TestQuery("commit"), 1143 &framework.TestCase{ 1144 Query: "select * from vitess_a", 1145 Result: [][]string{ 1146 {"1", "1", "abcd", "bar"}, 1147 {"1", "2", "bcde", "bar"}, 1148 }, 1149 }, 1150 framework.TestQuery("begin"), 1151 framework.TestQuery("update vitess_a set foo='efgh' where id=1"), 1152 framework.TestQuery("update vitess_a set foo='fghi' where id=2"), 1153 framework.TestQuery("commit"), 1154 }, 1155 }, 1156 &framework.MultiCase{ 1157 Name: "single pk update one row update", 1158 Cases: []framework.Testable{ 1159 framework.TestQuery("begin"), 1160 framework.TestQuery("insert into vitess_f(vb,id) values ('a', 1), ('b', 2)"), 1161 framework.TestQuery("commit"), 1162 framework.TestQuery("begin"), 1163 &framework.TestCase{ 1164 Query: "update vitess_f set id=2 where vb='a'", 1165 Rewritten: []string{ 1166 "update vitess_f set id = 2 where vb = 'a' limit 10001", 1167 }, 1168 RowsAffected: 1, 1169 }, 1170 framework.TestQuery("commit"), 1171 &framework.TestCase{ 1172 Query: "select * from vitess_f", 1173 Result: [][]string{ 1174 {"a", "2"}, 1175 {"b", "2"}, 1176 }, 1177 }, 1178 framework.TestQuery("begin"), 1179 framework.TestQuery("delete from vitess_f"), 1180 framework.TestQuery("commit"), 1181 }, 1182 }, 1183 &framework.MultiCase{ 1184 Name: "single pk update two rows", 1185 Cases: []framework.Testable{ 1186 framework.TestQuery("begin"), 1187 framework.TestQuery("insert into vitess_f(vb,id) values ('a', 1), ('b', 2)"), 1188 framework.TestQuery("commit"), 1189 framework.TestQuery("begin"), 1190 &framework.TestCase{ 1191 Query: "update vitess_f set id=3 where vb in ('a', 'b')", 1192 Rewritten: []string{ 1193 "update vitess_f set id = 3 where vb in ('a', 'b') limit 10001", 1194 }, 1195 RowsAffected: 2, 1196 }, 1197 framework.TestQuery("commit"), 1198 &framework.TestCase{ 1199 Query: "select * from vitess_f", 1200 Result: [][]string{ 1201 {"a", "3"}, 1202 {"b", "3"}, 1203 }, 1204 }, 1205 framework.TestQuery("begin"), 1206 framework.TestQuery("delete from vitess_f"), 1207 framework.TestQuery("commit"), 1208 }, 1209 }, 1210 &framework.MultiCase{ 1211 Name: "single pk update subquery", 1212 Cases: []framework.Testable{ 1213 framework.TestQuery("begin"), 1214 framework.TestQuery("insert into vitess_f(vb,id) values ('a', 1), ('b', 2)"), 1215 framework.TestQuery("commit"), 1216 framework.TestQuery("begin"), 1217 &framework.TestCase{ 1218 Query: "update vitess_f set id=4 where id >= 0", 1219 Rewritten: []string{ 1220 "update vitess_f set id = 4 where id >= 0 limit 10001", 1221 }, 1222 RowsAffected: 2, 1223 }, 1224 framework.TestQuery("commit"), 1225 &framework.TestCase{ 1226 Query: "select * from vitess_f", 1227 Result: [][]string{ 1228 {"a", "4"}, 1229 {"b", "4"}, 1230 }, 1231 }, 1232 framework.TestQuery("begin"), 1233 framework.TestQuery("delete from vitess_f"), 1234 framework.TestQuery("commit"), 1235 }, 1236 }, 1237 &framework.MultiCase{ 1238 Name: "single pk update subquery no rows", 1239 Cases: []framework.Testable{ 1240 framework.TestQuery("begin"), 1241 framework.TestQuery("insert into vitess_f(vb,id) values ('a', 1), ('b', 2)"), 1242 framework.TestQuery("commit"), 1243 framework.TestQuery("begin"), 1244 &framework.TestCase{ 1245 Query: "update vitess_f set id=4 where id < 0", 1246 Rewritten: []string{ 1247 "update vitess_f set id = 4 where id < 0 limit 10001", 1248 }, 1249 }, 1250 framework.TestQuery("commit"), 1251 &framework.TestCase{ 1252 Query: "select * from vitess_f", 1253 Result: [][]string{ 1254 {"a", "1"}, 1255 {"b", "2"}, 1256 }, 1257 }, 1258 framework.TestQuery("begin"), 1259 framework.TestQuery("delete from vitess_f"), 1260 framework.TestQuery("commit"), 1261 }, 1262 }, 1263 &framework.MultiCase{ 1264 Name: "delete", 1265 Cases: []framework.Testable{ 1266 framework.TestQuery("begin"), 1267 framework.TestQuery("insert into vitess_a(eid, id, name, foo) values (2, 1, '', '')"), 1268 &framework.TestCase{ 1269 Query: "delete /* pk */ from vitess_a where eid = 2 and id = 1", 1270 Rewritten: []string{ 1271 "delete /* pk */ from vitess_a where eid = 2 and id = 1 limit 10001", 1272 }, 1273 RowsAffected: 1, 1274 }, 1275 framework.TestQuery("commit"), 1276 &framework.TestCase{ 1277 Query: "select * from vitess_a where eid=2", 1278 }, 1279 }, 1280 }, 1281 &framework.MultiCase{ 1282 Name: "single in delete", 1283 Cases: []framework.Testable{ 1284 framework.TestQuery("begin"), 1285 framework.TestQuery("insert into vitess_a(eid, id, name, foo) values (2, 1, '', '')"), 1286 &framework.TestCase{ 1287 Query: "delete /* pk */ from vitess_a where eid = 2 and id in (1, 2)", 1288 Rewritten: []string{ 1289 "delete /* pk */ from vitess_a where eid = 2 and id in (1, 2) limit 10001", 1290 }, 1291 RowsAffected: 1, 1292 }, 1293 framework.TestQuery("commit"), 1294 &framework.TestCase{ 1295 Query: "select * from vitess_a where eid=2", 1296 }, 1297 }, 1298 }, 1299 &framework.MultiCase{ 1300 Name: "double in delete", 1301 Cases: []framework.Testable{ 1302 framework.TestQuery("begin"), 1303 framework.TestQuery("insert into vitess_a(eid, id, name, foo) values (2, 1, '', '')"), 1304 &framework.TestCase{ 1305 Query: "delete /* pk */ from vitess_a where eid in (2) and id in (1, 2)", 1306 Rewritten: []string{ 1307 "delete /* pk */ from vitess_a where eid in (2) and id in (1, 2) limit 10001", 1308 }, 1309 RowsAffected: 1, 1310 }, 1311 framework.TestQuery("commit"), 1312 &framework.TestCase{ 1313 Query: "select * from vitess_a where eid=2", 1314 }, 1315 }, 1316 }, 1317 &framework.MultiCase{ 1318 Name: "double in 2 delete", 1319 Cases: []framework.Testable{ 1320 framework.TestQuery("begin"), 1321 framework.TestQuery("insert into vitess_a(eid, id, name, foo) values (2, 1, '', '')"), 1322 &framework.TestCase{ 1323 Query: "delete /* pk */ from vitess_a where eid in (2, 3) and id in (1, 2)", 1324 Rewritten: []string{ 1325 "delete /* pk */ from vitess_a where eid in (2, 3) and id in (1, 2) limit 10001", 1326 }, 1327 RowsAffected: 1, 1328 }, 1329 framework.TestQuery("commit"), 1330 &framework.TestCase{ 1331 Query: "select * from vitess_a where eid=2", 1332 }, 1333 }, 1334 }, 1335 &framework.MultiCase{ 1336 Name: "complex where delete", 1337 Cases: []framework.Testable{ 1338 framework.TestQuery("begin"), 1339 framework.TestQuery("insert into vitess_a(eid, id, name, foo) values (2, 1, '', '')"), 1340 &framework.TestCase{ 1341 Query: "delete from vitess_a where eid = 1+1 and id = 1", 1342 Rewritten: []string{ 1343 "delete from vitess_a where eid = 1 + 1 and id = 1 limit 10001", 1344 }, 1345 RowsAffected: 1, 1346 }, 1347 framework.TestQuery("commit"), 1348 &framework.TestCase{ 1349 Query: "select * from vitess_a where eid=2", 1350 }, 1351 }, 1352 }, 1353 &framework.MultiCase{ 1354 Name: "partial pk delete", 1355 Cases: []framework.Testable{ 1356 framework.TestQuery("begin"), 1357 framework.TestQuery("insert into vitess_a(eid, id, name, foo) values (2, 1, '', '')"), 1358 &framework.TestCase{ 1359 Query: "delete from vitess_a where eid = 2", 1360 Rewritten: []string{ 1361 "delete from vitess_a where eid = 2 limit 10001", 1362 }, 1363 RowsAffected: 1, 1364 }, 1365 framework.TestQuery("commit"), 1366 &framework.TestCase{ 1367 Query: "select * from vitess_a where eid=2", 1368 }, 1369 }, 1370 }, 1371 &framework.MultiCase{ 1372 Name: "limit delete", 1373 Cases: []framework.Testable{ 1374 framework.TestQuery("begin"), 1375 framework.TestQuery("insert into vitess_a(eid, id, name, foo) values (2, 1, '', '')"), 1376 &framework.TestCase{ 1377 Query: "delete from vitess_a where eid = 2 limit 1", 1378 Rewritten: []string{ 1379 "delete from vitess_a where eid = 2 limit 1", 1380 }, 1381 RowsAffected: 1, 1382 }, 1383 framework.TestQuery("commit"), 1384 &framework.TestCase{ 1385 Query: "select * from vitess_a where eid=2", 1386 }, 1387 }, 1388 }, 1389 &framework.MultiCase{ 1390 Name: "order by delete", 1391 Cases: []framework.Testable{ 1392 framework.TestQuery("begin"), 1393 framework.TestQuery("insert into vitess_a(eid, id, name, foo) values (2, 1, '', '')"), 1394 framework.TestQuery("insert into vitess_a(eid, id, name, foo) values (2, 2, '', '')"), 1395 &framework.TestCase{ 1396 Query: "delete from vitess_a where eid = 2 order by id desc", 1397 Rewritten: []string{ 1398 "delete from vitess_a where eid = 2 order by id desc limit 10001", 1399 }, 1400 RowsAffected: 2, 1401 }, 1402 framework.TestQuery("commit"), 1403 &framework.TestCase{ 1404 Query: "select * from vitess_a where eid=2", 1405 }, 1406 }, 1407 }, 1408 &framework.MultiCase{ 1409 Name: "integer data types", 1410 Cases: []framework.Testable{ 1411 framework.TestQuery("begin"), 1412 &framework.TestCase{ 1413 Query: "insert into vitess_ints values(:tiny, :tinyu, :small, :smallu, :medium, :mediumu, :normal, :normalu, :big, :bigu, :year)", 1414 BindVars: map[string]*querypb.BindVariable{ 1415 "medium": sqltypes.Int64BindVariable(-8388608), 1416 "smallu": sqltypes.Int64BindVariable(65535), 1417 "normal": sqltypes.Int64BindVariable(-2147483648), 1418 "big": sqltypes.Int64BindVariable(-9223372036854775808), 1419 "tinyu": sqltypes.Int64BindVariable(255), 1420 "year": sqltypes.Int64BindVariable(2012), 1421 "tiny": sqltypes.Int64BindVariable(-128), 1422 "bigu": sqltypes.Uint64BindVariable(18446744073709551615), 1423 "normalu": sqltypes.Int64BindVariable(4294967295), 1424 "small": sqltypes.Int64BindVariable(-32768), 1425 "mediumu": sqltypes.Int64BindVariable(16777215), 1426 }, 1427 Rewritten: []string{ 1428 "insert into vitess_ints values (-128, 255, -32768, 65535, -8388608, 16777215, -2147483648, 4294967295, -9223372036854775808, 18446744073709551615, 2012)", 1429 }, 1430 }, 1431 framework.TestQuery("commit"), 1432 &framework.TestCase{ 1433 Query: "select * from vitess_ints where tiny = -128", 1434 Result: [][]string{ 1435 {"-128", "255", "-32768", "65535", "-8388608", "16777215", "-2147483648", "4294967295", "-9223372036854775808", "18446744073709551615", "2012"}, 1436 }, 1437 Rewritten: []string{ 1438 "select * from vitess_ints where tiny = -128 limit 10001", 1439 }, 1440 }, 1441 &framework.TestCase{ 1442 Query: "select * from vitess_ints where tiny = -128", 1443 Result: [][]string{ 1444 {"-128", "255", "-32768", "65535", "-8388608", "16777215", "-2147483648", "4294967295", "-9223372036854775808", "18446744073709551615", "2012"}, 1445 }, 1446 Rewritten: []string{ 1447 "select * from vitess_ints where tiny = -128 limit 10001", 1448 }, 1449 }, 1450 framework.TestQuery("begin"), 1451 &framework.TestCase{ 1452 Query: "insert into vitess_ints select 2, tinyu, small, smallu, medium, mediumu, normal, normalu, big, bigu, y from vitess_ints", 1453 Rewritten: []string{ 1454 "insert into vitess_ints select 2, tinyu, small, smallu, medium, mediumu, normal, normalu, big, bigu, y from vitess_ints", 1455 }, 1456 }, 1457 framework.TestQuery("commit"), 1458 framework.TestQuery("begin"), 1459 framework.TestQuery("delete from vitess_ints"), 1460 framework.TestQuery("commit"), 1461 }, 1462 }, 1463 &framework.MultiCase{ 1464 Name: "fractional data types", 1465 Cases: []framework.Testable{ 1466 framework.TestQuery("begin"), 1467 &framework.TestCase{ 1468 Query: "insert into vitess_fracts values(:id, :deci, :num, :f, :d)", 1469 BindVars: map[string]*querypb.BindVariable{ 1470 "d": sqltypes.Float64BindVariable(4.99), 1471 "num": sqltypes.StringBindVariable("2.99"), 1472 "id": sqltypes.Int64BindVariable(1), 1473 "f": sqltypes.Float64BindVariable(3.99), 1474 "deci": sqltypes.StringBindVariable("1.99"), 1475 }, 1476 Rewritten: []string{ 1477 "insert into vitess_fracts values (1, '1.99', '2.99', 3.99, 4.99)", 1478 }, 1479 }, 1480 framework.TestQuery("commit"), 1481 &framework.TestCase{ 1482 Query: "select * from vitess_fracts where id = 1", 1483 Result: [][]string{ 1484 {"1", "1.99", "2.99", "3.99", "4.99"}, 1485 }, 1486 Rewritten: []string{ 1487 "select * from vitess_fracts where id = 1 limit 10001", 1488 }, 1489 }, 1490 &framework.TestCase{ 1491 Query: "select * from vitess_fracts where id = 1", 1492 Result: [][]string{ 1493 {"1", "1.99", "2.99", "3.99", "4.99"}, 1494 }, 1495 Rewritten: []string{ 1496 "select * from vitess_fracts where id = 1 limit 10001", 1497 }, 1498 }, 1499 framework.TestQuery("begin"), 1500 &framework.TestCase{ 1501 Query: "insert into vitess_fracts select 2, deci, num, f, d from vitess_fracts", 1502 Rewritten: []string{ 1503 "insert into vitess_fracts select 2, deci, num, f, d from vitess_fracts", 1504 }, 1505 }, 1506 framework.TestQuery("commit"), 1507 framework.TestQuery("begin"), 1508 framework.TestQuery("delete from vitess_fracts"), 1509 framework.TestQuery("commit"), 1510 }, 1511 }, 1512 &framework.MultiCase{ 1513 Name: "string data types", 1514 Cases: []framework.Testable{ 1515 framework.TestQuery("begin"), 1516 &framework.TestCase{ 1517 Query: "insert into vitess_strings values (:vb, :c, :vc, :b, :tb, :bl, :ttx, :tx, :en, :s)", 1518 BindVars: map[string]*querypb.BindVariable{ 1519 "ttx": sqltypes.StringBindVariable("g"), 1520 "vb": sqltypes.StringBindVariable("a"), 1521 "vc": sqltypes.StringBindVariable("c"), 1522 "en": sqltypes.StringBindVariable("a"), 1523 "tx": sqltypes.StringBindVariable("h"), 1524 "bl": sqltypes.StringBindVariable("f"), 1525 "s": sqltypes.StringBindVariable("a,b"), 1526 "b": sqltypes.StringBindVariable("d"), 1527 "tb": sqltypes.StringBindVariable("e"), 1528 "c": sqltypes.StringBindVariable("b"), 1529 }, 1530 Rewritten: []string{ 1531 "insert into vitess_strings values ('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'a', 'a,b')", 1532 }, 1533 }, 1534 framework.TestQuery("commit"), 1535 &framework.TestCase{ 1536 Query: "select * from vitess_strings where vb = 'a'", 1537 Result: [][]string{ 1538 {"a", "b", "c", "d\x00\x00\x00", "e", "f", "g", "h", "a", "a,b"}, 1539 }, 1540 Rewritten: []string{ 1541 "select * from vitess_strings where vb = 'a' limit 10001", 1542 }, 1543 }, 1544 &framework.TestCase{ 1545 Query: "select * from vitess_strings where vb = 'a'", 1546 Result: [][]string{ 1547 {"a", "b", "c", "d\x00\x00\x00", "e", "f", "g", "h", "a", "a,b"}, 1548 }, 1549 Rewritten: []string{ 1550 "select * from vitess_strings where vb = 'a' limit 10001", 1551 }, 1552 }, 1553 framework.TestQuery("begin"), 1554 &framework.TestCase{ 1555 Query: "insert into vitess_strings select 'b', c, vc, b, tb, bl, ttx, tx, en, s from vitess_strings", 1556 Rewritten: []string{ 1557 "insert into vitess_strings select 'b', c, vc, b, tb, bl, ttx, tx, en, s from vitess_strings", 1558 }, 1559 }, 1560 framework.TestQuery("commit"), 1561 framework.TestQuery("begin"), 1562 framework.TestQuery("delete from vitess_strings"), 1563 framework.TestQuery("commit"), 1564 }, 1565 }, 1566 &framework.MultiCase{ 1567 Name: "misc data types", 1568 Cases: []framework.Testable{ 1569 framework.TestQuery("begin"), 1570 &framework.TestCase{ 1571 Query: "insert into vitess_misc values(:id, :b, :d, :dt, :t, point(1, 2))", 1572 BindVars: map[string]*querypb.BindVariable{ 1573 "t": sqltypes.StringBindVariable("15:45:45"), 1574 "dt": sqltypes.StringBindVariable("2012-01-01 15:45:45"), 1575 "b": sqltypes.StringBindVariable("\x01"), 1576 "id": sqltypes.Int64BindVariable(1), 1577 "d": sqltypes.StringBindVariable("2012-01-01"), 1578 }, 1579 Rewritten: []string{ 1580 "insert into vitess_misc values (1, '\x01', '2012-01-01', '2012-01-01 15:45:45', '15:45:45', point(1, 2))", 1581 }, 1582 }, 1583 framework.TestQuery("commit"), 1584 &framework.TestCase{ 1585 Query: "select * from vitess_misc where id = 1", 1586 Result: [][]string{ 1587 {"1", "\x01", "2012-01-01", "2012-01-01 15:45:45", "15:45:45", point12}, 1588 }, 1589 Rewritten: []string{ 1590 "select * from vitess_misc where id = 1 limit 10001", 1591 }, 1592 }, 1593 &framework.TestCase{ 1594 Query: "select * from vitess_misc where id = 1", 1595 Result: [][]string{ 1596 {"1", "\x01", "2012-01-01", "2012-01-01 15:45:45", "15:45:45", point12}, 1597 }, 1598 Rewritten: []string{ 1599 "select * from vitess_misc where id = 1 limit 10001", 1600 }, 1601 }, 1602 framework.TestQuery("begin"), 1603 &framework.TestCase{ 1604 // Skip geometry test. The binary representation is non-trivial to represent as go string. 1605 Query: "insert into vitess_misc(id, b, d, dt, t) select 2, b, d, dt, t from vitess_misc", 1606 Rewritten: []string{ 1607 "insert into vitess_misc(id, b, d, dt, t) select 2, b, d, dt, t from vitess_misc", 1608 }, 1609 }, 1610 framework.TestQuery("commit"), 1611 framework.TestQuery("begin"), 1612 framework.TestQuery("delete from vitess_misc"), 1613 framework.TestQuery("commit"), 1614 }, 1615 }, 1616 &framework.MultiCase{ 1617 Name: "boolean expressions", 1618 Cases: []framework.Testable{ 1619 framework.TestQuery("begin"), 1620 framework.TestQuery("insert into vitess_bool(bval, sval, ival) values (true, 'foo', false)"), 1621 framework.TestQuery("commit"), 1622 &framework.TestCase{ 1623 Query: "select * from vitess_bool", 1624 Result: [][]string{ 1625 {"1", "1", "foo", "0"}, 1626 }, 1627 }, 1628 framework.TestQuery("begin"), 1629 framework.TestQuery("insert into vitess_bool(bval, sval, ival) values (true, 'bar', 23)"), 1630 framework.TestQuery("insert into vitess_bool(bval, sval, ival) values (true, 'baz', 2342)"), 1631 framework.TestQuery("insert into vitess_bool(bval, sval, ival) values (true, 'test', 123)"), 1632 framework.TestQuery("insert into vitess_bool(bval, sval, ival) values (true, 'aa', 384)"), 1633 framework.TestQuery("insert into vitess_bool(bval, sval, ival) values (false, 'bbb', 213)"), 1634 framework.TestQuery("insert into vitess_bool(bval, sval, ival) values (false, 'cc', 24342)"), 1635 framework.TestQuery("insert into vitess_bool(bval, sval, ival) values (false, 'd', 1231)"), 1636 framework.TestQuery("insert into vitess_bool(bval, sval, ival) values (false, 'ee', 3894)"), 1637 framework.TestQuery("commit"), 1638 &framework.TestCase{ 1639 Query: "select * from vitess_bool where bval", 1640 Result: [][]string{ 1641 {"1", "1", "foo", "0"}, 1642 {"2", "1", "bar", "23"}, 1643 {"3", "1", "baz", "2342"}, 1644 {"4", "1", "test", "123"}, 1645 {"5", "1", "aa", "384"}, 1646 }, 1647 }, 1648 &framework.TestCase{ 1649 Query: "select * from vitess_bool where case sval when 'foo' then true when 'test' then true else false end", 1650 Result: [][]string{ 1651 {"1", "1", "foo", "0"}, 1652 {"4", "1", "test", "123"}, 1653 }, 1654 }, 1655 framework.TestQuery("begin"), 1656 &framework.TestCase{ 1657 Query: "insert into vitess_bool(auto, bval, sval, ival) values (1, false, 'test2', 191) on duplicate key update bval = false", 1658 Rewritten: []string{ 1659 "insert into vitess_bool(auto, bval, sval, ival) values (1, false, 'test2', 191) on duplicate key update bval = false", 1660 }, 1661 RowsAffected: 2, 1662 }, 1663 framework.TestQuery("commit"), 1664 &framework.TestCase{ 1665 Query: "select * from vitess_bool where bval", 1666 Result: [][]string{ 1667 {"2", "1", "bar", "23"}, 1668 {"3", "1", "baz", "2342"}, 1669 {"4", "1", "test", "123"}, 1670 {"5", "1", "aa", "384"}, 1671 }, 1672 }, 1673 &framework.TestCase{ 1674 Query: "select * from vitess_bool where not bval", 1675 Result: [][]string{ 1676 {"1", "0", "foo", "0"}, 1677 {"6", "0", "bbb", "213"}, 1678 {"7", "0", "cc", "24342"}, 1679 {"8", "0", "d", "1231"}, 1680 {"9", "0", "ee", "3894"}, 1681 }, 1682 }, 1683 framework.TestQuery("begin"), 1684 &framework.TestCase{ 1685 Query: "update vitess_bool set sval = 'test' where bval is false or ival = 23", 1686 Rewritten: []string{ 1687 "update vitess_bool set sval = 'test' where bval is false or ival = 23 limit 10001", 1688 }, 1689 RowsAffected: 6, 1690 }, 1691 framework.TestQuery("commit"), 1692 &framework.TestCase{ 1693 Query: "select * from vitess_bool where not bval", 1694 Result: [][]string{ 1695 {"1", "0", "test", "0"}, 1696 {"6", "0", "test", "213"}, 1697 {"7", "0", "test", "24342"}, 1698 {"8", "0", "test", "1231"}, 1699 {"9", "0", "test", "3894"}, 1700 }, 1701 }, 1702 &framework.TestCase{ 1703 Query: "select (bval or ival) from vitess_bool where ival = 213", 1704 Result: [][]string{ 1705 {"1"}, 1706 }, 1707 }, 1708 &framework.TestCase{ 1709 Query: "select bval from vitess_bool where ival = 213", 1710 Result: [][]string{ 1711 {"0"}, 1712 }, 1713 }, 1714 }, 1715 }, 1716 &framework.MultiCase{ 1717 Name: "impossible queries", 1718 Cases: []framework.Testable{ 1719 &framework.TestCase{ 1720 Name: "specific column", 1721 Query: "select eid from vitess_a where 1 != 1", 1722 Rewritten: []string{ 1723 "select eid from vitess_a where 1 != 1 limit 10001", 1724 }, 1725 RowsAffected: 0, 1726 }, 1727 &framework.TestCase{ 1728 Name: "all columns", 1729 Query: "select * from vitess_a where 1 != 1", 1730 Rewritten: []string{ 1731 "select * from vitess_a where 1 != 1 limit 10001", 1732 }, 1733 RowsAffected: 0, 1734 }, 1735 &framework.TestCase{ 1736 Name: "bind vars", 1737 Query: "select :bv from vitess_a where 1 != 1", 1738 BindVars: map[string]*querypb.BindVariable{ 1739 "bv": sqltypes.Int64BindVariable(1), 1740 }, 1741 Rewritten: []string{ 1742 "select 1 from vitess_a where 1 != 1 limit 10001", 1743 }, 1744 RowsAffected: 0, 1745 }, 1746 }, 1747 }, 1748 } 1749 1750 // Most of these tests are not really needed because the queries are mostly pass-through. 1751 // They're left as is because they still demonstrate the variety of constructs being supported. 1752 func TestQueries(t *testing.T) { 1753 client := framework.NewClient() 1754 1755 for _, tcase := range TestQueryCases { 1756 t.Run(name(tcase), func(t *testing.T) { 1757 err := tcase.Test("", client) 1758 require.NoError(t, err) 1759 }) 1760 } 1761 } 1762 1763 func name(tc framework.Testable) string { 1764 switch tc := tc.(type) { 1765 case *framework.TestCase: 1766 return tc.Name 1767 case *framework.MultiCase: 1768 return tc.Name 1769 } 1770 return fmt.Sprintf("%T", tc) 1771 } 1772 1773 func BenchmarkTabletQueries(b *testing.B) { 1774 client := framework.NewClient() 1775 1776 b.ResetTimer() 1777 for i := 0; i < b.N; i++ { 1778 tcase := TestQueryCases[rand.Intn(len(TestQueryCases))] 1779 if err := tcase.Benchmark(client); err != nil { 1780 b.Error(err) 1781 } 1782 } 1783 }