/** * Copyright (c) 2021 OceanBase * OceanBase CE is licensed under Mulan PubL v2. * You can use this software according to the terms and conditions of the Mulan PubL v2. * You may obtain a copy of Mulan PubL v2 at: * http://license.coscl.org.cn/MulanPubL-2.0 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. * See the Mulan PubL v2 for more details. */ #define USING_LOG_PREFIX SHARE #include "ob_datum.h" #include "ob_datum_util.h" namespace oceanbase { namespace common { ObObjDatumMapType ObDatum::get_obj_datum_map_type(const ObObjType type) { const static ObObjDatumMapType maps[] = { OBJ_DATUM_NULL, // ObNullType OBJ_DATUM_8BYTE_DATA, // ObTinyIntType OBJ_DATUM_8BYTE_DATA, // ObSmallIntType OBJ_DATUM_8BYTE_DATA, // ObMediumIntType OBJ_DATUM_8BYTE_DATA, // ObInt32Type OBJ_DATUM_8BYTE_DATA, // ObIntType OBJ_DATUM_8BYTE_DATA, // ObUTinyIntType OBJ_DATUM_8BYTE_DATA, // ObUSmallIntType OBJ_DATUM_8BYTE_DATA, // ObUMediumIntType OBJ_DATUM_8BYTE_DATA, // ObUInt32Type OBJ_DATUM_8BYTE_DATA, // ObUInt64Type OBJ_DATUM_4BYTE_DATA, // ObFloatType OBJ_DATUM_8BYTE_DATA, // ObDoubleType OBJ_DATUM_4BYTE_DATA, // ObUFloatType OBJ_DATUM_8BYTE_DATA, // ObUDoubleType OBJ_DATUM_NUMBER, // ObNumberType OBJ_DATUM_NUMBER, // ObUNumberType OBJ_DATUM_8BYTE_DATA, // ObDateTimeType OBJ_DATUM_8BYTE_DATA, // ObTimestampType OBJ_DATUM_4BYTE_DATA, // ObDateType OBJ_DATUM_8BYTE_DATA, // ObTimeType OBJ_DATUM_1BYTE_DATA, // ObYearType OBJ_DATUM_STRING, // ObVarcharType OBJ_DATUM_STRING, // ObCharType OBJ_DATUM_STRING, // ObHexStringType OBJ_DATUM_8BYTE_DATA, // ObExtendType OBJ_DATUM_8BYTE_DATA, // ObUnknownType OBJ_DATUM_STRING, // ObTinyTextType OBJ_DATUM_STRING, // ObTextType OBJ_DATUM_STRING, // ObMediumTextType OBJ_DATUM_STRING, // ObLongTextType OBJ_DATUM_8BYTE_DATA, // ObBitType OBJ_DATUM_8BYTE_DATA, // ObEnumType OBJ_DATUM_8BYTE_DATA, // ObSetType OBJ_DATUM_STRING, // ObEnumInnerType OBJ_DATUM_STRING, // ObSetInnerType OBJ_DATUM_4BYTE_LEN_DATA, // ObTimestampTZType OBJ_DATUM_2BYTE_LEN_DATA, // ObTimestampLTZType OBJ_DATUM_2BYTE_LEN_DATA, // ObTimestampNanoType OBJ_DATUM_STRING, // ObRawType OBJ_DATUM_8BYTE_DATA, // ObIntervalYMType OBJ_DATUM_4BYTE_LEN_DATA, // ObIntervalDSType OBJ_DATUM_NUMBER, // ObNumberFloatType OBJ_DATUM_STRING, // ObNVarchar2Type OBJ_DATUM_STRING, // ObNCharType OBJ_DATUM_STRING, // ObURowID OBJ_DATUM_LOB_LOCATOR, // ObLobType OBJ_DATUM_STRING, // ObJsonType }; static_assert(sizeof(maps) / sizeof(maps[0]) == ObMaxType, "new added type should extend this map"); ObObjDatumMapType t = OBJ_DATUM_MAPPING_MAX; if (type < 0 || type >= ObMaxType) { LOG_ERROR("invalid obj type", K(type)); } else { t = maps[type]; } return t; } uint32_t ObDatum::get_reserved_size(const ObObjDatumMapType type) { static const uint32_t OBOBJ_DATUM_MAP_TYPE_TO_RES_SIZE_MAP[] = { OBJ_DATUM_NULL_RES_SIZE, // OBJ_DATUM_NULL OBJ_DATUM_STRING_RES_SIZE, // OBJ_DATUM_STRING OBJ_DATUM_NUMBER_RES_SIZE, // OBJ_DATUM_NUMBER OBJ_DATUM_8BYTE_DATA_RES_SIZE, // OBJ_DATUM_8BYTE_DATA OBJ_DATUM_4BYTE_DATA_RES_SIZE, // OBJ_DATUM_4BYTE_DATA OBJ_DATUM_1BYTE_DATA_RES_SIZE, // OBJ_DATUM_1BYTE_DATA OBJ_DATUM_4BYTE_LEN_DATA_RES_SIZE, // OBJ_DATUM_4BYTE_LEN_DATA OBJ_DATUM_2BYTE_LEN_DATA_RES_SIZE, // OBJ_DATUM_2BYTE_LEN_DATA OBJ_DATUM_LOB_LOCATOR_RES_SIZE, // OBJ_DATUM_LOB_LOCATOR }; static_assert(sizeof(OBOBJ_DATUM_MAP_TYPE_TO_RES_SIZE_MAP) / sizeof(OBOBJ_DATUM_MAP_TYPE_TO_RES_SIZE_MAP[0]) == OBJ_DATUM_MAPPING_MAX, "new added ObObjDatumMapType should extend this map"); uint32_t res_size = 0; if (type >= OBJ_DATUM_MAPPING_MAX) { LOG_ERROR("invalid obj type", K(type)); } else { res_size = OBOBJ_DATUM_MAP_TYPE_TO_RES_SIZE_MAP[type]; } return res_size; } DEF_TO_STRING(ObDatum) { int64_t pos = 0; int ret = OB_SUCCESS; const static int64_t STR_MAX_PRINT_LEN = 128L; if (null_) { J_NULL(); } else { J_OBJ_START(); BUF_PRINTF("len: %d, ptr: %p", len_, ptr_); if (len_ > 0) { OB_ASSERT(NULL != ptr_); const int64_t plen = std::min(static_cast(len_), static_cast(STR_MAX_PRINT_LEN)); // print hex value BUF_PRINTF(", hex: "); if (OB_FAIL(hex_print(ptr_, plen, buf, buf_len, pos))) { // no logging in to_string function. } else { // maybe ObIntTC if (sizeof(int64_t) == len_) { BUF_PRINTF(", int: %ld", *int_); // maybe number with one digit if (1 == num_->desc_.len_) { BUF_PRINTF(", num_digit0: %u", num_->digits_[0]); } } // maybe printable C string int64_t idx = 0; while (idx < plen && isprint(ptr_[idx])) { idx++; } if (idx >= plen) { BUF_PRINTF(", cstr: %.*s", static_cast(plen), ptr_); } } } J_OBJ_END(); } return pos; } } // end namespace common } // end namespace oceanbase