fix optimizer generate wrong local insert plan

This commit is contained in:
obdev 2022-10-26 16:05:08 +00:00 committed by wangzelin.wzl
parent 6e74ecb6a8
commit 375a52f586
2 changed files with 42 additions and 8 deletions

View File

@ -716,6 +716,8 @@ int ObTableLocation::assign(const ObTableLocation &other)
is_valid_temporal_part_range_ = other.is_valid_temporal_part_range_;
is_valid_temporal_subpart_range_ = other.is_valid_temporal_subpart_range_;
is_link_ = other.is_link_;
is_part_range_get_ = other.is_part_range_get_;
is_subpart_range_get_ = other.is_subpart_range_get_;
if (OB_FAIL(loc_meta_.assign(other.loc_meta_))) {
LOG_WARN("assign loc meta failed", K(ret), K(other.loc_meta_));
}
@ -833,6 +835,8 @@ void ObTableLocation::reset()
is_valid_temporal_part_range_ = false;
is_valid_temporal_subpart_range_ = false;
is_link_ = false;
is_part_range_get_ = false;
is_subpart_range_get_ = false;
}
int ObTableLocation::init(share::schema::ObSchemaGetterGuard &schema_guard,
const ObDMLStmt &stmt,
@ -1781,7 +1785,8 @@ int ObTableLocation::set_location_calc_node(const ObDMLStmt &stmt,
bool &is_col_part_expr,
ObPartLocCalcNode *&calc_node,
ObPartLocCalcNode *&gen_col_node,
bool &get_all)
bool &get_all,
bool &is_range_get)
{
int ret = OB_SUCCESS;
ObSEArray<ColumnItem, 5> part_columns;
@ -1808,6 +1813,7 @@ int ObTableLocation::set_location_calc_node(const ObDMLStmt &stmt,
filter_exprs,
calc_node,
get_all,
is_range_get,
dtc_params,
exec_ctx))) {
LOG_WARN("Failed to get location calc node", K(ret));
@ -2094,7 +2100,8 @@ int ObTableLocation::record_not_insert_dml_partition_info(
is_col_part_expr_,
calc_node_,
gen_col_node_,
part_get_all_))) {
part_get_all_,
is_part_range_get_))) {
LOG_WARN("failed to set location calc node for first-level partition", K(ret));
} else if (PARTITION_LEVEL_TWO == part_level_
&& OB_FAIL(set_location_calc_node(stmt,
@ -2107,7 +2114,8 @@ int ObTableLocation::record_not_insert_dml_partition_info(
is_col_subpart_expr_,
subcalc_node_,
sub_gen_col_node_,
subpart_get_all_))) {
subpart_get_all_,
is_subpart_range_get_))) {
LOG_WARN("failed to set location calc node for second-level partition", K(ret));
}
@ -2188,12 +2196,14 @@ int ObTableLocation::get_location_calc_node(const ObPartitionLevel part_level,
const ObIArray<ObRawExpr*> &filter_exprs,
ObPartLocCalcNode *&res_node,
bool &get_all,
bool &is_range_get,
const ObDataTypeCastParams &dtc_params,
ObExecContext *exec_ctx)
{
int ret = OB_SUCCESS;
uint64_t column_id = OB_INVALID_ID;
get_all = false;
is_range_get = false;
bool only_range_node = false;
if (partition_expr->is_column_ref_expr() || is_virtual_table(loc_meta_.ref_table_id_)) {
@ -2222,6 +2232,9 @@ int ObTableLocation::get_location_calc_node(const ObPartitionLevel part_level,
get_all = true;
} else {
res_node = calc_node;
if (OB_NOT_NULL(calc_node)) {
is_range_get = static_cast<ObPLQueryRangeNode*>(calc_node)->pre_query_range_.is_precise_get();
}
}
} else {
ObSEArray<ObRawExpr *, 5> normal_filters;
@ -4483,6 +4496,11 @@ OB_DEF_SERIALIZE(ObTableLocation)
OB_UNIS_ENCODE(part_hint_ids_.at(i));
}
}
if (OB_SUCC(ret)) {
LST_DO_CODE(OB_UNIS_ENCODE,
is_part_range_get_,
is_subpart_range_get_);
}
return ret;
}
@ -4552,6 +4570,9 @@ OB_DEF_SERIALIZE_SIZE(ObTableLocation)
for (int64_t i = 0; i < part_hint_ids_.count(); i++) {
OB_UNIS_ADD_LEN(part_hint_ids_.at(i));
}
LST_DO_CODE(OB_UNIS_ADD_LEN,
is_part_range_get_,
is_subpart_range_get_);
return len;
}
@ -4697,6 +4718,11 @@ OB_DEF_DESERIALIZE(ObTableLocation)
OZ(part_hint_ids_.push_back(part_hint_id));
}
}
if (OB_SUCC(ret)) {
LST_DO_CODE(OB_UNIS_DECODE,
is_part_range_get_,
is_subpart_range_get_);
}
return ret;
}

View File

@ -489,7 +489,9 @@ public:
has_dynamic_exec_param_(false),
is_valid_temporal_part_range_(false),
is_valid_temporal_subpart_range_(false),
is_link_(false)
is_link_(false),
is_part_range_get_(false),
is_subpart_range_get_(false)
{
}
@ -531,7 +533,9 @@ public:
has_dynamic_exec_param_(false),
is_valid_temporal_part_range_(false),
is_valid_temporal_subpart_range_(false),
is_link_(false)
is_link_(false),
is_part_range_get_(false),
is_subpart_range_get_(false)
{
}
virtual ~ObTableLocation() { reset(); }
@ -720,8 +724,8 @@ public:
inline bool is_part_or_subpart_all_partition() const
{
return (part_level_ == share::schema::PARTITION_LEVEL_ZERO) ||
(part_get_all_ && (part_level_ == share::schema::PARTITION_LEVEL_ONE)) ||
((subpart_get_all_ || part_get_all_) && (part_level_ == share::schema::PARTITION_LEVEL_TWO));
(part_level_ == share::schema::PARTITION_LEVEL_ONE && (part_get_all_ || !is_part_range_get_)) ||
(part_level_ == share::schema::PARTITION_LEVEL_TWO && (subpart_get_all_ || part_get_all_ || !is_part_range_get_ || !is_subpart_range_get_));
}
void set_has_dynamic_exec_param(bool flag) { has_dynamic_exec_param_ = flag; }
@ -920,6 +924,7 @@ private:
const common::ObIArray<ObRawExpr*> &filter_exprs,
ObPartLocCalcNode *&res_node,
bool &get_all,
bool &is_range_get,
const common::ObDataTypeCastParams &dtc_params,
ObExecContext *exec_ctx);
@ -1025,7 +1030,8 @@ private:
bool &is_col_part_expr,
ObPartLocCalcNode *&calc_node,
ObPartLocCalcNode *&gen_col_node,
bool &get_all);
bool &get_all,
bool &is_range_get);
int calc_partition_ids_by_in_expr(
ObExecContext &exec_ctx,
@ -1123,6 +1129,8 @@ private:
bool is_valid_temporal_subpart_range_;
bool is_link_; //used to identify whether the table is a link_table
bool is_part_range_get_;
bool is_subpart_range_get_;
};
}