1
0
mirror of https://github.com/mariadb-corporation/mariadb-columnstore-engine.git synced 2025-07-02 17:22:27 +03:00

MCOL-5625: Fixes json_query implementation

Also extends func_json_value.test.
This commit is contained in:
Serguey Zefirov
2023-11-30 09:22:36 +03:00
committed by Leonid Fedorov
parent bc88cd05b3
commit a9ab71e675
4 changed files with 71 additions and 7 deletions

View File

@ -48,4 +48,34 @@ json_text $.key3 json_value json_query
{"key1":123, "key2":"[1]"} $.key3 NULL NULL {"key1":123, "key2":"[1]"} $.key3 NULL NULL
DROP TABLE t2; DROP TABLE t2;
DROP TABLE t1; 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; DROP DATABASE json_value_db;

View File

@ -39,5 +39,33 @@ FROM t2;
DROP TABLE t2; DROP TABLE t2;
DROP TABLE t1; 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; DROP DATABASE json_value_db;

View File

@ -11,6 +11,16 @@ using namespace joblist;
namespace funcexp 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) bool JSONEgWrapper::checkAndGetComplexVal(string& ret, int* error)
{ {
if (json_value_scalar(this)) 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) execplan::CalpontSystemCatalog::ColType& type)
{ {
string ret; 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; return isNull ? "" : ret;
} }
} // namespace funcexp } // namespace funcexp

View File

@ -401,7 +401,7 @@ class Func_json_value : public Func_Str
/** @brief Func_json_query class /** @brief Func_json_query class
*/ */
class Func_json_query : public Func_Str, public JSONPathWrapper class Func_json_query : public Func_Str
{ {
public: public:
Func_json_query() : Func_Str("json_query") 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( execplan::CalpontSystemCatalog::ColType operationType(
FunctionParm& fp, execplan::CalpontSystemCatalog::ColType& resultType) override; FunctionParm& fp, execplan::CalpontSystemCatalog::ColType& resultType) override;