From 0ac0e154d957b519796f1088b0bc9f9ba5c2e639 Mon Sep 17 00:00:00 2001 From: Andrew Date: Tue, 27 Nov 2018 11:00:41 +0800 Subject: [PATCH] planner, executor: fix `PREPARE FROM @var_name` (#8437) --- executor/prepared_test.go | 14 ++++++++++++++ planner/core/planbuilder.go | 7 +++++-- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/executor/prepared_test.go b/executor/prepared_test.go index 0338145656173..07e54ef4ff356 100644 --- a/executor/prepared_test.go +++ b/executor/prepared_test.go @@ -214,6 +214,20 @@ func (s *testSuite) TestPrepared(c *C) { c.Assert(err, IsNil) c.Assert(len(fields), Equals, 0) + // issue 8074 + tk.MustExec("drop table if exists prepare1;") + tk.MustExec("create table prepare1 (a decimal(1))") + tk.MustExec("insert into prepare1 values(1);") + _, err = tk.Exec("prepare stmt FROM @sql1") + c.Assert(err.Error(), Equals, "line 1 column 4 near \"\" (total length 4)") + tk.MustExec("SET @sql = 'update prepare1 set a=5 where a=?';") + _, err = tk.Exec("prepare stmt FROM @sql") + c.Assert(err, IsNil) + tk.MustExec("set @var=1;") + _, err = tk.Exec("execute stmt using @var") + c.Assert(err, IsNil) + tk.MustQuery("select a from prepare1;").Check(testkit.Rows("5")) + // Coverage. exec := &executor.ExecuteExec{} exec.Next(ctx, nil) diff --git a/planner/core/planbuilder.go b/planner/core/planbuilder.go index c64de57ec8847..abf67bf9ff21c 100644 --- a/planner/core/planbuilder.go +++ b/planner/core/planbuilder.go @@ -401,8 +401,11 @@ func (b *PlanBuilder) buildPrepare(x *ast.PrepareStmt) Plan { Name: x.Name, } if x.SQLVar != nil { - // TODO: Prepared statement from variable expression do not work as expected. - // p.SQLText, _ = x.SQLVar.GetValue().(string) + if v, ok := b.ctx.GetSessionVars().Users[x.SQLVar.Name]; ok { + p.SQLText = v + } else { + p.SQLText = "NULL" + } } else { p.SQLText = x.SQLText }