From 08b3170dd6bc16e6b5d2ecfd8523f3b5cfbefc65 Mon Sep 17 00:00:00 2001 From: LiMingji Date: Thu, 17 Jan 2019 17:37:23 +0800 Subject: [PATCH] [parser] parser: implement Restore for ExistsSubqueryExpr (#126) --- parser/ast/expressions.go | 10 +++++++++- parser/ast/expressions_test.go | 12 ++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/parser/ast/expressions.go b/parser/ast/expressions.go index 74bbcf64bd..b1ea841051 100755 --- a/parser/ast/expressions.go +++ b/parser/ast/expressions.go @@ -588,7 +588,15 @@ type ExistsSubqueryExpr struct { // Restore implements Node interface. func (n *ExistsSubqueryExpr) Restore(ctx *RestoreCtx) error { - return errors.New("Not implemented") + if n.Not { + ctx.WriteKeyWord("NOT EXISTS ") + } else { + ctx.WriteKeyWord("EXISTS ") + } + if err := n.Sel.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore ExistsSubqueryExpr.Sel") + } + return nil } // Format the ExprNode into a Writer. diff --git a/parser/ast/expressions_test.go b/parser/ast/expressions_test.go index 8eed8df43c..911663c8e3 100644 --- a/parser/ast/expressions_test.go +++ b/parser/ast/expressions_test.go @@ -324,6 +324,18 @@ func (tc *testExpressionsSuite) TestPositionExprRestore(c *C) { return node.(*SelectStmt).OrderBy.Items[0] } RunNodeRestoreTest(c, testCases, "select * from t order by %s", extractNodeFunc) + +} + +func (tc *testExpressionsSuite) TestExistsSubqueryExprRestore(c *C) { + testCases := []NodeRestoreTestCase{ + {"EXISTS (SELECT 2)", "EXISTS (SELECT 2)"}, + {"NOT EXISTS (SELECT 2)", "NOT EXISTS (SELECT 2)"}, + } + extractNodeFunc := func(node Node) Node { + return node.(*SelectStmt).Where + } + RunNodeRestoreTest(c, testCases, "select 1 from t1 where %s", extractNodeFunc) } func (tc *testExpressionsSuite) TestVariableExpr(c *C) {