From 4ad6e00ec3c24eca811691e90ea7ba0291d31642 Mon Sep 17 00:00:00 2001 From: obdev Date: Fri, 21 Oct 2022 03:32:23 +0000 Subject: [PATCH] fix: json type object support empty string key --- deps/oblib/src/lib/json_type/ob_json_bin.cpp | 15 +++++--- deps/oblib/src/lib/json_type/ob_json_path.cpp | 2 +- deps/oblib/src/lib/json_type/ob_json_tree.cpp | 3 -- src/sql/engine/expr/ob_expr_json_search.cpp | 2 +- src/sql/engine/expr/ob_expr_json_value.cpp | 36 +++++++++---------- 5 files changed, 30 insertions(+), 28 deletions(-) diff --git a/deps/oblib/src/lib/json_type/ob_json_bin.cpp b/deps/oblib/src/lib/json_type/ob_json_bin.cpp index 15f26a227..fcee0bbe3 100644 --- a/deps/oblib/src/lib/json_type/ob_json_bin.cpp +++ b/deps/oblib/src/lib/json_type/ob_json_bin.cpp @@ -1322,11 +1322,16 @@ int ObJsonBin::deserialize_json_object_v0(const char *data, uint64_t length, ObJ } else { // TODO if with key dict, read key from dict // to consider, add option to controll need alloc or not - void *key_buf = allocator_->alloc(key_len); - if (key_buf == NULL) { - ret = OB_ALLOCATE_MEMORY_FAILED; - LOG_WARN("fail to alloc memory for data buf", K(ret)); - } else { + void *key_buf = nullptr; + if (key_len > 0) { + key_buf = allocator_->alloc(key_len); + if (key_buf == NULL) { + ret = OB_ALLOCATE_MEMORY_FAILED; + LOG_WARN("fail to alloc memory for data buf", K(ret)); + } + } + + if (OB_SUCC(ret)) { MEMCPY(key_buf, data + key_offset, key_len); ObString key(key_len, reinterpret_cast(key_buf)); const char *val = data + value_offset; diff --git a/deps/oblib/src/lib/json_type/ob_json_path.cpp b/deps/oblib/src/lib/json_type/ob_json_path.cpp index 066609636..91019c4a4 100644 --- a/deps/oblib/src/lib/json_type/ob_json_path.cpp +++ b/deps/oblib/src/lib/json_type/ob_json_path.cpp @@ -1051,7 +1051,7 @@ int ObJsonPath::parse_name_with_rapidjson(char*& str, uint64_t& len) ObJsonString *val = static_cast(dom); len = val->value().length(); str = static_cast (allocator_->alloc(len)); - if (OB_ISNULL(str)) { + if (len > 0 && OB_ISNULL(str)) { ret = OB_ALLOCATE_MEMORY_FAILED; LOG_WARN("fail to allocate memory for member_name.", K(ret), K(len), K(val->value())); diff --git a/deps/oblib/src/lib/json_type/ob_json_tree.cpp b/deps/oblib/src/lib/json_type/ob_json_tree.cpp index ddb483db6..788146ffc 100644 --- a/deps/oblib/src/lib/json_type/ob_json_tree.cpp +++ b/deps/oblib/src/lib/json_type/ob_json_tree.cpp @@ -630,9 +630,6 @@ int ObJsonObject::add(const common::ObString &key, ObJsonNode *value) if (OB_ISNULL(value)) { // check param ret = OB_INVALID_ARGUMENT; LOG_WARN("param value is NULL", K(ret)); - } else if (key.empty()) { - ret = OB_ERR_JSON_DOCUMENT_NULL_KEY; - LOG_WARN("key is NULL", K(ret)); } else { value->set_parent(this); ObJsonObjectPair pair(key, value); diff --git a/src/sql/engine/expr/ob_expr_json_search.cpp b/src/sql/engine/expr/ob_expr_json_search.cpp index 1e4614321..33be2689f 100644 --- a/src/sql/engine/expr/ob_expr_json_search.cpp +++ b/src/sql/engine/expr/ob_expr_json_search.cpp @@ -493,7 +493,7 @@ int ObExprJsonSearch::eval_json_search(const ObExpr &expr, ObEvalCtx &ctx, ObDat } // check one_or_all flag - bool one_flag; + bool one_flag = false; if (OB_SUCC(ret) && !is_null) { json_arg = expr.args_[1]; val_type = json_arg->datum_meta_.type_; diff --git a/src/sql/engine/expr/ob_expr_json_value.cpp b/src/sql/engine/expr/ob_expr_json_value.cpp index 02a65786f..16732967e 100644 --- a/src/sql/engine/expr/ob_expr_json_value.cpp +++ b/src/sql/engine/expr/ob_expr_json_value.cpp @@ -1155,7 +1155,7 @@ int ObExprJsonValue::cast_to_res(common::ObIAllocator *allocator, case ObMediumIntType: case ObInt32Type: case ObIntType: { - int64_t val; + int64_t val = 0; ret = cast_to_int(j_base, dst_type, val); if (!try_set_error_val(res, ret, error_type, error_val)) { res.set_int(dst_type, val); @@ -1167,7 +1167,7 @@ int ObExprJsonValue::cast_to_res(common::ObIAllocator *allocator, case ObUMediumIntType: case ObUInt32Type: case ObUInt64Type: { - uint64_t val; + uint64_t val = 0; ret = cast_to_uint(j_base, dst_type, val); if (!try_set_error_val(res, ret, error_type, error_val)) { res.set_uint(dst_type, val); @@ -1175,7 +1175,7 @@ int ObExprJsonValue::cast_to_res(common::ObIAllocator *allocator, break; } case ObDateTimeType: { - int64_t val; + int64_t val = 0; ret = cast_to_datetime(j_base, accuracy, val); if (ret == OB_ERR_NULL_VALUE) { res.set_null(); @@ -1194,7 +1194,7 @@ int ObExprJsonValue::cast_to_res(common::ObIAllocator *allocator, break; } case ObDateType: { - int32_t val; + int32_t val = 0; ret = cast_to_date(j_base, val); if (!try_set_error_val(res, ret, error_type, error_val)) { res.set_date(val); @@ -1202,7 +1202,7 @@ int ObExprJsonValue::cast_to_res(common::ObIAllocator *allocator, break; } case ObTimeType: { - int64_t val; + int64_t val = 0; ret = cast_to_time(j_base, accuracy, val); if (!try_set_error_val(res, ret, error_type, error_val)) { res.set_time(val); @@ -1210,7 +1210,7 @@ int ObExprJsonValue::cast_to_res(common::ObIAllocator *allocator, break; } case ObYearType: { - uint8_t val; + uint8_t val = 0; ret = cast_to_year(j_base, val); if (!try_set_error_val(res, ret, error_type, error_val)) { res.set_year(val); @@ -1219,7 +1219,7 @@ int ObExprJsonValue::cast_to_res(common::ObIAllocator *allocator, } case ObFloatType: case ObUFloatType: { - float out_val; + float out_val = 0; ret = cast_to_float(j_base, dst_type, out_val); if (!try_set_error_val(res, ret, error_type, error_val)) { res.set_float(dst_type, out_val); @@ -1228,7 +1228,7 @@ int ObExprJsonValue::cast_to_res(common::ObIAllocator *allocator, } case ObDoubleType: case ObUDoubleType: { - double out_val; + double out_val = 0; ret = cast_to_double(j_base, dst_type, out_val); if (!try_set_error_val(res, ret, error_type, error_val)) { res.set_double(dst_type, out_val); @@ -1262,7 +1262,7 @@ int ObExprJsonValue::cast_to_res(common::ObIAllocator *allocator, break; } case ObBitType: { - uint64_t out_val; + uint64_t out_val = 0; ret = cast_to_bit(j_base, out_val); if (!try_set_error_val(res, ret, error_type, error_val)) { res.set_bit(out_val); @@ -1325,7 +1325,7 @@ int ObExprJsonValue::cast_to_res(common::ObIAllocator *allocator, case ObMediumIntType: case ObInt32Type: case ObIntType: { - int64_t val; + int64_t val = 0; ret = cast_to_int(j_base, dst_type, val); if (!try_set_error_val(res, ret, error_type, error_val)) { res.set_int(val); @@ -1337,7 +1337,7 @@ int ObExprJsonValue::cast_to_res(common::ObIAllocator *allocator, case ObUMediumIntType: case ObUInt32Type: case ObUInt64Type: { - uint64_t val; + uint64_t val = 0; ret = cast_to_uint(j_base, dst_type, val); if (!try_set_error_val(res, ret, error_type, error_val)) { res.set_uint(val); @@ -1345,7 +1345,7 @@ int ObExprJsonValue::cast_to_res(common::ObIAllocator *allocator, break; } case ObDateTimeType: { - int64_t val; + int64_t val = 0; ret = cast_to_datetime(j_base, accuracy, val); if (ret == OB_ERR_NULL_VALUE) { res.set_null(); @@ -1366,7 +1366,7 @@ int ObExprJsonValue::cast_to_res(common::ObIAllocator *allocator, break; } case ObDateType: { - int32_t val; + int32_t val = 0; ret = cast_to_date(j_base, val); if (!try_set_error_val(res, ret, error_type, error_val)) { res.set_date(val); @@ -1374,7 +1374,7 @@ int ObExprJsonValue::cast_to_res(common::ObIAllocator *allocator, break; } case ObTimeType: { - int64_t val; + int64_t val = 0; ret = cast_to_time(j_base, accuracy, val); if (!try_set_error_val(res, ret, error_type, error_val)) { res.set_time(val); @@ -1382,7 +1382,7 @@ int ObExprJsonValue::cast_to_res(common::ObIAllocator *allocator, break; } case ObYearType: { - uint8_t val; + uint8_t val = 0; ret = cast_to_year(j_base, val); if (!try_set_error_val(res, ret, error_type, error_val)) { res.set_year(val); @@ -1391,7 +1391,7 @@ int ObExprJsonValue::cast_to_res(common::ObIAllocator *allocator, } case ObFloatType: case ObUFloatType: { - float out_val; + float out_val = 0; ret = cast_to_float(j_base, dst_type, out_val); if (!try_set_error_val(res, ret, error_type, error_val)) { res.set_float(out_val); @@ -1400,7 +1400,7 @@ int ObExprJsonValue::cast_to_res(common::ObIAllocator *allocator, } case ObDoubleType: case ObUDoubleType: { - double out_val; + double out_val = 0; ret = cast_to_double(j_base, dst_type, out_val); if (!try_set_error_val(res, ret, error_type, error_val)) { res.set_double(out_val); @@ -1442,7 +1442,7 @@ int ObExprJsonValue::cast_to_res(common::ObIAllocator *allocator, break; } case ObBitType: { - uint64_t out_val; + uint64_t out_val = 0; ret = cast_to_bit(j_base, out_val); if (!try_set_error_val(res, ret, error_type, error_val)) { res.set_bit(out_val); -- GitLab