From e37d621a1220db68cf9af4a9fed8757793592b59 Mon Sep 17 00:00:00 2001 From: Serguey Zefirov Date: Tue, 25 Feb 2025 08:09:49 +0000 Subject: [PATCH] fix(MCOL-5842): Fix JSON_OBJECT's handling of empty strings JSON_OBJECT() (and probably some other JSON functions) now properly handle empty strings in their arguments - JSON_OBJECT used to return NULL, now it returns empty string. --- .../MCOL-5842-group-concat-json-object.result | 12 ++++++++++++ .../bugfixes/MCOL-5842-group-concat-json-object.test | 12 ++++++++++++ utils/funcexp/jsonhelpers.cpp | 2 +- 3 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 mysql-test/columnstore/bugfixes/MCOL-5842-group-concat-json-object.result create mode 100644 mysql-test/columnstore/bugfixes/MCOL-5842-group-concat-json-object.test diff --git a/mysql-test/columnstore/bugfixes/MCOL-5842-group-concat-json-object.result b/mysql-test/columnstore/bugfixes/MCOL-5842-group-concat-json-object.result new file mode 100644 index 000000000..8d8f9b3aa --- /dev/null +++ b/mysql-test/columnstore/bugfixes/MCOL-5842-group-concat-json-object.result @@ -0,0 +1,12 @@ +DROP DATABASE IF EXISTS MCOL5842; +CREATE DATABASE MCOL5842; +USE MCOL5842; +CREATE TABLE tcs(t TEXT) ENGINE=Columnstore; +INSERT INTO tcs(t) VALUES (''); +SELECT JSON_OBJECT('t', t, 'a', 'b') FROM tcs; +JSON_OBJECT('t', t, 'a', 'b') +{"t": "", "a": "b"} +SELECT GROUP_CONCAT(JSON_OBJECT('t', t, 'a', 'b')) FROM tcs; +GROUP_CONCAT(JSON_OBJECT('t', t, 'a', 'b')) +{"t": "", "a": "b"} +DROP DATABASE MCOL5842; diff --git a/mysql-test/columnstore/bugfixes/MCOL-5842-group-concat-json-object.test b/mysql-test/columnstore/bugfixes/MCOL-5842-group-concat-json-object.test new file mode 100644 index 000000000..6e203ac27 --- /dev/null +++ b/mysql-test/columnstore/bugfixes/MCOL-5842-group-concat-json-object.test @@ -0,0 +1,12 @@ +--disable_warnings +DROP DATABASE IF EXISTS MCOL5842; +--enable_warnings +CREATE DATABASE MCOL5842; +USE MCOL5842; + +CREATE TABLE tcs(t TEXT) ENGINE=Columnstore; +INSERT INTO tcs(t) VALUES (''); +SELECT JSON_OBJECT('t', t, 'a', 'b') FROM tcs; +SELECT GROUP_CONCAT(JSON_OBJECT('t', t, 'a', 'b')) FROM tcs; + +DROP DATABASE MCOL5842; diff --git a/utils/funcexp/jsonhelpers.cpp b/utils/funcexp/jsonhelpers.cpp index 042a3f33a..a1a0ca4a6 100644 --- a/utils/funcexp/jsonhelpers.cpp +++ b/utils/funcexp/jsonhelpers.cpp @@ -32,7 +32,7 @@ bool appendEscapedJS(string& ret, const CHARSET_INFO* retCS, const utils::NullSt int strLen = jsLen * 12 * jsCS->mbmaxlen / jsCS->mbminlen; char* buf = (char*)alloca(strLen); if ((strLen = json_escape(retCS, (const uchar*)rawJS, (const uchar*)rawJS + jsLen, jsCS, (uchar*)buf, - (uchar*)buf + strLen)) > 0) + (uchar*)buf + strLen)) >= 0) { buf[strLen] = '\0'; ret.append(buf, strLen);