From 08e0491b5a5d040a7800a517ed5c74ca159effb0 Mon Sep 17 00:00:00 2001 From: siddontang Date: Fri, 16 Oct 2015 08:56:20 +0800 Subject: [PATCH] *: having adds SelectList field. --- plan/plans/having.go | 1 + plan/plans/having_test.go | 4 ++++ rset/rsets/having.go | 7 ++++--- rset/rsets/having_test.go | 14 ++++++++------ stmt/stmts/select.go | 5 +++-- 5 files changed, 20 insertions(+), 11 deletions(-) diff --git a/plan/plans/having.go b/plan/plans/having.go index 82a50c0860..231f059eaa 100644 --- a/plan/plans/having.go +++ b/plan/plans/having.go @@ -32,6 +32,7 @@ type HavingPlan struct { Src plan.Plan Expr expression.Expression evalArgs map[interface{}]interface{} + *SelectList } // Explain implements plan.Plan Explain interface. diff --git a/plan/plans/having_test.go b/plan/plans/having_test.go index c54ea143cc..a3777fe9f2 100644 --- a/plan/plans/having_test.go +++ b/plan/plans/having_test.go @@ -30,6 +30,10 @@ var _ = Suite(&testHavingPlan{}) func (t *testHavingPlan) TestHaving(c *C) { tblPlan := &testTablePlan{groupByTestData, []string{"id", "name"}, 0} havingPlan := &plans.HavingPlan{ + SelectList: &plans.SelectList{ + HiddenFieldOffset: len(tblPlan.GetFields()), + ResultFields: tblPlan.GetFields(), + }, Src: tblPlan, Expr: &expression.BinaryOperation{ Op: opcode.GE, diff --git a/rset/rsets/having.go b/rset/rsets/having.go index 73bd81ecb7..39ba3cc561 100644 --- a/rset/rsets/having.go +++ b/rset/rsets/having.go @@ -28,8 +28,9 @@ var ( // HavingRset is record set for having fields. type HavingRset struct { - Src plan.Plan - Expr expression.Expression + Src plan.Plan + Expr expression.Expression + SelectList *plans.SelectList } // CheckAndUpdateSelectList checks having fields validity and set hidden fields to selectList. @@ -90,7 +91,7 @@ func (r *HavingRset) CheckAndUpdateSelectList(selectList *plans.SelectList, grou // Plan gets HavingPlan. func (r *HavingRset) Plan(ctx context.Context) (plan.Plan, error) { - return &plans.HavingPlan{Src: r.Src, Expr: r.Expr}, nil + return &plans.HavingPlan{Src: r.Src, Expr: r.Expr, SelectList: r.SelectList}, nil } // String implements fmt.Stringer interface. diff --git a/rset/rsets/having_test.go b/rset/rsets/having_test.go index 7e2149a6f8..91a13e3052 100644 --- a/rset/rsets/having_test.go +++ b/rset/rsets/having_test.go @@ -35,12 +35,7 @@ func (s *testHavingRsetSuite) SetUpSuite(c *C) { // expr `id > 1` expr := expression.NewBinaryOperation(opcode.GT, &expression.Ident{CIStr: model.NewCIStr("id")}, expression.Value{Val: 1}) - s.r = &HavingRset{Src: tblPlan, Expr: expr} -} - -func (s *testHavingRsetSuite) TestHavingRsetCheckAndUpdateSelectList(c *C) { - resultFields := s.r.Src.GetFields() - + resultFields := tblPlan.GetFields() fields := make([]*field.Field, len(resultFields)) for i, resultField := range resultFields { name := resultField.Name @@ -52,6 +47,13 @@ func (s *testHavingRsetSuite) TestHavingRsetCheckAndUpdateSelectList(c *C) { ResultFields: resultFields, Fields: fields, } + s.r = &HavingRset{Src: tblPlan, Expr: expr, SelectList: selectList} +} + +func (s *testHavingRsetSuite) TestHavingRsetCheckAndUpdateSelectList(c *C) { + resultFields := s.r.Src.GetFields() + + selectList := s.r.SelectList groupBy := []expression.Expression{} diff --git a/stmt/stmts/select.go b/stmt/stmts/select.go index 7e6b81aa31..8b889dc5a2 100644 --- a/stmt/stmts/select.go +++ b/stmt/stmts/select.go @@ -207,8 +207,9 @@ func (s *SelectStmt) Plan(ctx context.Context) (plan.Plan, error) { if s := s.Having; s != nil { if r, err = (&rsets.HavingRset{ - Src: r, - Expr: s.Expr}).Plan(ctx); err != nil { + Src: r, + Expr: s.Expr, + SelectList: selectList}).Plan(ctx); err != nil { return nil, err } }