This is an automated email from the ASF dual-hosted git repository.

morningman pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/master by this push:
     new fe95b84c34 [fix](jsonb)fix CAST String to JSONB nullable problem 
(#14626)
fe95b84c34 is described below

commit fe95b84c346c2e62dc8ebdd5a0b66a38b5f3013d
Author: Kang <[email protected]>
AuthorDate: Tue Nov 29 16:22:22 2022 +0800

    [fix](jsonb)fix CAST String to JSONB nullable problem (#14626)
    
    fix CAST String to SONB nullable problem in DEBUG mode.
---
 be/src/vec/data_types/data_type_factory.hpp        |   2 +-
 be/src/vec/functions/function_cast.h               |   3 +-
 be/test/vec/function/function_jsonb_test.cpp       |  49 +++-
 .../data/jsonb_p0/test_jsonb_load_and_function.out | 324 +++++++++++++++++++++
 .../jsonb_p0/test_jsonb_load_and_function.groovy   |  43 +++
 5 files changed, 409 insertions(+), 12 deletions(-)

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<DataTypeDecimal<Decimal128I>>(
                                             
BeConsts::MAX_DECIMAL128_PRECISION, 0)},
-                    {"Json", std::make_shared<DataTypeJsonb>()},
+                    {"Jsonb", std::make_shared<DataTypeJsonb>()},
                     {"BitMap", std::make_shared<DataTypeBitMap>()},
                     {"Hll", std::make_shared<DataTypeHLL>()},
             };
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<DataTypeJsonb, true>(
             "CAST", {Nullable {TypeIndex::UInt8}, ConstedNotnull 
{TypeIndex::String}},
-            {{{BOOLEAN(1), STRING("Json")}, STRING("true")}});
+            {{{BOOLEAN(1), STRING("Jsonb")}, STRING("true")}});
     check_function<DataTypeJsonb, true>(
             "CAST", {Nullable {TypeIndex::UInt8}, ConstedNotnull 
{TypeIndex::String}},
-            {{{BOOLEAN(0), STRING("Json")}, STRING("false")}});
+            {{{BOOLEAN(0), STRING("Jsonb")}, STRING("false")}});
     check_function<DataTypeJsonb, true>(
             "CAST", {Nullable {TypeIndex::Int8}, ConstedNotnull 
{TypeIndex::String}},
-            {{{TINYINT(100), STRING("Json")}, STRING("100")}});
+            {{{TINYINT(100), STRING("Jsonb")}, STRING("100")}});
     check_function<DataTypeJsonb, true>(
             "CAST", {Nullable {TypeIndex::Int16}, ConstedNotnull 
{TypeIndex::String}},
-            {{{SMALLINT(10000), STRING("Json")}, STRING("10000")}});
+            {{{SMALLINT(10000), STRING("Jsonb")}, STRING("10000")}});
     check_function<DataTypeJsonb, true>(
             "CAST", {Nullable {TypeIndex::Int32}, ConstedNotnull 
{TypeIndex::String}},
-            {{{INT(1000000000), STRING("Json")}, STRING("1000000000")}});
+            {{{INT(1000000000), STRING("Jsonb")}, STRING("1000000000")}});
     check_function<DataTypeJsonb, true>(
             "CAST", {Nullable {TypeIndex::Int64}, ConstedNotnull 
{TypeIndex::String}},
-            {{{BIGINT(1152921504606846976), STRING("Json")}, 
STRING("1152921504606846976")}});
+            {{{BIGINT(1152921504606846976), STRING("Jsonb")}, 
STRING("1152921504606846976")}});
     check_function<DataTypeJsonb, true>(
             "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<DataTypeJsonb, true>(
             "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<DataTypeJsonb, true>(
             "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<DataTypeJsonb, false>(
+            "CAST", {Notnull {TypeIndex::UInt8}, ConstedNotnull 
{TypeIndex::String}},
+            {{{BOOLEAN(1), STRING("Jsonb")}, STRING("true")}});
+    check_function<DataTypeJsonb, false>(
+            "CAST", {Notnull {TypeIndex::UInt8}, ConstedNotnull 
{TypeIndex::String}},
+            {{{BOOLEAN(0), STRING("Jsonb")}, STRING("false")}});
+    check_function<DataTypeJsonb, false>(
+            "CAST", {Notnull {TypeIndex::Int8}, ConstedNotnull 
{TypeIndex::String}},
+            {{{TINYINT(100), STRING("Jsonb")}, STRING("100")}});
+    check_function<DataTypeJsonb, false>(
+            "CAST", {Notnull {TypeIndex::Int16}, ConstedNotnull 
{TypeIndex::String}},
+            {{{SMALLINT(10000), STRING("Jsonb")}, STRING("10000")}});
+    check_function<DataTypeJsonb, false>(
+            "CAST", {Notnull {TypeIndex::Int32}, ConstedNotnull 
{TypeIndex::String}},
+            {{{INT(1000000000), STRING("Jsonb")}, STRING("1000000000")}});
+    check_function<DataTypeJsonb, false>(
+            "CAST", {Notnull {TypeIndex::Int64}, ConstedNotnull 
{TypeIndex::String}},
+            {{{BIGINT(1152921504606846976), STRING("Jsonb")}, 
STRING("1152921504606846976")}});
+    check_function<DataTypeJsonb, false>(
+            "CAST", {Notnull {TypeIndex::Float64}, ConstedNotnull 
{TypeIndex::String}},
+            {{{DOUBLE(6.18), STRING("Jsonb")}, STRING("6.18")}});
+    // String to JSONB should always be Nullable
+    check_function<DataTypeJsonb, true>(
+            "CAST", {Notnull {TypeIndex::String}, ConstedNotnull 
{TypeIndex::String}},
+            {{{STRING(R"(abcd)"), STRING("Jsonb")}, Null()}}); // should fail
+    check_function<DataTypeJsonb, true>(
+            "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)"""
+
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to