fix: json type 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;
|
||||
|
||||
@ -1051,7 +1051,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()));
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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_;
|
||||
|
||||
@ -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<ObObj>(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<ObObj>(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<ObObj>(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<ObObj>(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<ObObj>(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<ObObj>(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<ObObj>(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<ObObj>(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<ObDatum>(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<ObDatum>(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<ObDatum>(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<ObDatum>(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<ObDatum>(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<ObDatum>(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<ObDatum>(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<ObDatum>(res, ret, error_type, error_val)) {
|
||||
res.set_bit(out_val);
|
||||
|
||||
Reference in New Issue
Block a user