From 958c8edf128e4f0d5e754a2a1fbc284494f3db6d Mon Sep 17 00:00:00 2001 From: exialin Date: Fri, 21 Dec 2018 14:10:59 +0800 Subject: [PATCH] [parser] parser: implement Restore for ValuesExpr (#99) --- parser/ast/expressions.go | 9 ++++++++- parser/ast/expressions_test.go | 11 +++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/parser/ast/expressions.go b/parser/ast/expressions.go index 04fad58f247cd..fabb3b1791dc0 100644 --- a/parser/ast/expressions.go +++ b/parser/ast/expressions.go @@ -1060,7 +1060,14 @@ type ValuesExpr struct { // Restore implements Node interface. func (n *ValuesExpr) Restore(ctx *RestoreCtx) error { - return errors.New("Not implemented") + ctx.WriteKeyWord("VALUES") + ctx.WritePlain("(") + if err := n.Column.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore ValuesExpr.Column") + } + ctx.WritePlain(")") + + return nil } // Format the ExprNode into a Writer. diff --git a/parser/ast/expressions_test.go b/parser/ast/expressions_test.go index 5e6675fe62b6d..80e06dcf4e00a 100644 --- a/parser/ast/expressions_test.go +++ b/parser/ast/expressions_test.go @@ -249,3 +249,14 @@ func (tc *testExpressionsSuite) TestPatternLikeExprRestore(c *C) { } RunNodeRestoreTest(c, testCases, "select %s", extractNodeFunc) } + +func (tc *testExpressionsSuite) TestValuesExpr(c *C) { + testCases := []NodeRestoreTestCase{ + {"values(a)", "VALUES(`a`)"}, + {"values(a)+values(b)", "VALUES(`a`)+VALUES(`b`)"}, + } + extractNodeFunc := func(node Node) Node { + return node.(*InsertStmt).OnDuplicate[0].Expr + } + RunNodeRestoreTest(c, testCases, "insert into t values (1,2,3) on duplicate key update c=%s", extractNodeFunc) +}