func TestStreamSelectIN(t *testing.T) { router, _, _, sbclookup := createRouterEnv() q := proto.Query{ Sql: "select * from user where id in (1)", TabletType: topo.TYPE_MASTER, } result, err := routerStream(router, &q) if err != nil { t.Error(err) } wantResult := singleRowResult if !reflect.DeepEqual(result, wantResult) { t.Errorf("result: %+v, want %+v", result, wantResult) } q.Sql = "select * from user where id in (1, 3)" result, err = routerStream(router, &q) if err != nil { t.Error(err) } wantResult = &mproto.QueryResult{ Fields: singleRowResult.Fields, Rows: [][]sqltypes.Value{ singleRowResult.Rows[0], singleRowResult.Rows[0], }, RowsAffected: 2, } if !reflect.DeepEqual(result, wantResult) { t.Errorf("result: %+v, want %+v", result, wantResult) } q.Sql = "select * from user where name = 'foo'" result, err = routerStream(router, &q) if err != nil { t.Error(err) } wantResult = singleRowResult if !reflect.DeepEqual(result, wantResult) { t.Errorf("result: %+v, want %+v", result, wantResult) } wantQueries := []tproto.BoundQuery{{ Sql: "select user_id from name_user_map where name = :name", BindVariables: map[string]interface{}{ "name": "foo", }, }} if !reflect.DeepEqual(sbclookup.Queries, wantQueries) { t.Errorf("sbclookup.Queries: %+v, want %+v\n", sbclookup.Queries, wantQueries) } }
func TestStreamSelectKeyrange(t *testing.T) { router, _, _, _ := createRouterEnv() q := proto.Query{ Sql: "select * from user where keyrange('', '\x20')", TabletType: topo.TYPE_MASTER, } result, err := routerStream(router, &q) if err != nil { t.Error(err) } wantResult := singleRowResult if !reflect.DeepEqual(result, wantResult) { t.Errorf("result: %+v, want %+v", result, wantResult) } q.Sql = "select * from user where keyrange('\x40', '\x60')" result, err = routerStream(router, &q) if err != nil { t.Error(err) } wantResult = singleRowResult if !reflect.DeepEqual(result, wantResult) { t.Errorf("result: %+v, want %+v", result, wantResult) } }
func TestSelectSingleShardKey(t *testing.T) { schema, err := planbuilder.LoadSchemaJSON(locateFile("router_test.json")) if err != nil { t.Fatal(err) } s := createSandbox("TestRouter") sbc1 := &sandboxConn{} sbc2 := &sandboxConn{} s.MapTestConn("-20", sbc1) s.MapTestConn("40-60", sbc2) serv := new(sandboxTopo) scatterConn := NewScatterConn(serv, "", "aa", 1*time.Second, 10, 1*time.Millisecond) router := NewRouter(serv, "aa", schema, "", scatterConn) q := proto.Query{ Sql: "select * from user where id = 1", TabletType: topo.TYPE_MASTER, } _, err = router.Execute(&context.DummyContext{}, &q) if err != nil { t.Errorf("want nil, got %v", err) } if sbc1.ExecCount != 1 { t.Errorf("want 1, got %v\n", sbc1.ExecCount) } if sbc2.ExecCount != 0 { t.Errorf("want 0, got %v\n", sbc2.ExecCount) } q.Sql = "select * from user where id = 3" _, err = router.Execute(&context.DummyContext{}, &q) if err != nil { t.Errorf("want nil, got %v", err) } if sbc1.ExecCount != 1 { t.Errorf("want 1, got %v\n", sbc1.ExecCount) } if sbc2.ExecCount != 1 { t.Errorf("want 1, got %v\n", sbc2.ExecCount) } }