コード例 #1
0
ファイル: join_test.go プロジェクト: lovedboy/tidb
func (s *testJoinSuit) TestJoin(c *C) {
	s.cols = []*column.Col{
		{
			ColumnInfo: model.ColumnInfo{
				ID:           0,
				Name:         model.NewCIStr("id"),
				Offset:       0,
				DefaultValue: 0,
				FieldType:    *types.NewFieldType(mysql.TypeLonglong),
			},
		},
		{
			ColumnInfo: model.ColumnInfo{
				ID:           1,
				Name:         model.NewCIStr("name"),
				Offset:       1,
				DefaultValue: nil,
				FieldType:    *types.NewFieldType(mysql.TypeVarchar),
			},
		},
	}

	var testData1 = []*testRowData{
		{1, []interface{}{10, "10"}},
		{2, []interface{}{10, "20"}},
		{3, []interface{}{10, "30"}},
		{4, []interface{}{40, "40"}},
		{6, []interface{}{60, "60"}},
	}

	var testData2 = []*testRowData{
		{1, []interface{}{10, "10"}},
		{2, []interface{}{10, "20"}},
		{3, []interface{}{10, "30"}},
		{4, []interface{}{40, "40"}},
		{6, []interface{}{60, "60"}},
	}

	tblPlan1 := &testTablePlan{testData1, []string{"id", "name"}, 0}
	tblPlan2 := &testTablePlan{testData2, []string{"id", "name"}, 0}

	joinPlan := &plans.JoinPlan{
		Left:   tblPlan1,
		Right:  tblPlan2,
		Type:   "CROSS",
		Fields: []*field.ResultField{},
		On:     expression.Value{Val: true},
	}
	rset := rsets.Recordset{
		Plan: joinPlan,
		Ctx:  mock.NewContext()}

	rset.Do(func(data []interface{}) (bool, error) {
		return true, nil
	})
	tblPlan1.Close()
	tblPlan2.Close()
	rset.Plan = &plans.JoinPlan{
		Left:   tblPlan1,
		Right:  tblPlan2,
		Type:   "LEFT",
		Fields: []*field.ResultField{},
		On:     expression.Value{Val: true},
	}
	rset.Do(func(data []interface{}) (bool, error) {
		return true, nil
	})
	tblPlan1.Close()
	tblPlan2.Close()
	joinPlan = &plans.JoinPlan{
		Left:   tblPlan1,
		Right:  tblPlan2,
		Type:   "RIGHT",
		Fields: []*field.ResultField{},
		On:     expression.Value{Val: true},
	}

	expr := &expression.BinaryOperation{
		Op: opcode.LT,
		L: &expression.Ident{
			CIStr: model.NewCIStr("id"),
		},
		R: expression.Value{
			Val: 100,
		},
	}
	np, _, err := joinPlan.Filter(nil, expr)
	c.Assert(np, NotNil)
	c.Assert(err, IsNil)
	rset.Plan = joinPlan
	rset.Do(func(data []interface{}) (bool, error) {
		return true, nil
	})
	tblPlan1.Close()
	tblPlan2.Close()
	rset.Plan = &plans.JoinPlan{
		Left:   tblPlan1,
		Right:  tblPlan2,
		Type:   "FULL",
		Fields: []*field.ResultField{},
		On:     expression.Value{Val: true},
	}

	rset.Do(func(data []interface{}) (bool, error) {
		return true, nil
	})
}
コード例 #2
0
ファイル: fields_test.go プロジェクト: lovedboy/tidb
func (s *testFieldsSuit) TestDefaultFieldsPlan(c *C) {
	tblPlan := &testTablePlan{selectFieldsTestData, []string{"id", "name"}, 0}

	sl1 := &plans.SelectList{
		Fields: []*field.Field{
			{
				Expr: &expression.Ident{
					CIStr: model.NewCIStr("name"),
				},
			},
		},
	}

	selFieldsPlan := &plans.SelectFieldsDefaultPlan{
		SelectList: sl1,
		Src:        tblPlan,
	}
	rset := rsets.Recordset{
		Plan: selFieldsPlan,
		Ctx:  mock.NewContext(),
	}
	rset.Do(func(data []interface{}) (bool, error) {
		c.Assert(len(data), Equals, 1)
		c.Assert(data[0].(string), Equals, "hello")
		return true, nil
	})

	// test multiple fields
	sl2 := &plans.SelectList{
		Fields: []*field.Field{
			{
				Expr: &expression.Ident{
					CIStr: model.NewCIStr("name"),
				},
			},
			{
				Expr: &expression.Ident{
					CIStr: model.NewCIStr("id"),
				},
			},
		},
	}
	tblPlan.Close()
	rset.Plan = &plans.SelectFieldsDefaultPlan{
		SelectList: sl2,
		Src:        tblPlan,
	}

	rset.Do(func(data []interface{}) (bool, error) {
		c.Assert(len(data), Equals, 2)
		c.Assert(data[0].(string), Equals, "hello")
		c.Assert(data[1].(int), GreaterEqual, 10)
		return true, nil
	})

	// test field doesn't exists
	sl3 := &plans.SelectList{
		Fields: []*field.Field{
			{
				Expr: &expression.Ident{
					CIStr: model.NewCIStr("nosuchfield"),
				},
			},
		},
	}
	tblPlan.Close()
	rset.Plan = &plans.SelectFieldsDefaultPlan{
		SelectList: sl3,
		Src:        tblPlan,
	}
	err := rset.Do(func(data []interface{}) (bool, error) {
		return true, nil
	})
	c.Assert(err.Error() == "unknown field nosuchfield", Equals, true)
}