diff --git a/be/src/vec/data_types/data_type_factory.hpp b/be/src/vec/data_types/data_type_factory.hpp index b164c432f1..696ab9ee54 100644 --- a/be/src/vec/data_types/data_type_factory.hpp +++ b/be/src/vec/data_types/data_type_factory.hpp @@ -79,7 +79,7 @@ public: BeConsts::MAX_DECIMAL128_PRECISION, 0)}, {"Decimal128I", std::make_shared>( BeConsts::MAX_DECIMAL128_PRECISION, 0)}, - {"Json", std::make_shared()}, + {"Jsonb", std::make_shared()}, {"BitMap", std::make_shared()}, {"Hll", std::make_shared()}, }; diff --git a/be/src/vec/functions/function_cast.h b/be/src/vec/functions/function_cast.h index e15ef01e9f..90edd3906b 100644 --- a/be/src/vec/functions/function_cast.h +++ b/be/src/vec/functions/function_cast.h @@ -1730,8 +1730,7 @@ protected: need_to_be_nullable |= arguments[0].type->is_nullable(); // 2. from_type is string, to_type is not string need_to_be_nullable |= (arguments[0].type->get_type_id() == TypeIndex::String) && - (type->get_type_id() != TypeIndex::String) && - (type->get_type_id() != TypeIndex::JSONB); + (type->get_type_id() != TypeIndex::String); // 3. from_type is not DateTime/Date, to_type is DateTime/Date need_to_be_nullable |= (arguments[0].type->get_type_id() != TypeIndex::Date && arguments[0].type->get_type_id() != TypeIndex::DateTime) && diff --git a/be/test/vec/function/function_jsonb_test.cpp b/be/test/vec/function/function_jsonb_test.cpp index 46ef9655dd..7f1fd480e5 100644 --- a/be/test/vec/function/function_jsonb_test.cpp +++ b/be/test/vec/function/function_jsonb_test.cpp @@ -1394,33 +1394,64 @@ TEST(FunctionJsonbTEST, JsonbCastToOtherTest) { } TEST(FunctionJsonbTEST, JsonbCastFromOtherTest) { + // CAST Nullable(X) to Nullable(JSONB) check_function( "CAST", {Nullable {TypeIndex::UInt8}, ConstedNotnull {TypeIndex::String}}, - {{{BOOLEAN(1), STRING("Json")}, STRING("true")}}); + {{{BOOLEAN(1), STRING("Jsonb")}, STRING("true")}}); check_function( "CAST", {Nullable {TypeIndex::UInt8}, ConstedNotnull {TypeIndex::String}}, - {{{BOOLEAN(0), STRING("Json")}, STRING("false")}}); + {{{BOOLEAN(0), STRING("Jsonb")}, STRING("false")}}); check_function( "CAST", {Nullable {TypeIndex::Int8}, ConstedNotnull {TypeIndex::String}}, - {{{TINYINT(100), STRING("Json")}, STRING("100")}}); + {{{TINYINT(100), STRING("Jsonb")}, STRING("100")}}); check_function( "CAST", {Nullable {TypeIndex::Int16}, ConstedNotnull {TypeIndex::String}}, - {{{SMALLINT(10000), STRING("Json")}, STRING("10000")}}); + {{{SMALLINT(10000), STRING("Jsonb")}, STRING("10000")}}); check_function( "CAST", {Nullable {TypeIndex::Int32}, ConstedNotnull {TypeIndex::String}}, - {{{INT(1000000000), STRING("Json")}, STRING("1000000000")}}); + {{{INT(1000000000), STRING("Jsonb")}, STRING("1000000000")}}); check_function( "CAST", {Nullable {TypeIndex::Int64}, ConstedNotnull {TypeIndex::String}}, - {{{BIGINT(1152921504606846976), STRING("Json")}, STRING("1152921504606846976")}}); + {{{BIGINT(1152921504606846976), STRING("Jsonb")}, STRING("1152921504606846976")}}); check_function( "CAST", {Nullable {TypeIndex::Float64}, ConstedNotnull {TypeIndex::String}}, - {{{DOUBLE(6.18), STRING("Json")}, STRING("6.18")}}); + {{{DOUBLE(6.18), STRING("Jsonb")}, STRING("6.18")}}); check_function( "CAST", {Nullable {TypeIndex::String}, ConstedNotnull {TypeIndex::String}}, - {{{STRING(R"(abcd)"), STRING("Json")}, Null()}}); // should fail + {{{STRING(R"(abcd)"), STRING("Jsonb")}, Null()}}); // should fail check_function( "CAST", {Nullable {TypeIndex::String}, ConstedNotnull {TypeIndex::String}}, - {{{STRING(R"("abcd")"), STRING("Json")}, STRING(R"("abcd")")}}); + {{{STRING(R"("abcd")"), STRING("Jsonb")}, STRING(R"("abcd")")}}); + + // CAST X to JSONB + check_function( + "CAST", {Notnull {TypeIndex::UInt8}, ConstedNotnull {TypeIndex::String}}, + {{{BOOLEAN(1), STRING("Jsonb")}, STRING("true")}}); + check_function( + "CAST", {Notnull {TypeIndex::UInt8}, ConstedNotnull {TypeIndex::String}}, + {{{BOOLEAN(0), STRING("Jsonb")}, STRING("false")}}); + check_function( + "CAST", {Notnull {TypeIndex::Int8}, ConstedNotnull {TypeIndex::String}}, + {{{TINYINT(100), STRING("Jsonb")}, STRING("100")}}); + check_function( + "CAST", {Notnull {TypeIndex::Int16}, ConstedNotnull {TypeIndex::String}}, + {{{SMALLINT(10000), STRING("Jsonb")}, STRING("10000")}}); + check_function( + "CAST", {Notnull {TypeIndex::Int32}, ConstedNotnull {TypeIndex::String}}, + {{{INT(1000000000), STRING("Jsonb")}, STRING("1000000000")}}); + check_function( + "CAST", {Notnull {TypeIndex::Int64}, ConstedNotnull {TypeIndex::String}}, + {{{BIGINT(1152921504606846976), STRING("Jsonb")}, STRING("1152921504606846976")}}); + check_function( + "CAST", {Notnull {TypeIndex::Float64}, ConstedNotnull {TypeIndex::String}}, + {{{DOUBLE(6.18), STRING("Jsonb")}, STRING("6.18")}}); + // String to JSONB should always be Nullable + check_function( + "CAST", {Notnull {TypeIndex::String}, ConstedNotnull {TypeIndex::String}}, + {{{STRING(R"(abcd)"), STRING("Jsonb")}, Null()}}); // should fail + check_function( + "CAST", {Notnull {TypeIndex::String}, ConstedNotnull {TypeIndex::String}}, + {{{STRING(R"("abcd")"), STRING("Jsonb")}, STRING(R"("abcd")")}}); } } // namespace doris::vectorized diff --git a/regression-test/data/jsonb_p0/test_jsonb_load_and_function.out b/regression-test/data/jsonb_p0/test_jsonb_load_and_function.out index b2b68133f6..e7d9b65b2e 100644 --- a/regression-test/data/jsonb_p0/test_jsonb_load_and_function.out +++ b/regression-test/data/jsonb_p0/test_jsonb_load_and_function.out @@ -3442,3 +3442,327 @@ 18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N 26 {"k1":"v1","k2":200} \N +-- !select -- +1 \N \N +2 null \N +3 true true +4 false false +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 100 +6 10000 10000 +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 100 +6 10000 10000 +7 1000000000 1000000000 +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 100 +6 10000 10000 +7 1000000000 1000000000 +8 1152921504606846976 1152921504606846976 +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 100.0 +6 10000 10000.0 +7 1000000000 1.0E9 +8 1152921504606846976 1.15292150460684698E18 +9 6.18 6.18 +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null null +3 true true +4 false false +5 100 100 +6 10000 10000 +7 1000000000 1000000000 +8 1152921504606846976 1152921504606846976 +9 6.18 6.18 +10 "abcd" "abcd" +11 {} {} +12 {"k1":"v31","k2":300} {"k1":"v31","k2":300} +13 [] [] +14 [123,456] [123,456] +15 ["abc","def"] ["abc","def"] +16 [null,true,false,100,6.18,"abc"] [null,true,false,100,6.18,"abc"] +17 [{"k1":"v41","k2":400},1,"a",3.14] [{"k1":"v41","k2":400},1,"a",3.14] +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} +26 {"k1":"v1","k2":200} {"k1":"v1","k2":200} + +-- !select -- +1 \N \N +2 null \N +3 true true +4 false false +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 100 +6 10000 10000 +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 100 +6 10000 10000 +7 1000000000 1000000000 +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 100 +6 10000 10000 +7 1000000000 1000000000 +8 1152921504606846976 1152921504606846976 +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 100 +6 10000 10000 +7 1000000000 1000000000 +8 1152921504606846976 1.15292150460685e+18 +9 6.18 6.18 +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null null +3 true true +4 false false +5 100 100 +6 10000 10000 +7 1000000000 1000000000 +8 1152921504606846976 1152921504606846976 +9 6.18 6.18 +10 "abcd" "abcd" +11 {} {} +12 {"k1":"v31","k2":300} {"k1":"v31","k2":300} +13 [] [] +14 [123,456] [123,456] +15 ["abc","def"] ["abc","def"] +16 [null,true,false,100,6.18,"abc"] [null,true,false,100,6.18,"abc"] +17 [{"k1":"v41","k2":400},1,"a",3.14] [{"k1":"v41","k2":400},1,"a",3.14] +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} +26 {"k1":"v1","k2":200} {"k1":"v1","k2":200} + +-- !select -- +null + +-- !select -- +true + +-- !select -- +false + +-- !select -- +100 + +-- !select -- +10000 + +-- !select -- +1000000000 + +-- !select -- +1152921504606846976 + +-- !select -- +6.18 + +-- !select -- +"abcd" + +-- !select -- +{} + +-- !select -- +{"k1":"v31","k2":300} + +-- !select -- +[] + +-- !select -- +[123,456] + +-- !select -- +["abc","def"] + +-- !select -- +[null,true,false,100,6.18,"abc"] + +-- !select -- +[{"k1":"v41","k2":400},1,"a",3.14] + +-- !select -- +{"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} + +-- !select -- +\N + +-- !select -- +\N + +-- !select -- +\N + +-- !select -- +\N + +-- !select -- +\N + +-- !select -- +\N + +-- !select -- +\N + diff --git a/regression-test/suites/jsonb_p0/test_jsonb_load_and_function.groovy b/regression-test/suites/jsonb_p0/test_jsonb_load_and_function.groovy index 871d1542dd..2535f375ef 100644 --- a/regression-test/suites/jsonb_p0/test_jsonb_load_and_function.groovy +++ b/regression-test/suites/jsonb_p0/test_jsonb_load_and_function.groovy @@ -308,4 +308,47 @@ suite("test_jsonb_load_and_function", "p0") { qt_select "SELECT id, j, jsonb_type(j, '\$.a1[3]') FROM ${testTable} ORDER BY id" qt_select "SELECT id, j, jsonb_type(j, '\$.a1[4]') FROM ${testTable} ORDER BY id" qt_select "SELECT id, j, jsonb_type(j, '\$.a1[10]') FROM ${testTable} ORDER BY id" + + + // CAST from JSONB + qt_select "SELECT id, j, CAST(j AS BOOLEAN) FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, CAST(j AS SMALLINT) FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, CAST(j AS INT) FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, CAST(j AS BIGINT) FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, CAST(j AS DOUBLE) FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, CAST(j AS STRING) FROM ${testTable} ORDER BY id" + + // CAST to JSONB + qt_select "SELECT id, j, CAST(CAST(j AS BOOLEAN) AS JSONB) FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, CAST(CAST(j AS SMALLINT) AS JSONB) FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, CAST(CAST(j AS INT) AS JSONB) FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, CAST(CAST(j AS BIGINT) AS JSONB) FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, CAST(CAST(j AS DOUBLE) AS JSONB) FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, CAST(CAST(j AS STRING) AS JSONB) FROM ${testTable} ORDER BY id" + + qt_select """SELECT CAST('null' AS JSONB)""" + qt_select """SELECT CAST('true' AS JSONB)""" + qt_select """SELECT CAST('false' AS JSONB)""" + qt_select """SELECT CAST('100' AS JSONB)""" + qt_select """SELECT CAST('10000' AS JSONB)""" + qt_select """SELECT CAST('1000000000' AS JSONB)""" + qt_select """SELECT CAST('1152921504606846976' AS JSONB)""" + qt_select """SELECT CAST('6.18' AS JSONB)""" + qt_select """SELECT CAST('"abcd"' AS JSONB)""" + qt_select """SELECT CAST('{}' AS JSONB)""" + qt_select """SELECT CAST('{"k1":"v31", "k2": 300}' AS JSONB)""" + qt_select """SELECT CAST('[]' AS JSONB)""" + qt_select """SELECT CAST('[123, 456]' AS JSONB)""" + qt_select """SELECT CAST('["abc", "def"]' AS JSONB)""" + qt_select """SELECT CAST('[null, true, false, 100, 6.18, "abc"]' AS JSONB)""" + qt_select """SELECT CAST('[{"k1":"v41", "k2": 400}, 1, "a", 3.14]' AS JSONB)""" + qt_select """SELECT CAST('{"k1":"v31", "k2": 300, "a1": [{"k1":"v41", "k2": 400}, 1, "a", 3.14]}' AS JSONB)""" + qt_select """SELECT CAST("''" AS JSONB)""" + qt_select """SELECT CAST("'abc'" AS JSONB)""" + qt_select """SELECT CAST('abc' AS JSONB)""" + qt_select """SELECT CAST('100x' AS JSONB)""" + qt_select """SELECT CAST('6.a8' AS JSONB)""" + qt_select """SELECT CAST('{x' AS JSONB)""" + qt_select """SELECT CAST('[123, abc]' AS JSONB)""" + }