cp bug fix to open source branch

This commit is contained in:
obdev
2021-07-20 17:06:14 +08:00
committed by wangzelin.wzl
parent 91bb0da2ae
commit f45d2cdbe2
37 changed files with 766 additions and 628 deletions

View File

@ -975,7 +975,7 @@ int ObTransformUtils::replace_expr(
}
}
if (OB_SUCC(ret)) {
if (OB_FAIL(expr->replace_expr(other_exprs, new_exprs))) {
if (OB_FAIL(SMART_CALL(expr->replace_expr(other_exprs, new_exprs)))) {
LOG_WARN("failed to replace expr", K(ret));
} else if (NULL != temp_old_expr) {
const_cast<ObIArray<ObRawExpr*>&>(other_exprs).at(idx) = temp_old_expr;
@ -1700,8 +1700,8 @@ int ObTransformUtils::check_stmt_output_nullable(const ObSelectStmt* stmt, const
int ObTransformUtils::find_not_null_expr(ObDMLStmt& stmt, ObRawExpr*& not_null_expr, bool& is_valid)
{
int ret = OB_SUCCESS;
ObRelIds from_tables;
if (OB_FAIL(get_from_tables(stmt, from_tables))) {
ObSqlBitSet<> from_tables;
if (OB_FAIL(stmt.get_from_tables(from_tables))) {
LOG_WARN("failed to get from tables", K(ret));
}
for (int64_t i = 0; OB_SUCC(ret) && i < stmt.get_column_size(); ++i) {
@ -2977,7 +2977,7 @@ int ObTransformUtils::check_stmt_unique(ObSelectStmt* stmt, ObSQLSessionInfo* se
ObRelIds all_tables;
if (OB_FAIL(compute_stmt_property(stmt, check_helper, res_info, extra_flags))) {
LOG_WARN("failed to compute stmt property", K(ret));
} else if (OB_FAIL(get_from_tables(*stmt, all_tables))) {
} else if (OB_FAIL(stmt->get_from_tables(all_tables))) {
LOG_WARN("failed to get from tables", K(ret));
} else if (!is_strict && OB_FAIL(append(res_info.fd_sets_, res_info.candi_fd_sets_))) {
// is strict, use fd_item_set & candi_fd_set check unique
@ -3019,7 +3019,7 @@ int ObTransformUtils::compute_stmt_property(ObSelectStmt* stmt, UniqueCheckHelpe
ObTableFdItem* group_unique_fd = NULL;
ObRelIds table_set;
ObSEArray<ObRawExpr*, 4> select_exprs;
if (OB_FAIL(get_from_tables(*stmt, table_set))) {
if (OB_FAIL(stmt->get_from_tables(table_set))) {
LOG_WARN("failed to get from tables", K(ret));
} else if (OB_FAIL(stmt->get_select_exprs(select_exprs))) {
LOG_WARN("failed to get select exprs", K(ret));
@ -3266,7 +3266,7 @@ int ObTransformUtils::compute_path_property(ObDMLStmt* stmt, UniqueCheckHelper&
} else if (OB_ISNULL(table)) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("unexpected from item", K(ret), K(from_item));
} else if (OB_FAIL(get_table_rel_ids(*stmt, *table, rel_ids))) {
} else if (OB_FAIL(stmt->get_table_rel_ids(*table, rel_ids))) {
LOG_WARN("failed to get table relids", K(ret));
} else if (OB_FAIL(compute_table_property(stmt, check_helper, table, cond_exprs, right_info))) {
LOG_WARN("failed to compute table property", K(ret));
@ -3421,8 +3421,8 @@ int ObTransformUtils::compute_basic_table_property(ObDMLStmt* stmt, UniqueCheckH
} else if (!table->is_basic_table()) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("get unexpected table", K(ret), K(*table));
} else if (OB_FAIL(get_table_rel_ids(*stmt, *table, table_set)) ||
OB_FAIL(res_info.table_set_.add_members(table_set))) {
} else if (OB_FAIL(stmt->get_table_rel_ids(*table, table_set))
|| OB_FAIL(res_info.table_set_.add_members(table_set))) {
LOG_WARN("failed to get table relids", K(ret));
} else if (OB_FAIL(extract_table_exprs(*stmt, cond_exprs, *table, cur_cond_exprs))) {
LOG_WARN("failed to extract table exprs", K(ret));
@ -3492,8 +3492,8 @@ int ObTransformUtils::compute_generate_table_property(ObDMLStmt* stmt, UniqueChe
LOG_WARN("get unexpected table", K(ret), K(*table));
} else if (OB_FAIL(SMART_CALL(compute_stmt_property(ref_query, check_helper, child_info)))) {
LOG_WARN("failed to compute stmt property", K(ret));
} else if (OB_FAIL(get_table_rel_ids(*stmt, *table, table_set)) ||
OB_FAIL(res_info.table_set_.add_members(table_set))) {
} else if (OB_FAIL(stmt->get_table_rel_ids(*table, table_set))
|| OB_FAIL(res_info.table_set_.add_members(table_set))) {
LOG_WARN("failed to get table relids", K(ret));
} else if (OB_FAIL(ObOptimizerUtil::convert_subplan_scan_expr(*check_helper.expr_factory_,
child_info.equal_sets_,
@ -3768,7 +3768,7 @@ int ObTransformUtils::extract_table_exprs(const ObDMLStmt& stmt, const ObIArray<
{
int ret = OB_SUCCESS;
ObSqlBitSet<> table_set;
if (OB_FAIL(get_table_rel_ids(stmt, target, table_set))) {
if (OB_FAIL(stmt.get_table_rel_ids(target, table_set))) {
LOG_WARN("failed to get table rel ids", K(ret));
} else if (OB_FAIL(extract_table_exprs(stmt, source_exprs, table_set, exprs))) {
LOG_WARN("failed to extract table exprs", K(ret));
@ -3781,7 +3781,7 @@ int ObTransformUtils::extract_table_exprs(const ObDMLStmt& stmt, const ObIArray<
{
int ret = OB_SUCCESS;
ObSqlBitSet<> table_set;
if (OB_FAIL(get_table_rel_ids(stmt, tables, table_set))) {
if (OB_FAIL(stmt.get_table_rel_ids(tables, table_set))) {
LOG_WARN("failed to get table rel ids", K(ret));
} else if (OB_FAIL(extract_table_exprs(stmt, source_exprs, table_set, exprs))) {
LOG_WARN("failed to extract table exprs", K(ret));
@ -3816,9 +3816,9 @@ int ObTransformUtils::get_table_joined_exprs(const ObDMLStmt& stmt, const TableI
int ret = OB_SUCCESS;
ObSqlBitSet<> source_table_ids;
ObSqlBitSet<> target_table_ids;
if (OB_FAIL(get_table_rel_ids(stmt, source, source_table_ids))) {
if (OB_FAIL(stmt.get_table_rel_ids(source, source_table_ids))) {
LOG_WARN("failed to get source table rel ids", K(ret));
} else if (OB_FAIL(get_table_rel_ids(stmt, target, target_table_ids))) {
} else if (OB_FAIL(stmt.get_table_rel_ids(target, target_table_ids))) {
LOG_WARN("failed to get target table rel ids", K(ret));
} else if (OB_FAIL(get_table_joined_exprs(
source_table_ids, target_table_ids, conditions, target_exprs, join_source_ids, join_target_ids))) {
@ -3840,14 +3840,14 @@ int ObTransformUtils::get_table_joined_exprs(const ObDMLStmt& stmt, const ObIArr
if (OB_ISNULL(table)) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("table item is null", K(ret));
} else if (OB_FAIL(get_table_rel_ids(stmt, *table, source_table_ids))) {
} else if (OB_FAIL(stmt.get_table_rel_ids(*table, source_table_ids))) {
LOG_WARN("failed to get source table rel ids", K(ret));
} else { /*do nothing*/
}
}
if (OB_FAIL(ret)) {
/*do nothing*/
} else if (OB_FAIL(get_table_rel_ids(stmt, target, target_table_ids))) {
} else if (OB_FAIL(stmt.get_table_rel_ids(target, target_table_ids))) {
LOG_WARN("failed to get target table rel ids", K(ret));
} else if (OB_FAIL(get_table_joined_exprs(
source_table_ids, target_table_ids, conditions, target_exprs, join_source_ids, join_target_ids))) {
@ -3944,117 +3944,7 @@ int ObTransformUtils::get_table_joined_exprs(const ObSqlBitSet<>& source_ids, co
return ret;
}
int ObTransformUtils::relids_to_table_items(ObDMLStmt* stmt, const ObRelIds& rel_ids, ObIArray<TableItem*>& rel_array)
{
int ret = OB_SUCCESS;
if (OB_ISNULL(stmt)) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("stmt is null", K(ret));
} else {
TableItem* table = NULL;
int64_t idx = OB_INVALID_INDEX;
for (int64_t i = 0; OB_SUCC(ret) && i < stmt->get_table_items().count(); ++i) {
if (OB_ISNULL(table = stmt->get_table_items().at(i))) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("table item is null", K(ret));
} else if (OB_UNLIKELY((idx = stmt->get_table_bit_index(table->table_id_)) == OB_INVALID_INDEX)) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("get table item invalid idx", K(idx), K(table->table_id_));
} else if (rel_ids.has_member(idx)) {
ret = rel_array.push_back(table);
}
}
}
return ret;
}
int ObTransformUtils::relids_to_table_ids(
ObDMLStmt* stmt, const ObSqlBitSet<>& table_set, ObIArray<uint64_t>& table_ids)
{
int ret = OB_SUCCESS;
if (OB_ISNULL(stmt)) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("stmt is null", K(ret));
} else {
TableItem* table = NULL;
int64_t idx = OB_INVALID_INDEX;
for (int64_t i = 0; OB_SUCC(ret) && i < stmt->get_table_items().count(); ++i) {
if (OB_ISNULL(table = stmt->get_table_items().at(i))) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("table item is null", K(ret));
} else if (OB_UNLIKELY((idx = stmt->get_table_bit_index(table->table_id_)) == OB_INVALID_INDEX)) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("get table item invalid idx", K(idx), K(table->table_id_));
} else if (table_set.has_member(idx)) {
ret = table_ids.push_back(table->table_id_);
}
}
}
return ret;
}
int ObTransformUtils::get_table_rel_ids(const ObDMLStmt& stmt, const TableItem& target, ObSqlBitSet<>& table_set)
{
int ret = OB_SUCCESS;
if (target.is_joined_table()) {
const JoinedTable& joined_table = static_cast<const JoinedTable&>(target);
for (int64_t i = 0; OB_SUCC(ret) && i < joined_table.single_table_ids_.count(); ++i) {
if (OB_FAIL(table_set.add_member(stmt.get_table_bit_index(joined_table.single_table_ids_.at(i))))) {
LOG_WARN("failed to add member", K(ret), K(joined_table.single_table_ids_.at(i)));
}
}
} else if (OB_FAIL(table_set.add_member(stmt.get_table_bit_index(target.table_id_)))) {
LOG_WARN("failed to add member", K(ret), K(target.table_id_));
}
return ret;
}
int ObTransformUtils::get_table_rel_ids(
const ObDMLStmt& stmt, const ObIArray<uint64_t>& table_ids, ObSqlBitSet<>& table_set)
{
int ret = OB_SUCCESS;
int32_t idx = OB_INVALID_INDEX;
for (int64_t i = 0; OB_SUCC(ret) && i < table_ids.count(); ++i) {
idx = stmt.get_table_bit_index(table_ids.at(i));
if (OB_UNLIKELY(OB_INVALID_INDEX == idx)) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("unexpect idx", K(ret));
} else if (OB_FAIL(table_set.add_member(idx))) {
LOG_WARN("failed to add members", K(ret));
}
}
return ret;
}
int ObTransformUtils::get_table_rel_ids(const ObDMLStmt& stmt, const uint64_t table_id, ObSqlBitSet<>& table_set)
{
int ret = OB_SUCCESS;
int32_t idx = stmt.get_table_bit_index(table_id);
if (OB_UNLIKELY(OB_INVALID_INDEX == idx)) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("unexpect idx", K(ret));
} else if (OB_FAIL(table_set.add_member(idx))) {
LOG_WARN("failed to add members", K(ret));
}
return ret;
}
int ObTransformUtils::get_table_rel_ids(
const ObDMLStmt& stmt, const ObIArray<TableItem*>& tables, ObSqlBitSet<>& table_set)
{
int ret = OB_SUCCESS;
for (int64_t i = 0; OB_SUCC(ret) && i < tables.count(); ++i) {
if (OB_ISNULL(tables.at(i))) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("unexpect null", K(ret));
} else if (OB_FAIL(get_table_rel_ids(stmt, *tables.at(i), table_set))) {
LOG_WARN("failed to get table rel ids", K(ret));
}
}
return ret;
}
int ObTransformUtils::get_from_item(ObDMLStmt* stmt, TableItem* table, FromItem& from)
int ObTransformUtils::get_from_item(ObDMLStmt *stmt, TableItem *table, FromItem &from)
{
int ret = OB_SUCCESS;
bool found = false;
@ -4586,11 +4476,11 @@ int ObTransformUtils::generate_unique_key(
ObTransformerCtx* ctx, ObDMLStmt* stmt, ObSqlBitSet<>& ignore_tables, ObIArray<ObRawExpr*>& unique_keys)
{
int ret = OB_SUCCESS;
ObRelIds from_rel_ids;
ObSqlBitSet<> from_rel_ids;
if (OB_ISNULL(stmt) || OB_ISNULL(ctx)) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("param is null", K(stmt), K(ctx), K(ret));
} else if (OB_FAIL(get_from_tables(*stmt, from_rel_ids))) {
} else if (OB_FAIL(stmt->get_from_tables(from_rel_ids))) {
LOG_WARN("failed to get output rel ids", K(ret));
} else {
ObIArray<TableItem*>& table_items = stmt->get_table_items();
@ -5413,15 +5303,12 @@ int ObTransformUtils::create_simple_view(
// 5. finish creating the child stmts
if (OB_SUCC(ret)) {
// create select list
ObSEArray<ObRawExpr*, 4> columns;
ObSEArray<ObQueryRefRawExpr*, 4> query_refs;
ObRelIds rel_ids;
ObSEArray<ObRawExpr *, 4> columns;
ObSEArray<ObQueryRefRawExpr *, 4> query_refs;
ObSqlBitSet<> from_tables;
ObSEArray<ObRawExpr*, 16> shared_exprs;
if (OB_FAIL(get_from_tables(*view_stmt, rel_ids))) {
if (OB_FAIL(view_stmt->get_from_tables(from_tables))) {
LOG_WARN("failed to get from tables", K(ret));
} else if (OB_FAIL(from_tables.add_members2(rel_ids))) {
LOG_WARN("failed to add members", K(ret));
} else if (OB_FAIL(view_stmt->get_column_exprs(columns))) {
LOG_WARN("failed to get column exprs", K(ret));
} else if (OB_FAIL(extract_table_exprs(*view_stmt, columns, from_tables, select_list))) {
@ -5849,6 +5736,10 @@ int ObTransformUtils::create_view_with_table(
LOG_WARN("failed to adjust subquery list", K(ret));
} else if (OB_FAIL(view_stmt->adjust_subquery_stmt_parent(stmt, view_stmt))) {
LOG_WARN("failed to adjust subquery stmt parent", K(ret));
} else if ((stmt->is_delete_stmt() || stmt->is_update_stmt() || stmt->is_merge_stmt()) &&
OB_FAIL(adjust_updatable_view(*ctx->expr_factory_, static_cast<ObDelUpdStmt*>(stmt),
*new_table))) {
LOG_WARN("failed to adjust updatable view", K(ret));
} else if (OB_FAIL(stmt->remove_table_item(new_table))) {
LOG_WARN("failed to remove table item", K(ret));
} else if (OB_FAIL(stmt->replace_inner_stmt_expr(old_column_exprs, new_column_exprs))) {
@ -5913,18 +5804,22 @@ int ObTransformUtils::pushdown_semi_info_right_filter(ObDMLStmt* stmt, ObTransfo
// pushdown right table filter in semi condition:
// 1. if right table is a basic table, create a generate table.
// 2. pushdown the right table filters into the generate table.
int ObTransformUtils::pushdown_semi_info_right_filter(
ObDMLStmt* stmt, ObTransformerCtx* ctx, SemiInfo* semi_info, ObIArray<ObRawExpr*>& right_filters)
// subquery in right filter can not be a shared subquery
int ObTransformUtils::pushdown_semi_info_right_filter(ObDMLStmt *stmt,
ObTransformerCtx *ctx,
SemiInfo *semi_info,
ObIArray<ObRawExpr*> &right_filters)
{
int ret = OB_SUCCESS;
TableItem* right_table = NULL;
ObSelectStmt* child_stmt = NULL;
bool can_push = false;
ObSEArray<ObRawExpr*, 16> new_right_filters;
ObSEArray<ObRawExpr*, 16> old_column_exprs;
ObSEArray<ObRawExpr*, 16> new_column_exprs;
if (OB_ISNULL(stmt) || OB_ISNULL(ctx) || OB_ISNULL(semi_info)) {
if (OB_ISNULL(stmt) || OB_ISNULL(ctx) || OB_ISNULL(semi_info) || OB_ISNULL(ctx->expr_factory_)) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("unexpected null", K(ret), K(stmt), K(ctx), K(semi_info));
LOG_WARN("unexpected null", K(ret), K(stmt), K(ctx), K(semi_info), K(ctx->expr_factory_));
} else if (right_filters.empty()) {
/* do nothing */
} else if (OB_ISNULL(right_table = stmt->get_table_item_by_id(semi_info->right_table_id_))) {
@ -5940,9 +5835,12 @@ int ObTransformUtils::pushdown_semi_info_right_filter(
LOG_WARN("unexpected right table", K(ret), K(right_table), K(child_stmt));
} else if (OB_FAIL(ObOptimizerUtil::remove_item(semi_info->semi_conditions_, right_filters))) {
LOG_WARN("failed to remove item", K(ret));
} else if (OB_FAIL(child_stmt->add_condition_exprs(right_filters))) {
} else if (OB_FAIL(ObRawExprUtils::copy_exprs(*ctx->expr_factory_, right_filters,
new_right_filters, COPY_REF_DEFAULT))) {
LOG_WARN("failed to copy exprs", K(ret));
} else if (OB_FAIL(child_stmt->add_condition_exprs(new_right_filters))) {
LOG_WARN("failed to add condotion exprs", K(ret));
} else if (OB_FAIL(extract_query_ref_expr(right_filters, child_stmt->get_subquery_exprs()))) {
} else if (OB_FAIL(extract_query_ref_expr(new_right_filters, child_stmt->get_subquery_exprs()))) {
LOG_WARN("failed to adjust subquery list", K(ret));
} else if (OB_FAIL(stmt->adjust_subquery_list())) {
LOG_WARN("failed to adjust subquery list", K(ret));
@ -6119,43 +6017,9 @@ int ObTransformUtils::replace_table_in_joined_tables(TableItem* table, TableItem
return ret;
}
/**
* @brief get_output_rel_ids
* get ObRelIds for all tables in from items
*/
int ObTransformUtils::get_from_tables(const ObDMLStmt& stmt, ObRelIds& output_rel_ids)
{
int ret = OB_SUCCESS;
int32_t bit_id = OB_INVALID_INDEX;
for (int64_t i = 0; OB_SUCC(ret) && i < stmt.get_from_item_size(); ++i) {
const FromItem& from = stmt.get_from_item(i);
if (from.is_joined_) {
const JoinedTable* table = stmt.get_joined_table(from.table_id_);
if (OB_ISNULL(table)) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("failed to get joined table", K(ret));
}
for (int64_t j = 0; OB_SUCC(ret) && j < table->single_table_ids_.count(); ++j) {
uint64_t table_id = table->single_table_ids_.at(j);
if (OB_UNLIKELY(OB_INVALID_INDEX == (bit_id = stmt.get_table_bit_index(table_id)))) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("invalid table bit index", K(ret), K(table_id), K(bit_id));
} else if (OB_FAIL(output_rel_ids.add_member(bit_id))) {
LOG_WARN("failed to add member", K(ret));
}
}
} else if (OB_UNLIKELY(OB_INVALID_INDEX == (bit_id = stmt.get_table_bit_index(from.table_id_)))) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("invalid table bit index", K(ret), K(from.table_id_), K(bit_id));
} else if (OB_FAIL(output_rel_ids.add_member(bit_id))) {
LOG_WARN("failed to add member", K(ret));
}
}
return ret;
}
int ObTransformUtils::classify_rownum_conds(
ObDMLStmt& stmt, ObIArray<ObRawExpr*>& spj_conds, ObIArray<ObRawExpr*>& other_conds)
int ObTransformUtils::classify_rownum_conds(ObDMLStmt &stmt,
ObIArray<ObRawExpr *> &spj_conds,
ObIArray<ObRawExpr *> &other_conds)
{
int ret = OB_SUCCESS;
if (stmt.is_select_stmt()) {
@ -6777,7 +6641,7 @@ int ObTransformUtils::recursive_set_stmt_unique(ObSelectStmt* select_stmt, ObTra
int ret = OB_SUCCESS;
bool is_unique = false;
bool is_stack_overflow = false;
ObRelIds origin_output_rel_ids;
ObSqlBitSet<> origin_output_rel_ids;
ObSEArray<ObRawExpr*, 4> pkeys;
ObSEArray<ObRawExpr*, 4> select_exprs;
if (OB_ISNULL(select_stmt) || OB_ISNULL(ctx) || OB_ISNULL(ctx->session_info_) || OB_ISNULL(ctx->schema_checker_) ||
@ -6801,7 +6665,7 @@ int ObTransformUtils::recursive_set_stmt_unique(ObSelectStmt* select_stmt, ObTra
}
} else if (OB_FAIL(select_stmt->get_select_exprs(select_exprs))) {
LOG_WARN("failed to get select exprs", K(ret));
} else if (OB_FAIL(get_from_tables(*select_stmt, origin_output_rel_ids))) {
} else if (OB_FAIL(select_stmt->get_from_tables(origin_output_rel_ids))) {
LOG_WARN("failed to get output rel ids", K(ret));
} else {
ObIArray<TableItem*>& table_items = select_stmt->get_table_items();
@ -6870,11 +6734,11 @@ int ObTransformUtils::check_can_set_stmt_unique(ObDMLStmt* stmt, bool& can_set_u
{
int ret = OB_SUCCESS;
can_set_unique = false;
ObRelIds output_rel_ids;
ObSqlBitSet<> output_rel_ids;
if (OB_ISNULL(stmt)) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("get unexpected null ptr", K(stmt), K(ret));
} else if (OB_FAIL(get_from_tables(*stmt, output_rel_ids))) {
} else if (OB_FAIL(stmt->get_from_tables(output_rel_ids))) {
LOG_WARN("failed to get output rel ids", K(ret));
} else {
ObSelectStmt* view_stmt = NULL;