diff --git a/src/share/inner_table/ob_inner_table_schema_def.py b/src/share/inner_table/ob_inner_table_schema_def.py index a4077655b1..bb699adbed 100644 --- a/src/share/inner_table/ob_inner_table_schema_def.py +++ b/src/share/inner_table/ob_inner_table_schema_def.py @@ -11572,6 +11572,7 @@ def_table_schema( # 12399: __all_virtual_storage_leak_info # # 12400 __all_virtual_ls_log_restore_status +# 12401: __all_virtual_tenant_parameter # # 余留位置 # @@ -11883,6 +11884,7 @@ def_table_schema(**no_direct_access(gen_oracle_mapping_virtual_table_def('15298' def_table_schema(**no_direct_access(gen_oracle_mapping_virtual_table_def('15385', all_def_keywords['__all_virtual_timestamp_service']))) # 15386: __all_virtual_column_group # 15387: __all_virtual_ls_log_restore_status +# 15388: __all_virtual_tenant_parameter ################################################################################ # System View (20000,30000] diff --git a/src/sql/code_generator/ob_static_engine_cg.cpp b/src/sql/code_generator/ob_static_engine_cg.cpp index 03b565c992..8b6792a875 100644 --- a/src/sql/code_generator/ob_static_engine_cg.cpp +++ b/src/sql/code_generator/ob_static_engine_cg.cpp @@ -1275,7 +1275,7 @@ int ObStaticEngineCG::generate_hash_set_spec(ObLogSet &op, ObHashSetSpec &spec) { int ret = OB_SUCCESS; ObSEArray out_raw_exprs; - if (OB_FAIL(op.extra_set_exprs(out_raw_exprs))) { + if (OB_FAIL(op.get_pure_set_exprs(out_raw_exprs))) { LOG_WARN("failed to get output exprs", K(ret)); } else if (OB_FAIL(mark_expr_self_produced(out_raw_exprs))) { // set expr LOG_WARN("fail to mark exprs self produced", K(ret)); @@ -1446,7 +1446,7 @@ int ObStaticEngineCG::generate_merge_set_spec(ObLogSet &op, ObMergeSetSpec &spec { int ret = OB_SUCCESS; ObSEArray out_raw_exprs; - if (OB_FAIL(op.extra_set_exprs(out_raw_exprs))) { + if (OB_FAIL(op.get_pure_set_exprs(out_raw_exprs))) { LOG_WARN("failed to get output exprs", K(ret)); } else if (OB_FAIL(mark_expr_self_produced(out_raw_exprs))) { // set expr LOG_WARN("fail to mark exprs self produced", K(ret)); diff --git a/src/sql/optimizer/ob_log_set.cpp b/src/sql/optimizer/ob_log_set.cpp index 1d9996709c..83697f8c6b 100644 --- a/src/sql/optimizer/ob_log_set.cpp +++ b/src/sql/optimizer/ob_log_set.cpp @@ -151,7 +151,6 @@ int ObLogSet::get_equal_set_conditions(ObIArray &equal_conds) { int ret = OB_SUCCESS; ObSQLSessionInfo *session_info = NULL; - ObSEArray select_exprs; ObSEArray set_exprs; const ObSelectStmt *stmt = NULL; ObRawExprFactory *expr_factory = NULL; @@ -161,9 +160,7 @@ int ObLogSet::get_equal_set_conditions(ObIArray &equal_conds) ret = OB_ERR_UNEXPECTED; LOG_WARN("get unexpected null", K(get_plan()), K(get_stmt()), K(session_info), K(ret)); } else if (OB_FALSE_IT(stmt = static_cast(get_stmt()))) { - } else if (OB_FAIL(get_set_exprs(select_exprs))) { - LOG_WARN("failed to get set exprs", K(ret)); - } else if (OB_FAIL(ObTransformUtils::get_expr_in_cast(select_exprs, set_exprs))) { + } else if (OB_FAIL(stmt->get_pure_set_exprs(set_exprs))) { LOG_WARN("failed to expr in cast", K(ret)); } else if (OB_FAIL(ObTransformUtils::get_equal_set_conditions(*expr_factory, session_info, stmt, set_exprs, equal_conds))) { @@ -354,24 +351,6 @@ int ObLogSet::compute_sharding_info() return ret; } -int ObLogSet::is_my_set_expr(const ObRawExpr *expr, bool &bret) -{ - int ret = OB_SUCCESS; - bret = false; - const ObSelectStmt *stmt = static_cast(get_stmt()); - if (OB_ISNULL(stmt) || OB_ISNULL(expr)) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("unexpect NULL pointer", K(stmt), K(expr)); - } else if (!expr->is_set_op_expr()) { - bret = false; - } else { - for (int64_t i = 0; OB_SUCC(ret) && !bret && i < stmt->get_select_item_size(); ++i) { - bret = expr == ObTransformUtils::get_expr_in_cast(stmt->get_select_item(i).expr_); - } - } - return ret; -} - int ObLogSet::set_search_ordering(const common::ObIArray &search_ordering) { int ret = OB_SUCCESS; @@ -741,14 +720,17 @@ int ObLogSet::get_set_exprs(ObIArray &set_exprs) return ret; } -int ObLogSet::extra_set_exprs(ObIArray &set_exprs) +int ObLogSet::get_pure_set_exprs(ObIArray &set_exprs) { int ret = OB_SUCCESS; - ObSEArray out_raw_exprs; - if (OB_FAIL(get_set_exprs(out_raw_exprs))) { - LOG_WARN("failed to get set exprs", K(ret)); - } else if (OB_FAIL(ObTransformUtils::get_expr_in_cast(out_raw_exprs, set_exprs))) { - LOG_WARN("failed to get expr in cast", K(ret)); + if (OB_ISNULL(get_stmt()) || OB_UNLIKELY(!get_stmt()->is_select_stmt())) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("get unexpected error", K(get_stmt()), K(ret)); + } else { + const ObSelectStmt *sel_stmt = static_cast(get_stmt()); + if (OB_FAIL(sel_stmt->get_pure_set_exprs(set_exprs))) { + LOG_WARN("failed to get set op exprs", K(ret)); + } else { /*do nothing*/ } } return ret; } diff --git a/src/sql/optimizer/ob_log_set.h b/src/sql/optimizer/ob_log_set.h index cb1b6d3847..54a443b230 100644 --- a/src/sql/optimizer/ob_log_set.h +++ b/src/sql/optimizer/ob_log_set.h @@ -45,7 +45,6 @@ public: const ObSelectStmt *get_left_stmt() const; const ObSelectStmt *get_right_stmt() const; int get_my_set_exprs(ObIArray &set_exprs); - int is_my_set_expr(const ObRawExpr *expr, bool &bret); const char *get_name() const; inline void assign_set_distinct(const bool is_distinct) { is_distinct_ = is_distinct; } inline void set_recursive_union(bool is_recursive_union) { is_recursive_union_ = is_recursive_union; } @@ -72,7 +71,7 @@ public: int set_set_directions(const common::ObIArray &directions) { return set_directions_.assign(directions); } int add_set_direction(const ObOrderDirection direction = default_asc_direction()) { return set_directions_.push_back(direction); } int get_set_exprs(ObIArray &set_exprs); - int extra_set_exprs(ObIArray &set_exprs); + int get_pure_set_exprs(ObIArray &set_exprs); virtual int est_cost() override; virtual int est_width() override; virtual int re_est_cost(EstimateCostInfo ¶m, double &card, double &cost) override; diff --git a/src/sql/optimizer/ob_optimizer_util.cpp b/src/sql/optimizer/ob_optimizer_util.cpp index 50e061c9c2..8d8c13fd44 100644 --- a/src/sql/optimizer/ob_optimizer_util.cpp +++ b/src/sql/optimizer/ob_optimizer_util.cpp @@ -6681,15 +6681,11 @@ int ObOptimizerUtil::rename_set_op_pushdown_filter(const ObSelectStmt &parent_st { int ret = OB_SUCCESS; ObSEArray child_select_list; - ObSEArray parent_select_list; ObSEArray parent_set_exprs; ObRawExprCopier copier(expr_factory); if (OB_FAIL(subquery.get_select_exprs(child_select_list))) { LOG_WARN("get child stmt select exprs failed", K(ret)); - } else if (OB_FAIL(parent_stmt.get_select_exprs(parent_select_list))) { - LOG_WARN("get parent stmt select exprs failed", K(ret)); - } else if (OB_FAIL(ObTransformUtils::get_expr_in_cast(parent_select_list, - parent_set_exprs))) { + } else if (OB_FAIL(parent_stmt.get_pure_set_exprs(parent_set_exprs))) { LOG_WARN("failed to get expr in cast", K(ret)); } else if (OB_FAIL(copier.add_replaced_expr(parent_set_exprs, child_select_list))) { LOG_WARN("failed to add exprs", K(ret)); diff --git a/src/sql/optimizer/ob_select_log_plan.cpp b/src/sql/optimizer/ob_select_log_plan.cpp index 7dd030cba9..3bbb7150b1 100644 --- a/src/sql/optimizer/ob_select_log_plan.cpp +++ b/src/sql/optimizer/ob_select_log_plan.cpp @@ -1804,7 +1804,11 @@ int ObSelectLogPlan::update_set_sharding_info(const ObIArray & ObSEArray old_exprs; ObSEArray new_exprs; ObSEArray partition_keys; - if (OB_FAIL(get_pure_set_exprs(pure_set_exprs))) { + const ObSelectStmt *sel_stmt = NULL; + if (OB_ISNULL(sel_stmt = get_stmt()) || OB_UNLIKELY(!sel_stmt->is_select_stmt())) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("get unexpected error", K(ret)); + } else if (OB_FAIL(sel_stmt->get_pure_set_exprs(pure_set_exprs))) { LOG_WARN("failed to get pure set exprs", K(ret)); } else { ObSEArray dist_shardings; @@ -2789,33 +2793,6 @@ int ObSelectLogPlan::candi_allocate_distinct_set(const ObIArray &pure_set_exprs) -{ - int ret = OB_SUCCESS; - const ObSelectStmt *sel_stmt = NULL; - ObSEArray set_exprs; - if (OB_ISNULL(sel_stmt = get_stmt()) || OB_UNLIKELY(!sel_stmt->is_select_stmt())) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("get unexpected error", K(ret)); - } else if (OB_FAIL(sel_stmt->get_select_exprs(set_exprs))) { - LOG_WARN("failed to get select exprs", K(ret)); - } else { - for (int64_t i = 0; OB_SUCC(ret) && i < set_exprs.count(); i++) { - ObRawExpr *output_expr = NULL; - if (OB_ISNULL(set_exprs.at(i))) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("get unexpected null", K(ret)); - } else if (OB_ISNULL(output_expr = ObTransformUtils::get_expr_in_cast(set_exprs.at(i)))) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("failed to get first set op expr", K(ret)); - } else if (OB_FAIL(pure_set_exprs.push_back(output_expr))) { - LOG_WARN("failed to push back output expr", K(ret)); - } else { /*do nothing*/ } - } - } - return ret; -} - int ObSelectLogPlan::get_distributed_set_methods(const EqualSets &equal_sets, const ObIArray &left_set_keys, const ObIArray &right_set_keys, diff --git a/src/sql/optimizer/ob_select_log_plan.h b/src/sql/optimizer/ob_select_log_plan.h index b7f7bc5867..3262c56bfc 100644 --- a/src/sql/optimizer/ob_select_log_plan.h +++ b/src/sql/optimizer/ob_select_log_plan.h @@ -269,8 +269,6 @@ private: int candi_allocate_distinct_set(const ObIArray &child_plans); - int get_pure_set_exprs(ObIArray &pure_set_exprs); - int get_allowed_branch_order(const bool ignore_hint, const ObSelectStmt::SetOperator set_op, bool &no_swap, diff --git a/src/sql/resolver/dml/ob_select_stmt.cpp b/src/sql/resolver/dml/ob_select_stmt.cpp index 8b28f07185..a1813a7f83 100644 --- a/src/sql/resolver/dml/ob_select_stmt.cpp +++ b/src/sql/resolver/dml/ob_select_stmt.cpp @@ -1197,3 +1197,39 @@ bool ObSelectStmt::has_hidden_rowid() const { } return res; } + +int ObSelectStmt::get_pure_set_exprs(ObIArray &pure_set_exprs) const +{ + int ret = OB_SUCCESS; + pure_set_exprs.reuse(); + if (is_set_stmt()) { + ObRawExpr *select_expr = NULL; + ObRawExpr *set_op_expr = NULL; + for (int64_t i = 0; OB_SUCC(ret) && i < get_select_item_size(); ++i) { + if (OB_ISNULL(select_expr = get_select_item(i).expr_)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("get unexpected null", K(ret), K(i)); + } else if (!select_expr->has_flag(CNT_SET_OP)) { + /* do nothing, for recursive union all, exists search/cycle pseudo columns*/ + } else if (OB_ISNULL(set_op_expr = get_pure_set_expr(select_expr)) + || OB_UNLIKELY(!set_op_expr->is_set_op_expr())) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("get unexpected expr", K(ret), K(i), K(*select_expr)); + } else if (OB_FAIL(pure_set_exprs.push_back(set_op_expr))) { + LOG_WARN("failed to push back expr", K(ret)); + } + } + } + return ret; +} + +// cast sys functions above set op expr can be: +// T_FUN_SYS_CAST/T_FUN_SYS_RAWTOHEX/T_FUN_SYS_TO_NCHAR/T_FUN_SYS_TO_CHAR +// use this function to get set op expr from expr child recursively +ObRawExpr* ObSelectStmt::get_pure_set_expr(ObRawExpr *expr) +{ + while (OB_NOT_NULL(expr) && !expr->is_set_op_expr() && 0 < expr->get_param_count()) { + expr = expr->get_param_expr(0); + } + return expr; +} \ No newline at end of file diff --git a/src/sql/resolver/dml/ob_select_stmt.h b/src/sql/resolver/dml/ob_select_stmt.h index 22865111a5..e655981f3c 100644 --- a/src/sql/resolver/dml/ob_select_stmt.h +++ b/src/sql/resolver/dml/ob_select_stmt.h @@ -601,6 +601,8 @@ public: share::schema::ViewCheckOption get_check_option() const { return check_option_; } void set_check_option(share::schema::ViewCheckOption check_option) { check_option_ = check_option; } // this function will only be called while resolving with clause. + int get_pure_set_exprs(ObIArray &pure_set_exprs) const; + static ObRawExpr* get_pure_set_expr(ObRawExpr *expr); private: SetOperator set_op_; diff --git a/src/sql/rewrite/ob_transform_predicate_move_around.cpp b/src/sql/rewrite/ob_transform_predicate_move_around.cpp index aebd145e32..bfeed7e7ad 100644 --- a/src/sql/rewrite/ob_transform_predicate_move_around.cpp +++ b/src/sql/rewrite/ob_transform_predicate_move_around.cpp @@ -1743,7 +1743,6 @@ int ObTransformPredicateMoveAround::rename_set_op_predicates(ObSelectStmt &child { int ret = OB_SUCCESS; ObSEArray child_select_list; - ObSEArray parent_select_list; ObSEArray parent_set_exprs; if (OB_ISNULL(ctx_) || OB_ISNULL(ctx_->expr_factory_) || OB_ISNULL(ctx_->session_info_)) { @@ -1751,9 +1750,7 @@ int ObTransformPredicateMoveAround::rename_set_op_predicates(ObSelectStmt &child LOG_WARN("param has null", K(ctx_), K(ret)); } else if (OB_FAIL(child_stmt.get_select_exprs(child_select_list))) { LOG_WARN("get child stmt select exprs failed", K(ret)); - } else if (OB_FAIL(parent_stmt.get_select_exprs(parent_select_list))) { - LOG_WARN("get parent stmt select exprs failed", K(ret)); - } else if (OB_FAIL(ObTransformUtils::get_expr_in_cast(parent_select_list, parent_set_exprs))) { + } else if (OB_FAIL(parent_stmt.get_pure_set_exprs(parent_set_exprs))) { LOG_WARN("failed to get parent set exprs", K(ret)); } else if (child_select_list.count() != parent_set_exprs.count()) { ret = OB_ERR_UNEXPECTED; diff --git a/src/sql/rewrite/ob_transform_simplify_set.cpp b/src/sql/rewrite/ob_transform_simplify_set.cpp index 5436ccae58..422f8eddc8 100644 --- a/src/sql/rewrite/ob_transform_simplify_set.cpp +++ b/src/sql/rewrite/ob_transform_simplify_set.cpp @@ -145,7 +145,6 @@ int ObTransformSimplifySet::add_order_by(ObSelectStmt *stmt, ObSelectStmt *upper { int ret = OB_SUCCESS; ObSEArray set_exprs; - ObSEArray select_exprs; //add order by if (OB_ISNULL(stmt) || OB_ISNULL(upper_stmt) || OB_ISNULL(ctx_) || OB_ISNULL(ctx_->expr_factory_)) { @@ -154,9 +153,7 @@ int ObTransformSimplifySet::add_order_by(ObSelectStmt *stmt, ObSelectStmt *upper } else if (stmt->get_order_item_size() > 0) { ret = OB_INVALID_ARGUMENT; LOG_WARN("stmt should not have order by", K(ret), K(stmt->get_order_item_size())); - } else if (OB_FAIL(upper_stmt->get_select_exprs(select_exprs))) { - LOG_WARN("failed to get select exprs", K(ret)); - } else if (OB_FAIL(ObTransformUtils::get_expr_in_cast(select_exprs, set_exprs))) { + } else if (OB_FAIL(upper_stmt->get_pure_set_exprs(set_exprs))) { LOG_WARN("failed to get expr in cast", K(ret)); } else { ObRawExprCopier copier(*ctx_->expr_factory_); diff --git a/src/sql/rewrite/ob_transform_utils.cpp b/src/sql/rewrite/ob_transform_utils.cpp index acf067978f..599492df3f 100644 --- a/src/sql/rewrite/ob_transform_utils.cpp +++ b/src/sql/rewrite/ob_transform_utils.cpp @@ -4061,7 +4061,7 @@ int ObTransformUtils::compute_set_stmt_property(const ObSelectStmt *stmt, LOG_WARN("failed to append fd equal set", K(ret)); } else if (OB_FAIL(append(tmp_equal_sets, right_info.equal_sets_))) { LOG_WARN("failed to append fd equal set", K(ret)); - } else if (OB_FAIL(get_expr_in_cast(select_exprs, set_exprs))) { + } else if (OB_FAIL(stmt->get_pure_set_exprs(set_exprs))) { LOG_WARN("failed to get first set op exprs", K(ret)); } else if (OB_FAIL(get_equal_set_conditions(*check_helper.expr_factory_, check_helper.session_info_, @@ -4135,37 +4135,6 @@ int ObTransformUtils::get_equal_set_conditions(ObRawExprFactory &expr_factory, return ret; } -int ObTransformUtils::get_expr_in_cast(ObIArray &input_exprs, - ObIArray &output_exprs) -{ - int ret = OB_SUCCESS; - UNUSED(input_exprs); - UNUSED(output_exprs); - for (int64_t i = 0; OB_SUCC(ret) && i < input_exprs.count(); i++) { - ObRawExpr *expr = input_exprs.at(i); - int64_t cast_level = 0; - while (OB_NOT_NULL(expr) && T_FUN_SYS_CAST == expr->get_expr_type()) { - expr = ++cast_level <= OB_MAX_SET_STMT_SIZE ? expr->get_param_expr(0) : NULL; - } - if (OB_ISNULL(expr)) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("get unexpected null", K(ret)); - } else if (OB_FAIL(output_exprs.push_back(expr))) { - LOG_WARN("failed to push back expr", K(ret)); - } - } - return ret; -} - -ObRawExpr* ObTransformUtils::get_expr_in_cast(ObRawExpr *expr) -{ - int64_t cast_level = 0; - while (OB_NOT_NULL(expr) && T_FUN_SYS_CAST == expr->get_expr_type()) { - expr = ++cast_level <= OB_MAX_SET_STMT_SIZE ? expr->get_param_expr(0) : NULL; - } - return expr; -} - int ObTransformUtils::add_cast_for_replace(ObRawExprFactory &expr_factory, const ObRawExpr *from_expr, ObRawExpr *&to_expr, @@ -6073,7 +6042,7 @@ int ObTransformUtils::remove_select_items(ObTransformerCtx *ctx, /*do nothing*/ } else if (OB_FAIL(new_select_items.push_back(union_stmt.get_select_item(i)))) { LOG_WARN("failed to push back select items", K(ret)); - } else if (OB_ISNULL(set_expr = get_expr_in_cast(new_select_items.at(idx).expr_)) + } else if (OB_ISNULL(set_expr = ObSelectStmt::get_pure_set_expr(new_select_items.at(idx).expr_)) || OB_UNLIKELY(!set_expr->is_set_op_expr())) { ret = OB_ERR_UNEXPECTED; LOG_WARN("unexpected set expr", K(ret), K(set_expr)); @@ -10071,7 +10040,7 @@ int ObTransformUtils::check_select_item_need_remove(const ObSelectStmt *stmt, if (stmt->is_scala_group_by() && expr->has_flag(CNT_AGG)) { need_remove = false; } - } else if (OB_ISNULL(expr = ObTransformUtils::get_expr_in_cast(expr)) + } else if (OB_ISNULL(expr = ObSelectStmt::get_pure_set_expr(expr)) || OB_UNLIKELY(!expr->is_set_op_expr())) { ret = OB_ERR_UNEXPECTED; LOG_WARN("unexpected set expr", K(ret), KPC(expr)); diff --git a/src/sql/rewrite/ob_transform_utils.h b/src/sql/rewrite/ob_transform_utils.h index 4ab961d42a..a6fb94ee55 100644 --- a/src/sql/rewrite/ob_transform_utils.h +++ b/src/sql/rewrite/ob_transform_utils.h @@ -877,10 +877,6 @@ public: ObIArray &set_exprs, ObIArray &equal_conds); - static int get_expr_in_cast(ObIArray &input_exprs, - ObIArray &output_exprs); - static ObRawExpr* get_expr_in_cast(ObRawExpr *expr); - static int add_cast_for_replace(ObRawExprFactory &expr_factory, const ObRawExpr *from_expr, ObRawExpr *&to_expr, diff --git a/src/storage/compaction/ob_medium_compaction_func.cpp b/src/storage/compaction/ob_medium_compaction_func.cpp index fd18c17bb9..a506adc56e 100644 --- a/src/storage/compaction/ob_medium_compaction_func.cpp +++ b/src/storage/compaction/ob_medium_compaction_func.cpp @@ -126,7 +126,7 @@ int ObMediumCompactionScheduleFunc::choose_major_snapshot( } else if (OB_FAIL(ObMediumCompactionScheduleFunc::get_table_schema_to_merge( tablet, freeze_info.schema_version, allocator, medium_info))) { if (OB_TABLE_IS_DELETED == ret) { - // do nothing + // do nothing, end loop } else if (OB_ERR_SCHEMA_HISTORY_EMPTY == ret) { if (freeze_info.freeze_version <= scheduler_frozen_version) { FLOG_INFO("table schema may recycled, use newer freeze info instead", K(ret), KPC(last_major), K(freeze_info), @@ -395,8 +395,13 @@ int ObMediumCompactionScheduleFunc::decide_medium_snapshot( ret = OB_E(EventTable::EN_SCHEDULE_MEDIUM_COMPACTION) ret; LOG_INFO("errsim", K(ret), KPC(this)); if (OB_FAIL(ret)) { - FLOG_INFO("set schedule medium with errsim", KPC(this)); - ret = OB_SUCCESS; + const share::SCN &weak_read_ts = ls_.get_ls_wrs_handler()->get_ls_weak_read_ts(); + const int64_t snapshot_gc_ts = MTL(ObTenantFreezeInfoMgr*)->get_snapshot_gc_ts(); + medium_info.medium_snapshot_ = MAX(MAX(max_reserved_snapshot, MIN(weak_read_ts.get_val_for_tx(), snapshot_gc_ts)); + if (medium_info.medium_snapshot_ > max_sync_medium_scn) { + FLOG_INFO("set schedule medium with errsim", KPC(this)); + ret = OB_SUCCESS; + } } } }