diff --git a/expression/builtin_string.go b/expression/builtin_string.go index b8882bbcf4080..5d942effe78d3 100644 --- a/expression/builtin_string.go +++ b/expression/builtin_string.go @@ -2696,8 +2696,11 @@ func (b *builtinQuoteSig) Clone() builtinFunc { // See https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_quote func (b *builtinQuoteSig) evalString(row chunk.Row) (string, bool, error) { str, isNull, err := b.args[0].EvalString(b.ctx, row) - if isNull || err != nil { + if err != nil { return "", true, err + } else if isNull { + // If the argument is NULL, the return value is the word "NULL" without enclosing single quotation marks. see ref. + return "NULL", false, err } runes := []rune(str) diff --git a/expression/builtin_string_test.go b/expression/builtin_string_test.go index b07ebd7d11f13..0272e2b7d8c20 100644 --- a/expression/builtin_string_test.go +++ b/expression/builtin_string_test.go @@ -2168,7 +2168,7 @@ func (s *testEvaluatorSuite) TestQuote(c *C) { {`萌萌哒(๑•ᴗ•๑)😊`, `'萌萌哒(๑•ᴗ•๑)😊'`}, {`㍿㌍㍑㌫`, `'㍿㌍㍑㌫'`}, {string([]byte{0, 26}), `'\0\Z'`}, - {nil, nil}, + {nil, "NULL"}, } for _, t := range tbl { diff --git a/expression/integration_test.go b/expression/integration_test.go index 27ea98a6bc7ff..7fbaaa7494b51 100644 --- a/expression/integration_test.go +++ b/expression/integration_test.go @@ -900,7 +900,14 @@ func (s *testIntegrationSuite) TestStringBuiltin(c *C) { result = tk.MustQuery(`select quote("aaaa"), quote(""), quote("\"\""), quote("\n\n");`) result.Check(testkit.Rows("'aaaa' '' '\"\"' '\n\n'")) result = tk.MustQuery(`select quote(0121), quote(0000), quote("中文"), quote(NULL);`) - result.Check(testkit.Rows("'121' '0' '中文' ")) + result.Check(testkit.Rows("'121' '0' '中文' NULL")) + tk.MustQuery(`select quote(null) is NULL;`).Check(testkit.Rows(`0`)) + tk.MustQuery(`select quote(null) is NOT NULL;`).Check(testkit.Rows(`1`)) + tk.MustQuery(`select length(quote(null));`).Check(testkit.Rows(`4`)) + tk.MustQuery(`select quote(null) REGEXP binary 'null'`).Check(testkit.Rows(`0`)) + tk.MustQuery(`select quote(null) REGEXP binary 'NULL'`).Check(testkit.Rows(`1`)) + tk.MustQuery(`select quote(null) REGEXP 'NULL'`).Check(testkit.Rows(`1`)) + tk.MustQuery(`select quote(null) REGEXP 'null'`).Check(testkit.Rows(`1`)) // for convert result = tk.MustQuery(`select convert("123" using "binary"), convert("中文" using "binary"), convert("中文" using "utf8"), convert("中文" using "utf8mb4"), convert(cast("中文" as binary) using "utf8");`)