fix: json type json-object support empty string key
This commit is contained in:
9
deps/oblib/src/lib/json_type/ob_json_bin.cpp
vendored
9
deps/oblib/src/lib/json_type/ob_json_bin.cpp
vendored
@ -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);
|
||||
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));
|
||||
} else {
|
||||
}
|
||||
}
|
||||
|
||||
if (OB_SUCC(ret)) {
|
||||
MEMCPY(key_buf, data + key_offset, key_len);
|
||||
ObString key(key_len, reinterpret_cast<const char*>(key_buf));
|
||||
const char *val = data + value_offset;
|
||||
|
||||
@ -1049,7 +1049,7 @@ int ObJsonPath::parse_name_with_rapidjson(char*& str, uint64_t& len)
|
||||
ObJsonString *val = static_cast<ObJsonString *>(dom);
|
||||
len = val->value().length();
|
||||
str = static_cast<char*> (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()));
|
||||
|
||||
@ -628,9 +628,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);
|
||||
|
||||
@ -262,7 +262,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_;
|
||||
|
||||
@ -1151,7 +1151,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<ObDatum>(res, ret, error_type, error_val, "SIGNED")) {
|
||||
res.set_int(val);
|
||||
@ -1163,7 +1163,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<ObDatum>(res, ret, error_type, error_val, "UNSIGNED")) {
|
||||
res.set_uint(val);
|
||||
@ -1171,7 +1171,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();
|
||||
@ -1192,7 +1192,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<ObDatum>(res, ret, error_type, error_val, "DATE")) {
|
||||
res.set_date(val);
|
||||
@ -1200,7 +1200,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<ObDatum>(res, ret, error_type, error_val, "TIME")) {
|
||||
res.set_time(val);
|
||||
@ -1208,7 +1208,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<ObDatum>(res, ret, error_type, error_val, "YEAR")) {
|
||||
res.set_year(val);
|
||||
@ -1217,7 +1217,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<ObDatum>(res, ret, error_type, error_val, "FLOAT")) {
|
||||
res.set_float(out_val);
|
||||
@ -1226,7 +1226,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<ObDatum>(res, ret, error_type, error_val, "DOUBLE")) {
|
||||
res.set_double(out_val);
|
||||
@ -1268,7 +1268,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<ObDatum>(res, ret, error_type, error_val, "BIT")) {
|
||||
res.set_bit(out_val);
|
||||
|
||||
Reference in New Issue
Block a user