2
* Copyright (c) 2021 OceanBase
3
* OceanBase CE is licensed under Mulan PubL v2.
4
* You can use this software according to the terms and conditions of the Mulan PubL v2.
5
* You may obtain a copy of Mulan PubL v2 at:
6
* http://license.coscl.org.cn/MulanPubL-2.0
7
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
8
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
9
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
10
* See the Mulan PubL v2 for more details.
15
#include "observer/mysql/obsm_utils.h"
16
#include "common/ob_accuracy.h"
17
#include "share/schema/ob_schema_getter_guard.h"
19
using namespace oceanbase::share::schema;
20
using namespace oceanbase::common;
21
using namespace oceanbase::obmysql;
23
ObSMRow::ObSMRow(MYSQL_PROTOCOL_TYPE type,
24
const ObNewRow &obrow,
25
const ObDataTypeCastParams &dtc_params,
26
const common::ColumnsFieldIArray *fields,
27
ObSchemaGetterGuard *schema_guard,
31
dtc_params_(dtc_params),
33
schema_guard_(schema_guard),
38
int ObSMRow::encode_cell(
39
int64_t idx, char *buf,
40
int64_t len, int64_t &pos, char *bitmap) const
43
if (idx > get_cells_cnt() || idx < 0) {
44
ret = OB_INVALID_ARGUMENT;
45
} else if (is_packed_) {
46
const ObObj *cell = &obrow_.cells_[idx];
47
//to check is overflow
48
if (OB_UNLIKELY(cell->get_string_len() < 0)) {
49
ret = OB_ERR_UNEXPECTED;
50
SQL_ENG_LOG(ERROR, "invalid obj len", K(ret), K(common::lbt()), K(cell->get_string_len()));
51
} else if (OB_UNLIKELY((len - pos) < cell->get_string_len())) {
52
ret = OB_SIZE_OVERFLOW;
54
MEMCPY(buf + pos, cell->get_string_ptr(), cell->get_string_len());
55
pos += cell->get_string_len();
58
int64_t cell_idx = OB_LIKELY(NULL != obrow_.projector_)
59
? obrow_.projector_[idx]
61
const ObObj *cell = &obrow_.cells_[cell_idx];
63
if (NULL == fields_) {
64
ret = ObSMUtils::cell_str(
65
buf, len, *cell, type_, pos, idx, bitmap, dtc_params_, NULL, NULL);
67
ret = ObSMUtils::cell_str(
68
buf, len, *cell, type_, pos, idx, bitmap, dtc_params_, &fields_->at(idx), schema_guard_, tenant_id_);