From 1f958c9ed254eb040b9711cc49df53fee5d4b030 Mon Sep 17 00:00:00 2001 From: Serguey Zefirov Date: Thu, 30 Nov 2023 09:22:36 +0300 Subject: [PATCH] MCOL-5625: Fixes json_query implementation Also extends func_json_value.test. --- .../basic/r/func_json_value.result | 30 +++++++++++++++++++ .../columnstore/basic/t/func_json_value.test | 28 +++++++++++++++++ utils/funcexp/func_json_query.cpp | 13 +++++++- utils/funcexp/functor_json.h | 7 +---- 4 files changed, 71 insertions(+), 7 deletions(-) diff --git a/mysql-test/columnstore/basic/r/func_json_value.result b/mysql-test/columnstore/basic/r/func_json_value.result index afceff7e6..009703c02 100644 --- a/mysql-test/columnstore/basic/r/func_json_value.result +++ b/mysql-test/columnstore/basic/r/func_json_value.result @@ -48,4 +48,34 @@ json_text $.key3 json_value json_query {"key1":123, "key2":"[1]"} $.key3 NULL NULL DROP TABLE t2; DROP TABLE t1; +CREATE TABLE zu (hu TEXT) ENGINE = COLUMNSTORE; +INSERT INTO zu(hu) VALUES ('{}'), (NULL), ('{ "": "huh", "10001" : "10001", "10002" : "10001", "10003" : "10001", "10004" : "10001", "10005" : "10001", "10006" : "10001", "10007" : "10001", "10008" : "10001", "10009" : "10001", "10010" : "10001", "10011" : "10001", "10012" : "10001", "10013" : "10001", "10014" : "10001", "10015" : "10001", "10016" : "10001", "10017" : "10001", "10018" : "10001", "10019" : "10001", "10020" : "10001", "buga" : ""}'); +INSERT INTO zu(hu) SELECT hu FROM zu; +INSERT INTO zu(hu) SELECT hu FROM zu; +INSERT INTO zu(hu) SELECT hu FROM zu; +INSERT INTO zu(hu) SELECT hu FROM zu; +INSERT INTO zu(hu) SELECT hu FROM zu; +INSERT INTO zu(hu) SELECT hu FROM zu; +INSERT INTO zu(hu) SELECT hu FROM zu; +INSERT INTO zu(hu) SELECT hu FROM zu; +INSERT INTO zu(hu) SELECT hu FROM zu; +INSERT INTO zu(hu) SELECT hu FROM zu; +INSERT INTO zu(hu) SELECT hu FROM zu; +INSERT INTO zu(hu) SELECT hu FROM zu; +INSERT INTO zu(hu) SELECT hu FROM zu; +INSERT INTO zu(hu) SELECT hu FROM zu; +INSERT INTO zu(hu) SELECT hu FROM zu; +INSERT INTO zu(hu) SELECT hu FROM zu; +INSERT INTO zu(hu) SELECT hu FROM zu; +INSERT INTO zu(hu) SELECT hu FROM zu; +INSERT INTO zu(hu) SELECT hu FROM zu; +INSERT INTO zu(hu) SELECT hu FROM zu; +SELECT COUNT(*) FROM zu; +COUNT(*) +3145728 +SELECT COUNT(*) FROM zu wHERE +JSON_QUERY(hu, '$.buga') IS NOT NULL +AND JSON_QUERY(hu, '$.zhuga') IS NULL; +COUNT(*) +0 DROP DATABASE json_value_db; diff --git a/mysql-test/columnstore/basic/t/func_json_value.test b/mysql-test/columnstore/basic/t/func_json_value.test index a51b11551..f73568be9 100644 --- a/mysql-test/columnstore/basic/t/func_json_value.test +++ b/mysql-test/columnstore/basic/t/func_json_value.test @@ -39,5 +39,33 @@ FROM t2; DROP TABLE t2; DROP TABLE t1; + +# check an absence of race bug in json_query. +CREATE TABLE zu (hu TEXT) ENGINE = COLUMNSTORE; +INSERT INTO zu(hu) VALUES ('{}'), (NULL), ('{ "": "huh", "10001" : "10001", "10002" : "10001", "10003" : "10001", "10004" : "10001", "10005" : "10001", "10006" : "10001", "10007" : "10001", "10008" : "10001", "10009" : "10001", "10010" : "10001", "10011" : "10001", "10012" : "10001", "10013" : "10001", "10014" : "10001", "10015" : "10001", "10016" : "10001", "10017" : "10001", "10018" : "10001", "10019" : "10001", "10020" : "10001", "buga" : ""}'); +INSERT INTO zu(hu) SELECT hu FROM zu; +INSERT INTO zu(hu) SELECT hu FROM zu; +INSERT INTO zu(hu) SELECT hu FROM zu; +INSERT INTO zu(hu) SELECT hu FROM zu; +INSERT INTO zu(hu) SELECT hu FROM zu; +INSERT INTO zu(hu) SELECT hu FROM zu; +INSERT INTO zu(hu) SELECT hu FROM zu; +INSERT INTO zu(hu) SELECT hu FROM zu; +INSERT INTO zu(hu) SELECT hu FROM zu; +INSERT INTO zu(hu) SELECT hu FROM zu; +INSERT INTO zu(hu) SELECT hu FROM zu; +INSERT INTO zu(hu) SELECT hu FROM zu; +INSERT INTO zu(hu) SELECT hu FROM zu; +INSERT INTO zu(hu) SELECT hu FROM zu; +INSERT INTO zu(hu) SELECT hu FROM zu; +INSERT INTO zu(hu) SELECT hu FROM zu; +INSERT INTO zu(hu) SELECT hu FROM zu; +INSERT INTO zu(hu) SELECT hu FROM zu; +INSERT INTO zu(hu) SELECT hu FROM zu; +INSERT INTO zu(hu) SELECT hu FROM zu; +SELECT COUNT(*) FROM zu; +SELECT COUNT(*) FROM zu wHERE + JSON_QUERY(hu, '$.buga') IS NOT NULL +AND JSON_QUERY(hu, '$.zhuga') IS NULL; DROP DATABASE json_value_db; diff --git a/utils/funcexp/func_json_query.cpp b/utils/funcexp/func_json_query.cpp index cf6f7d40c..447f7dedd 100644 --- a/utils/funcexp/func_json_query.cpp +++ b/utils/funcexp/func_json_query.cpp @@ -11,6 +11,16 @@ using namespace joblist; namespace funcexp { + +class QueryJSONPathWrapper : public JSONPathWrapper +{ + bool checkAndGetValue(JSONEgWrapper* je, string& res, int* error) override + { + return je->checkAndGetComplexVal(res, error); + } + +}; + bool JSONEgWrapper::checkAndGetComplexVal(string& ret, int* error) { if (json_value_scalar(this)) @@ -42,7 +52,8 @@ string Func_json_query::getStrVal(rowgroup::Row& row, FunctionParm& fp, bool& is execplan::CalpontSystemCatalog::ColType& type) { string ret; - isNull = JSONPathWrapper::extract(ret, row, fp[0], fp[1]); + QueryJSONPathWrapper qpw; + isNull = qpw.extract(ret, row, fp[0], fp[1]); return isNull ? "" : ret; } } // namespace funcexp diff --git a/utils/funcexp/functor_json.h b/utils/funcexp/functor_json.h index 09afc8d8c..1d12df584 100644 --- a/utils/funcexp/functor_json.h +++ b/utils/funcexp/functor_json.h @@ -401,7 +401,7 @@ class Func_json_value : public Func_Str /** @brief Func_json_query class */ -class Func_json_query : public Func_Str, public JSONPathWrapper +class Func_json_query : public Func_Str { public: Func_json_query() : Func_Str("json_query") @@ -411,11 +411,6 @@ class Func_json_query : public Func_Str, public JSONPathWrapper { } - bool checkAndGetValue(JSONEgWrapper* je, string& res, int* error) override - { - return je->checkAndGetComplexVal(res, error); - } - execplan::CalpontSystemCatalog::ColType operationType( FunctionParm& fp, execplan::CalpontSystemCatalog::ColType& resultType) override;