github-actions[bot] commented on code in PR #24631: URL: https://github.com/apache/doris/pull/24631#discussion_r1334318050
########## be/test/vec/function/function_jsonb_test.cpp: ########## @@ -1487,4 +1487,574 @@ TEST(FunctionJsonbTEST, JsonbCastFromOtherTest) { "CAST", {Notnull {TypeIndex::String}, ConstedNotnull {TypeIndex::JSONB}}, {{{STRING(R"("abcd")"), Null()}, STRING(R"("abcd")")}}); } + +TEST(FunctionJsonbTEST, GetJSONSTRINGTest) { + std::string func_name = "get_json_string"; + InputTypeSet input_types = {TypeIndex::JSONB, TypeIndex::String}; + + // get json from root + DataSet data_set = { + {{Null(), STRING("$")}, Null()}, + {{STRING("null"), STRING("$")}, STRING("null")}, + {{STRING("true"), STRING("$")}, STRING("true")}, + {{STRING("false"), STRING("$")}, STRING("false")}, + {{STRING("100"), STRING("$")}, STRING("100")}, //int8 + {{STRING("10000"), STRING("$")}, STRING("10000")}, // int16 + {{STRING("1000000000"), STRING("$")}, STRING("1000000000")}, // int32 + {{STRING("1152921504606846976"), STRING("$")}, STRING("1152921504606846976")}, // int64 + {{STRING("6.18"), STRING("$")}, STRING("6.18")}, // double + {{STRING(R"("abcd")"), STRING("$")}, STRING("abcd")}, // string + {{STRING("{}"), STRING("$")}, STRING("{}")}, // empty object + {{STRING(R"({"k1":"v31", "k2": 300})"), STRING("$")}, + STRING(R"({"k1":"v31","k2":300})")}, // object + {{STRING("[]"), STRING("$")}, STRING("[]")}, // empty array + {{STRING("[123, 456]"), STRING("$")}, STRING("[123,456]")}, // int array + {{STRING(R"(["abc", "def"])"), STRING("$")}, + STRING(R"(["abc","def"])")}, // string array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$")}, + STRING(R"([null,true,false,100,6.18,"abc"])")}, // multi type array + {{STRING(R"([{"k1":"v41", "k2": 400}, 1, "a", 3.14])"), STRING("$")}, + STRING(R"([{"k1":"v41","k2":400},1,"a",3.14])")}, // complex array + }; + + check_function<DataTypeString, true>(func_name, input_types, data_set); + + // get json from obejct + data_set = { + {{Null(), STRING("$.k1")}, Null()}, + {{STRING("null"), STRING("$.k1")}, Null()}, + {{STRING("true"), STRING("$.k1")}, Null()}, + {{STRING("false"), STRING("$.k1")}, Null()}, + {{STRING("100"), STRING("$.k1")}, Null()}, //int8 + {{STRING("10000"), STRING("$.k1")}, Null()}, // int16 + {{STRING("1000000000"), STRING("$.k1")}, Null()}, // int32 + {{STRING("1152921504606846976"), STRING("$.k1")}, Null()}, // int64 + {{STRING("6.18"), STRING("$.k1")}, Null()}, // double + {{STRING(R"("abcd")"), STRING("$.k1")}, Null()}, // string + {{STRING("{}"), STRING("$.k1")}, Null()}, // empty object + {{STRING(R"({"k1":"v31", "k2": 300})"), STRING("$.k1")}, STRING("v31")}, // object + {{STRING("[]"), STRING("$.k1")}, Null()}, // empty array + {{STRING("[123, 456]"), STRING("$.k1")}, Null()}, // int array + {{STRING(R"(["abc", "def"])"), STRING("$.k1")}, Null()}, // string array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$.k1")}, + Null()}, // multi type array + {{STRING(R"([{"k1":"v41", "k2": 400}, 1, "a", 3.14])"), STRING("$.k1")}, + Null()}, // complex array + }; + + check_function<DataTypeString, true>(func_name, input_types, data_set); + + // get json from array + data_set = { + {{Null(), STRING("$[0]")}, Null()}, + {{STRING("null"), STRING("$[0]")}, Null()}, + {{STRING("true"), STRING("$[0]")}, Null()}, + {{STRING("false"), STRING("$[0]")}, Null()}, + {{STRING("100"), STRING("$[0]")}, Null()}, //int8 + {{STRING("10000"), STRING("$[0]")}, Null()}, // int16 + {{STRING("1000000000"), STRING("$[0]")}, Null()}, // int32 + {{STRING("1152921504606846976"), STRING("$[0]")}, Null()}, // int64 + {{STRING("6.18"), STRING("$[0]")}, Null()}, // double + {{STRING(R"("abcd")"), STRING("$[0]")}, Null()}, // string + {{STRING("{}"), STRING("$[0]")}, STRING("{}")}, // empty object + {{STRING(R"({"k1":"v31", "k2": 300})"), STRING("$[0]")}, + STRING(R"({"k1":"v31","k2":300})")}, // object + {{STRING("[]"), STRING("$[0]")}, Null()}, // empty array + {{STRING("null"), STRING("$[1]")}, Null()}, + {{STRING("true"), STRING("$[1]")}, Null()}, + {{STRING("false"), STRING("$[1]")}, Null()}, + {{STRING("100"), STRING("$[1]")}, Null()}, //int8 + {{STRING("10000"), STRING("$[1]")}, Null()}, // int16 + {{STRING("1000000000"), STRING("$[1]")}, Null()}, // int32 + {{STRING("1152921504606846976"), STRING("$[1]")}, Null()}, // int64 + {{STRING("6.18"), STRING("$[1]")}, Null()}, // double + {{STRING(R"("abcd")"), STRING("$[1]")}, Null()}, // string + {{STRING("{}"), STRING("$[1]")}, Null()}, // empty object + {{STRING(R"({"k1":"v31", "k2": 300})"), STRING("$[1]")}, Null()}, // object + {{STRING("[]"), STRING("$[1]")}, Null()}, // empty array + {{STRING("[123, 456]"), STRING("$[0]")}, STRING("123")}, // int array + {{STRING("[123, 456]"), STRING("$[1]")}, STRING("456")}, // int array + {{STRING("[123, 456]"), STRING("$[2]")}, Null()}, // int array + {{STRING(R"(["abc", "def"])"), STRING("$[0]")}, STRING("abc")}, // string array + {{STRING(R"(["abc", "def"])"), STRING("$[1]")}, STRING("def")}, // string array + {{STRING(R"(["abc", "def"])"), STRING("$[2]")}, Null()}, // string array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$[0]")}, + STRING("null")}, // multi type array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$[1]")}, + STRING("true")}, // multi type array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$[2]")}, + STRING("false")}, // multi type array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$[3]")}, + STRING("100")}, // multi type array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$[4]")}, + STRING("6.18")}, // multi type array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$[5]")}, + STRING("abc")}, // multi type array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$[6]")}, + Null()}, // multi type array + {{STRING(R"([{"k1":"v41", "k2": 400}, 1, "a", 3.14])"), STRING("$[0]")}, + STRING(R"({"k1":"v41","k2":400})")}, // complex array + {{STRING(R"([{"k1":"v41", "k2": 400}, 1, "a", 3.14])"), STRING("$[1]")}, + STRING("1")}, // complex array + {{STRING(R"([{"k1":"v41", "k2": 400}, 1, "a", 3.14])"), STRING("$[2]")}, + STRING("a")}, // complex array + {{STRING(R"([{"k1":"v41", "k2": 400}, 1, "a", 3.14])"), STRING("$[3]")}, + STRING("3.14")}, // complex array + {{STRING(R"([{"k1":"v41", "k2": 400}, 1, "a", 3.14])"), STRING("$[4]")}, + Null()}, // complex array + }; + + check_function<DataTypeString, true>(func_name, input_types, data_set); + + // get json with path $[0].k1 + data_set = { + {{Null(), STRING("$[0].k1")}, Null()}, + {{STRING("null"), STRING("$[0].k1")}, Null()}, + {{STRING("true"), STRING("$[0].k1")}, Null()}, + {{STRING("false"), STRING("$[0].k1")}, Null()}, + {{STRING("100"), STRING("$[0].k1")}, Null()}, //int8 + {{STRING("10000"), STRING("$[0].k1")}, Null()}, // int16 + {{STRING("1000000000"), STRING("$[0].k1")}, Null()}, // int32 + {{STRING("1152921504606846976"), STRING("$[0].k1")}, Null()}, // int64 + {{STRING("6.18"), STRING("$[0].k1")}, Null()}, // double + {{STRING(R"("abcd")"), STRING("$[0].k1")}, Null()}, // string + {{STRING("{}"), STRING("$[0].k1")}, Null()}, // empty object + {{STRING(R"({"k1":"v31", "k2": 300})"), STRING("$[0].k1")}, STRING(R"(v31)")}, // object + {{STRING("[]"), STRING("$[0].k1")}, Null()}, // empty array + {{STRING("[123, 456]"), STRING("$[0].k1")}, Null()}, // int array + {{STRING(R"(["abc", "def"])"), STRING("$[0].k1")}, Null()}, // string array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$[0].k1")}, + Null()}, // multi type array + {{STRING(R"([{"k1":"v41", "k2": 400}, 1, "a", 3.14])"), STRING("$[0].k1")}, + STRING("v41")}, // complex array + }; + + check_function<DataTypeString, true>(func_name, input_types, data_set); +} + +TEST(FunctionJsonbTEST, GetJsonIntTest) { + std::string func_name = "get_json_int"; + InputTypeSet input_types = {TypeIndex::JSONB, TypeIndex::String}; Review Comment: warning: variable 'input_types' is not initialized [cppcoreguidelines-init-variables] ```suggestion InputTypeSet input_types = 0 = {TypeIndex::JSONB, TypeIndex::String}; ``` ########## be/test/vec/function/function_jsonb_test.cpp: ########## @@ -1487,4 +1487,574 @@ TEST(FunctionJsonbTEST, JsonbCastFromOtherTest) { "CAST", {Notnull {TypeIndex::String}, ConstedNotnull {TypeIndex::JSONB}}, {{{STRING(R"("abcd")"), Null()}, STRING(R"("abcd")")}}); } + +TEST(FunctionJsonbTEST, GetJSONSTRINGTest) { + std::string func_name = "get_json_string"; + InputTypeSet input_types = {TypeIndex::JSONB, TypeIndex::String}; + + // get json from root + DataSet data_set = { + {{Null(), STRING("$")}, Null()}, + {{STRING("null"), STRING("$")}, STRING("null")}, + {{STRING("true"), STRING("$")}, STRING("true")}, + {{STRING("false"), STRING("$")}, STRING("false")}, + {{STRING("100"), STRING("$")}, STRING("100")}, //int8 + {{STRING("10000"), STRING("$")}, STRING("10000")}, // int16 + {{STRING("1000000000"), STRING("$")}, STRING("1000000000")}, // int32 + {{STRING("1152921504606846976"), STRING("$")}, STRING("1152921504606846976")}, // int64 + {{STRING("6.18"), STRING("$")}, STRING("6.18")}, // double + {{STRING(R"("abcd")"), STRING("$")}, STRING("abcd")}, // string + {{STRING("{}"), STRING("$")}, STRING("{}")}, // empty object + {{STRING(R"({"k1":"v31", "k2": 300})"), STRING("$")}, + STRING(R"({"k1":"v31","k2":300})")}, // object + {{STRING("[]"), STRING("$")}, STRING("[]")}, // empty array + {{STRING("[123, 456]"), STRING("$")}, STRING("[123,456]")}, // int array + {{STRING(R"(["abc", "def"])"), STRING("$")}, + STRING(R"(["abc","def"])")}, // string array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$")}, + STRING(R"([null,true,false,100,6.18,"abc"])")}, // multi type array + {{STRING(R"([{"k1":"v41", "k2": 400}, 1, "a", 3.14])"), STRING("$")}, + STRING(R"([{"k1":"v41","k2":400},1,"a",3.14])")}, // complex array + }; + + check_function<DataTypeString, true>(func_name, input_types, data_set); + + // get json from obejct + data_set = { + {{Null(), STRING("$.k1")}, Null()}, + {{STRING("null"), STRING("$.k1")}, Null()}, + {{STRING("true"), STRING("$.k1")}, Null()}, + {{STRING("false"), STRING("$.k1")}, Null()}, + {{STRING("100"), STRING("$.k1")}, Null()}, //int8 + {{STRING("10000"), STRING("$.k1")}, Null()}, // int16 + {{STRING("1000000000"), STRING("$.k1")}, Null()}, // int32 + {{STRING("1152921504606846976"), STRING("$.k1")}, Null()}, // int64 + {{STRING("6.18"), STRING("$.k1")}, Null()}, // double + {{STRING(R"("abcd")"), STRING("$.k1")}, Null()}, // string + {{STRING("{}"), STRING("$.k1")}, Null()}, // empty object + {{STRING(R"({"k1":"v31", "k2": 300})"), STRING("$.k1")}, STRING("v31")}, // object + {{STRING("[]"), STRING("$.k1")}, Null()}, // empty array + {{STRING("[123, 456]"), STRING("$.k1")}, Null()}, // int array + {{STRING(R"(["abc", "def"])"), STRING("$.k1")}, Null()}, // string array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$.k1")}, + Null()}, // multi type array + {{STRING(R"([{"k1":"v41", "k2": 400}, 1, "a", 3.14])"), STRING("$.k1")}, + Null()}, // complex array + }; + + check_function<DataTypeString, true>(func_name, input_types, data_set); + + // get json from array + data_set = { + {{Null(), STRING("$[0]")}, Null()}, + {{STRING("null"), STRING("$[0]")}, Null()}, + {{STRING("true"), STRING("$[0]")}, Null()}, + {{STRING("false"), STRING("$[0]")}, Null()}, + {{STRING("100"), STRING("$[0]")}, Null()}, //int8 + {{STRING("10000"), STRING("$[0]")}, Null()}, // int16 + {{STRING("1000000000"), STRING("$[0]")}, Null()}, // int32 + {{STRING("1152921504606846976"), STRING("$[0]")}, Null()}, // int64 + {{STRING("6.18"), STRING("$[0]")}, Null()}, // double + {{STRING(R"("abcd")"), STRING("$[0]")}, Null()}, // string + {{STRING("{}"), STRING("$[0]")}, STRING("{}")}, // empty object + {{STRING(R"({"k1":"v31", "k2": 300})"), STRING("$[0]")}, + STRING(R"({"k1":"v31","k2":300})")}, // object + {{STRING("[]"), STRING("$[0]")}, Null()}, // empty array + {{STRING("null"), STRING("$[1]")}, Null()}, + {{STRING("true"), STRING("$[1]")}, Null()}, + {{STRING("false"), STRING("$[1]")}, Null()}, + {{STRING("100"), STRING("$[1]")}, Null()}, //int8 + {{STRING("10000"), STRING("$[1]")}, Null()}, // int16 + {{STRING("1000000000"), STRING("$[1]")}, Null()}, // int32 + {{STRING("1152921504606846976"), STRING("$[1]")}, Null()}, // int64 + {{STRING("6.18"), STRING("$[1]")}, Null()}, // double + {{STRING(R"("abcd")"), STRING("$[1]")}, Null()}, // string + {{STRING("{}"), STRING("$[1]")}, Null()}, // empty object + {{STRING(R"({"k1":"v31", "k2": 300})"), STRING("$[1]")}, Null()}, // object + {{STRING("[]"), STRING("$[1]")}, Null()}, // empty array + {{STRING("[123, 456]"), STRING("$[0]")}, STRING("123")}, // int array + {{STRING("[123, 456]"), STRING("$[1]")}, STRING("456")}, // int array + {{STRING("[123, 456]"), STRING("$[2]")}, Null()}, // int array + {{STRING(R"(["abc", "def"])"), STRING("$[0]")}, STRING("abc")}, // string array + {{STRING(R"(["abc", "def"])"), STRING("$[1]")}, STRING("def")}, // string array + {{STRING(R"(["abc", "def"])"), STRING("$[2]")}, Null()}, // string array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$[0]")}, + STRING("null")}, // multi type array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$[1]")}, + STRING("true")}, // multi type array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$[2]")}, + STRING("false")}, // multi type array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$[3]")}, + STRING("100")}, // multi type array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$[4]")}, + STRING("6.18")}, // multi type array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$[5]")}, + STRING("abc")}, // multi type array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$[6]")}, + Null()}, // multi type array + {{STRING(R"([{"k1":"v41", "k2": 400}, 1, "a", 3.14])"), STRING("$[0]")}, + STRING(R"({"k1":"v41","k2":400})")}, // complex array + {{STRING(R"([{"k1":"v41", "k2": 400}, 1, "a", 3.14])"), STRING("$[1]")}, + STRING("1")}, // complex array + {{STRING(R"([{"k1":"v41", "k2": 400}, 1, "a", 3.14])"), STRING("$[2]")}, + STRING("a")}, // complex array + {{STRING(R"([{"k1":"v41", "k2": 400}, 1, "a", 3.14])"), STRING("$[3]")}, + STRING("3.14")}, // complex array + {{STRING(R"([{"k1":"v41", "k2": 400}, 1, "a", 3.14])"), STRING("$[4]")}, + Null()}, // complex array + }; + + check_function<DataTypeString, true>(func_name, input_types, data_set); + + // get json with path $[0].k1 + data_set = { + {{Null(), STRING("$[0].k1")}, Null()}, + {{STRING("null"), STRING("$[0].k1")}, Null()}, + {{STRING("true"), STRING("$[0].k1")}, Null()}, + {{STRING("false"), STRING("$[0].k1")}, Null()}, + {{STRING("100"), STRING("$[0].k1")}, Null()}, //int8 + {{STRING("10000"), STRING("$[0].k1")}, Null()}, // int16 + {{STRING("1000000000"), STRING("$[0].k1")}, Null()}, // int32 + {{STRING("1152921504606846976"), STRING("$[0].k1")}, Null()}, // int64 + {{STRING("6.18"), STRING("$[0].k1")}, Null()}, // double + {{STRING(R"("abcd")"), STRING("$[0].k1")}, Null()}, // string + {{STRING("{}"), STRING("$[0].k1")}, Null()}, // empty object + {{STRING(R"({"k1":"v31", "k2": 300})"), STRING("$[0].k1")}, STRING(R"(v31)")}, // object + {{STRING("[]"), STRING("$[0].k1")}, Null()}, // empty array + {{STRING("[123, 456]"), STRING("$[0].k1")}, Null()}, // int array + {{STRING(R"(["abc", "def"])"), STRING("$[0].k1")}, Null()}, // string array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$[0].k1")}, + Null()}, // multi type array + {{STRING(R"([{"k1":"v41", "k2": 400}, 1, "a", 3.14])"), STRING("$[0].k1")}, + STRING("v41")}, // complex array + }; + + check_function<DataTypeString, true>(func_name, input_types, data_set); +} + +TEST(FunctionJsonbTEST, GetJsonIntTest) { + std::string func_name = "get_json_int"; + InputTypeSet input_types = {TypeIndex::JSONB, TypeIndex::String}; + + // get json from root + DataSet data_set = { Review Comment: warning: variable 'data_set' is not initialized [cppcoreguidelines-init-variables] ```suggestion DataSet data_set = 0 = { ``` ########## be/test/vec/function/function_jsonb_test.cpp: ########## @@ -1487,4 +1487,574 @@ TEST(FunctionJsonbTEST, JsonbCastFromOtherTest) { "CAST", {Notnull {TypeIndex::String}, ConstedNotnull {TypeIndex::JSONB}}, {{{STRING(R"("abcd")"), Null()}, STRING(R"("abcd")")}}); } + +TEST(FunctionJsonbTEST, GetJSONSTRINGTest) { + std::string func_name = "get_json_string"; + InputTypeSet input_types = {TypeIndex::JSONB, TypeIndex::String}; + + // get json from root + DataSet data_set = { + {{Null(), STRING("$")}, Null()}, + {{STRING("null"), STRING("$")}, STRING("null")}, + {{STRING("true"), STRING("$")}, STRING("true")}, + {{STRING("false"), STRING("$")}, STRING("false")}, + {{STRING("100"), STRING("$")}, STRING("100")}, //int8 + {{STRING("10000"), STRING("$")}, STRING("10000")}, // int16 + {{STRING("1000000000"), STRING("$")}, STRING("1000000000")}, // int32 + {{STRING("1152921504606846976"), STRING("$")}, STRING("1152921504606846976")}, // int64 + {{STRING("6.18"), STRING("$")}, STRING("6.18")}, // double + {{STRING(R"("abcd")"), STRING("$")}, STRING("abcd")}, // string + {{STRING("{}"), STRING("$")}, STRING("{}")}, // empty object + {{STRING(R"({"k1":"v31", "k2": 300})"), STRING("$")}, + STRING(R"({"k1":"v31","k2":300})")}, // object + {{STRING("[]"), STRING("$")}, STRING("[]")}, // empty array + {{STRING("[123, 456]"), STRING("$")}, STRING("[123,456]")}, // int array + {{STRING(R"(["abc", "def"])"), STRING("$")}, + STRING(R"(["abc","def"])")}, // string array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$")}, + STRING(R"([null,true,false,100,6.18,"abc"])")}, // multi type array + {{STRING(R"([{"k1":"v41", "k2": 400}, 1, "a", 3.14])"), STRING("$")}, + STRING(R"([{"k1":"v41","k2":400},1,"a",3.14])")}, // complex array + }; + + check_function<DataTypeString, true>(func_name, input_types, data_set); + + // get json from obejct + data_set = { + {{Null(), STRING("$.k1")}, Null()}, + {{STRING("null"), STRING("$.k1")}, Null()}, + {{STRING("true"), STRING("$.k1")}, Null()}, + {{STRING("false"), STRING("$.k1")}, Null()}, + {{STRING("100"), STRING("$.k1")}, Null()}, //int8 + {{STRING("10000"), STRING("$.k1")}, Null()}, // int16 + {{STRING("1000000000"), STRING("$.k1")}, Null()}, // int32 + {{STRING("1152921504606846976"), STRING("$.k1")}, Null()}, // int64 + {{STRING("6.18"), STRING("$.k1")}, Null()}, // double + {{STRING(R"("abcd")"), STRING("$.k1")}, Null()}, // string + {{STRING("{}"), STRING("$.k1")}, Null()}, // empty object + {{STRING(R"({"k1":"v31", "k2": 300})"), STRING("$.k1")}, STRING("v31")}, // object + {{STRING("[]"), STRING("$.k1")}, Null()}, // empty array + {{STRING("[123, 456]"), STRING("$.k1")}, Null()}, // int array + {{STRING(R"(["abc", "def"])"), STRING("$.k1")}, Null()}, // string array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$.k1")}, + Null()}, // multi type array + {{STRING(R"([{"k1":"v41", "k2": 400}, 1, "a", 3.14])"), STRING("$.k1")}, + Null()}, // complex array + }; + + check_function<DataTypeString, true>(func_name, input_types, data_set); + + // get json from array + data_set = { + {{Null(), STRING("$[0]")}, Null()}, + {{STRING("null"), STRING("$[0]")}, Null()}, + {{STRING("true"), STRING("$[0]")}, Null()}, + {{STRING("false"), STRING("$[0]")}, Null()}, + {{STRING("100"), STRING("$[0]")}, Null()}, //int8 + {{STRING("10000"), STRING("$[0]")}, Null()}, // int16 + {{STRING("1000000000"), STRING("$[0]")}, Null()}, // int32 + {{STRING("1152921504606846976"), STRING("$[0]")}, Null()}, // int64 + {{STRING("6.18"), STRING("$[0]")}, Null()}, // double + {{STRING(R"("abcd")"), STRING("$[0]")}, Null()}, // string + {{STRING("{}"), STRING("$[0]")}, STRING("{}")}, // empty object + {{STRING(R"({"k1":"v31", "k2": 300})"), STRING("$[0]")}, + STRING(R"({"k1":"v31","k2":300})")}, // object + {{STRING("[]"), STRING("$[0]")}, Null()}, // empty array + {{STRING("null"), STRING("$[1]")}, Null()}, + {{STRING("true"), STRING("$[1]")}, Null()}, + {{STRING("false"), STRING("$[1]")}, Null()}, + {{STRING("100"), STRING("$[1]")}, Null()}, //int8 + {{STRING("10000"), STRING("$[1]")}, Null()}, // int16 + {{STRING("1000000000"), STRING("$[1]")}, Null()}, // int32 + {{STRING("1152921504606846976"), STRING("$[1]")}, Null()}, // int64 + {{STRING("6.18"), STRING("$[1]")}, Null()}, // double + {{STRING(R"("abcd")"), STRING("$[1]")}, Null()}, // string + {{STRING("{}"), STRING("$[1]")}, Null()}, // empty object + {{STRING(R"({"k1":"v31", "k2": 300})"), STRING("$[1]")}, Null()}, // object + {{STRING("[]"), STRING("$[1]")}, Null()}, // empty array + {{STRING("[123, 456]"), STRING("$[0]")}, STRING("123")}, // int array + {{STRING("[123, 456]"), STRING("$[1]")}, STRING("456")}, // int array + {{STRING("[123, 456]"), STRING("$[2]")}, Null()}, // int array + {{STRING(R"(["abc", "def"])"), STRING("$[0]")}, STRING("abc")}, // string array + {{STRING(R"(["abc", "def"])"), STRING("$[1]")}, STRING("def")}, // string array + {{STRING(R"(["abc", "def"])"), STRING("$[2]")}, Null()}, // string array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$[0]")}, + STRING("null")}, // multi type array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$[1]")}, + STRING("true")}, // multi type array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$[2]")}, + STRING("false")}, // multi type array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$[3]")}, + STRING("100")}, // multi type array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$[4]")}, + STRING("6.18")}, // multi type array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$[5]")}, + STRING("abc")}, // multi type array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$[6]")}, + Null()}, // multi type array + {{STRING(R"([{"k1":"v41", "k2": 400}, 1, "a", 3.14])"), STRING("$[0]")}, + STRING(R"({"k1":"v41","k2":400})")}, // complex array + {{STRING(R"([{"k1":"v41", "k2": 400}, 1, "a", 3.14])"), STRING("$[1]")}, + STRING("1")}, // complex array + {{STRING(R"([{"k1":"v41", "k2": 400}, 1, "a", 3.14])"), STRING("$[2]")}, + STRING("a")}, // complex array + {{STRING(R"([{"k1":"v41", "k2": 400}, 1, "a", 3.14])"), STRING("$[3]")}, + STRING("3.14")}, // complex array + {{STRING(R"([{"k1":"v41", "k2": 400}, 1, "a", 3.14])"), STRING("$[4]")}, + Null()}, // complex array + }; + + check_function<DataTypeString, true>(func_name, input_types, data_set); + + // get json with path $[0].k1 + data_set = { + {{Null(), STRING("$[0].k1")}, Null()}, + {{STRING("null"), STRING("$[0].k1")}, Null()}, + {{STRING("true"), STRING("$[0].k1")}, Null()}, + {{STRING("false"), STRING("$[0].k1")}, Null()}, + {{STRING("100"), STRING("$[0].k1")}, Null()}, //int8 + {{STRING("10000"), STRING("$[0].k1")}, Null()}, // int16 + {{STRING("1000000000"), STRING("$[0].k1")}, Null()}, // int32 + {{STRING("1152921504606846976"), STRING("$[0].k1")}, Null()}, // int64 + {{STRING("6.18"), STRING("$[0].k1")}, Null()}, // double + {{STRING(R"("abcd")"), STRING("$[0].k1")}, Null()}, // string + {{STRING("{}"), STRING("$[0].k1")}, Null()}, // empty object + {{STRING(R"({"k1":"v31", "k2": 300})"), STRING("$[0].k1")}, STRING(R"(v31)")}, // object + {{STRING("[]"), STRING("$[0].k1")}, Null()}, // empty array + {{STRING("[123, 456]"), STRING("$[0].k1")}, Null()}, // int array + {{STRING(R"(["abc", "def"])"), STRING("$[0].k1")}, Null()}, // string array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$[0].k1")}, + Null()}, // multi type array + {{STRING(R"([{"k1":"v41", "k2": 400}, 1, "a", 3.14])"), STRING("$[0].k1")}, + STRING("v41")}, // complex array + }; + + check_function<DataTypeString, true>(func_name, input_types, data_set); +} + +TEST(FunctionJsonbTEST, GetJsonIntTest) { + std::string func_name = "get_json_int"; + InputTypeSet input_types = {TypeIndex::JSONB, TypeIndex::String}; + + // get json from root + DataSet data_set = { + {{Null(), STRING("$")}, Null()}, + {{STRING("null"), STRING("$")}, Null()}, + {{STRING("true"), STRING("$")}, Null()}, + {{STRING("false"), STRING("$")}, Null()}, + {{STRING("100"), STRING("$")}, INT(100)}, //int8 + {{STRING("10000"), STRING("$")}, INT(10000)}, // int16 + {{STRING("1000000000"), STRING("$")}, INT(1000000000)}, // int32 + {{STRING("1152921504606846976"), STRING("$")}, Null()}, // int64 + {{STRING("6.18"), STRING("$")}, Null()}, // double + {{STRING(R"("abcd")"), STRING("$")}, Null()}, // string + {{STRING("{}"), STRING("$")}, Null()}, // empty object + {{STRING(R"({"k1":"v31", "k2": 300})"), STRING("$")}, Null()}, // object + {{STRING("[]"), STRING("$")}, Null()}, // empty array + {{STRING("[123, 456]"), STRING("$")}, Null()}, // int array + {{STRING(R"(["abc", "def"])"), STRING("$")}, Null()}, // string array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$")}, + Null()}, // multi type array + {{STRING(R"([{"k1":"v41", "k2": 400}, 1, "a", 3.14])"), STRING("$")}, + Null()}, // complex array + }; + + check_function<DataTypeInt32, true>(func_name, input_types, data_set); + + // get json from obejct + data_set = { + {{Null(), STRING("$.k1")}, Null()}, + {{STRING("null"), STRING("$.k1")}, Null()}, + {{STRING("true"), STRING("$.k1")}, Null()}, + {{STRING("false"), STRING("$.k1")}, Null()}, + {{STRING("100"), STRING("$.k1")}, Null()}, //int8 + {{STRING("10000"), STRING("$.k1")}, Null()}, // int16 + {{STRING("1000000000"), STRING("$.k1")}, Null()}, // int32 + {{STRING("1152921504606846976"), STRING("$.k1")}, Null()}, // int64 + {{STRING("6.18"), STRING("$.k1")}, Null()}, // double + {{STRING(R"("abcd")"), STRING("$.k1")}, Null()}, // string + {{STRING("{}"), STRING("$.k1")}, Null()}, // empty object + {{STRING(R"({"k1":"v31", "k2": 300})"), STRING("$.k1")}, Null()}, // object + {{STRING("[]"), STRING("$.k1")}, Null()}, // empty array + {{STRING("[123, 456]"), STRING("$.k1")}, Null()}, // int array + {{STRING(R"(["abc", "def"])"), STRING("$.k1")}, Null()}, // string array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$.k1")}, + Null()}, // multi type array + {{STRING(R"([{"k1":"v41", "k2": 400}, 1, "a", 3.14])"), STRING("$.k1")}, + Null()}, // complex array + }; + + check_function<DataTypeInt32, true>(func_name, input_types, data_set); + + // get json from array + data_set = { + {{Null(), STRING("$[0]")}, Null()}, + {{STRING("null"), STRING("$[0]")}, Null()}, + {{STRING("true"), STRING("$[0]")}, Null()}, + {{STRING("false"), STRING("$[0]")}, Null()}, + {{STRING("100"), STRING("$[0]")}, Null()}, //int8 + {{STRING("10000"), STRING("$[0]")}, Null()}, // int16 + {{STRING("1000000000"), STRING("$[0]")}, Null()}, // int32 + {{STRING("1152921504606846976"), STRING("$[0]")}, Null()}, // int64 + {{STRING("6.18"), STRING("$[0]")}, Null()}, // double + {{STRING(R"("abcd")"), STRING("$[0]")}, Null()}, // string + {{STRING("{}"), STRING("$[0]")}, Null()}, // empty object + {{STRING(R"({"k1":"v31", "k2": 300})"), STRING("$[0]")}, Null()}, // object + {{STRING("[]"), STRING("$[0]")}, Null()}, // empty array + {{STRING("null"), STRING("$[1]")}, Null()}, + {{STRING("true"), STRING("$[1]")}, Null()}, + {{STRING("false"), STRING("$[1]")}, Null()}, + {{STRING("100"), STRING("$[1]")}, Null()}, //int8 + {{STRING("10000"), STRING("$[1]")}, Null()}, // int16 + {{STRING("1000000000"), STRING("$[1]")}, Null()}, // int32 + {{STRING("1152921504606846976"), STRING("$[1]")}, Null()}, // int64 + {{STRING("6.18"), STRING("$[1]")}, Null()}, // double + {{STRING(R"("abcd")"), STRING("$[1]")}, Null()}, // string + {{STRING("{}"), STRING("$[1]")}, Null()}, // empty object + {{STRING(R"({"k1":"v31", "k2": 300})"), STRING("$[1]")}, Null()}, // object + {{STRING("[]"), STRING("$[1]")}, Null()}, // empty array + {{STRING("[123, 456]"), STRING("$[0]")}, INT(123)}, // int array + {{STRING("[123, 456]"), STRING("$[1]")}, INT(456)}, // int array + {{STRING("[123, 456]"), STRING("$[2]")}, Null()}, // int array + {{STRING(R"(["abc", "def"])"), STRING("$[0]")}, Null()}, // string array + {{STRING(R"(["abc", "def"])"), STRING("$[1]")}, Null()}, // string array + {{STRING(R"(["abc", "def"])"), STRING("$[2]")}, Null()}, // string array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$[0]")}, + Null()}, // multi type array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$[1]")}, + Null()}, // multi type array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$[2]")}, + Null()}, // multi type array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$[3]")}, + INT(100)}, // multi type array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$[4]")}, + Null()}, // multi type array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$[5]")}, + Null()}, // multi type array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$[6]")}, + Null()}, // multi type array + {{STRING(R"([{"k1":"v41", "k2": 400}, 1, "a", 3.14])"), STRING("$[0]")}, + Null()}, // complex array + {{STRING(R"([{"k1":"v41", "k2": 400}, 1, "a", 3.14])"), STRING("$[1]")}, + INT(1)}, // complex array + {{STRING(R"([{"k1":"v41", "k2": 400}, 1, "a", 3.14])"), STRING("$[2]")}, + Null()}, // complex array + {{STRING(R"([{"k1":"v41", "k2": 400}, 1, "a", 3.14])"), STRING("$[3]")}, + Null()}, // complex array + {{STRING(R"([{"k1":"v41", "k2": 400}, 1, "a", 3.14])"), STRING("$[4]")}, + Null()}, // complex array + }; + + check_function<DataTypeInt32, true>(func_name, input_types, data_set); + + // get json with path $[0].k1 + data_set = { + {{Null(), STRING("$[0].k1")}, Null()}, + {{STRING("null"), STRING("$[0].k1")}, Null()}, + {{STRING("true"), STRING("$[0].k1")}, Null()}, + {{STRING("false"), STRING("$[0].k1")}, Null()}, + {{STRING("100"), STRING("$[0].k1")}, Null()}, //int8 + {{STRING("10000"), STRING("$[0].k1")}, Null()}, // int16 + {{STRING("1000000000"), STRING("$[0].k1")}, Null()}, // int32 + {{STRING("1152921504606846976"), STRING("$[0].k1")}, Null()}, // int64 + {{STRING("6.18"), STRING("$[0].k1")}, Null()}, // double + {{STRING(R"("abcd")"), STRING("$[0].k1")}, Null()}, // string + {{STRING("{}"), STRING("$[0].k1")}, Null()}, // empty object + {{STRING(R"({"k1":"v31", "k2": 300})"), STRING("$[0].k1")}, Null()}, // object + {{STRING("[]"), STRING("$[0].k1")}, Null()}, // empty array + {{STRING("[123, 456]"), STRING("$[0].k1")}, Null()}, // int array + {{STRING(R"(["abc", "def"])"), STRING("$[0].k1")}, Null()}, // string array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$[0].k1")}, + Null()}, // multi type array + {{STRING(R"([{"k1":"v41", "k2": 400}, 1, "a", 3.14])"), STRING("$[0].k1")}, + Null()}, // complex array + {{STRING(R"([{"k1":"v41", "k2": 400}, 1, "a", 3.14])"), STRING("$[0].k2")}, + INT(400)}, // complex array + }; + + check_function<DataTypeInt32, true>(func_name, input_types, data_set); +} + +TEST(FunctionJsonbTEST, GetJsonBigIntTest) { + std::string func_name = "get_json_bigint"; + InputTypeSet input_types = {TypeIndex::JSONB, TypeIndex::String}; + + // get json from root + DataSet data_set = { + {{Null(), STRING("$")}, Null()}, + {{STRING("null"), STRING("$")}, Null()}, + {{STRING("true"), STRING("$")}, Null()}, + {{STRING("false"), STRING("$")}, Null()}, + {{STRING("100"), STRING("$")}, BIGINT(100)}, //int8 + {{STRING("10000"), STRING("$")}, BIGINT(10000)}, // int16 + {{STRING("1000000000"), STRING("$")}, BIGINT(1000000000)}, // int32 + {{STRING("1152921504606846976"), STRING("$")}, BIGINT(1152921504606846976)}, // int64 + {{STRING("6.18"), STRING("$")}, Null()}, // double + {{STRING(R"("abcd")"), STRING("$")}, Null()}, // string + {{STRING("{}"), STRING("$")}, Null()}, // empty object + {{STRING(R"({"k1":"v31", "k2": 300})"), STRING("$")}, Null()}, // object + {{STRING("[]"), STRING("$")}, Null()}, // empty array + {{STRING("[123, 456]"), STRING("$")}, Null()}, // int array + {{STRING(R"(["abc", "def"])"), STRING("$")}, Null()}, // string array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$")}, + Null()}, // multi type array + {{STRING(R"([{"k1":"v41", "k2": 400}, 1, "a", 3.14])"), STRING("$")}, + Null()}, // complex array + }; + + check_function<DataTypeInt64, true>(func_name, input_types, data_set); + + // get json from obejct + data_set = { + {{Null(), STRING("$.k1")}, Null()}, + {{STRING("null"), STRING("$.k1")}, Null()}, + {{STRING("true"), STRING("$.k1")}, Null()}, + {{STRING("false"), STRING("$.k1")}, Null()}, + {{STRING("100"), STRING("$.k1")}, Null()}, //int8 + {{STRING("10000"), STRING("$.k1")}, Null()}, // int16 + {{STRING("1000000000"), STRING("$.k1")}, Null()}, // int32 + {{STRING("1152921504606846976"), STRING("$.k1")}, Null()}, // int64 + {{STRING("6.18"), STRING("$.k1")}, Null()}, // double + {{STRING(R"("abcd")"), STRING("$.k1")}, Null()}, // string + {{STRING("{}"), STRING("$.k1")}, Null()}, // empty object + {{STRING(R"({"k1":"v31", "k2": 300})"), STRING("$.k1")}, Null()}, // object + {{STRING("[]"), STRING("$.k1")}, Null()}, // empty array + {{STRING("[123, 456]"), STRING("$.k1")}, Null()}, // int array + {{STRING(R"(["abc", "def"])"), STRING("$.k1")}, Null()}, // string array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$.k1")}, + Null()}, // multi type array + {{STRING(R"([{"k1":"v41", "k2": 400}, 1, "a", 3.14])"), STRING("$.k1")}, + Null()}, // complex array + }; + + check_function<DataTypeInt64, true>(func_name, input_types, data_set); + + // get json from array + data_set = { + {{Null(), STRING("$[0]")}, Null()}, + {{STRING("null"), STRING("$[0]")}, Null()}, + {{STRING("true"), STRING("$[0]")}, Null()}, + {{STRING("false"), STRING("$[0]")}, Null()}, + {{STRING("100"), STRING("$[0]")}, Null()}, //int8 + {{STRING("10000"), STRING("$[0]")}, Null()}, // int16 + {{STRING("1000000000"), STRING("$[0]")}, Null()}, // int32 + {{STRING("1152921504606846976"), STRING("$[0]")}, Null()}, // int64 + {{STRING("6.18"), STRING("$[0]")}, Null()}, // double + {{STRING(R"("abcd")"), STRING("$[0]")}, Null()}, // string + {{STRING("{}"), STRING("$[0]")}, Null()}, // empty object + {{STRING(R"({"k1":"v31", "k2": 300})"), STRING("$[0]")}, Null()}, // object + {{STRING("[]"), STRING("$[0]")}, Null()}, // empty array + {{STRING("null"), STRING("$[1]")}, Null()}, + {{STRING("true"), STRING("$[1]")}, Null()}, + {{STRING("false"), STRING("$[1]")}, Null()}, + {{STRING("100"), STRING("$[1]")}, Null()}, //int8 + {{STRING("10000"), STRING("$[1]")}, Null()}, // int16 + {{STRING("1000000000"), STRING("$[1]")}, Null()}, // int32 + {{STRING("1152921504606846976"), STRING("$[1]")}, Null()}, // int64 + {{STRING("6.18"), STRING("$[1]")}, Null()}, // double + {{STRING(R"("abcd")"), STRING("$[1]")}, Null()}, // string + {{STRING("{}"), STRING("$[1]")}, Null()}, // empty object + {{STRING(R"({"k1":"v31", "k2": 300})"), STRING("$[1]")}, Null()}, // object + {{STRING("[]"), STRING("$[1]")}, Null()}, // empty array + {{STRING("[123, 456]"), STRING("$[0]")}, BIGINT(123)}, // int array + {{STRING("[123, 456]"), STRING("$[1]")}, BIGINT(456)}, // int array + {{STRING("[123, 456]"), STRING("$[2]")}, Null()}, // int array + {{STRING(R"(["abc", "def"])"), STRING("$[0]")}, Null()}, // string array + {{STRING(R"(["abc", "def"])"), STRING("$[1]")}, Null()}, // string array + {{STRING(R"(["abc", "def"])"), STRING("$[2]")}, Null()}, // string array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$[0]")}, + Null()}, // multi type array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$[1]")}, + Null()}, // multi type array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$[2]")}, + Null()}, // multi type array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$[3]")}, + BIGINT(100)}, // multi type array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$[4]")}, + Null()}, // multi type array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$[5]")}, + Null()}, // multi type array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$[6]")}, + Null()}, // multi type array + {{STRING(R"([{"k1":"v41", "k2": 400}, 1, "a", 3.14])"), STRING("$[0]")}, + Null()}, // complex array + {{STRING(R"([{"k1":"v41", "k2": 400}, 1, "a", 3.14])"), STRING("$[1]")}, + BIGINT(1)}, // complex array + {{STRING(R"([{"k1":"v41", "k2": 400}, 1, "a", 3.14])"), STRING("$[2]")}, + Null()}, // complex array + {{STRING(R"([{"k1":"v41", "k2": 400}, 1, "a", 3.14])"), STRING("$[3]")}, + Null()}, // complex array + {{STRING(R"([{"k1":"v41", "k2": 400}, 1, "a", 3.14])"), STRING("$[4]")}, + Null()}, // complex array + }; + + check_function<DataTypeInt64, true>(func_name, input_types, data_set); + + // get json with path $[0].k1 + data_set = { + {{Null(), STRING("$[0].k1")}, Null()}, + {{STRING("null"), STRING("$[0].k1")}, Null()}, + {{STRING("true"), STRING("$[0].k1")}, Null()}, + {{STRING("false"), STRING("$[0].k1")}, Null()}, + {{STRING("100"), STRING("$[0].k1")}, Null()}, //int8 + {{STRING("10000"), STRING("$[0].k1")}, Null()}, // int16 + {{STRING("1000000000"), STRING("$[0].k1")}, Null()}, // int32 + {{STRING("1152921504606846976"), STRING("$[0].k1")}, Null()}, // int64 + {{STRING("6.18"), STRING("$[0].k1")}, Null()}, // double + {{STRING(R"("abcd")"), STRING("$[0].k1")}, Null()}, // string + {{STRING("{}"), STRING("$[0].k1")}, Null()}, // empty object + {{STRING(R"({"k1":"v31", "k2": 300})"), STRING("$[0].k1")}, Null()}, // object + {{STRING("[]"), STRING("$[0].k1")}, Null()}, // empty array + {{STRING("[123, 456]"), STRING("$[0].k1")}, Null()}, // int array + {{STRING(R"(["abc", "def"])"), STRING("$[0].k1")}, Null()}, // string array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$[0].k1")}, + Null()}, // multi type array + {{STRING(R"([{"k1":"v41", "k2": 400}, 1, "a", 3.14])"), STRING("$[0].k1")}, + Null()}, // complex array + {{STRING(R"([{"k1":"v41", "k2": 400}, 1, "a", 3.14])"), STRING("$[0].k2")}, + BIGINT(400)}, // complex array + }; + + check_function<DataTypeInt64, true>(func_name, input_types, data_set); +} + +TEST(FunctionJsonbTEST, GetJsonDoubleTest) { + std::string func_name = "get_json_double"; + InputTypeSet input_types = {TypeIndex::JSONB, TypeIndex::String}; + + // get json from root + DataSet data_set = { Review Comment: warning: variable 'data_set' is not initialized [cppcoreguidelines-init-variables] ```suggestion DataSet data_set = 0 = { ``` ########## be/test/vec/function/function_jsonb_test.cpp: ########## @@ -1487,4 +1487,574 @@ TEST(FunctionJsonbTEST, JsonbCastFromOtherTest) { "CAST", {Notnull {TypeIndex::String}, ConstedNotnull {TypeIndex::JSONB}}, {{{STRING(R"("abcd")"), Null()}, STRING(R"("abcd")")}}); } + +TEST(FunctionJsonbTEST, GetJSONSTRINGTest) { + std::string func_name = "get_json_string"; + InputTypeSet input_types = {TypeIndex::JSONB, TypeIndex::String}; + + // get json from root + DataSet data_set = { + {{Null(), STRING("$")}, Null()}, + {{STRING("null"), STRING("$")}, STRING("null")}, + {{STRING("true"), STRING("$")}, STRING("true")}, + {{STRING("false"), STRING("$")}, STRING("false")}, + {{STRING("100"), STRING("$")}, STRING("100")}, //int8 + {{STRING("10000"), STRING("$")}, STRING("10000")}, // int16 + {{STRING("1000000000"), STRING("$")}, STRING("1000000000")}, // int32 + {{STRING("1152921504606846976"), STRING("$")}, STRING("1152921504606846976")}, // int64 + {{STRING("6.18"), STRING("$")}, STRING("6.18")}, // double + {{STRING(R"("abcd")"), STRING("$")}, STRING("abcd")}, // string + {{STRING("{}"), STRING("$")}, STRING("{}")}, // empty object + {{STRING(R"({"k1":"v31", "k2": 300})"), STRING("$")}, + STRING(R"({"k1":"v31","k2":300})")}, // object + {{STRING("[]"), STRING("$")}, STRING("[]")}, // empty array + {{STRING("[123, 456]"), STRING("$")}, STRING("[123,456]")}, // int array + {{STRING(R"(["abc", "def"])"), STRING("$")}, + STRING(R"(["abc","def"])")}, // string array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$")}, + STRING(R"([null,true,false,100,6.18,"abc"])")}, // multi type array + {{STRING(R"([{"k1":"v41", "k2": 400}, 1, "a", 3.14])"), STRING("$")}, + STRING(R"([{"k1":"v41","k2":400},1,"a",3.14])")}, // complex array + }; + + check_function<DataTypeString, true>(func_name, input_types, data_set); + + // get json from obejct + data_set = { + {{Null(), STRING("$.k1")}, Null()}, + {{STRING("null"), STRING("$.k1")}, Null()}, + {{STRING("true"), STRING("$.k1")}, Null()}, + {{STRING("false"), STRING("$.k1")}, Null()}, + {{STRING("100"), STRING("$.k1")}, Null()}, //int8 + {{STRING("10000"), STRING("$.k1")}, Null()}, // int16 + {{STRING("1000000000"), STRING("$.k1")}, Null()}, // int32 + {{STRING("1152921504606846976"), STRING("$.k1")}, Null()}, // int64 + {{STRING("6.18"), STRING("$.k1")}, Null()}, // double + {{STRING(R"("abcd")"), STRING("$.k1")}, Null()}, // string + {{STRING("{}"), STRING("$.k1")}, Null()}, // empty object + {{STRING(R"({"k1":"v31", "k2": 300})"), STRING("$.k1")}, STRING("v31")}, // object + {{STRING("[]"), STRING("$.k1")}, Null()}, // empty array + {{STRING("[123, 456]"), STRING("$.k1")}, Null()}, // int array + {{STRING(R"(["abc", "def"])"), STRING("$.k1")}, Null()}, // string array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$.k1")}, + Null()}, // multi type array + {{STRING(R"([{"k1":"v41", "k2": 400}, 1, "a", 3.14])"), STRING("$.k1")}, + Null()}, // complex array + }; + + check_function<DataTypeString, true>(func_name, input_types, data_set); + + // get json from array + data_set = { + {{Null(), STRING("$[0]")}, Null()}, + {{STRING("null"), STRING("$[0]")}, Null()}, + {{STRING("true"), STRING("$[0]")}, Null()}, + {{STRING("false"), STRING("$[0]")}, Null()}, + {{STRING("100"), STRING("$[0]")}, Null()}, //int8 + {{STRING("10000"), STRING("$[0]")}, Null()}, // int16 + {{STRING("1000000000"), STRING("$[0]")}, Null()}, // int32 + {{STRING("1152921504606846976"), STRING("$[0]")}, Null()}, // int64 + {{STRING("6.18"), STRING("$[0]")}, Null()}, // double + {{STRING(R"("abcd")"), STRING("$[0]")}, Null()}, // string + {{STRING("{}"), STRING("$[0]")}, STRING("{}")}, // empty object + {{STRING(R"({"k1":"v31", "k2": 300})"), STRING("$[0]")}, + STRING(R"({"k1":"v31","k2":300})")}, // object + {{STRING("[]"), STRING("$[0]")}, Null()}, // empty array + {{STRING("null"), STRING("$[1]")}, Null()}, + {{STRING("true"), STRING("$[1]")}, Null()}, + {{STRING("false"), STRING("$[1]")}, Null()}, + {{STRING("100"), STRING("$[1]")}, Null()}, //int8 + {{STRING("10000"), STRING("$[1]")}, Null()}, // int16 + {{STRING("1000000000"), STRING("$[1]")}, Null()}, // int32 + {{STRING("1152921504606846976"), STRING("$[1]")}, Null()}, // int64 + {{STRING("6.18"), STRING("$[1]")}, Null()}, // double + {{STRING(R"("abcd")"), STRING("$[1]")}, Null()}, // string + {{STRING("{}"), STRING("$[1]")}, Null()}, // empty object + {{STRING(R"({"k1":"v31", "k2": 300})"), STRING("$[1]")}, Null()}, // object + {{STRING("[]"), STRING("$[1]")}, Null()}, // empty array + {{STRING("[123, 456]"), STRING("$[0]")}, STRING("123")}, // int array + {{STRING("[123, 456]"), STRING("$[1]")}, STRING("456")}, // int array + {{STRING("[123, 456]"), STRING("$[2]")}, Null()}, // int array + {{STRING(R"(["abc", "def"])"), STRING("$[0]")}, STRING("abc")}, // string array + {{STRING(R"(["abc", "def"])"), STRING("$[1]")}, STRING("def")}, // string array + {{STRING(R"(["abc", "def"])"), STRING("$[2]")}, Null()}, // string array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$[0]")}, + STRING("null")}, // multi type array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$[1]")}, + STRING("true")}, // multi type array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$[2]")}, + STRING("false")}, // multi type array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$[3]")}, + STRING("100")}, // multi type array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$[4]")}, + STRING("6.18")}, // multi type array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$[5]")}, + STRING("abc")}, // multi type array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$[6]")}, + Null()}, // multi type array + {{STRING(R"([{"k1":"v41", "k2": 400}, 1, "a", 3.14])"), STRING("$[0]")}, + STRING(R"({"k1":"v41","k2":400})")}, // complex array + {{STRING(R"([{"k1":"v41", "k2": 400}, 1, "a", 3.14])"), STRING("$[1]")}, + STRING("1")}, // complex array + {{STRING(R"([{"k1":"v41", "k2": 400}, 1, "a", 3.14])"), STRING("$[2]")}, + STRING("a")}, // complex array + {{STRING(R"([{"k1":"v41", "k2": 400}, 1, "a", 3.14])"), STRING("$[3]")}, + STRING("3.14")}, // complex array + {{STRING(R"([{"k1":"v41", "k2": 400}, 1, "a", 3.14])"), STRING("$[4]")}, + Null()}, // complex array + }; + + check_function<DataTypeString, true>(func_name, input_types, data_set); + + // get json with path $[0].k1 + data_set = { + {{Null(), STRING("$[0].k1")}, Null()}, + {{STRING("null"), STRING("$[0].k1")}, Null()}, + {{STRING("true"), STRING("$[0].k1")}, Null()}, + {{STRING("false"), STRING("$[0].k1")}, Null()}, + {{STRING("100"), STRING("$[0].k1")}, Null()}, //int8 + {{STRING("10000"), STRING("$[0].k1")}, Null()}, // int16 + {{STRING("1000000000"), STRING("$[0].k1")}, Null()}, // int32 + {{STRING("1152921504606846976"), STRING("$[0].k1")}, Null()}, // int64 + {{STRING("6.18"), STRING("$[0].k1")}, Null()}, // double + {{STRING(R"("abcd")"), STRING("$[0].k1")}, Null()}, // string + {{STRING("{}"), STRING("$[0].k1")}, Null()}, // empty object + {{STRING(R"({"k1":"v31", "k2": 300})"), STRING("$[0].k1")}, STRING(R"(v31)")}, // object + {{STRING("[]"), STRING("$[0].k1")}, Null()}, // empty array + {{STRING("[123, 456]"), STRING("$[0].k1")}, Null()}, // int array + {{STRING(R"(["abc", "def"])"), STRING("$[0].k1")}, Null()}, // string array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$[0].k1")}, + Null()}, // multi type array + {{STRING(R"([{"k1":"v41", "k2": 400}, 1, "a", 3.14])"), STRING("$[0].k1")}, + STRING("v41")}, // complex array + }; + + check_function<DataTypeString, true>(func_name, input_types, data_set); +} + +TEST(FunctionJsonbTEST, GetJsonIntTest) { + std::string func_name = "get_json_int"; + InputTypeSet input_types = {TypeIndex::JSONB, TypeIndex::String}; + + // get json from root + DataSet data_set = { + {{Null(), STRING("$")}, Null()}, + {{STRING("null"), STRING("$")}, Null()}, + {{STRING("true"), STRING("$")}, Null()}, + {{STRING("false"), STRING("$")}, Null()}, + {{STRING("100"), STRING("$")}, INT(100)}, //int8 + {{STRING("10000"), STRING("$")}, INT(10000)}, // int16 + {{STRING("1000000000"), STRING("$")}, INT(1000000000)}, // int32 + {{STRING("1152921504606846976"), STRING("$")}, Null()}, // int64 + {{STRING("6.18"), STRING("$")}, Null()}, // double + {{STRING(R"("abcd")"), STRING("$")}, Null()}, // string + {{STRING("{}"), STRING("$")}, Null()}, // empty object + {{STRING(R"({"k1":"v31", "k2": 300})"), STRING("$")}, Null()}, // object + {{STRING("[]"), STRING("$")}, Null()}, // empty array + {{STRING("[123, 456]"), STRING("$")}, Null()}, // int array + {{STRING(R"(["abc", "def"])"), STRING("$")}, Null()}, // string array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$")}, + Null()}, // multi type array + {{STRING(R"([{"k1":"v41", "k2": 400}, 1, "a", 3.14])"), STRING("$")}, + Null()}, // complex array + }; + + check_function<DataTypeInt32, true>(func_name, input_types, data_set); + + // get json from obejct + data_set = { + {{Null(), STRING("$.k1")}, Null()}, + {{STRING("null"), STRING("$.k1")}, Null()}, + {{STRING("true"), STRING("$.k1")}, Null()}, + {{STRING("false"), STRING("$.k1")}, Null()}, + {{STRING("100"), STRING("$.k1")}, Null()}, //int8 + {{STRING("10000"), STRING("$.k1")}, Null()}, // int16 + {{STRING("1000000000"), STRING("$.k1")}, Null()}, // int32 + {{STRING("1152921504606846976"), STRING("$.k1")}, Null()}, // int64 + {{STRING("6.18"), STRING("$.k1")}, Null()}, // double + {{STRING(R"("abcd")"), STRING("$.k1")}, Null()}, // string + {{STRING("{}"), STRING("$.k1")}, Null()}, // empty object + {{STRING(R"({"k1":"v31", "k2": 300})"), STRING("$.k1")}, Null()}, // object + {{STRING("[]"), STRING("$.k1")}, Null()}, // empty array + {{STRING("[123, 456]"), STRING("$.k1")}, Null()}, // int array + {{STRING(R"(["abc", "def"])"), STRING("$.k1")}, Null()}, // string array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$.k1")}, + Null()}, // multi type array + {{STRING(R"([{"k1":"v41", "k2": 400}, 1, "a", 3.14])"), STRING("$.k1")}, + Null()}, // complex array + }; + + check_function<DataTypeInt32, true>(func_name, input_types, data_set); + + // get json from array + data_set = { + {{Null(), STRING("$[0]")}, Null()}, + {{STRING("null"), STRING("$[0]")}, Null()}, + {{STRING("true"), STRING("$[0]")}, Null()}, + {{STRING("false"), STRING("$[0]")}, Null()}, + {{STRING("100"), STRING("$[0]")}, Null()}, //int8 + {{STRING("10000"), STRING("$[0]")}, Null()}, // int16 + {{STRING("1000000000"), STRING("$[0]")}, Null()}, // int32 + {{STRING("1152921504606846976"), STRING("$[0]")}, Null()}, // int64 + {{STRING("6.18"), STRING("$[0]")}, Null()}, // double + {{STRING(R"("abcd")"), STRING("$[0]")}, Null()}, // string + {{STRING("{}"), STRING("$[0]")}, Null()}, // empty object + {{STRING(R"({"k1":"v31", "k2": 300})"), STRING("$[0]")}, Null()}, // object + {{STRING("[]"), STRING("$[0]")}, Null()}, // empty array + {{STRING("null"), STRING("$[1]")}, Null()}, + {{STRING("true"), STRING("$[1]")}, Null()}, + {{STRING("false"), STRING("$[1]")}, Null()}, + {{STRING("100"), STRING("$[1]")}, Null()}, //int8 + {{STRING("10000"), STRING("$[1]")}, Null()}, // int16 + {{STRING("1000000000"), STRING("$[1]")}, Null()}, // int32 + {{STRING("1152921504606846976"), STRING("$[1]")}, Null()}, // int64 + {{STRING("6.18"), STRING("$[1]")}, Null()}, // double + {{STRING(R"("abcd")"), STRING("$[1]")}, Null()}, // string + {{STRING("{}"), STRING("$[1]")}, Null()}, // empty object + {{STRING(R"({"k1":"v31", "k2": 300})"), STRING("$[1]")}, Null()}, // object + {{STRING("[]"), STRING("$[1]")}, Null()}, // empty array + {{STRING("[123, 456]"), STRING("$[0]")}, INT(123)}, // int array + {{STRING("[123, 456]"), STRING("$[1]")}, INT(456)}, // int array + {{STRING("[123, 456]"), STRING("$[2]")}, Null()}, // int array + {{STRING(R"(["abc", "def"])"), STRING("$[0]")}, Null()}, // string array + {{STRING(R"(["abc", "def"])"), STRING("$[1]")}, Null()}, // string array + {{STRING(R"(["abc", "def"])"), STRING("$[2]")}, Null()}, // string array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$[0]")}, + Null()}, // multi type array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$[1]")}, + Null()}, // multi type array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$[2]")}, + Null()}, // multi type array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$[3]")}, + INT(100)}, // multi type array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$[4]")}, + Null()}, // multi type array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$[5]")}, + Null()}, // multi type array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$[6]")}, + Null()}, // multi type array + {{STRING(R"([{"k1":"v41", "k2": 400}, 1, "a", 3.14])"), STRING("$[0]")}, + Null()}, // complex array + {{STRING(R"([{"k1":"v41", "k2": 400}, 1, "a", 3.14])"), STRING("$[1]")}, + INT(1)}, // complex array + {{STRING(R"([{"k1":"v41", "k2": 400}, 1, "a", 3.14])"), STRING("$[2]")}, + Null()}, // complex array + {{STRING(R"([{"k1":"v41", "k2": 400}, 1, "a", 3.14])"), STRING("$[3]")}, + Null()}, // complex array + {{STRING(R"([{"k1":"v41", "k2": 400}, 1, "a", 3.14])"), STRING("$[4]")}, + Null()}, // complex array + }; + + check_function<DataTypeInt32, true>(func_name, input_types, data_set); + + // get json with path $[0].k1 + data_set = { + {{Null(), STRING("$[0].k1")}, Null()}, + {{STRING("null"), STRING("$[0].k1")}, Null()}, + {{STRING("true"), STRING("$[0].k1")}, Null()}, + {{STRING("false"), STRING("$[0].k1")}, Null()}, + {{STRING("100"), STRING("$[0].k1")}, Null()}, //int8 + {{STRING("10000"), STRING("$[0].k1")}, Null()}, // int16 + {{STRING("1000000000"), STRING("$[0].k1")}, Null()}, // int32 + {{STRING("1152921504606846976"), STRING("$[0].k1")}, Null()}, // int64 + {{STRING("6.18"), STRING("$[0].k1")}, Null()}, // double + {{STRING(R"("abcd")"), STRING("$[0].k1")}, Null()}, // string + {{STRING("{}"), STRING("$[0].k1")}, Null()}, // empty object + {{STRING(R"({"k1":"v31", "k2": 300})"), STRING("$[0].k1")}, Null()}, // object + {{STRING("[]"), STRING("$[0].k1")}, Null()}, // empty array + {{STRING("[123, 456]"), STRING("$[0].k1")}, Null()}, // int array + {{STRING(R"(["abc", "def"])"), STRING("$[0].k1")}, Null()}, // string array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$[0].k1")}, + Null()}, // multi type array + {{STRING(R"([{"k1":"v41", "k2": 400}, 1, "a", 3.14])"), STRING("$[0].k1")}, + Null()}, // complex array + {{STRING(R"([{"k1":"v41", "k2": 400}, 1, "a", 3.14])"), STRING("$[0].k2")}, + INT(400)}, // complex array + }; + + check_function<DataTypeInt32, true>(func_name, input_types, data_set); +} + +TEST(FunctionJsonbTEST, GetJsonBigIntTest) { + std::string func_name = "get_json_bigint"; + InputTypeSet input_types = {TypeIndex::JSONB, TypeIndex::String}; Review Comment: warning: variable 'input_types' is not initialized [cppcoreguidelines-init-variables] ```suggestion InputTypeSet input_types = 0 = {TypeIndex::JSONB, TypeIndex::String}; ``` ########## be/test/vec/function/function_jsonb_test.cpp: ########## @@ -1487,4 +1487,574 @@ TEST(FunctionJsonbTEST, JsonbCastFromOtherTest) { "CAST", {Notnull {TypeIndex::String}, ConstedNotnull {TypeIndex::JSONB}}, {{{STRING(R"("abcd")"), Null()}, STRING(R"("abcd")")}}); } + +TEST(FunctionJsonbTEST, GetJSONSTRINGTest) { + std::string func_name = "get_json_string"; + InputTypeSet input_types = {TypeIndex::JSONB, TypeIndex::String}; + + // get json from root + DataSet data_set = { + {{Null(), STRING("$")}, Null()}, + {{STRING("null"), STRING("$")}, STRING("null")}, + {{STRING("true"), STRING("$")}, STRING("true")}, + {{STRING("false"), STRING("$")}, STRING("false")}, + {{STRING("100"), STRING("$")}, STRING("100")}, //int8 + {{STRING("10000"), STRING("$")}, STRING("10000")}, // int16 + {{STRING("1000000000"), STRING("$")}, STRING("1000000000")}, // int32 + {{STRING("1152921504606846976"), STRING("$")}, STRING("1152921504606846976")}, // int64 + {{STRING("6.18"), STRING("$")}, STRING("6.18")}, // double + {{STRING(R"("abcd")"), STRING("$")}, STRING("abcd")}, // string + {{STRING("{}"), STRING("$")}, STRING("{}")}, // empty object + {{STRING(R"({"k1":"v31", "k2": 300})"), STRING("$")}, + STRING(R"({"k1":"v31","k2":300})")}, // object + {{STRING("[]"), STRING("$")}, STRING("[]")}, // empty array + {{STRING("[123, 456]"), STRING("$")}, STRING("[123,456]")}, // int array + {{STRING(R"(["abc", "def"])"), STRING("$")}, + STRING(R"(["abc","def"])")}, // string array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$")}, + STRING(R"([null,true,false,100,6.18,"abc"])")}, // multi type array + {{STRING(R"([{"k1":"v41", "k2": 400}, 1, "a", 3.14])"), STRING("$")}, + STRING(R"([{"k1":"v41","k2":400},1,"a",3.14])")}, // complex array + }; + + check_function<DataTypeString, true>(func_name, input_types, data_set); + + // get json from obejct + data_set = { + {{Null(), STRING("$.k1")}, Null()}, + {{STRING("null"), STRING("$.k1")}, Null()}, + {{STRING("true"), STRING("$.k1")}, Null()}, + {{STRING("false"), STRING("$.k1")}, Null()}, + {{STRING("100"), STRING("$.k1")}, Null()}, //int8 + {{STRING("10000"), STRING("$.k1")}, Null()}, // int16 + {{STRING("1000000000"), STRING("$.k1")}, Null()}, // int32 + {{STRING("1152921504606846976"), STRING("$.k1")}, Null()}, // int64 + {{STRING("6.18"), STRING("$.k1")}, Null()}, // double + {{STRING(R"("abcd")"), STRING("$.k1")}, Null()}, // string + {{STRING("{}"), STRING("$.k1")}, Null()}, // empty object + {{STRING(R"({"k1":"v31", "k2": 300})"), STRING("$.k1")}, STRING("v31")}, // object + {{STRING("[]"), STRING("$.k1")}, Null()}, // empty array + {{STRING("[123, 456]"), STRING("$.k1")}, Null()}, // int array + {{STRING(R"(["abc", "def"])"), STRING("$.k1")}, Null()}, // string array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$.k1")}, + Null()}, // multi type array + {{STRING(R"([{"k1":"v41", "k2": 400}, 1, "a", 3.14])"), STRING("$.k1")}, + Null()}, // complex array + }; + + check_function<DataTypeString, true>(func_name, input_types, data_set); + + // get json from array + data_set = { + {{Null(), STRING("$[0]")}, Null()}, + {{STRING("null"), STRING("$[0]")}, Null()}, + {{STRING("true"), STRING("$[0]")}, Null()}, + {{STRING("false"), STRING("$[0]")}, Null()}, + {{STRING("100"), STRING("$[0]")}, Null()}, //int8 + {{STRING("10000"), STRING("$[0]")}, Null()}, // int16 + {{STRING("1000000000"), STRING("$[0]")}, Null()}, // int32 + {{STRING("1152921504606846976"), STRING("$[0]")}, Null()}, // int64 + {{STRING("6.18"), STRING("$[0]")}, Null()}, // double + {{STRING(R"("abcd")"), STRING("$[0]")}, Null()}, // string + {{STRING("{}"), STRING("$[0]")}, STRING("{}")}, // empty object + {{STRING(R"({"k1":"v31", "k2": 300})"), STRING("$[0]")}, + STRING(R"({"k1":"v31","k2":300})")}, // object + {{STRING("[]"), STRING("$[0]")}, Null()}, // empty array + {{STRING("null"), STRING("$[1]")}, Null()}, + {{STRING("true"), STRING("$[1]")}, Null()}, + {{STRING("false"), STRING("$[1]")}, Null()}, + {{STRING("100"), STRING("$[1]")}, Null()}, //int8 + {{STRING("10000"), STRING("$[1]")}, Null()}, // int16 + {{STRING("1000000000"), STRING("$[1]")}, Null()}, // int32 + {{STRING("1152921504606846976"), STRING("$[1]")}, Null()}, // int64 + {{STRING("6.18"), STRING("$[1]")}, Null()}, // double + {{STRING(R"("abcd")"), STRING("$[1]")}, Null()}, // string + {{STRING("{}"), STRING("$[1]")}, Null()}, // empty object + {{STRING(R"({"k1":"v31", "k2": 300})"), STRING("$[1]")}, Null()}, // object + {{STRING("[]"), STRING("$[1]")}, Null()}, // empty array + {{STRING("[123, 456]"), STRING("$[0]")}, STRING("123")}, // int array + {{STRING("[123, 456]"), STRING("$[1]")}, STRING("456")}, // int array + {{STRING("[123, 456]"), STRING("$[2]")}, Null()}, // int array + {{STRING(R"(["abc", "def"])"), STRING("$[0]")}, STRING("abc")}, // string array + {{STRING(R"(["abc", "def"])"), STRING("$[1]")}, STRING("def")}, // string array + {{STRING(R"(["abc", "def"])"), STRING("$[2]")}, Null()}, // string array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$[0]")}, + STRING("null")}, // multi type array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$[1]")}, + STRING("true")}, // multi type array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$[2]")}, + STRING("false")}, // multi type array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$[3]")}, + STRING("100")}, // multi type array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$[4]")}, + STRING("6.18")}, // multi type array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$[5]")}, + STRING("abc")}, // multi type array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$[6]")}, + Null()}, // multi type array + {{STRING(R"([{"k1":"v41", "k2": 400}, 1, "a", 3.14])"), STRING("$[0]")}, + STRING(R"({"k1":"v41","k2":400})")}, // complex array + {{STRING(R"([{"k1":"v41", "k2": 400}, 1, "a", 3.14])"), STRING("$[1]")}, + STRING("1")}, // complex array + {{STRING(R"([{"k1":"v41", "k2": 400}, 1, "a", 3.14])"), STRING("$[2]")}, + STRING("a")}, // complex array + {{STRING(R"([{"k1":"v41", "k2": 400}, 1, "a", 3.14])"), STRING("$[3]")}, + STRING("3.14")}, // complex array + {{STRING(R"([{"k1":"v41", "k2": 400}, 1, "a", 3.14])"), STRING("$[4]")}, + Null()}, // complex array + }; + + check_function<DataTypeString, true>(func_name, input_types, data_set); + + // get json with path $[0].k1 + data_set = { + {{Null(), STRING("$[0].k1")}, Null()}, + {{STRING("null"), STRING("$[0].k1")}, Null()}, + {{STRING("true"), STRING("$[0].k1")}, Null()}, + {{STRING("false"), STRING("$[0].k1")}, Null()}, + {{STRING("100"), STRING("$[0].k1")}, Null()}, //int8 + {{STRING("10000"), STRING("$[0].k1")}, Null()}, // int16 + {{STRING("1000000000"), STRING("$[0].k1")}, Null()}, // int32 + {{STRING("1152921504606846976"), STRING("$[0].k1")}, Null()}, // int64 + {{STRING("6.18"), STRING("$[0].k1")}, Null()}, // double + {{STRING(R"("abcd")"), STRING("$[0].k1")}, Null()}, // string + {{STRING("{}"), STRING("$[0].k1")}, Null()}, // empty object + {{STRING(R"({"k1":"v31", "k2": 300})"), STRING("$[0].k1")}, STRING(R"(v31)")}, // object + {{STRING("[]"), STRING("$[0].k1")}, Null()}, // empty array + {{STRING("[123, 456]"), STRING("$[0].k1")}, Null()}, // int array + {{STRING(R"(["abc", "def"])"), STRING("$[0].k1")}, Null()}, // string array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$[0].k1")}, + Null()}, // multi type array + {{STRING(R"([{"k1":"v41", "k2": 400}, 1, "a", 3.14])"), STRING("$[0].k1")}, + STRING("v41")}, // complex array + }; + + check_function<DataTypeString, true>(func_name, input_types, data_set); +} + +TEST(FunctionJsonbTEST, GetJsonIntTest) { + std::string func_name = "get_json_int"; + InputTypeSet input_types = {TypeIndex::JSONB, TypeIndex::String}; + + // get json from root + DataSet data_set = { + {{Null(), STRING("$")}, Null()}, + {{STRING("null"), STRING("$")}, Null()}, + {{STRING("true"), STRING("$")}, Null()}, + {{STRING("false"), STRING("$")}, Null()}, + {{STRING("100"), STRING("$")}, INT(100)}, //int8 + {{STRING("10000"), STRING("$")}, INT(10000)}, // int16 + {{STRING("1000000000"), STRING("$")}, INT(1000000000)}, // int32 + {{STRING("1152921504606846976"), STRING("$")}, Null()}, // int64 + {{STRING("6.18"), STRING("$")}, Null()}, // double + {{STRING(R"("abcd")"), STRING("$")}, Null()}, // string + {{STRING("{}"), STRING("$")}, Null()}, // empty object + {{STRING(R"({"k1":"v31", "k2": 300})"), STRING("$")}, Null()}, // object + {{STRING("[]"), STRING("$")}, Null()}, // empty array + {{STRING("[123, 456]"), STRING("$")}, Null()}, // int array + {{STRING(R"(["abc", "def"])"), STRING("$")}, Null()}, // string array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$")}, + Null()}, // multi type array + {{STRING(R"([{"k1":"v41", "k2": 400}, 1, "a", 3.14])"), STRING("$")}, + Null()}, // complex array + }; + + check_function<DataTypeInt32, true>(func_name, input_types, data_set); + + // get json from obejct + data_set = { + {{Null(), STRING("$.k1")}, Null()}, + {{STRING("null"), STRING("$.k1")}, Null()}, + {{STRING("true"), STRING("$.k1")}, Null()}, + {{STRING("false"), STRING("$.k1")}, Null()}, + {{STRING("100"), STRING("$.k1")}, Null()}, //int8 + {{STRING("10000"), STRING("$.k1")}, Null()}, // int16 + {{STRING("1000000000"), STRING("$.k1")}, Null()}, // int32 + {{STRING("1152921504606846976"), STRING("$.k1")}, Null()}, // int64 + {{STRING("6.18"), STRING("$.k1")}, Null()}, // double + {{STRING(R"("abcd")"), STRING("$.k1")}, Null()}, // string + {{STRING("{}"), STRING("$.k1")}, Null()}, // empty object + {{STRING(R"({"k1":"v31", "k2": 300})"), STRING("$.k1")}, Null()}, // object + {{STRING("[]"), STRING("$.k1")}, Null()}, // empty array + {{STRING("[123, 456]"), STRING("$.k1")}, Null()}, // int array + {{STRING(R"(["abc", "def"])"), STRING("$.k1")}, Null()}, // string array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$.k1")}, + Null()}, // multi type array + {{STRING(R"([{"k1":"v41", "k2": 400}, 1, "a", 3.14])"), STRING("$.k1")}, + Null()}, // complex array + }; + + check_function<DataTypeInt32, true>(func_name, input_types, data_set); + + // get json from array + data_set = { + {{Null(), STRING("$[0]")}, Null()}, + {{STRING("null"), STRING("$[0]")}, Null()}, + {{STRING("true"), STRING("$[0]")}, Null()}, + {{STRING("false"), STRING("$[0]")}, Null()}, + {{STRING("100"), STRING("$[0]")}, Null()}, //int8 + {{STRING("10000"), STRING("$[0]")}, Null()}, // int16 + {{STRING("1000000000"), STRING("$[0]")}, Null()}, // int32 + {{STRING("1152921504606846976"), STRING("$[0]")}, Null()}, // int64 + {{STRING("6.18"), STRING("$[0]")}, Null()}, // double + {{STRING(R"("abcd")"), STRING("$[0]")}, Null()}, // string + {{STRING("{}"), STRING("$[0]")}, Null()}, // empty object + {{STRING(R"({"k1":"v31", "k2": 300})"), STRING("$[0]")}, Null()}, // object + {{STRING("[]"), STRING("$[0]")}, Null()}, // empty array + {{STRING("null"), STRING("$[1]")}, Null()}, + {{STRING("true"), STRING("$[1]")}, Null()}, + {{STRING("false"), STRING("$[1]")}, Null()}, + {{STRING("100"), STRING("$[1]")}, Null()}, //int8 + {{STRING("10000"), STRING("$[1]")}, Null()}, // int16 + {{STRING("1000000000"), STRING("$[1]")}, Null()}, // int32 + {{STRING("1152921504606846976"), STRING("$[1]")}, Null()}, // int64 + {{STRING("6.18"), STRING("$[1]")}, Null()}, // double + {{STRING(R"("abcd")"), STRING("$[1]")}, Null()}, // string + {{STRING("{}"), STRING("$[1]")}, Null()}, // empty object + {{STRING(R"({"k1":"v31", "k2": 300})"), STRING("$[1]")}, Null()}, // object + {{STRING("[]"), STRING("$[1]")}, Null()}, // empty array + {{STRING("[123, 456]"), STRING("$[0]")}, INT(123)}, // int array + {{STRING("[123, 456]"), STRING("$[1]")}, INT(456)}, // int array + {{STRING("[123, 456]"), STRING("$[2]")}, Null()}, // int array + {{STRING(R"(["abc", "def"])"), STRING("$[0]")}, Null()}, // string array + {{STRING(R"(["abc", "def"])"), STRING("$[1]")}, Null()}, // string array + {{STRING(R"(["abc", "def"])"), STRING("$[2]")}, Null()}, // string array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$[0]")}, + Null()}, // multi type array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$[1]")}, + Null()}, // multi type array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$[2]")}, + Null()}, // multi type array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$[3]")}, + INT(100)}, // multi type array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$[4]")}, + Null()}, // multi type array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$[5]")}, + Null()}, // multi type array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$[6]")}, + Null()}, // multi type array + {{STRING(R"([{"k1":"v41", "k2": 400}, 1, "a", 3.14])"), STRING("$[0]")}, + Null()}, // complex array + {{STRING(R"([{"k1":"v41", "k2": 400}, 1, "a", 3.14])"), STRING("$[1]")}, + INT(1)}, // complex array + {{STRING(R"([{"k1":"v41", "k2": 400}, 1, "a", 3.14])"), STRING("$[2]")}, + Null()}, // complex array + {{STRING(R"([{"k1":"v41", "k2": 400}, 1, "a", 3.14])"), STRING("$[3]")}, + Null()}, // complex array + {{STRING(R"([{"k1":"v41", "k2": 400}, 1, "a", 3.14])"), STRING("$[4]")}, + Null()}, // complex array + }; + + check_function<DataTypeInt32, true>(func_name, input_types, data_set); + + // get json with path $[0].k1 + data_set = { + {{Null(), STRING("$[0].k1")}, Null()}, + {{STRING("null"), STRING("$[0].k1")}, Null()}, + {{STRING("true"), STRING("$[0].k1")}, Null()}, + {{STRING("false"), STRING("$[0].k1")}, Null()}, + {{STRING("100"), STRING("$[0].k1")}, Null()}, //int8 + {{STRING("10000"), STRING("$[0].k1")}, Null()}, // int16 + {{STRING("1000000000"), STRING("$[0].k1")}, Null()}, // int32 + {{STRING("1152921504606846976"), STRING("$[0].k1")}, Null()}, // int64 + {{STRING("6.18"), STRING("$[0].k1")}, Null()}, // double + {{STRING(R"("abcd")"), STRING("$[0].k1")}, Null()}, // string + {{STRING("{}"), STRING("$[0].k1")}, Null()}, // empty object + {{STRING(R"({"k1":"v31", "k2": 300})"), STRING("$[0].k1")}, Null()}, // object + {{STRING("[]"), STRING("$[0].k1")}, Null()}, // empty array + {{STRING("[123, 456]"), STRING("$[0].k1")}, Null()}, // int array + {{STRING(R"(["abc", "def"])"), STRING("$[0].k1")}, Null()}, // string array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$[0].k1")}, + Null()}, // multi type array + {{STRING(R"([{"k1":"v41", "k2": 400}, 1, "a", 3.14])"), STRING("$[0].k1")}, + Null()}, // complex array + {{STRING(R"([{"k1":"v41", "k2": 400}, 1, "a", 3.14])"), STRING("$[0].k2")}, + INT(400)}, // complex array + }; + + check_function<DataTypeInt32, true>(func_name, input_types, data_set); +} + +TEST(FunctionJsonbTEST, GetJsonBigIntTest) { + std::string func_name = "get_json_bigint"; + InputTypeSet input_types = {TypeIndex::JSONB, TypeIndex::String}; + + // get json from root + DataSet data_set = { Review Comment: warning: variable 'data_set' is not initialized [cppcoreguidelines-init-variables] ```suggestion DataSet data_set = 0 = { ``` ########## be/test/vec/function/function_jsonb_test.cpp: ########## @@ -1487,4 +1487,574 @@ TEST(FunctionJsonbTEST, JsonbCastFromOtherTest) { "CAST", {Notnull {TypeIndex::String}, ConstedNotnull {TypeIndex::JSONB}}, {{{STRING(R"("abcd")"), Null()}, STRING(R"("abcd")")}}); } + +TEST(FunctionJsonbTEST, GetJSONSTRINGTest) { + std::string func_name = "get_json_string"; + InputTypeSet input_types = {TypeIndex::JSONB, TypeIndex::String}; + + // get json from root + DataSet data_set = { + {{Null(), STRING("$")}, Null()}, + {{STRING("null"), STRING("$")}, STRING("null")}, + {{STRING("true"), STRING("$")}, STRING("true")}, + {{STRING("false"), STRING("$")}, STRING("false")}, + {{STRING("100"), STRING("$")}, STRING("100")}, //int8 + {{STRING("10000"), STRING("$")}, STRING("10000")}, // int16 + {{STRING("1000000000"), STRING("$")}, STRING("1000000000")}, // int32 + {{STRING("1152921504606846976"), STRING("$")}, STRING("1152921504606846976")}, // int64 + {{STRING("6.18"), STRING("$")}, STRING("6.18")}, // double + {{STRING(R"("abcd")"), STRING("$")}, STRING("abcd")}, // string + {{STRING("{}"), STRING("$")}, STRING("{}")}, // empty object + {{STRING(R"({"k1":"v31", "k2": 300})"), STRING("$")}, + STRING(R"({"k1":"v31","k2":300})")}, // object + {{STRING("[]"), STRING("$")}, STRING("[]")}, // empty array + {{STRING("[123, 456]"), STRING("$")}, STRING("[123,456]")}, // int array + {{STRING(R"(["abc", "def"])"), STRING("$")}, + STRING(R"(["abc","def"])")}, // string array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$")}, + STRING(R"([null,true,false,100,6.18,"abc"])")}, // multi type array + {{STRING(R"([{"k1":"v41", "k2": 400}, 1, "a", 3.14])"), STRING("$")}, + STRING(R"([{"k1":"v41","k2":400},1,"a",3.14])")}, // complex array + }; + + check_function<DataTypeString, true>(func_name, input_types, data_set); + + // get json from obejct + data_set = { + {{Null(), STRING("$.k1")}, Null()}, + {{STRING("null"), STRING("$.k1")}, Null()}, + {{STRING("true"), STRING("$.k1")}, Null()}, + {{STRING("false"), STRING("$.k1")}, Null()}, + {{STRING("100"), STRING("$.k1")}, Null()}, //int8 + {{STRING("10000"), STRING("$.k1")}, Null()}, // int16 + {{STRING("1000000000"), STRING("$.k1")}, Null()}, // int32 + {{STRING("1152921504606846976"), STRING("$.k1")}, Null()}, // int64 + {{STRING("6.18"), STRING("$.k1")}, Null()}, // double + {{STRING(R"("abcd")"), STRING("$.k1")}, Null()}, // string + {{STRING("{}"), STRING("$.k1")}, Null()}, // empty object + {{STRING(R"({"k1":"v31", "k2": 300})"), STRING("$.k1")}, STRING("v31")}, // object + {{STRING("[]"), STRING("$.k1")}, Null()}, // empty array + {{STRING("[123, 456]"), STRING("$.k1")}, Null()}, // int array + {{STRING(R"(["abc", "def"])"), STRING("$.k1")}, Null()}, // string array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$.k1")}, + Null()}, // multi type array + {{STRING(R"([{"k1":"v41", "k2": 400}, 1, "a", 3.14])"), STRING("$.k1")}, + Null()}, // complex array + }; + + check_function<DataTypeString, true>(func_name, input_types, data_set); + + // get json from array + data_set = { + {{Null(), STRING("$[0]")}, Null()}, + {{STRING("null"), STRING("$[0]")}, Null()}, + {{STRING("true"), STRING("$[0]")}, Null()}, + {{STRING("false"), STRING("$[0]")}, Null()}, + {{STRING("100"), STRING("$[0]")}, Null()}, //int8 + {{STRING("10000"), STRING("$[0]")}, Null()}, // int16 + {{STRING("1000000000"), STRING("$[0]")}, Null()}, // int32 + {{STRING("1152921504606846976"), STRING("$[0]")}, Null()}, // int64 + {{STRING("6.18"), STRING("$[0]")}, Null()}, // double + {{STRING(R"("abcd")"), STRING("$[0]")}, Null()}, // string + {{STRING("{}"), STRING("$[0]")}, STRING("{}")}, // empty object + {{STRING(R"({"k1":"v31", "k2": 300})"), STRING("$[0]")}, + STRING(R"({"k1":"v31","k2":300})")}, // object + {{STRING("[]"), STRING("$[0]")}, Null()}, // empty array + {{STRING("null"), STRING("$[1]")}, Null()}, + {{STRING("true"), STRING("$[1]")}, Null()}, + {{STRING("false"), STRING("$[1]")}, Null()}, + {{STRING("100"), STRING("$[1]")}, Null()}, //int8 + {{STRING("10000"), STRING("$[1]")}, Null()}, // int16 + {{STRING("1000000000"), STRING("$[1]")}, Null()}, // int32 + {{STRING("1152921504606846976"), STRING("$[1]")}, Null()}, // int64 + {{STRING("6.18"), STRING("$[1]")}, Null()}, // double + {{STRING(R"("abcd")"), STRING("$[1]")}, Null()}, // string + {{STRING("{}"), STRING("$[1]")}, Null()}, // empty object + {{STRING(R"({"k1":"v31", "k2": 300})"), STRING("$[1]")}, Null()}, // object + {{STRING("[]"), STRING("$[1]")}, Null()}, // empty array + {{STRING("[123, 456]"), STRING("$[0]")}, STRING("123")}, // int array + {{STRING("[123, 456]"), STRING("$[1]")}, STRING("456")}, // int array + {{STRING("[123, 456]"), STRING("$[2]")}, Null()}, // int array + {{STRING(R"(["abc", "def"])"), STRING("$[0]")}, STRING("abc")}, // string array + {{STRING(R"(["abc", "def"])"), STRING("$[1]")}, STRING("def")}, // string array + {{STRING(R"(["abc", "def"])"), STRING("$[2]")}, Null()}, // string array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$[0]")}, + STRING("null")}, // multi type array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$[1]")}, + STRING("true")}, // multi type array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$[2]")}, + STRING("false")}, // multi type array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$[3]")}, + STRING("100")}, // multi type array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$[4]")}, + STRING("6.18")}, // multi type array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$[5]")}, + STRING("abc")}, // multi type array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$[6]")}, + Null()}, // multi type array + {{STRING(R"([{"k1":"v41", "k2": 400}, 1, "a", 3.14])"), STRING("$[0]")}, + STRING(R"({"k1":"v41","k2":400})")}, // complex array + {{STRING(R"([{"k1":"v41", "k2": 400}, 1, "a", 3.14])"), STRING("$[1]")}, + STRING("1")}, // complex array + {{STRING(R"([{"k1":"v41", "k2": 400}, 1, "a", 3.14])"), STRING("$[2]")}, + STRING("a")}, // complex array + {{STRING(R"([{"k1":"v41", "k2": 400}, 1, "a", 3.14])"), STRING("$[3]")}, + STRING("3.14")}, // complex array + {{STRING(R"([{"k1":"v41", "k2": 400}, 1, "a", 3.14])"), STRING("$[4]")}, + Null()}, // complex array + }; + + check_function<DataTypeString, true>(func_name, input_types, data_set); + + // get json with path $[0].k1 + data_set = { + {{Null(), STRING("$[0].k1")}, Null()}, + {{STRING("null"), STRING("$[0].k1")}, Null()}, + {{STRING("true"), STRING("$[0].k1")}, Null()}, + {{STRING("false"), STRING("$[0].k1")}, Null()}, + {{STRING("100"), STRING("$[0].k1")}, Null()}, //int8 + {{STRING("10000"), STRING("$[0].k1")}, Null()}, // int16 + {{STRING("1000000000"), STRING("$[0].k1")}, Null()}, // int32 + {{STRING("1152921504606846976"), STRING("$[0].k1")}, Null()}, // int64 + {{STRING("6.18"), STRING("$[0].k1")}, Null()}, // double + {{STRING(R"("abcd")"), STRING("$[0].k1")}, Null()}, // string + {{STRING("{}"), STRING("$[0].k1")}, Null()}, // empty object + {{STRING(R"({"k1":"v31", "k2": 300})"), STRING("$[0].k1")}, STRING(R"(v31)")}, // object + {{STRING("[]"), STRING("$[0].k1")}, Null()}, // empty array + {{STRING("[123, 456]"), STRING("$[0].k1")}, Null()}, // int array + {{STRING(R"(["abc", "def"])"), STRING("$[0].k1")}, Null()}, // string array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$[0].k1")}, + Null()}, // multi type array + {{STRING(R"([{"k1":"v41", "k2": 400}, 1, "a", 3.14])"), STRING("$[0].k1")}, + STRING("v41")}, // complex array + }; + + check_function<DataTypeString, true>(func_name, input_types, data_set); +} + +TEST(FunctionJsonbTEST, GetJsonIntTest) { + std::string func_name = "get_json_int"; + InputTypeSet input_types = {TypeIndex::JSONB, TypeIndex::String}; + + // get json from root + DataSet data_set = { + {{Null(), STRING("$")}, Null()}, + {{STRING("null"), STRING("$")}, Null()}, + {{STRING("true"), STRING("$")}, Null()}, + {{STRING("false"), STRING("$")}, Null()}, + {{STRING("100"), STRING("$")}, INT(100)}, //int8 + {{STRING("10000"), STRING("$")}, INT(10000)}, // int16 + {{STRING("1000000000"), STRING("$")}, INT(1000000000)}, // int32 + {{STRING("1152921504606846976"), STRING("$")}, Null()}, // int64 + {{STRING("6.18"), STRING("$")}, Null()}, // double + {{STRING(R"("abcd")"), STRING("$")}, Null()}, // string + {{STRING("{}"), STRING("$")}, Null()}, // empty object + {{STRING(R"({"k1":"v31", "k2": 300})"), STRING("$")}, Null()}, // object + {{STRING("[]"), STRING("$")}, Null()}, // empty array + {{STRING("[123, 456]"), STRING("$")}, Null()}, // int array + {{STRING(R"(["abc", "def"])"), STRING("$")}, Null()}, // string array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$")}, + Null()}, // multi type array + {{STRING(R"([{"k1":"v41", "k2": 400}, 1, "a", 3.14])"), STRING("$")}, + Null()}, // complex array + }; + + check_function<DataTypeInt32, true>(func_name, input_types, data_set); + + // get json from obejct + data_set = { + {{Null(), STRING("$.k1")}, Null()}, + {{STRING("null"), STRING("$.k1")}, Null()}, + {{STRING("true"), STRING("$.k1")}, Null()}, + {{STRING("false"), STRING("$.k1")}, Null()}, + {{STRING("100"), STRING("$.k1")}, Null()}, //int8 + {{STRING("10000"), STRING("$.k1")}, Null()}, // int16 + {{STRING("1000000000"), STRING("$.k1")}, Null()}, // int32 + {{STRING("1152921504606846976"), STRING("$.k1")}, Null()}, // int64 + {{STRING("6.18"), STRING("$.k1")}, Null()}, // double + {{STRING(R"("abcd")"), STRING("$.k1")}, Null()}, // string + {{STRING("{}"), STRING("$.k1")}, Null()}, // empty object + {{STRING(R"({"k1":"v31", "k2": 300})"), STRING("$.k1")}, Null()}, // object + {{STRING("[]"), STRING("$.k1")}, Null()}, // empty array + {{STRING("[123, 456]"), STRING("$.k1")}, Null()}, // int array + {{STRING(R"(["abc", "def"])"), STRING("$.k1")}, Null()}, // string array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$.k1")}, + Null()}, // multi type array + {{STRING(R"([{"k1":"v41", "k2": 400}, 1, "a", 3.14])"), STRING("$.k1")}, + Null()}, // complex array + }; + + check_function<DataTypeInt32, true>(func_name, input_types, data_set); + + // get json from array + data_set = { + {{Null(), STRING("$[0]")}, Null()}, + {{STRING("null"), STRING("$[0]")}, Null()}, + {{STRING("true"), STRING("$[0]")}, Null()}, + {{STRING("false"), STRING("$[0]")}, Null()}, + {{STRING("100"), STRING("$[0]")}, Null()}, //int8 + {{STRING("10000"), STRING("$[0]")}, Null()}, // int16 + {{STRING("1000000000"), STRING("$[0]")}, Null()}, // int32 + {{STRING("1152921504606846976"), STRING("$[0]")}, Null()}, // int64 + {{STRING("6.18"), STRING("$[0]")}, Null()}, // double + {{STRING(R"("abcd")"), STRING("$[0]")}, Null()}, // string + {{STRING("{}"), STRING("$[0]")}, Null()}, // empty object + {{STRING(R"({"k1":"v31", "k2": 300})"), STRING("$[0]")}, Null()}, // object + {{STRING("[]"), STRING("$[0]")}, Null()}, // empty array + {{STRING("null"), STRING("$[1]")}, Null()}, + {{STRING("true"), STRING("$[1]")}, Null()}, + {{STRING("false"), STRING("$[1]")}, Null()}, + {{STRING("100"), STRING("$[1]")}, Null()}, //int8 + {{STRING("10000"), STRING("$[1]")}, Null()}, // int16 + {{STRING("1000000000"), STRING("$[1]")}, Null()}, // int32 + {{STRING("1152921504606846976"), STRING("$[1]")}, Null()}, // int64 + {{STRING("6.18"), STRING("$[1]")}, Null()}, // double + {{STRING(R"("abcd")"), STRING("$[1]")}, Null()}, // string + {{STRING("{}"), STRING("$[1]")}, Null()}, // empty object + {{STRING(R"({"k1":"v31", "k2": 300})"), STRING("$[1]")}, Null()}, // object + {{STRING("[]"), STRING("$[1]")}, Null()}, // empty array + {{STRING("[123, 456]"), STRING("$[0]")}, INT(123)}, // int array + {{STRING("[123, 456]"), STRING("$[1]")}, INT(456)}, // int array + {{STRING("[123, 456]"), STRING("$[2]")}, Null()}, // int array + {{STRING(R"(["abc", "def"])"), STRING("$[0]")}, Null()}, // string array + {{STRING(R"(["abc", "def"])"), STRING("$[1]")}, Null()}, // string array + {{STRING(R"(["abc", "def"])"), STRING("$[2]")}, Null()}, // string array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$[0]")}, + Null()}, // multi type array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$[1]")}, + Null()}, // multi type array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$[2]")}, + Null()}, // multi type array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$[3]")}, + INT(100)}, // multi type array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$[4]")}, + Null()}, // multi type array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$[5]")}, + Null()}, // multi type array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$[6]")}, + Null()}, // multi type array + {{STRING(R"([{"k1":"v41", "k2": 400}, 1, "a", 3.14])"), STRING("$[0]")}, + Null()}, // complex array + {{STRING(R"([{"k1":"v41", "k2": 400}, 1, "a", 3.14])"), STRING("$[1]")}, + INT(1)}, // complex array + {{STRING(R"([{"k1":"v41", "k2": 400}, 1, "a", 3.14])"), STRING("$[2]")}, + Null()}, // complex array + {{STRING(R"([{"k1":"v41", "k2": 400}, 1, "a", 3.14])"), STRING("$[3]")}, + Null()}, // complex array + {{STRING(R"([{"k1":"v41", "k2": 400}, 1, "a", 3.14])"), STRING("$[4]")}, + Null()}, // complex array + }; + + check_function<DataTypeInt32, true>(func_name, input_types, data_set); + + // get json with path $[0].k1 + data_set = { + {{Null(), STRING("$[0].k1")}, Null()}, + {{STRING("null"), STRING("$[0].k1")}, Null()}, + {{STRING("true"), STRING("$[0].k1")}, Null()}, + {{STRING("false"), STRING("$[0].k1")}, Null()}, + {{STRING("100"), STRING("$[0].k1")}, Null()}, //int8 + {{STRING("10000"), STRING("$[0].k1")}, Null()}, // int16 + {{STRING("1000000000"), STRING("$[0].k1")}, Null()}, // int32 + {{STRING("1152921504606846976"), STRING("$[0].k1")}, Null()}, // int64 + {{STRING("6.18"), STRING("$[0].k1")}, Null()}, // double + {{STRING(R"("abcd")"), STRING("$[0].k1")}, Null()}, // string + {{STRING("{}"), STRING("$[0].k1")}, Null()}, // empty object + {{STRING(R"({"k1":"v31", "k2": 300})"), STRING("$[0].k1")}, Null()}, // object + {{STRING("[]"), STRING("$[0].k1")}, Null()}, // empty array + {{STRING("[123, 456]"), STRING("$[0].k1")}, Null()}, // int array + {{STRING(R"(["abc", "def"])"), STRING("$[0].k1")}, Null()}, // string array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$[0].k1")}, + Null()}, // multi type array + {{STRING(R"([{"k1":"v41", "k2": 400}, 1, "a", 3.14])"), STRING("$[0].k1")}, + Null()}, // complex array + {{STRING(R"([{"k1":"v41", "k2": 400}, 1, "a", 3.14])"), STRING("$[0].k2")}, + INT(400)}, // complex array + }; + + check_function<DataTypeInt32, true>(func_name, input_types, data_set); +} + +TEST(FunctionJsonbTEST, GetJsonBigIntTest) { + std::string func_name = "get_json_bigint"; + InputTypeSet input_types = {TypeIndex::JSONB, TypeIndex::String}; + + // get json from root + DataSet data_set = { + {{Null(), STRING("$")}, Null()}, + {{STRING("null"), STRING("$")}, Null()}, + {{STRING("true"), STRING("$")}, Null()}, + {{STRING("false"), STRING("$")}, Null()}, + {{STRING("100"), STRING("$")}, BIGINT(100)}, //int8 + {{STRING("10000"), STRING("$")}, BIGINT(10000)}, // int16 + {{STRING("1000000000"), STRING("$")}, BIGINT(1000000000)}, // int32 + {{STRING("1152921504606846976"), STRING("$")}, BIGINT(1152921504606846976)}, // int64 + {{STRING("6.18"), STRING("$")}, Null()}, // double + {{STRING(R"("abcd")"), STRING("$")}, Null()}, // string + {{STRING("{}"), STRING("$")}, Null()}, // empty object + {{STRING(R"({"k1":"v31", "k2": 300})"), STRING("$")}, Null()}, // object + {{STRING("[]"), STRING("$")}, Null()}, // empty array + {{STRING("[123, 456]"), STRING("$")}, Null()}, // int array + {{STRING(R"(["abc", "def"])"), STRING("$")}, Null()}, // string array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$")}, + Null()}, // multi type array + {{STRING(R"([{"k1":"v41", "k2": 400}, 1, "a", 3.14])"), STRING("$")}, + Null()}, // complex array + }; + + check_function<DataTypeInt64, true>(func_name, input_types, data_set); + + // get json from obejct + data_set = { + {{Null(), STRING("$.k1")}, Null()}, + {{STRING("null"), STRING("$.k1")}, Null()}, + {{STRING("true"), STRING("$.k1")}, Null()}, + {{STRING("false"), STRING("$.k1")}, Null()}, + {{STRING("100"), STRING("$.k1")}, Null()}, //int8 + {{STRING("10000"), STRING("$.k1")}, Null()}, // int16 + {{STRING("1000000000"), STRING("$.k1")}, Null()}, // int32 + {{STRING("1152921504606846976"), STRING("$.k1")}, Null()}, // int64 + {{STRING("6.18"), STRING("$.k1")}, Null()}, // double + {{STRING(R"("abcd")"), STRING("$.k1")}, Null()}, // string + {{STRING("{}"), STRING("$.k1")}, Null()}, // empty object + {{STRING(R"({"k1":"v31", "k2": 300})"), STRING("$.k1")}, Null()}, // object + {{STRING("[]"), STRING("$.k1")}, Null()}, // empty array + {{STRING("[123, 456]"), STRING("$.k1")}, Null()}, // int array + {{STRING(R"(["abc", "def"])"), STRING("$.k1")}, Null()}, // string array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$.k1")}, + Null()}, // multi type array + {{STRING(R"([{"k1":"v41", "k2": 400}, 1, "a", 3.14])"), STRING("$.k1")}, + Null()}, // complex array + }; + + check_function<DataTypeInt64, true>(func_name, input_types, data_set); + + // get json from array + data_set = { + {{Null(), STRING("$[0]")}, Null()}, + {{STRING("null"), STRING("$[0]")}, Null()}, + {{STRING("true"), STRING("$[0]")}, Null()}, + {{STRING("false"), STRING("$[0]")}, Null()}, + {{STRING("100"), STRING("$[0]")}, Null()}, //int8 + {{STRING("10000"), STRING("$[0]")}, Null()}, // int16 + {{STRING("1000000000"), STRING("$[0]")}, Null()}, // int32 + {{STRING("1152921504606846976"), STRING("$[0]")}, Null()}, // int64 + {{STRING("6.18"), STRING("$[0]")}, Null()}, // double + {{STRING(R"("abcd")"), STRING("$[0]")}, Null()}, // string + {{STRING("{}"), STRING("$[0]")}, Null()}, // empty object + {{STRING(R"({"k1":"v31", "k2": 300})"), STRING("$[0]")}, Null()}, // object + {{STRING("[]"), STRING("$[0]")}, Null()}, // empty array + {{STRING("null"), STRING("$[1]")}, Null()}, + {{STRING("true"), STRING("$[1]")}, Null()}, + {{STRING("false"), STRING("$[1]")}, Null()}, + {{STRING("100"), STRING("$[1]")}, Null()}, //int8 + {{STRING("10000"), STRING("$[1]")}, Null()}, // int16 + {{STRING("1000000000"), STRING("$[1]")}, Null()}, // int32 + {{STRING("1152921504606846976"), STRING("$[1]")}, Null()}, // int64 + {{STRING("6.18"), STRING("$[1]")}, Null()}, // double + {{STRING(R"("abcd")"), STRING("$[1]")}, Null()}, // string + {{STRING("{}"), STRING("$[1]")}, Null()}, // empty object + {{STRING(R"({"k1":"v31", "k2": 300})"), STRING("$[1]")}, Null()}, // object + {{STRING("[]"), STRING("$[1]")}, Null()}, // empty array + {{STRING("[123, 456]"), STRING("$[0]")}, BIGINT(123)}, // int array + {{STRING("[123, 456]"), STRING("$[1]")}, BIGINT(456)}, // int array + {{STRING("[123, 456]"), STRING("$[2]")}, Null()}, // int array + {{STRING(R"(["abc", "def"])"), STRING("$[0]")}, Null()}, // string array + {{STRING(R"(["abc", "def"])"), STRING("$[1]")}, Null()}, // string array + {{STRING(R"(["abc", "def"])"), STRING("$[2]")}, Null()}, // string array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$[0]")}, + Null()}, // multi type array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$[1]")}, + Null()}, // multi type array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$[2]")}, + Null()}, // multi type array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$[3]")}, + BIGINT(100)}, // multi type array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$[4]")}, + Null()}, // multi type array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$[5]")}, + Null()}, // multi type array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$[6]")}, + Null()}, // multi type array + {{STRING(R"([{"k1":"v41", "k2": 400}, 1, "a", 3.14])"), STRING("$[0]")}, + Null()}, // complex array + {{STRING(R"([{"k1":"v41", "k2": 400}, 1, "a", 3.14])"), STRING("$[1]")}, + BIGINT(1)}, // complex array + {{STRING(R"([{"k1":"v41", "k2": 400}, 1, "a", 3.14])"), STRING("$[2]")}, + Null()}, // complex array + {{STRING(R"([{"k1":"v41", "k2": 400}, 1, "a", 3.14])"), STRING("$[3]")}, + Null()}, // complex array + {{STRING(R"([{"k1":"v41", "k2": 400}, 1, "a", 3.14])"), STRING("$[4]")}, + Null()}, // complex array + }; + + check_function<DataTypeInt64, true>(func_name, input_types, data_set); + + // get json with path $[0].k1 + data_set = { + {{Null(), STRING("$[0].k1")}, Null()}, + {{STRING("null"), STRING("$[0].k1")}, Null()}, + {{STRING("true"), STRING("$[0].k1")}, Null()}, + {{STRING("false"), STRING("$[0].k1")}, Null()}, + {{STRING("100"), STRING("$[0].k1")}, Null()}, //int8 + {{STRING("10000"), STRING("$[0].k1")}, Null()}, // int16 + {{STRING("1000000000"), STRING("$[0].k1")}, Null()}, // int32 + {{STRING("1152921504606846976"), STRING("$[0].k1")}, Null()}, // int64 + {{STRING("6.18"), STRING("$[0].k1")}, Null()}, // double + {{STRING(R"("abcd")"), STRING("$[0].k1")}, Null()}, // string + {{STRING("{}"), STRING("$[0].k1")}, Null()}, // empty object + {{STRING(R"({"k1":"v31", "k2": 300})"), STRING("$[0].k1")}, Null()}, // object + {{STRING("[]"), STRING("$[0].k1")}, Null()}, // empty array + {{STRING("[123, 456]"), STRING("$[0].k1")}, Null()}, // int array + {{STRING(R"(["abc", "def"])"), STRING("$[0].k1")}, Null()}, // string array + {{STRING(R"([null, true, false, 100, 6.18, "abc"])"), STRING("$[0].k1")}, + Null()}, // multi type array + {{STRING(R"([{"k1":"v41", "k2": 400}, 1, "a", 3.14])"), STRING("$[0].k1")}, + Null()}, // complex array + {{STRING(R"([{"k1":"v41", "k2": 400}, 1, "a", 3.14])"), STRING("$[0].k2")}, + BIGINT(400)}, // complex array + }; + + check_function<DataTypeInt64, true>(func_name, input_types, data_set); +} + +TEST(FunctionJsonbTEST, GetJsonDoubleTest) { + std::string func_name = "get_json_double"; + InputTypeSet input_types = {TypeIndex::JSONB, TypeIndex::String}; Review Comment: warning: variable 'input_types' is not initialized [cppcoreguidelines-init-variables] ```suggestion InputTypeSet input_types = 0 = {TypeIndex::JSONB, TypeIndex::String}; ``` -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For queries about this service, please contact Infrastructure at: us...@infra.apache.org --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org