[FEAT MERGE]4_2_sql_feature

Co-authored-by: yinyj17 <yinyijun92@gmail.com>
Co-authored-by: xianyu-w <707512433@qq.com>
Co-authored-by: jingtaoye35 <1255153887@qq.com>
This commit is contained in:
zzg19950727
2023-04-28 11:12:11 +00:00
committed by ob-robot
parent 3bf92459f1
commit 3cada22bdc
161 changed files with 16883 additions and 4730 deletions

View File

@ -62,11 +62,11 @@ int ObTransformPredicateMoveAround::transform_one_stmt(
LOG_WARN("failed to create equal exprs for insert", K(ret));
} else if (OB_FAIL(pushdown_predicates(stmt, dummy_pushdown))) {
LOG_WARN("failed to push down predicates", K(ret));
} else if (OB_FAIL(adjust_transed_stmts())) {
LOG_WARN("sort sort transed stmts failed", K(ret));
} else if (transed_stmts_.empty() || !real_happened_) {
// transform not happened actually
transed_stmts_.reuse();
} else if (OB_FAIL(sort_transed_stmts())) {
LOG_WARN("sort sort transed stmts failed", K(ret));
} else if (OB_FAIL(add_transform_hint(*stmt, &transed_stmts_))) {
LOG_WARN("add transform hint failed", K(ret));
} else {
@ -75,7 +75,7 @@ int ObTransformPredicateMoveAround::transform_one_stmt(
return ret;
}
int ObTransformPredicateMoveAround::sort_transed_stmts()
int ObTransformPredicateMoveAround::adjust_transed_stmts()
{
int ret = OB_SUCCESS;
auto cmp_func = [](ObDMLStmt* l_stmt, ObDMLStmt* r_stmt) {
@ -86,6 +86,15 @@ int ObTransformPredicateMoveAround::sort_transed_stmts()
}
};
std::sort(transed_stmts_.begin(), transed_stmts_.end(), cmp_func);
ObDMLStmt *stmt = NULL;
for (int64_t i = transed_stmts_.count() - 1; OB_SUCC(ret) && i >= 0; --i) {
if (OB_ISNULL(stmt = transed_stmts_.at(i))) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("stmt is null", K(ret), K(stmt));
} else if (stmt->is_set_stmt() && OB_FAIL(transed_stmts_.remove(i))) {
LOG_WARN("failed to remove set stmt", K(ret));
}
}
return ret;
}
@ -1515,20 +1524,16 @@ int ObTransformPredicateMoveAround::pushdown_into_set_stmt(ObSelectStmt *stmt,
ret = OB_ERR_UNEXPECTED;
LOG_WARN("param has null", K(stmt), K(parent_stmt), K(ret));
} else {
ObSEArray<ObRawExpr*, 16> all_preds;
ObSEArray<ObRawExpr*, 16> subquery_preds;
ObSEArray<ObRawExpr*, 16> valid_preds; //存储能够下推的谓词
ObSEArray<ObRawExpr*, 16> rename_preds; //存储重命名为当前stmt的select expr的谓词
ObSEArray<ObRawExpr*, 16> candi_preds; //返回未成功下推的谓词
ObSEArray<ObRawExpr*, 16> equal_const_preds;
ObSEArray<ObRawExpr*, 16> invalid_preds;
if (OB_FAIL(all_preds.assign(pushdown_preds))) {
LOG_WARN("failed to assign pushdown preds");
} else if (OB_FAIL(append(all_preds, pullup_preds))) {
LOG_WARN("failed to append pullup preds", K(ret));
} else if (OB_FAIL(extract_valid_preds(all_preds,
valid_preds,
invalid_preds))) {
ObSEArray<ObRawExpr*, 16> invalid_pushdown_preds;
ObSEArray<ObRawExpr*, 16> invalid_pullup_preds;
const int64_t pushdown_preds_cnt = pushdown_preds.count();
if (OB_FAIL(extract_valid_preds(pushdown_preds, valid_preds, invalid_pushdown_preds))
|| OB_FAIL(extract_valid_preds(pullup_preds, valid_preds, invalid_pullup_preds))) {
LOG_WARN("failed to check push down", K(ret));
} else if (OB_FAIL(rename_preds.assign(valid_preds))) {
LOG_WARN("failed to assign rename preds", K(ret));
@ -1557,8 +1562,11 @@ int ObTransformPredicateMoveAround::pushdown_into_set_stmt(ObSelectStmt *stmt,
if (OB_FAIL(ret)) {
} else if (OB_FAIL(pushdown_preds.assign(output_preds))) {
LOG_WARN("assign preds failed", K(ret));
} else if (OB_FAIL(append(pushdown_preds, invalid_preds))) {
} else if (OB_FAIL(append(pushdown_preds, invalid_pushdown_preds))) {
LOG_WARN("failed to append no push down preds", K(ret));
} else if (pushdown_preds.count() != pushdown_preds_cnt
&& OB_FAIL(add_var_to_array_no_dup(transed_stmts_, static_cast<ObDMLStmt*>(parent_stmt)))) {
LOG_WARN("append transed stmt failed", K(ret));
} else {/*do nothing*/}
}
}
@ -2697,7 +2705,9 @@ int ObTransformPredicateMoveAround::pushdown_into_table(ObDMLStmt *stmt,
} else if (OB_FALSE_IT(old_candi_preds_count = candi_preds.count())) {
} else if (OB_FAIL(SMART_CALL(pushdown_predicates(table_item->ref_query_, candi_preds)))) {
LOG_WARN("failed to push down predicates", K(ret));
} else if (candi_preds.count() != old_candi_preds_count
} else if ((candi_preds.count() != old_candi_preds_count
|| (table_item->ref_query_->is_set_stmt() &&
ObOptimizerUtil::find_item(transed_stmts_, table_item->ref_query_)))
&& OB_FAIL(add_var_to_array_no_dup(transed_stmts_, stmt))) {
LOG_WARN("append transed stmt failed", K(ret));
} else if (OB_FAIL(append(candi_preds, invalid_preds))) {