fix mysqltest for FOR UPDATE rewrite
This commit is contained in:
@ -163,6 +163,8 @@ int ObTransformTempTable::generate_with_clause(ObDMLStmt *&stmt, bool &trans_hap
|
|||||||
OPT_TRACE("stmt containt oversize set stmt");
|
OPT_TRACE("stmt containt oversize set stmt");
|
||||||
} else if (!enable_temp_table_transform || force_temp_table_inline) {
|
} else if (!enable_temp_table_transform || force_temp_table_inline) {
|
||||||
OPT_TRACE("session variable disable temp table transform");
|
OPT_TRACE("session variable disable temp table transform");
|
||||||
|
} else if (stmt->has_for_update()) {
|
||||||
|
OPT_TRACE("stmt has for update, can not extract CTE");
|
||||||
} else if (OB_FAIL(parent_map.create(128, "TempTable"))) {
|
} else if (OB_FAIL(parent_map.create(128, "TempTable"))) {
|
||||||
LOG_WARN("failed to init stmt map", K(ret));
|
LOG_WARN("failed to init stmt map", K(ret));
|
||||||
} else if (OB_FAIL(ObTransformUtils::get_all_child_stmts(stmt, child_stmts, &parent_map))) {
|
} else if (OB_FAIL(ObTransformUtils::get_all_child_stmts(stmt, child_stmts, &parent_map))) {
|
||||||
@ -208,6 +210,7 @@ int ObTransformTempTable::expand_temp_table(ObIArray<TempTableInfo> &temp_table_
|
|||||||
bool force_materia = false;
|
bool force_materia = false;
|
||||||
bool force_inline = false;
|
bool force_inline = false;
|
||||||
bool is_oversize_stmt = false;
|
bool is_oversize_stmt = false;
|
||||||
|
bool has_for_update = false;
|
||||||
int64_t stmt_size = 0;
|
int64_t stmt_size = 0;
|
||||||
bool need_expand = false;
|
bool need_expand = false;
|
||||||
bool can_expand = true;
|
bool can_expand = true;
|
||||||
@ -219,6 +222,8 @@ int ObTransformTempTable::expand_temp_table(ObIArray<TempTableInfo> &temp_table_
|
|||||||
LOG_WARN("check stmt size failed", K(ret));
|
LOG_WARN("check stmt size failed", K(ret));
|
||||||
} else if (OB_FAIL(ObTransformUtils::check_expand_temp_table_valid(helper.temp_table_query_, can_expand))) {
|
} else if (OB_FAIL(ObTransformUtils::check_expand_temp_table_valid(helper.temp_table_query_, can_expand))) {
|
||||||
LOG_WARN("failed to check expand temp table valid", K(ret));
|
LOG_WARN("failed to check expand temp table valid", K(ret));
|
||||||
|
} else if (OB_FAIL(check_has_for_update(helper, has_for_update))) {
|
||||||
|
LOG_WARN("failed to check has for update", K(ret));
|
||||||
} else if (!can_expand) {
|
} else if (!can_expand) {
|
||||||
// do nothing
|
// do nothing
|
||||||
OPT_TRACE("CTE can not be expanded");
|
OPT_TRACE("CTE can not be expanded");
|
||||||
@ -229,6 +234,9 @@ int ObTransformTempTable::expand_temp_table(ObIArray<TempTableInfo> &temp_table_
|
|||||||
} else if (force_inline) {
|
} else if (force_inline) {
|
||||||
need_expand = true;
|
need_expand = true;
|
||||||
OPT_TRACE("hint force inline CTE");
|
OPT_TRACE("hint force inline CTE");
|
||||||
|
} else if (lib::is_oracle_mode() && has_for_update) {
|
||||||
|
need_expand = true;
|
||||||
|
OPT_TRACE("stmt has FOR UPDATE, force inline CTE");
|
||||||
} else if (force_materia) {
|
} else if (force_materia) {
|
||||||
//do nothing
|
//do nothing
|
||||||
OPT_TRACE("hint force materialize CTE");
|
OPT_TRACE("hint force materialize CTE");
|
||||||
@ -410,6 +418,24 @@ int ObTransformTempTable::check_stmt_has_cross_product(ObSelectStmt *stmt, bool
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int ObTransformTempTable::check_has_for_update(const ObDMLStmt::TempTableInfo &helper,
|
||||||
|
bool &has_for_update)
|
||||||
|
{
|
||||||
|
int ret = OB_SUCCESS;
|
||||||
|
has_for_update = false;
|
||||||
|
for (int64_t i = 0; OB_SUCC(ret) && i < helper.upper_stmts_.count(); ++i) {
|
||||||
|
const ObDMLStmt *upper_stmt = helper.upper_stmts_.at(i);
|
||||||
|
if (OB_ISNULL(upper_stmt)) {
|
||||||
|
ret = OB_ERR_UNEXPECTED;
|
||||||
|
LOG_WARN("upper stmt is NULL", K(ret), K(i));
|
||||||
|
} else if (upper_stmt->has_for_update()) {
|
||||||
|
has_for_update = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief extract_common_subquery_as_cte
|
* @brief extract_common_subquery_as_cte
|
||||||
* 比较当前stmt的所有child stmt,
|
* 比较当前stmt的所有child stmt,
|
||||||
|
@ -133,6 +133,8 @@ public:
|
|||||||
const ObStmtMapInfo &map_info,
|
const ObStmtMapInfo &map_info,
|
||||||
bool &is_match);
|
bool &is_match);
|
||||||
|
|
||||||
|
int check_has_for_update(const ObDMLStmt::TempTableInfo &helper, bool &has_for_update);
|
||||||
|
|
||||||
int remove_simple_stmts(ObIArray<ObSelectStmt*> &stmts);
|
int remove_simple_stmts(ObIArray<ObSelectStmt*> &stmts);
|
||||||
|
|
||||||
int get_non_correlated_subquery(ObDMLStmt *stmt,
|
int get_non_correlated_subquery(ObDMLStmt *stmt,
|
||||||
|
@ -430,7 +430,6 @@ int ObTransformerImpl::choose_rewrite_rules(ObDMLStmt *stmt, uint64_t &need_type
|
|||||||
ObTransformRule::add_trans_type(disable_list, OR_EXPANSION);
|
ObTransformRule::add_trans_type(disable_list, OR_EXPANSION);
|
||||||
ObTransformRule::add_trans_type(disable_list, GROUPBY_PUSHDOWN);
|
ObTransformRule::add_trans_type(disable_list, GROUPBY_PUSHDOWN);
|
||||||
ObTransformRule::add_trans_type(disable_list, GROUPBY_PULLUP);
|
ObTransformRule::add_trans_type(disable_list, GROUPBY_PULLUP);
|
||||||
ObTransformRule::add_trans_type(disable_list, TEMP_TABLE_OPTIMIZATION);
|
|
||||||
}
|
}
|
||||||
if (func.update_global_index_) {
|
if (func.update_global_index_) {
|
||||||
ObTransformRule::add_trans_type(disable_list, OR_EXPANSION);
|
ObTransformRule::add_trans_type(disable_list, OR_EXPANSION);
|
||||||
|
Reference in New Issue
Block a user