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  }