From 694e086e7914a8fc0eb601327edb6bcc31d2c7f2 Mon Sep 17 00:00:00 2001 From: Yiding Cui Date: Sun, 29 Sep 2019 20:35:32 +0800 Subject: [PATCH] planner: update's select should not change the output columns (#12476) (#12483) --- go.mod | 2 -- planner/core/logical_plan_builder.go | 11 ++++++++++- planner/core/logical_plan_test.go | 4 ++++ 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 8dc89708410de..a9ecde49c5771 100644 --- a/go.mod +++ b/go.mod @@ -77,5 +77,3 @@ require ( sourcegraph.com/sourcegraph/appdash v0.0.0-20180531100431-4c381bd170b4 sourcegraph.com/sourcegraph/appdash-data v0.0.0-20151005221446-73f23eafcf67 ) - -go 1.13 diff --git a/planner/core/logical_plan_builder.go b/planner/core/logical_plan_builder.go index 5ff63363a8e68..26ffc3dcb260c 100644 --- a/planner/core/logical_plan_builder.go +++ b/planner/core/logical_plan_builder.go @@ -2584,12 +2584,21 @@ func (b *PlanBuilder) buildUpdate(ctx context.Context, update *ast.UpdateStmt) ( b.visitInfo = appendVisitInfo(b.visitInfo, mysql.SelectPriv, dbName, t.Name.L, "", nil) } + oldSchemaLen := p.Schema().Len() if sel.Where != nil { - p, err = b.buildSelection(ctx, p, sel.Where, nil) + p, err = b.buildSelection(ctx, p, update.Where, nil) if err != nil { return nil, err } } + // TODO: expression rewriter should not change the output columns. We should cut the columns here. + if p.Schema().Len() != oldSchemaLen { + proj := LogicalProjection{Exprs: expression.Column2Exprs(p.Schema().Columns[:oldSchemaLen])}.Init(b.ctx) + proj.SetSchema(expression.NewSchema(make([]*expression.Column, oldSchemaLen)...)) + copy(proj.schema.Columns, p.Schema().Columns[:oldSchemaLen]) + proj.SetChildren(p) + p = proj + } if sel.OrderBy != nil { p, err = b.buildSort(ctx, p, sel.OrderBy.Items, nil, nil) if err != nil { diff --git a/planner/core/logical_plan_test.go b/planner/core/logical_plan_test.go index 7044937619e67..eb086694f3e0e 100644 --- a/planner/core/logical_plan_test.go +++ b/planner/core/logical_plan_test.go @@ -940,6 +940,10 @@ func (s *testPlanSuite) TestPlanBuilder(c *C) { // binlog columns, because the schema and data are not consistent. plan: "LeftHashJoin{LeftHashJoin{TableReader(Table(t))->IndexLookUp(Index(t.c_d_e)[[666,666]], Table(t))}(test.t.a,test.t.b)->IndexReader(Index(t.c_d_e)[[42,42]])}(test.t.b,test.t.a)->Sel([or(6_aux_0, 10_aux_0)])->Projection->Delete", }, + { + sql: "update t set a = 2 where b in (select c from t)", + plan: "LeftHashJoin{TableReader(Table(t))->IndexReader(Index(t.c_d_e)[[NULL,+inf]])->StreamAgg}(test.t.b,test.t.c)->Projection->Update", + }, } ctx := context.Background()