From c5a94ea0e2718348fd0e7f3d9f18ed5fce5b69ee Mon Sep 17 00:00:00 2001 From: JinmaoLi Date: Tue, 16 Apr 2024 04:49:17 +0000 Subject: [PATCH] [CP] adjust the initialization timing of var_init_exprs --- .../code_generator/ob_static_engine_cg.cpp | 1 + src/sql/optimizer/ob_log_expr_values.cpp | 33 ++++++++++++++++++- src/sql/optimizer/ob_log_expr_values.h | 1 + src/sql/resolver/dml/ob_dml_resolver.cpp | 23 ------------- src/sql/resolver/dml/ob_dml_resolver.h | 1 - 5 files changed, 34 insertions(+), 25 deletions(-) diff --git a/src/sql/code_generator/ob_static_engine_cg.cpp b/src/sql/code_generator/ob_static_engine_cg.cpp index 42eb5d0bce..97f579cf7b 100644 --- a/src/sql/code_generator/ob_static_engine_cg.cpp +++ b/src/sql/code_generator/ob_static_engine_cg.cpp @@ -7968,6 +7968,7 @@ int ObStaticEngineCG::set_other_properties(const ObLogPlan &log_plan, ObPhysical !var_init_expr->has_flag(CNT_ONETIME) && !var_init_expr->has_flag(CNT_ALIAS) && !var_init_expr->has_flag(CNT_DYNAMIC_PARAM) && + !var_init_expr->has_flag(CNT_DYNAMIC_USER_VARIABLE) && !ObOptimizerUtil::has_psedu_column(*var_init_expr) && !ObOptimizerUtil::has_hierarchical_expr(*var_init_expr) && var_init_expr->get_relation_ids().is_empty()) { diff --git a/src/sql/optimizer/ob_log_expr_values.cpp b/src/sql/optimizer/ob_log_expr_values.cpp index e66c28b649..42a56499db 100644 --- a/src/sql/optimizer/ob_log_expr_values.cpp +++ b/src/sql/optimizer/ob_log_expr_values.cpp @@ -282,9 +282,15 @@ int ObLogExprValues::get_op_exprs(ObIArray &all_exprs) int ObLogExprValues::allocate_expr_post(ObAllocExprContext &ctx) { int ret = OB_SUCCESS; - if (OB_ISNULL(get_stmt())) { + ObQueryCtx *query_ctx = NULL; + ObSQLSessionInfo *session_info = NULL; + bool enable_var_assign_use_das = false; + if (OB_ISNULL(get_stmt()) || OB_ISNULL(get_plan()) || + OB_ISNULL(query_ctx = get_plan()->get_optimizer_context().get_query_ctx()) || + OB_ISNULL(session_info = get_plan()->get_optimizer_context().get_session_info())) { ret = OB_ERR_UNEXPECTED; LOG_WARN("get unexpected null", K(get_stmt()), K(ret)); + } else if (OB_FALSE_IT(enable_var_assign_use_das = session_info->is_var_assign_use_das_enabled())) { } else if (get_stmt()->is_insert_stmt() || is_values_table_) { const ObIArray &values_desc = get_stmt()->is_insert_stmt() ? static_cast(get_stmt())->get_values_desc() : value_desc_; @@ -305,6 +311,9 @@ int ObLogExprValues::allocate_expr_post(ObAllocExprContext &ctx) LOG_WARN("construct array binding values failed", K(ret)); } else if (value_exprs_.empty() && OB_FAIL(append(value_exprs_, get_output_exprs()))) { LOG_WARN("failed to append exprs", K(ret)); + } else if (enable_var_assign_use_das && get_stmt()->is_select_stmt() && + OB_FAIL(extract_var_init_exprs(get_stmt(), query_ctx->var_init_exprs_))) { + LOG_WARN("extract var init exprs failed", K(ret)); } else if (value_exprs_.empty() && OB_FAIL(allocate_dummy_output())) { LOG_WARN("failed to allocate dummy output", K(ret)); } else if (OB_FAIL(construct_sequence_values())) { @@ -563,5 +572,27 @@ int ObLogExprValues::is_my_fixed_expr(const ObRawExpr *expr, bool &is_fixed) return OB_SUCCESS; } +// Extract the var assign expr, This is to be compatible with some of mysql's uses of variables +// Such as "select c1,(@rownum:= @rownum+1) as CCBH from t1,(SELECT@rownum:=0) B" +int ObLogExprValues::extract_var_init_exprs(const ObDMLStmt *stmt, + ObIArray &assign_exprs) +{ + int ret = OB_SUCCESS; + const ObSelectStmt *select_stmt = NULL; + if (OB_ISNULL(stmt) || !stmt->is_select_stmt()) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("unexpected stmt", K(ret)); + } else if (OB_FALSE_IT(select_stmt = static_cast(stmt))) { + } else if (select_stmt->get_from_item_size() <= 0) { + for (int i = 0; OB_SUCC(ret) && i < select_stmt->get_select_item_size(); ++i) { + const SelectItem &select_item = select_stmt->get_select_item(i); + if (OB_FAIL(ObRawExprUtils::extract_var_assign_exprs(select_item.expr_, assign_exprs))) { + LOG_WARN("extract var assign exprs failed", K(ret)); + } + } + } + return ret; +} + } // namespace sql }// namespace oceanbase diff --git a/src/sql/optimizer/ob_log_expr_values.h b/src/sql/optimizer/ob_log_expr_values.h index b183b3a878..aebddd7326 100644 --- a/src/sql/optimizer/ob_log_expr_values.h +++ b/src/sql/optimizer/ob_log_expr_values.h @@ -67,6 +67,7 @@ class ObLogExprValues : public ObLogicalOperator virtual int get_op_exprs(ObIArray &all_exprs) override; virtual int is_my_fixed_expr(const ObRawExpr *expr, bool &is_fixed) override; virtual int allocate_expr_post(ObAllocExprContext &ctx) override; + int extract_var_init_exprs(const ObDMLStmt *stmt, ObIArray &assign_exprs); int extract_err_log_info(); int mark_probably_local_exprs(); int allocate_dummy_output(); diff --git a/src/sql/resolver/dml/ob_dml_resolver.cpp b/src/sql/resolver/dml/ob_dml_resolver.cpp index 28e5418b96..1745c152d6 100755 --- a/src/sql/resolver/dml/ob_dml_resolver.cpp +++ b/src/sql/resolver/dml/ob_dml_resolver.cpp @@ -4952,10 +4952,6 @@ int ObDMLResolver::do_resolve_generate_table(const ParseNode &table_node, LOG_WARN("check duplicated column failed", K(ret)); } else if (OB_FAIL(resolve_generate_table_item(ref_stmt, alias_name, table_item))) { LOG_WARN("resolve generate table item failed", K(ret)); - } else if (enable_var_assign_use_das && OB_FAIL(extract_var_init_exprs(ref_stmt, params_.query_ctx_->var_init_exprs_))) { - // Extract the var assign expr in generated table, This is to be compatible with some of mysql's uses of variables - // Such as "select c1,(@rownum:= @rownum+1) as CCBH from t1,(SELECT@rownum:=0) B" - LOG_WARN("extract var init exprs failed", K(ret)); } else { LOG_DEBUG("finish do_resolve_generate_table", K(alias_name), KPC(table_item), KPC(table_item->ref_query_)); @@ -4963,25 +4959,6 @@ int ObDMLResolver::do_resolve_generate_table(const ParseNode &table_node, return ret; } -int ObDMLResolver::extract_var_init_exprs(ObSelectStmt *ref_query, ObIArray &assign_exprs) -{ - // Extract the var assign expr in generated table, This is to be compatible with some of mysql's uses of variables - // Such as "select c1,(@rownum:= @rownum+1) as CCBH from t1,(SELECT@rownum:=0) B" - int ret = OB_SUCCESS; - if (OB_ISNULL(ref_query)) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("ref query is nullptr", KR(ret)); - } else if (ref_query->get_from_item_size() <= 0) { - for (int i = 0; OB_SUCC(ret) && i < ref_query->get_select_item_size(); ++i) { - const SelectItem &select_item = ref_query->get_select_item(i); - if (OB_FAIL(ObRawExprUtils::extract_var_assign_exprs(select_item.expr_, assign_exprs))) { - LOG_WARN("extract var assign exprs failed", K(ret)); - } - } - } - return ret; -} - int ObDMLResolver::resolve_generate_table_item(ObSelectStmt *ref_query, const ObString &alias_name, TableItem *&tbl_item) diff --git a/src/sql/resolver/dml/ob_dml_resolver.h b/src/sql/resolver/dml/ob_dml_resolver.h index 927cc479e4..152369bad5 100644 --- a/src/sql/resolver/dml/ob_dml_resolver.h +++ b/src/sql/resolver/dml/ob_dml_resolver.h @@ -190,7 +190,6 @@ public: const ParseNode *alias_node, ObChildStmtResolver &child_resolver, TableItem *&table_item); - int extract_var_init_exprs(ObSelectStmt *ref_query, common::ObIArray &assign_exprs); int resolve_generate_table_item(ObSelectStmt *ref_query, const ObString &alias_name, TableItem *&tbl_item); int resolve_joined_table(const ParseNode &parse_node, JoinedTable *&joined_table); int resolve_joined_table_item(const ParseNode &parse_node, JoinedTable *&joined_table);