Fix invalid rowid rowkey inside rowid
This commit is contained in:
39
deps/oblib/src/lib/rowid/ob_urowid.cpp
vendored
39
deps/oblib/src/lib/rowid/ob_urowid.cpp
vendored
@ -12,6 +12,7 @@
|
|||||||
|
|
||||||
#include "ob_urowid.h"
|
#include "ob_urowid.h"
|
||||||
|
|
||||||
|
#include "common/ob_smart_call.h"
|
||||||
#include "common/ob_tablet_id.h"
|
#include "common/ob_tablet_id.h"
|
||||||
#include "common/object/ob_object.h"
|
#include "common/object/ob_object.h"
|
||||||
#include "lib/encode/ob_base64_encode.h"
|
#include "lib/encode/ob_base64_encode.h"
|
||||||
@ -447,10 +448,10 @@ int ObURowIDData::decode2urowid(const char* input, const int64_t input_len,
|
|||||||
urowid_data.rowid_content_ = decoded_buf;
|
urowid_data.rowid_content_ = decoded_buf;
|
||||||
urowid_data.rowid_len_ = pos;
|
urowid_data.rowid_len_ = pos;
|
||||||
// check validity after decoding
|
// check validity after decoding
|
||||||
if (!urowid_data.is_valid_urowid()) {
|
if (OB_FAIL(urowid_data.check_is_valid_urowid())) {
|
||||||
urowid_data.rowid_content_ = NULL;
|
urowid_data.rowid_content_ = NULL;
|
||||||
urowid_data.rowid_len_ = 0;
|
urowid_data.rowid_len_ = 0;
|
||||||
ret = OB_INVALID_ROWID;
|
COMMON_LOG(WARN, "invalid rowid", K(ret));
|
||||||
} else {
|
} else {
|
||||||
// do nothing
|
// do nothing
|
||||||
}
|
}
|
||||||
@ -487,35 +488,44 @@ int ObURowIDData::build_invalid_rowid_obj(ObIAllocator &alloc, ObObj *&rowid_obj
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ObURowIDData::is_valid_urowid() const
|
int ObURowIDData::check_is_valid_urowid() const
|
||||||
{
|
{
|
||||||
bool is_valid = true;
|
|
||||||
int ret = OB_SUCCESS;
|
int ret = OB_SUCCESS;
|
||||||
const uint8_t version = get_version();
|
const uint8_t version = get_version();
|
||||||
if (HEAP_TABLE_ROWID_VERSION == version) {
|
if (HEAP_TABLE_ROWID_VERSION == version) {
|
||||||
is_valid = rowid_len_ == HEAP_ORGANIZED_TABLE_ROWID_CONTENT_BUF_SIZE;
|
if (rowid_len_ != HEAP_ORGANIZED_TABLE_ROWID_CONTENT_BUF_SIZE) {
|
||||||
|
ret = OB_INVALID_ROWID;
|
||||||
|
}
|
||||||
} else if (EXT_HEAP_TABLE_ROWID_VERSION == version) {
|
} else if (EXT_HEAP_TABLE_ROWID_VERSION == version) {
|
||||||
is_valid = rowid_len_ == EXT_HEAP_ORGANIZED_TABLE_ROWID_CONTENT_BUF_SIZE;
|
if (rowid_len_ != EXT_HEAP_ORGANIZED_TABLE_ROWID_CONTENT_BUF_SIZE) {
|
||||||
|
ret = OB_INVALID_ROWID;
|
||||||
|
}
|
||||||
} else if (NO_PK_ROWID_VERSION == version
|
} else if (NO_PK_ROWID_VERSION == version
|
||||||
|| PK_ROWID_VERSION == version
|
|| PK_ROWID_VERSION == version
|
||||||
|| LOB_NO_PK_ROWID_VERSION == version
|
|| LOB_NO_PK_ROWID_VERSION == version
|
||||||
|| EXTERNAL_TABLE_ROWID_VERSION == version) {
|
|| EXTERNAL_TABLE_ROWID_VERSION == version) {
|
||||||
int64_t pos = get_pk_content_offset();
|
int64_t pos = get_pk_content_offset();
|
||||||
ObObj obj;
|
ObObj obj;
|
||||||
for (; is_valid && pos < rowid_len_; ) {
|
for (; OB_SUCC(ret) && pos < rowid_len_; ) {
|
||||||
ObObjType obj_type = get_pk_type(pos);
|
ObObjType obj_type = get_pk_type(pos);
|
||||||
if (OB_UNLIKELY(ob_is_invalid_obj_type(obj_type))) {
|
if (OB_UNLIKELY(ob_is_invalid_obj_type(obj_type))) {
|
||||||
is_valid = false;
|
ret = OB_INVALID_ROWID;
|
||||||
|
COMMON_LOG(WARN, "invalid obj type in rowid", K(ret), K(obj_type), K(pos), KPC(this));
|
||||||
} else if (OB_FAIL(get_pk_value(obj_type, pos, obj))) {
|
} else if (OB_FAIL(get_pk_value(obj_type, pos, obj))) {
|
||||||
is_valid = false;
|
if (OB_NOT_SUPPORTED == ret) {
|
||||||
} else {
|
ret = OB_INVALID_ROWID; // oracle doesn't have such kind of rowkey
|
||||||
// do nothing
|
}
|
||||||
|
COMMON_LOG(WARN, "failed to get pk value", K(ret), K(obj_type), K(pos), KPC(this));
|
||||||
|
} else if (obj.is_urowid()) {
|
||||||
|
if (OB_FAIL(SMART_CALL(obj.get_urowid().check_is_valid_urowid()))) {
|
||||||
|
COMMON_LOG(WARN, "failed to check is valid urowid", K(ret), K(pos));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
is_valid = false;
|
ret = OB_INVALID_ROWID;
|
||||||
}
|
}
|
||||||
return is_valid;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ObURowIDData::is_valid_version(int64_t v)
|
bool ObURowIDData::is_valid_version(int64_t v)
|
||||||
@ -1028,8 +1038,7 @@ int ObURowIDData::get_pk_vals(ObIArray<ObObj> &pk_vals) const
|
|||||||
{
|
{
|
||||||
int ret = OB_SUCCESS;
|
int ret = OB_SUCCESS;
|
||||||
int64_t pos = 0;
|
int64_t pos = 0;
|
||||||
if (OB_UNLIKELY(!is_valid_urowid())) {
|
if (OB_FAIL(check_is_valid_urowid())) {
|
||||||
ret = OB_INVALID_ROWID;
|
|
||||||
COMMON_LOG(WARN, "invalid rowid", K(ret));
|
COMMON_LOG(WARN, "invalid rowid", K(ret));
|
||||||
} else if (is_physical_rowid()) {
|
} else if (is_physical_rowid()) {
|
||||||
if (OB_FAIL(get_rowkey_for_heap_organized_table(pk_vals))) {
|
if (OB_FAIL(get_rowkey_for_heap_organized_table(pk_vals))) {
|
||||||
|
|||||||
2
deps/oblib/src/lib/rowid/ob_urowid.h
vendored
2
deps/oblib/src/lib/rowid/ob_urowid.h
vendored
@ -216,7 +216,7 @@ private:
|
|||||||
|
|
||||||
|
|
||||||
static bool is_valid_version(int64_t v);
|
static bool is_valid_version(int64_t v);
|
||||||
bool is_valid_urowid() const;
|
int check_is_valid_urowid() const;
|
||||||
|
|
||||||
static int set_heap_organized_table_rowid_content(const ObIArray<ObObj> &args,
|
static int set_heap_organized_table_rowid_content(const ObIArray<ObObj> &args,
|
||||||
uint8_t *buf,
|
uint8_t *buf,
|
||||||
|
|||||||
Reference in New Issue
Block a user