From b73b833e02bfa2a82cd09cda3ecd02c95f66fc09 Mon Sep 17 00:00:00 2001 From: Ewan Chou Date: Wed, 31 May 2017 13:46:22 +0800 Subject: [PATCH] parser: use ExpressionListOpt for json functions. (#3362) --- parser/parser.y | 23 ++++++----------------- parser/parser_test.go | 6 ++++++ 2 files changed, 12 insertions(+), 17 deletions(-) diff --git a/parser/parser.y b/parser/parser.y index 3c9e3e6ca8..0d5a24cc24 100644 --- a/parser/parser.y +++ b/parser/parser.y @@ -3642,28 +3642,17 @@ FunctionCallNonKeyword: { $$ = &ast.FuncCallExpr{FnName: model.NewCIStr($1), Args: $3.([]ast.ExprNode)} } -| "JSON_EXTRACT" '(' Expression ',' ExpressionList ')' +| "JSON_EXTRACT" '(' ExpressionListOpt ')' { - var args = []ast.ExprNode{$3.(ast.ExprNode)} - args = append(args, $5.([]ast.ExprNode)...) - $$ = &ast.FuncCallExpr{ - FnName: model.NewCIStr($1), - Args: args, - } + $$ = &ast.FuncCallExpr{FnName: model.NewCIStr($1), Args: $3.([]ast.ExprNode)} } -| "JSON_UNQUOTE" '(' Expression ')' +| "JSON_UNQUOTE" '(' ExpressionListOpt ')' { - $$ = &ast.FuncCallExpr{ - FnName: model.NewCIStr($1), - Args: []ast.ExprNode{$3.(ast.ExprNode)}, - } + $$ = &ast.FuncCallExpr{FnName: model.NewCIStr($1), Args: $3.([]ast.ExprNode)} } -| "JSON_TYPE" '(' Expression ')' +| "JSON_TYPE" '(' ExpressionListOpt ')' { - $$ = &ast.FuncCallExpr{ - FnName: model.NewCIStr($1), - Args: []ast.ExprNode{$3.(ast.ExprNode)}, - } + $$ = &ast.FuncCallExpr{FnName: model.NewCIStr($1), Args: $3.([]ast.ExprNode)} } GetFormatSelector: diff --git a/parser/parser_test.go b/parser/parser_test.go index ad17f0a8d2..60911b07a2 100644 --- a/parser/parser_test.go +++ b/parser/parser_test.go @@ -1026,6 +1026,12 @@ func (s *testParserSuite) TestBuiltin(c *C) { {`SELECT UNCOMPRESS('any string');`, true}, {`SELECT UNCOMPRESSED_LENGTH(@compressed_string);`, true}, {`SELECT VALIDATE_PASSWORD_STRENGTH(@str);`, true}, + + // For JSON functions. + {`SELECT JSON_EXTRACT();`, true}, + {`SELECT JSON_UNQUOTE();`, true}, + {`SELECT JSON_TYPE('[123]');`, true}, + {`SELECT JSON_TYPE();`, true}, } s.RunTest(c, table) }