diff --git a/src/objit/src/expr/ob_expr_info_flag.h b/src/objit/src/expr/ob_expr_info_flag.h index dca4e44767..729add75f4 100644 --- a/src/objit/src/expr/ob_expr_info_flag.h +++ b/src/objit/src/expr/ob_expr_info_flag.h @@ -35,7 +35,7 @@ enum ObExprInfoFlag IS_IS_EXPR, IS_VALUES, IS_DEFAULT, - IS_USER_VARIABLE, + IS_DYNAMIC_USER_VARIABLE, // user variable which is assigned in query or query has udf IS_STATE_FUNC, IS_SET_OP, IS_LAST_INSERT_ID, @@ -67,7 +67,7 @@ enum ObExprInfoFlag CNT_IS_EXPR, CNT_VALUES, CNT_DEFAULT, - CNT_USER_VARIABLE, + CNT_DYNAMIC_USER_VARIABLE, CNT_STATE_FUNC, CNT_SET_OP, CNT_LAST_INSERT_ID, @@ -117,7 +117,7 @@ inline const char* get_expr_info_flag_str(const ObExprInfoFlag flag) case IS_CUR_TIME: { ret = "IS_CUR_TIME"; break; } case IS_IS_EXPR: { ret = "IS_IS_EXPR"; break; } case IS_STATE_FUNC: { ret = "IS_STATE_FUNC"; break; } - case IS_USER_VARIABLE: { ret = "IS_USER_VARIABLE"; break; } + case IS_DYNAMIC_USER_VARIABLE: { ret = "IS_DYNAMIC_USER_VARIABLE"; break; } case IS_SET_OP: { ret = "IS_SET_OP"; break; } case IS_LAST_INSERT_ID: { ret = "IS_LAST_INSERT_ID"; break; } case IS_RAND_FUNC: { ret = "IS_RAND_FUNC"; break;} @@ -140,7 +140,7 @@ inline const char* get_expr_info_flag_str(const ObExprInfoFlag flag) case CNT_ALIAS: { ret = "CNT_ALIAS"; break; } case CNT_CUR_TIME: { ret = "CNT_CUR_TIME"; break; } case CNT_IS_EXPR: { ret = "CNT_IS_EXPR"; break; } - case CNT_USER_VARIABLE: { ret = "CNT_USER_VARIABLE"; break; } + case CNT_DYNAMIC_USER_VARIABLE: { ret = "CNT_DYNAMIC_USER_VARIABLE"; break; } case CNT_STATE_FUNC: { ret = "CNT_STATE_FUNC"; break; } case CNT_SET_OP: { ret = "CNT_SET_OP"; break; } case CNT_LAST_INSERT_ID: { ret = "CNT_LAST_INSERT_ID"; break; } diff --git a/src/sql/code_generator/ob_static_engine_cg.cpp b/src/sql/code_generator/ob_static_engine_cg.cpp index 9ee23a9e3a..32d7c2a126 100644 --- a/src/sql/code_generator/ob_static_engine_cg.cpp +++ b/src/sql/code_generator/ob_static_engine_cg.cpp @@ -880,8 +880,7 @@ int ObStaticEngineCG::generate_calc_exprs( && T_CTE_SEARCH_COLUMN != raw_expr->get_expr_type() && T_CTE_CYCLE_COLUMN != raw_expr->get_expr_type() && T_PSEUDO_EXTERNAL_FILE_COL != raw_expr->get_expr_type() - && !(raw_expr->is_const_expr() || raw_expr->has_flag(IS_USER_VARIABLE)) - // TODO:@guoping.wgp, following T_FUN_SYS_PART restrictions should be removed later + && !(raw_expr->is_const_expr() || raw_expr->has_flag(IS_DYNAMIC_USER_VARIABLE)) && !(T_FUN_SYS_PART_HASH == raw_expr->get_expr_type() || T_FUN_SYS_PART_KEY == raw_expr->get_expr_type())) { if (raw_expr->is_calculated()) { ret = OB_ERR_UNEXPECTED; diff --git a/src/sql/optimizer/ob_dynamic_sampling.cpp b/src/sql/optimizer/ob_dynamic_sampling.cpp index 5af0220e5a..d7e8f1bdc1 100644 --- a/src/sql/optimizer/ob_dynamic_sampling.cpp +++ b/src/sql/optimizer/ob_dynamic_sampling.cpp @@ -1347,7 +1347,7 @@ int ObDynamicSamplingUtils::check_ds_can_use_filter(const ObRawExpr *filter, } else if (filter->has_flag(CNT_DYNAMIC_PARAM) || filter->has_flag(CNT_SUB_QUERY) || filter->has_flag(CNT_RAND_FUNC) || - filter->has_flag(CNT_USER_VARIABLE) || + filter->has_flag(CNT_DYNAMIC_USER_VARIABLE) || filter->has_flag(CNT_PL_UDF) || filter->has_flag(CNT_SO_UDF) || filter->get_expr_type() == T_FUN_SET_TO_STR || diff --git a/src/sql/optimizer/ob_log_plan.cpp b/src/sql/optimizer/ob_log_plan.cpp index 0231ad474b..7124ca400c 100644 --- a/src/sql/optimizer/ob_log_plan.cpp +++ b/src/sql/optimizer/ob_log_plan.cpp @@ -960,7 +960,7 @@ int ObLogPlan::pre_process_quals(const ObIArray &table_items, } else if (qual->is_const_expr()) { ret = add_startup_filter(qual); } else if (qual->has_flag(CNT_RAND_FUNC) || - qual->has_flag(CNT_USER_VARIABLE)) { + qual->has_flag(CNT_DYNAMIC_USER_VARIABLE)) { ret = add_special_expr(qual); } else if (ObOptimizerUtil::has_hierarchical_expr(*qual)) { ret = normal_quals.push_back(qual); diff --git a/src/sql/optimizer/ob_logical_operator.cpp b/src/sql/optimizer/ob_logical_operator.cpp index 4988ae032e..7e8389a6eb 100644 --- a/src/sql/optimizer/ob_logical_operator.cpp +++ b/src/sql/optimizer/ob_logical_operator.cpp @@ -2018,7 +2018,7 @@ int ObLogicalOperator::extract_non_const_exprs(const ObIArray &input ret = OB_ERR_UNEXPECTED; LOG_WARN("get unexpected null", K(ret), K(expr)); } else if (expr->is_static_const_expr() || - expr->has_flag(IS_USER_VARIABLE)) { + expr->has_flag(IS_DYNAMIC_USER_VARIABLE)) { /*do nothing*/ } else if (OB_FAIL(add_var_to_array_no_dup(non_const_exprs, expr))) { LOG_WARN("failed to push back expr", K(ret)); diff --git a/src/sql/resolver/ddl/ob_create_view_resolver.cpp b/src/sql/resolver/ddl/ob_create_view_resolver.cpp index 3cd1d42af7..4abc71782c 100644 --- a/src/sql/resolver/ddl/ob_create_view_resolver.cpp +++ b/src/sql/resolver/ddl/ob_create_view_resolver.cpp @@ -429,8 +429,7 @@ int ObCreateViewResolver::check_privilege_needed(ObCreateTableStmt &stmt, if (OB_ISNULL(table_item)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("table item is null"); - } else if (TableItem::BASE_TABLE == table_item->type_ - || TableItem::ALIAS_TABLE == table_item->type_) { + } else if (table_item->is_basic_table() || table_item->is_view_table_) { //no check for information_schema select ObString info_schema("information_schema"); bool is_table_name_equal = false; diff --git a/src/sql/resolver/expr/ob_expr_info_flag.h b/src/sql/resolver/expr/ob_expr_info_flag.h index 7e9578e22a..bb906d950b 100644 --- a/src/sql/resolver/expr/ob_expr_info_flag.h +++ b/src/sql/resolver/expr/ob_expr_info_flag.h @@ -35,7 +35,7 @@ enum ObExprInfoFlag IS_IS_EXPR, IS_VALUES, IS_DEFAULT, - IS_USER_VARIABLE, + IS_DYNAMIC_USER_VARIABLE, // user variable which is assigned in query or query has udf IS_STATE_FUNC, IS_SET_OP, IS_LAST_INSERT_ID, @@ -79,7 +79,7 @@ enum ObExprInfoFlag CNT_IS_EXPR, CNT_VALUES, CNT_DEFAULT, - CNT_USER_VARIABLE, + CNT_DYNAMIC_USER_VARIABLE, CNT_STATE_FUNC, CNT_SET_OP, CNT_LAST_INSERT_ID, @@ -156,7 +156,7 @@ inline const char* get_expr_info_flag_str(const ObExprInfoFlag flag) case IS_IS_EXPR: { ret = "IS_IS_EXPR"; break; } case IS_VALUES: { ret = "IS_VALUES"; break; } case IS_DEFAULT: { ret = "IS_DEFAULT"; break; } - case IS_USER_VARIABLE: { ret = "IS_USER_VARIABLE"; break; } + case IS_DYNAMIC_USER_VARIABLE: { ret = "IS_DYNAMIC_USER_VARIABLE"; break; } case IS_STATE_FUNC: { ret = "IS_STATE_FUNC"; break; } case IS_SET_OP: { ret = "IS_SET_OP"; break; } case IS_LAST_INSERT_ID: { ret = "IS_LAST_INSERT_ID"; break; } @@ -192,7 +192,7 @@ inline const char* get_expr_info_flag_str(const ObExprInfoFlag flag) case CNT_IS_EXPR: { ret = "CNT_IS_EXPR"; break; } case CNT_VALUES: { ret = "CNT_VALUES"; break; } case CNT_DEFAULT: { ret = "CNT_DEFAULT"; break; } - case CNT_USER_VARIABLE: { ret = "CNT_USER_VARIABLE"; break; } + case CNT_DYNAMIC_USER_VARIABLE: { ret = "CNT_DYNAMIC_USER_VARIABLE"; break; } case CNT_STATE_FUNC: { ret = "CNT_STATE_FUNC"; break; } case CNT_SET_OP: { ret = "CNT_SET_OP"; break; } case CNT_LAST_INSERT_ID: { ret = "CNT_LAST_INSERT_ID"; break; } diff --git a/src/sql/resolver/expr/ob_raw_expr.cpp b/src/sql/resolver/expr/ob_raw_expr.cpp index f4ec704313..97c3e65aed 100644 --- a/src/sql/resolver/expr/ob_raw_expr.cpp +++ b/src/sql/resolver/expr/ob_raw_expr.cpp @@ -212,7 +212,7 @@ bool ObRawExpr::is_vectorize_result() const // TODO bin.lb: more sophisticate bool not_pre_calc = has_generalized_column() || has_flag(CNT_STATE_FUNC) - || has_flag(CNT_USER_VARIABLE) + || has_flag(CNT_DYNAMIC_USER_VARIABLE) || has_flag(CNT_ALIAS) || has_flag(CNT_VALUES) || has_flag(CNT_SEQ_EXPR) @@ -681,7 +681,7 @@ bool ObRawExpr::is_not_calculable_expr() const { return is_generalized_column() || has_flag(IS_STATE_FUNC) - || has_flag(IS_USER_VARIABLE) + || has_flag(IS_DYNAMIC_USER_VARIABLE) || has_flag(IS_ALIAS) || has_flag(IS_VALUES) || has_flag(IS_SEQ_EXPR) @@ -699,7 +699,7 @@ bool ObRawExpr::cnt_not_calculable_expr() const // need add the same rules. return has_generalized_column() || has_flag(CNT_STATE_FUNC) - || has_flag(CNT_USER_VARIABLE) + || has_flag(CNT_DYNAMIC_USER_VARIABLE) || has_flag(CNT_ALIAS) || has_flag(CNT_VALUES) || has_flag(CNT_SEQ_EXPR) @@ -742,7 +742,6 @@ int ObRawExpr::is_const_inherit_expr(bool &is_const_inherit, || T_FUN_SYS_SLEEP == type_ || T_OP_PRIOR == type_ || T_OP_ASSIGN == type_ - || T_OP_GET_USER_VAR == type_ || T_FUN_NORMAL_UDF == type_ || T_FUN_SYS_REMOVE_CONST == type_ || T_FUN_SYS_WRAPPER_INNER == type_ diff --git a/src/sql/resolver/expr/ob_raw_expr_info_extractor.cpp b/src/sql/resolver/expr/ob_raw_expr_info_extractor.cpp index c197b8e61e..6ff94d4400 100644 --- a/src/sql/resolver/expr/ob_raw_expr_info_extractor.cpp +++ b/src/sql/resolver/expr/ob_raw_expr_info_extractor.cpp @@ -533,9 +533,9 @@ int ObRawExprInfoExtractor::visit(ObSysFunRawExpr &expr) LOG_WARN("failed to add flag IS_STATE_FUNC", K(ret)); } } - if (OB_SUCC(ret) && T_OP_GET_USER_VAR == expr.get_expr_type()) { - if (OB_FAIL(expr.add_flag(IS_USER_VARIABLE))) { - LOG_WARN("failed to add flag IS_USER_VARIABLE", K(ret)); + if (OB_SUCC(ret) && T_OP_GET_USER_VAR == expr.get_expr_type() && !expr.is_const_expr()) { + if (OB_FAIL(expr.add_flag(IS_DYNAMIC_USER_VARIABLE))) { + LOG_WARN("failed to add flag IS_DYNAMIC_USER_VARIABLE", K(ret)); } } diff --git a/src/sql/resolver/expr/ob_raw_expr_resolver_impl.cpp b/src/sql/resolver/expr/ob_raw_expr_resolver_impl.cpp index e14707034d..9aba0af1d0 100644 --- a/src/sql/resolver/expr/ob_raw_expr_resolver_impl.cpp +++ b/src/sql/resolver/expr/ob_raw_expr_resolver_impl.cpp @@ -6180,6 +6180,19 @@ int ObRawExprResolverImpl::resolve_udf_node(const ParseNode *node, ObUDFInfo &ud } } } + if (OB_SUCC(ret)) { + if (ctx_.query_ctx_ != NULL) { + ctx_.query_ctx_->has_udf_ = true; + for (int64_t i = 0; OB_SUCC(ret) && i < ctx_.query_ctx_->all_user_variable_.count(); ++i) { + if (OB_ISNULL(ctx_.query_ctx_->all_user_variable_.at(i))) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("get null user var expr", K(ret)); + } else { + ctx_.query_ctx_->all_user_variable_.at(i)->set_query_has_udf(true); + } + } + } + } if (OB_SUCC(ret)) { func_expr->set_func_name(udf_info.udf_name_); udf_info.ref_expr_ = func_expr; diff --git a/src/sql/rewrite/ob_predicate_deduce.h b/src/sql/rewrite/ob_predicate_deduce.h index eadb688145..42e269fc29 100644 --- a/src/sql/rewrite/ob_predicate_deduce.h +++ b/src/sql/rewrite/ob_predicate_deduce.h @@ -75,7 +75,7 @@ public: expr.has_flag(CNT_ROWNUM) || expr.has_flag(CNT_SEQ_EXPR) || expr.has_flag(CNT_STATE_FUNC) || - expr.has_flag(CNT_USER_VARIABLE); + expr.has_flag(CNT_DYNAMIC_USER_VARIABLE); } private: diff --git a/src/sql/rewrite/ob_transform_dblink.cpp b/src/sql/rewrite/ob_transform_dblink.cpp index 1005a71242..794d9f8883 100644 --- a/src/sql/rewrite/ob_transform_dblink.cpp +++ b/src/sql/rewrite/ob_transform_dblink.cpp @@ -486,11 +486,12 @@ int ObTransformDBlink::check_link_expr_valid(ObRawExpr *expr, bool &is_valid) LOG_WARN("unexpected null expr", K(ret)); } else if (expr->has_flag(CNT_PL_UDF) || expr->has_flag(CNT_SO_UDF) || - expr->has_flag(CNT_USER_VARIABLE)) { + expr->has_flag(CNT_DYNAMIC_USER_VARIABLE)) { // special flag is invalid } else if (T_FUN_APPROX_COUNT_DISTINCT_SYNOPSIS == expr->get_expr_type() || T_FUN_APPROX_COUNT_DISTINCT_SYNOPSIS_MERGE == expr->get_expr_type() || - T_FUN_SYS_ESTIMATE_NDV == expr->get_expr_type()) { + T_FUN_SYS_ESTIMATE_NDV == expr->get_expr_type() || + T_OP_GET_USER_VAR == expr->get_expr_type()) { // special function is invalid } else if (expr->get_result_type().is_ext()) { // special type is invalid diff --git a/src/sql/rewrite/ob_transform_pre_process.cpp b/src/sql/rewrite/ob_transform_pre_process.cpp index 28950af440..75751e46c2 100644 --- a/src/sql/rewrite/ob_transform_pre_process.cpp +++ b/src/sql/rewrite/ob_transform_pre_process.cpp @@ -9341,7 +9341,7 @@ int ObTransformPreProcess::expand_for_last_insert_id(ObDMLStmt &stmt, ObIArrayhas_flag(CNT_SUB_QUERY) && !expr->has_flag(CNT_ROWNUM) && !expr->has_flag(CNT_SEQ_EXPR) && - !expr->has_flag(CNT_USER_VARIABLE)) { + !expr->has_flag(CNT_DYNAMIC_USER_VARIABLE)) { bool removable = false; ObRawExpr *left = expr->get_param_expr(0); ObRawExpr *right = expr->get_param_expr(1); diff --git a/src/sql/rewrite/ob_transform_predicate_move_around.cpp b/src/sql/rewrite/ob_transform_predicate_move_around.cpp index 49a4b7f210..58a3f02c5a 100644 --- a/src/sql/rewrite/ob_transform_predicate_move_around.cpp +++ b/src/sql/rewrite/ob_transform_predicate_move_around.cpp @@ -2901,7 +2901,7 @@ int ObTransformPredicateMoveAround::choose_pushdown_preds( ret = OB_ERR_UNEXPECTED; LOG_WARN("predicate is null", K(ret), K(expr)); } else if (expr->has_flag(CNT_SUB_QUERY) || - expr->has_flag(CNT_USER_VARIABLE)) { + expr->has_flag(CNT_DYNAMIC_USER_VARIABLE)) { // push down a exec param may not a good idea ret = invalid_preds.push_back(expr); } else { diff --git a/src/sql/rewrite/ob_transform_simplify_expr.cpp b/src/sql/rewrite/ob_transform_simplify_expr.cpp index fd3f93e38f..a3866917ba 100644 --- a/src/sql/rewrite/ob_transform_simplify_expr.cpp +++ b/src/sql/rewrite/ob_transform_simplify_expr.cpp @@ -2310,6 +2310,7 @@ int ObTransformSimplifyExpr::remove_ora_decode(ObDMLStmt *stmt, bool &trans_happ ObSEArray old_exprs; ObSEArray new_exprs; ObSEArray relation_exprs; + trans_happened = false; if (OB_ISNULL(stmt)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("stmt is NULL", K(stmt)); diff --git a/src/sql/rewrite/ob_transform_utils.cpp b/src/sql/rewrite/ob_transform_utils.cpp index 17dd6ec6ad..5d715cbb79 100644 --- a/src/sql/rewrite/ob_transform_utils.cpp +++ b/src/sql/rewrite/ob_transform_utils.cpp @@ -12509,7 +12509,7 @@ int ObTransformUtils::check_expr_valid_for_stmt_merge(ObIArray &sele expr->has_generalized_column()) { // do nothing } else if (expr->has_flag(CNT_STATE_FUNC) || - expr->has_flag(CNT_USER_VARIABLE) || + expr->has_flag(CNT_DYNAMIC_USER_VARIABLE) || expr->has_flag(CNT_ALIAS) || expr->has_flag(CNT_VALUES) || expr->has_flag(CNT_SEQ_EXPR) || @@ -13026,6 +13026,12 @@ int ObTransformUtils::convert_aggr_expr(ObTransformerCtx *ctx, aggr_expr->get_expr_type() == T_FUN_MIN || aggr_expr->get_expr_type() == T_FUN_SUM) { output_expr = aggr_expr->get_param_expr(0); + if (OB_FAIL(add_cast_for_replace_if_need(*ctx->expr_factory_, + aggr_expr, + output_expr, + ctx->session_info_))) { + LOG_WARN("failed to add cast expr", K(ret)); + } } else if (aggr_expr->get_expr_type() != T_FUN_COUNT) { ret = OB_ERR_UNEXPECTED; LOG_WARN("invalid aggregation type", K(ret), K(aggr_expr->get_expr_type())); diff --git a/unittest/sql/resolver/expr/test_raw_expr_resolver.result b/unittest/sql/resolver/expr/test_raw_expr_resolver.result index b4471ddcfc..b6807ef929 100644 --- a/unittest/sql/resolver/expr/test_raw_expr_resolver.result +++ b/unittest/sql/resolver/expr/test_raw_expr_resolver.result @@ -2413,10 +2413,9 @@ }, "expr_info": [ "IS_FUNC", - "IS_USER_VARIABLE", + "IS_CONST_EXPR", "CNT_CONST", - "CNT_FUNC", - "CNT_USER_VARIABLE" + "CNT_FUNC" ], "rel_id": [ ],