fix: fix the core induced by check rowkey distinct when rowkey column has virtual generated column

This commit is contained in:
obdev
2023-04-18 14:41:34 +00:00
committed by ob-robot
parent bf7a860614
commit 4a15c4d020
4 changed files with 21 additions and 9 deletions

View File

@ -719,8 +719,14 @@ int ObConflictChecker::build_data_table_range(ObNewRange &lookup_range)
for (int64_t i = 0; OB_SUCC(ret) && i < rowkey_cnt; ++i) {
ObObj tmp_obj;
ObExpr *expr = checker_ctdef_.data_table_rowkey_expr_.at(i);
ObDatum &col_datum = expr->locate_expr_datum(eval_ctx_);
if (OB_FAIL(col_datum.to_obj(tmp_obj, expr->obj_meta_, expr->obj_datum_map_))) {
ObDatum *col_datum = nullptr;
if (OB_ISNULL(expr)) {
LOG_WARN("expr in rowkey is nullptr", K(ret), K(i));
} else if (OB_FAIL(expr->eval(eval_ctx_, col_datum))) {
LOG_WARN("failed to evaluate expr in rowkey", K(ret), K(i));
} else if (OB_ISNULL(col_datum)) {
LOG_WARN("evaluated column datum in rowkey is nullptr", K(ret), K(i));
} else if (OB_FAIL(col_datum->to_obj(tmp_obj, expr->obj_meta_, expr->obj_datum_map_))) {
LOG_WARN("convert datum to obj failed", K(ret));
}
// 这里需要做深拷贝

View File

@ -953,7 +953,7 @@ struct ObDMLRtCtx
bool need_non_sub_full_task()
{ return das_task_status_.need_non_sub_full_task(); }
void add_cached_row_size(const int64_t row_size) { cached_row_size_ += row_size; }
int64_t get_cached_row_size() const { return cached_row_size_; }
int64_t get_row_buffer_size() const { return cached_row_size_; }
ObDASRef das_ref_;
DasTaskStatus das_task_status_;

View File

@ -174,9 +174,15 @@ int ObDMLService::check_rowkey_whether_distinct(const ObExprPtrIArray &row,
ObObj *tmp_obj_ptr = tmp_table_rowkey.get_obj_ptr();
for (int64_t i = 0; OB_SUCC(ret) && i < rowkey_cnt; ++i) {
ObExpr *expr = row.at(i);
ObDatum &col_datum = expr->locate_expr_datum(eval_ctx);
if (OB_FAIL(col_datum.to_obj(tmp_obj_ptr[i], expr->obj_meta_, expr->obj_datum_map_))) {
LOG_WARN("convert datum to obj failed", K(ret));
ObDatum *col_datum = nullptr;
if (OB_ISNULL(expr)) {
LOG_WARN("expr in rowkey is nullptr", K(ret), K(i));
} else if (OB_FAIL(expr->eval(eval_ctx, col_datum))) {
LOG_WARN("failed to evaluate expr in rowkey", K(ret), K(i));
} else if (OB_ISNULL(col_datum)) {
LOG_WARN("evaluated column datum in rowkey is nullptr", K(ret), K(i));
} else if (OB_FAIL(col_datum->to_obj(tmp_obj_ptr[i], expr->obj_meta_, expr->obj_datum_map_))) {
LOG_WARN("convert datum to obj failed", K(ret), K(i));
}
}
@ -1561,7 +1567,7 @@ int ObDMLService::write_row_to_das_op(const ObDASDMLBaseCtDef &ctdef,
if (OB_SUCC(ret) && buffer_full) {
need_retry = true;
if (REACH_COUNT_INTERVAL(10)) { // print log per 10 times.
LOG_INFO("DAS write buffer full, ", K(dml_op->get_row_cnt()), K(dml_rtctx.das_ref_.get_das_mem_used()), K(dml_rtctx.get_cached_row_size()));
LOG_INFO("DAS write buffer full, ", K(dml_op->get_row_cnt()), K(dml_rtctx.das_ref_.get_das_mem_used()), K(dml_rtctx.get_row_buffer_size()));
}
dml_rtctx.das_ref_.set_frozen_node();
}

View File

@ -1106,9 +1106,9 @@ int ObTableModifyOp::discharge_das_write_buffer()
if (OB_UNLIKELY(simulate_buffer_size > 0)) {
buffer_size_limit = simulate_buffer_size;
}
if (dml_rtctx_.get_cached_row_size() >= buffer_size_limit) {
if (dml_rtctx_.get_row_buffer_size() >= buffer_size_limit) {
LOG_INFO("DASWriteBuffer full, now to write storage",
"buffer memory", dml_rtctx_.das_ref_.get_das_alloc().used(), K(dml_rtctx_.get_cached_row_size()));
"buffer memory", dml_rtctx_.das_ref_.get_das_alloc().used(), K(dml_rtctx_.get_row_buffer_size()));
ret = submit_all_dml_task();
} else if (execute_single_row_) {
ret = submit_all_dml_task();