/** * Copyright (c) 2021 OceanBase * OceanBase CE is licensed under Mulan PubL v2. * You can use this software according to the terms and conditions of the Mulan PubL v2. * You may obtain a copy of Mulan PubL v2 at: * http://license.coscl.org.cn/MulanPubL-2.0 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. * See the Mulan PubL v2 for more details. */ #ifndef _OB_RAW_EXPR_UTIL_H #define _OB_RAW_EXPR_UTIL_H 1 #include "sql/resolver/expr/ob_raw_expr.h" #include "common/row/ob_row_desc.h" #include "sql/parser/parse_node.h" #include "lib/hash/ob_placement_hashmap.h" #include "share/schema/ob_column_schema.h" #include "share/system_variable/ob_system_variable.h" #include "share/schema/ob_schema_getter_guard.h" #include "sql/resolver/ob_resolver_utils.h" #include "lib/hash/ob_hashset.h" #include "lib/allocator/ob_allocator.h" #include "share/schema/ob_trigger_info.h" namespace oceanbase { namespace sql { class ObBasicSessionInfo; class ObStmt; class ObDMLStmt; struct ColumnItem; struct ObGroupbyExpr; struct ObResolverUtils; struct ObSelectIntoItem; class ObDMLResolver; class ObSequenceNamespaceChecker; enum JsonArrayaggParserOffset { PARSE_JSON_ARRAYAGG_DISTINCT, PARSE_JSON_ARRAYAGG_EXPR, PARSE_JSON_ARRAYAGG_FORMAT, PARSE_JSON_ARRAYAGG_ORDER, PARSE_JSON_ARRAYAGG_ON_NULL, PARSE_JSON_ARRAYAGG_RETURNING, PARSE_JSON_ARRAYAGG_STRICT, PARSE_JSON_ARRAYAGG_MAX_IDX }; enum JsonObjectaggParserOffset { PARSE_JSON_OBJECTAGG_KEY, PARSE_JSON_OBJECTAGG_VALUE, PARSE_JSON_OBJECTAGG_FORMAT, PARSE_JSON_OBJECTAGG_ON_NULL, PARSE_JSON_OBJECTAGG_RETURNING, PARSE_JSON_OBJECTAGG_STRICT, PARSE_JSON_OBJECTAGG_UNIQUE_KEYS, PARSE_JSON_OBJECTAGG_MAX_IDX }; enum JsonAraayaggDeduceOffset { DEDUCE_JSON_ARRAYAGG_EXPR, DEDUCE_JSON_ARRAYAGG_FORMAT, DEDUCE_JSON_ARRAYAGG_ON_NULL, DEDUCE_JSON_ARRAYAGG_RETURNING, DEDUCE_JSON_ARRAYAGG_STRICT, DEDUCE_JSON_ARRAYAGG_MAX_IDX }; template class UniqueSetWrapAllocer { public: UniqueSetWrapAllocer() : allocator_(NULL) {} UniqueSetWrapAllocer(ObIAllocator &alloc) : allocator_(&alloc) {} T *alloc() { T *ret = static_cast(allocator_->alloc(sizeof(T))); if (NULL != ret) { new(ret) T(); } return ret; } void free(T *data) { if (NULL == data || NULL == allocator_) { SQL_LOG_RET(WARN, common::OB_INVALID_ARGUMENT, "invalid param null pointer", KP(data), KP(allocator_)); } else { data->~T(); allocator_->free(data); } } void inc_ref() {} void dec_ref() {} private: ObIAllocator *allocator_; }; class ObRawExprUniqueSet { public: ObRawExprUniqueSet(bool need_unique) : need_unique_(need_unique) {} virtual ~ObRawExprUniqueSet() {} int64_t count() const { return expr_array_.count(); } template int append(RawExprType *expr); template int append(const ObIArray &exprs); const ObIArray &get_expr_array() const { return expr_array_; } ; void reuse() { expr_array_.reuse(); } int flatten_and_add_raw_exprs(const ObIArray &raw_exprs, std::function filter, bool need_flatten_gen_col = true); int flatten_and_add_raw_exprs(const ObRawExprUniqueSet &raw_exprs, bool need_flatten_gen_col = true, std::function filter = [](ObRawExpr *e){ return NULL != e;}); int flatten_temp_expr(ObRawExpr *raw_expr); private: int flatten_and_add_raw_exprs(ObRawExpr *raw_expr, bool need_flatten_gen_col = true, std::function filter = [](ObRawExpr *e){ return NULL != e;}); DISALLOW_COPY_AND_ASSIGN(ObRawExprUniqueSet); private: ObSEArray expr_array_; bool need_unique_; }; template int ObRawExprUniqueSet::append(RawExprType *expr) { int ret = OB_SUCCESS; if (!need_unique_) { if (OB_FAIL(expr_array_.push_back(expr))) { SQL_LOG(WARN, "fail to append expr", K(ret)); } } else { if (expr->has_flag(IS_MARKED)) { // do nothing } else { if (OB_FAIL(expr_array_.push_back(expr))) { SQL_LOG(WARN, "fail to append expr", K(ret)); } else if (OB_FAIL(expr->add_flag(IS_MARKED))) { SQL_LOG(WARN, "fail to add flag", K(ret)); } } } return ret; } template int ObRawExprUniqueSet::append(const ObIArray &exprs) { int ret = OB_SUCCESS; for (int64_t i = 0; OB_SUCC(ret) && i < exprs.count(); i++) { if (OB_FAIL(append(exprs.at(i)))) { SQL_LOG(WARN, "fail to append expr", K(ret)); } } return ret; } class ObRawExprUtils { public: /** * make expression from string * * @param expr_str [in] expression string * @param buf_len [in] expression string length * @param allocator [in] allocator used by parser * @param resolve_ctx [in] expression resolver context * @param expr [out] resolved expression * @param columns [out] columns in the expr * @param sys_vars [out] system variables in the expr * @param sub_query_info [out] subqueries in the expr * * @return */ static int make_raw_expr_from_str(const char *expr_str, const int64_t buf_len, ObExprResolveContext &resolve_ctx, ObRawExpr *&expr, common::ObIArray &columns, common::ObIArray &sys_vars, common::ObIArray *sub_query_info, common::ObIArray &aggr_exprs, common::ObIArray &win_exprs, common::ObIArray &udf_info); static int make_raw_expr_from_str(const common::ObString &expr_str, ObExprResolveContext &resolve_ctx, ObRawExpr *&expr, common::ObIArray &column, common::ObIArray &sys_vars, common::ObIArray *sub_query_info, common::ObIArray &aggr_exprs, common::ObIArray &win_exprs, common::ObIArray &udf_info); static int parse_default_expr_from_str(const common::ObString &expr_str, ObCharsets4Parser expr_str_cs_type, common::ObIAllocator &allocator, const ParseNode *&node); static int parse_expr_list_node_from_str(const common::ObString &expr_str, ObCharsets4Parser expr_str_cs_type, common::ObIAllocator &allocator, const ParseNode *&node, const ObSQLMode &sql_mode); static int parse_expr_node_from_str(const common::ObString &expr_str, ObCharsets4Parser expr_str_cs_type, common::ObIAllocator &allocator, const ParseNode *&node, const ObSQLMode &sql_mode = 0); static int parse_bool_expr_node_from_str(const common::ObString &expr_str, common::ObIAllocator &allocator, const ParseNode *&node); static int build_check_constraint_expr(ObRawExprFactory &expr_factory, const ObSQLSessionInfo &session_info, const ParseNode &node, ObRawExpr *&expr, common::ObIArray &columns); static int check_deterministic(const ObRawExpr *expr, common::ObIAllocator &allocator, const ObResolverUtils::PureFunctionCheckStatus check_status = ObResolverUtils::DISABLE_CHECK); static int check_deterministic_single(const ObRawExpr *expr, const ObResolverUtils::PureFunctionCheckStatus check_status = ObResolverUtils::DISABLE_CHECK); static int build_generated_column_expr(ObRawExprFactory &expr_factory, const ObSQLSessionInfo &session_info, const ParseNode &node, ObRawExpr *&expr, common::ObIArray &columns, const ObTableSchema* new_table_schema, const bool sequence_allowed, ObDMLResolver *dml_resolver, const ObSchemaChecker *schema_checker = NULL, const ObResolverUtils::PureFunctionCheckStatus check_status = ObResolverUtils::DISABLE_CHECK, const bool need_check_simple_column = true, bool use_def_collation = false, ObCollationType connection_collation = CS_TYPE_INVALID); static int build_generated_column_expr(const common::ObString &expr_str, ObRawExprFactory &expr_factory, const ObSQLSessionInfo &session_info, ObRawExpr *&expr, common::ObIArray &columns, const ObTableSchema* new_table_schema, const bool sequence_allowed, ObDMLResolver *dml_resolver, const ObSchemaChecker *schema_checker = NULL, const ObResolverUtils::PureFunctionCheckStatus check_status = ObResolverUtils::DISABLE_CHECK, const bool need_check_simple_column = true); static int build_generated_column_expr(const common::ObString &expr_str, ObRawExprFactory &expr_factory, const ObSQLSessionInfo &session_info, ObSQLMode sql_mode, ObCollationType connection_collation, ObRawExpr *&expr, common::ObIArray &columns, const ObTableSchema* new_table_schema, const bool sequence_allowed, ObDMLResolver *dml_resolver, const ObSchemaChecker *schema_checker = NULL, const ObResolverUtils::PureFunctionCheckStatus check_status = ObResolverUtils::DISABLE_CHECK, const bool need_check_simple_column = true); static int build_generated_column_expr(const obrpc::ObCreateIndexArg *arg, const common::ObString &expr_str, ObRawExprFactory &expr_factory, const ObSQLSessionInfo &session_info, const share::schema::ObTableSchema &table_schema, ObRawExpr *&expr, const ObSchemaChecker *schema_checker = NULL, const ObResolverUtils::PureFunctionCheckStatus check_status = ObResolverUtils::DISABLE_CHECK, ObIArray *resolved_cols = NULL); static int build_generated_column_expr(const common::ObString &expr_str, ObRawExprFactory &expr_factory, const ObSQLSessionInfo &session_info, uint64_t table_id, const share::schema::ObTableSchema &table_schema, const share::schema::ObColumnSchemaV2 &gen_col_schema, ObRawExpr *&expr, const bool sequence_allowed, ObDMLResolver *dml_resolver, const ObSchemaChecker *schema_checker = NULL, const ObResolverUtils::PureFunctionCheckStatus check_status = ObResolverUtils::DISABLE_CHECK); static int check_generated_column_expr_str(const common::ObString &expr_str, const ObSQLSessionInfo &session_info, const share::schema::ObTableSchema &table_schema); static int build_seq_nextval_expr(ObRawExpr *&expr, const ObSQLSessionInfo *session_info, ObRawExprFactory *expr_factory, const ObQualifiedName &q_name, uint64_t seq_id, ObDMLStmt *stmt); // build oracle sequence_object.currval, sequence_object.nextval expr static int build_seq_nextval_expr(ObRawExpr *&expr, const ObSQLSessionInfo *session_info, ObRawExprFactory *expr_factory, const ObString &database_name, const ObString &tbl_name, const ObString &col_name, uint64_t seq_id, ObDMLStmt *stmt); static int resolve_sequence_object(const ObQualifiedName &q_name, ObDMLResolver *dml_resolver, const ObSQLSessionInfo *session_info, ObRawExprFactory *expr_factory, ObSequenceNamespaceChecker &sequence_namespace_checker, ObRawExpr *&real_ref_expr, bool is_generated_column); static int build_pad_expr_recursively(ObRawExprFactory &expr_factory, const ObSQLSessionInfo &session, const share::schema::ObTableSchema &table_schema, const share::schema::ObColumnSchemaV2 &gen_col_schema, ObRawExpr *&expr, const ObLocalSessionVar *local_vars = NULL, int64_t local_var_id = OB_INVALID_INDEX_INT64); static int build_rls_predicate_expr(const common::ObString &expr_str, ObRawExprFactory &expr_factory, const ObSQLSessionInfo &session_info, common::ObIArray &columns, ObRawExpr *&expr); static int build_raw_expr(ObRawExprFactory &expr_factory, const ObSQLSessionInfo &session_info, const ParseNode &node, ObRawExpr *&expr, common::ObIArray &columns, common::ObIArray &sys_vars, common::ObIArray &aggr_exprs, common::ObIArray &win_exprs, common::ObIArray &sub_query_info, common::ObIArray &udf_info, common::ObIArray &op_exprs, bool is_prepare_protocol = false); static int build_raw_expr(ObRawExprFactory &expr_factory, const ObSQLSessionInfo &session_info, ObSchemaChecker *schema_checker, pl::ObPLBlockNS *ns, ObStmtScope current_scope, ObStmt *stmt, const ParamStore *param_list, ExternalParams *external_param_info, const ParseNode &node, ObRawExpr *&expr, common::ObIArray &columns, common::ObIArray &sys_vars, common::ObIArray &aggr_exprs, common::ObIArray &win_exprs, common::ObIArray &sub_query_info, common::ObIArray &udf_info, common::ObIArray &op_exprs, bool is_prepare_protocol/*= false*/, TgTimingEvent tg_timing_event = TgTimingEvent::TG_TIMING_EVENT_INVALID, bool use_def_collation = false, ObCollationType def_collation = CS_TYPE_INVALID); static bool is_same_raw_expr(const ObRawExpr *src, const ObRawExpr *dst); /// replace all `from' to `to' in the raw_expr static int replace_all_ref_column(ObRawExpr *&raw_expr, const common::ObIArray &exprs, int64_t& offset); // if %expr_factory is not NULL, will deep copy %to expr. default behavior is shallow copy // if except_exprs is not NULL, will skip the expr in except_exprs static int replace_ref_column(ObRawExpr *&raw_expr, ObRawExpr *from, ObRawExpr *to, const ObIArray *except_exprs = NULL); static int replace_ref_column(ObRawExpr *&raw_expr, ObIArray &from, ObIArray &to, const ObIArray *except_exprs = NULL); static int replace_level_column(ObRawExpr *&raw_expr, ObRawExpr *to, bool &replaced); static int replace_ref_column(common::ObIArray &exprs, ObRawExpr *from, ObRawExpr *to, const ObIArray *except_exprs = NULL); static int replace_ref_column(common::ObIArray &exprs, ObIArray &from, ObIArray &to, const ObIArray *except_exprs = NULL); static int contain_virtual_generated_column(ObRawExpr *&expr, bool &is_contain_vir_gen_column); static bool is_all_column_exprs(const common::ObIArray &exprs); static int extract_set_op_exprs(const ObRawExpr *raw_expr, common::ObIArray &set_op_exprs); static int extract_var_assign_exprs(const ObRawExpr *raw_expr, common::ObIArray &assign_exprs); static int extract_set_op_exprs(const ObIArray &exprs, common::ObIArray &set_op_exprs); /// extract column exprs from the raw expr static int extract_column_exprs(const ObRawExpr *raw_expr, common::ObIArray &column_exprs, bool need_pseudo_column = false); static int extract_column_exprs(const common::ObIArray &exprs, common::ObIArray &column_exprs, bool need_pseudo_column = false); static int extract_column_exprs(const ObRawExpr *raw_expr, int64_t table_id, common::ObIArray &column_exprs); static int extract_column_exprs(const common::ObIArray &exprs, int64_t table_id, common::ObIArray &column_exprs); // no need to add cast. static int extract_column_exprs(const ObRawExpr *expr, ObIArray &column_exprs); static int extract_column_exprs(ObRawExpr* expr, ObRelIds &rel_ids, ObIArray &column_exprs); static int extract_column_exprs(ObIArray &exprs, ObRelIds &rel_ids, ObIArray &column_exprs); static int extract_contain_exprs(ObRawExpr *raw_expr, const common::ObIArray &src_exprs, common::ObIArray &contain_exprs); static int mark_column_explicited_reference(ObRawExpr &expr); static int extract_column_ids(const ObIArray &exprs, common::ObIArray &column_ids); static int extract_column_ids(const ObRawExpr *raw_expr, common::ObIArray &column_ids); static int extract_table_ids(const ObRawExpr *raw_expr, common::ObIArray &table_ids); static int extract_table_ids_from_exprs(const common::ObIArray &exprs, common::ObIArray &table_ids); static int extract_param_idxs(const ObRawExpr *expr, common::ObIArray ¶m_idxs); static int extract_col_aggr_exprs(ObIArray &exprs, ObIArray &column_or_aggr_exprs); static int extract_col_aggr_exprs(ObRawExpr* expr, ObIArray &column_or_aggr_exprs); static int extract_col_aggr_winfunc_exprs(ObIArray &exprs, ObIArray &column_aggr_winfunc_exprs); static int extract_col_aggr_winfunc_exprs(ObRawExpr* expr, ObIArray &column_aggr_winfunc_exprs); static int find_alias_expr(ObRawExpr *expr, ObAliasRefRawExpr *&alias_expr); static int find_flag(const ObRawExpr *expr, ObExprInfoFlag flag, bool &is_found); static int find_flag_rec(const ObRawExpr *expr, ObExprInfoFlag flag, bool &is_found); // try add cast expr above %expr , set %dst_expr to &expr if no cast added. static int try_add_cast_expr_above(ObRawExprFactory *expr_factory, const ObSQLSessionInfo *session, ObRawExpr &src_expr, const ObExprResType &dst_type, ObRawExpr *&new_expr); static int try_add_cast_expr_above(ObRawExprFactory *expr_factory, const ObSQLSessionInfo *session, ObRawExpr &expr, const ObExprResType &dst_type, const ObCastMode &cm, ObRawExpr *&new_expr, const ObLocalSessionVar *local_vars = NULL, int64_t local_var_id = OB_INVALID_INDEX_INT64); static int implict_cast_pl_udt_to_sql_udt(ObRawExprFactory *expr_factory, const ObSQLSessionInfo *session, ObRawExpr* &real_ref_expr); static int implict_cast_sql_udt_to_pl_udt(ObRawExprFactory *expr_factory, const ObSQLSessionInfo *session, ObRawExpr* &real_ref_expr); // new engine: may create more cast exprs to handle non-system-collation string. // e.g.: utf16->number: utf16->utf8->number (two cast expr) // utf8_bin->number: utf8->number (just one cat expr) // if %use_def_cm is not true, %cm will be set as cast mode for cast exprs. // NOTE: IS_INNER_ADDED_EXPR flag will be set. static int create_cast_expr(ObRawExprFactory &expr_factory, ObRawExpr *src_expr, const ObExprResType &dst_type, ObSysFunRawExpr *&func_expr, const ObSQLSessionInfo *session_info, bool use_def_cm = true, ObCastMode cm = CM_NONE, const ObLocalSessionVar *local_vars = NULL, int64_t local_var_id = OB_INVALID_INDEX_INT64); static void need_extra_cast(const ObExprResType &src_type, const ObExprResType &dst_type, bool &need_extra_cast_for_src_type, bool &need_extra_cast_for_dst_type); static int setup_extra_cast_utf8_type(const ObExprResType &type, ObExprResType &utf8_type); static int erase_inner_added_exprs(ObRawExpr *src_expr, ObRawExpr *&out_expr); static int erase_inner_cast_exprs(ObRawExpr *src_expr, ObRawExpr *&out_expr); // erase implicit cast which added for operand casting. static int erase_operand_implicit_cast(ObRawExpr *src, ObRawExpr *&out); static const ObRawExpr *skip_inner_added_expr(const ObRawExpr *expr); static ObRawExpr *skip_implicit_cast(ObRawExpr *e); static ObRawExpr *skip_inner_added_expr(ObRawExpr *expr); static const ObColumnRefRawExpr *get_column_ref_expr_recursively(const ObRawExpr *expr); static ObRawExpr *get_sql_udt_type_expr_recursively(ObRawExpr *expr); static int create_to_type_expr(ObRawExprFactory &expr_factory, ObRawExpr *src_expr, const common::ObObjType &dst_type, ObSysFunRawExpr *&to_type, ObSQLSessionInfo *session_info); static int create_substr_expr(ObRawExprFactory &expr_factory, ObSQLSessionInfo *session_info, ObRawExpr *first_expr, ObRawExpr *second_expr, ObRawExpr *third_expr, ObSysFunRawExpr *&out_expr); static int create_instr_expr(ObRawExprFactory &expr_factory, ObSQLSessionInfo *session_info, ObRawExpr *first_expr, ObRawExpr *second_expr, ObRawExpr *third_expr, ObRawExpr *fourth_expr, ObSysFunRawExpr *&out_expr); static int create_concat_expr(ObRawExprFactory &expr_factory, ObSQLSessionInfo *session_info, ObRawExpr *first_expr, ObRawExpr *second_expr, ObOpRawExpr *&out_expr); static int create_prefix_pattern_expr(ObRawExprFactory &expr_factory, ObSQLSessionInfo *session_info, ObRawExpr *first_expr, ObRawExpr *second_expr, ObRawExpr *third_expr, ObSysFunRawExpr *&out_expr); static int create_type_to_str_expr(ObRawExprFactory &expr_factory, ObRawExpr *src_expr, ObSysFunRawExpr *&out_expr, ObSQLSessionInfo *session_info, bool is_type_to_str, ObObjType dst_type = ObMaxType); static int wrap_enum_set_for_stmt(ObRawExprFactory &expr_factory, ObSelectStmt *stmt, ObSQLSessionInfo *session_info); static int get_exec_param_expr(ObRawExprFactory &expr_factory, ObQueryRefRawExpr *query_ref, ObRawExpr *correlated_expr, ObRawExpr *&exec_param); static int create_new_exec_param(ObQueryCtx *query_ctx, ObRawExprFactory &expr_factory, ObRawExpr *&expr, bool is_onetime = false); static int create_new_exec_param(ObRawExprFactory &expr_factory, ObRawExpr *ref_expr, ObExecParamRawExpr *&exec_param, bool is_onetime = false); static int create_param_expr(ObRawExprFactory &expr_factory, int64_t param_idx, ObRawExpr *&expr); static int build_trim_expr(const share::schema::ObColumnSchemaV2 *column_schema, ObRawExprFactory &expr_factory, const ObSQLSessionInfo *session_info, ObRawExpr *&expr, const ObLocalSessionVar *local_vars = NULL, int64_t local_var_id = OB_INVALID_INDEX_INT64); static bool need_column_conv(const ColumnItem &column, ObRawExpr &expr); static int build_pad_expr(ObRawExprFactory &expr_factory, bool is_char, const share::schema::ObColumnSchemaV2 *column_schema, ObRawExpr *&expr, const sql::ObSQLSessionInfo *session_info, const ObLocalSessionVar *local_vars = NULL, int64_t local_var_id = OB_INVALID_INDEX_INT64); static bool need_column_conv(const ObExprResType &expected_type, const ObRawExpr &expr); // 此方法请谨慎使用,会丢失enum类型的 enum_set_values static int build_column_conv_expr(ObRawExprFactory &expr_factory, const share::schema::ObColumnSchemaV2 *column_schema, ObRawExpr *&expr, const sql::ObSQLSessionInfo *session_info, const ObLocalSessionVar *local_vars = NULL); static int build_column_conv_expr(ObRawExprFactory &expr_factory, common::ObIAllocator &allocator, const ObColumnRefRawExpr &col_expr, ObRawExpr *&expr, const ObSQLSessionInfo *session_info, bool is_generated_column = false, const ObLocalSessionVar *local_vars = NULL, int64_t local_var_id = OB_INVALID_INDEX_INT64); static int build_column_conv_expr(const ObSQLSessionInfo *session_info, ObRawExprFactory &expr_factory, const common::ObObjType &type, const common::ObCollationType &collation, const int64_t &accuracy, const bool &is_nullable, const common::ObString *column_conv_info, const common::ObIArray *type_infos, ObRawExpr *&expr, bool is_in_pl = false, bool is_generated_column = false, const ObLocalSessionVar *local_vars = NULL, int64_t local_var_id = OB_INVALID_INDEX_INT64); static int build_var_int_expr(ObRawExprFactory &expr_factory, ObConstRawExpr *&expr); static int build_default_expr(ObRawExprFactory &expr_factory, const common::ObObjType &type, const common::ObCollationType &collation, const int64_t &accuracy, ObRawExpr *&expr); static int build_const_int_expr(ObRawExprFactory &expr_factory, common::ObObjType type, int64_t int_value, ObConstRawExpr *&expr); static int build_const_uint_expr(ObRawExprFactory &expr_factory, common::ObObjType type, uint64_t uint_value, ObConstRawExpr *&expr); static int build_const_float_expr(ObRawExprFactory &expr_factory, common::ObObjType type, float value, ObConstRawExpr *&expr); static int build_const_double_expr(ObRawExprFactory &expr_factory, common::ObObjType type, double value, ObConstRawExpr *&expr); static int build_const_datetime_expr(ObRawExprFactory &expr_factory, int64_t int_value, ObConstRawExpr *&expr); static int build_const_date_expr(ObRawExprFactory &expr_factory, int64_t int_value, ObConstRawExpr *&expr); static int build_const_ym_expr(ObRawExprFactory &expr_factory, common::ObObjType type, const ObObj &obj, ObConstRawExpr *&expr); static int build_const_ds_expr(ObRawExprFactory &expr_factory, common::ObObjType type, ObIntervalDSValue &ds_value, ObConstRawExpr *&expr); static int build_const_timestampnano_expr(ObRawExprFactory &expr_factory, ObObjType type, ObOTimestampData &value, ObConstRawExpr *&expr); static int build_const_number_expr(ObRawExprFactory &expr_factory, ObObjType type, number::ObNumber value, ObConstRawExpr *&expr); static int build_const_obj_expr(ObRawExprFactory &expr_factory, const ObObj &obj, ObConstRawExpr *&expr); static int build_mul_expr(ObRawExprFactory &raw_expr_factory, ObRawExpr *expr1, ObRawExpr *expr2, ObOpRawExpr *&expr_out); static int build_div_expr(ObRawExprFactory &raw_expr_factory, ObRawExpr *expr1, ObRawExpr *expr2, ObOpRawExpr *&expr_out); static int build_add_all_expr(ObRawExprFactory &raw_expr_factory, ObRawExpr *expr1, ObRawExpr *expr2, ObRawExpr *expr3, ObRawExpr *expr4, ObOpRawExpr *&sum_expr); static int build_second_expr_from_interval_ds(ObRawExprFactory &raw_expr_factory, ObRawExpr *interval_ds_expr, ObOpRawExpr *&second_expr); static int build_month_expr_from_interval_ym(ObRawExprFactory &raw_expr_factory, ObRawExpr *interval_ym_expr, ObOpRawExpr *&month_expr); static int build_datepart_to_second_expr(ObRawExprFactory &raw_expr_factory, ObRawExpr *interval_ds_expr, int datapart, int n, ObRawExpr *&expr_out); static int build_interval_ym_diff_exprs(ObRawExprFactory &raw_expr_factory, ObObj &const_val, const ObObj &transition_val, const ObObj &interval_val, ObRawExpr *&diff_1_out, ObRawExpr *&diff_2_out, ObConstRawExpr *&transition_expr, ObConstRawExpr *&interval_expr); static int build_interval_ds_diff_exprs(ObRawExprFactory &raw_expr_factory, ObObj &const_val, const ObObj &transition_val, const ObObj &interval_val, ObRawExpr *&diff_1_out, ObRawExpr *&diff_2_out, ObConstRawExpr *&transition_expr, ObConstRawExpr *&interval_expr); static int build_high_bound_raw_expr(ObRawExprFactory &raw_expr_factory, ObSQLSessionInfo* session, ObObj &const_val, const ObObj &transition_val, const ObObj &interval_val, ObRawExpr *&result_expr_out, ObRawExpr *&n_part_expr); static int build_common_diff_exprs(ObRawExprFactory &raw_expr_factory, ObObj &const_val, const ObObj &transition_val, const ObObj &interval_val, ObRawExpr *&diff_1_out, ObRawExpr *&diff_2_out, ObConstRawExpr *&transition_expr, ObConstRawExpr *&interval_expr); static int build_sign_expr(ObRawExprFactory &expr_factory, ObRawExpr *param, ObRawExpr *&sign_expr); static int build_less_than_expr(ObRawExprFactory &expr_factory, ObRawExpr *left, ObRawExpr *right, ObOpRawExpr *&less_than_expr); static int build_variable_expr(ObRawExprFactory &expr_factory, const ObExprResType &result_type, ObVarRawExpr *&expr); static int build_op_pseudo_column_expr(ObRawExprFactory &expr_factory, const ObItemType expr_type, const char *expr_name, const ObExprResType &res_type, ObOpPseudoColumnRawExpr *&expr); static int build_const_bool_expr(ObRawExprFactory *expr_factory, ObRawExpr *&expr, bool b_value); static int build_const_string_expr(ObRawExprFactory &expr_factory, common::ObObjType type, const common::ObString &string_value, common::ObCollationType cs_type, ObConstRawExpr *&expr); static int build_null_expr(ObRawExprFactory &expr_factory, ObRawExpr *&expr); static int build_nvl_expr(ObRawExprFactory &expr_factory, const ColumnItem *column_item, ObRawExpr *&expr); static int build_nvl_expr(ObRawExprFactory &expr_factory, const ColumnItem *column_item, ObRawExpr *&expr1, ObRawExpr *&expr2); static int build_nvl_expr(ObRawExprFactory &expr_factory, ObRawExpr *param_expr1, ObRawExpr *param_expr2, ObRawExpr *&expr); static int build_lnnvl_expr(ObRawExprFactory &expr_factory, ObRawExpr *param_expr, ObRawExpr *&lnnvl_expr); static int build_equal_last_insert_id_expr(ObRawExprFactory &expr_factory, ObRawExpr *&expr, ObSQLSessionInfo *session); static int build_get_user_var(ObRawExprFactory &expr_factory, const common::ObString &var_name, ObRawExpr *&expr, const ObSQLSessionInfo *session_info = NULL, ObQueryCtx *query_ctx = NULL, common::ObIArray *user_var_exprs = NULL); static int build_get_sys_var(ObRawExprFactory &expr_factory, const common::ObString &var_name, share::ObSetVar::SetScopeType var_scope, ObRawExpr *&expr, const ObSQLSessionInfo *session_info = NULL); static int get_package_var_ids(ObRawExpr *expr, uint64_t &package_id, int64_t &var_idx); static int set_package_var_ids(ObRawExpr *expr, uint64_t package_id, int64_t var_idx); static int build_get_package_var(ObRawExprFactory &expr_factory, share::schema::ObSchemaGetterGuard &schema_guard, uint64_t package_id, int64_t var_idx, ObExprResType *result_type, ObRawExpr *&expr, const ObSQLSessionInfo *session_info); static int build_calc_part_id_expr(ObRawExprFactory &expr_factory, const ObSQLSessionInfo &session, uint64_t ref_table_id, share::schema::ObPartitionLevel part_level, ObRawExpr *part_expr, ObRawExpr *subpart_expr, ObRawExpr *&expr); static int build_calc_tablet_id_expr(ObRawExprFactory &expr_factory, const ObSQLSessionInfo &session, uint64_t ref_table_id, ObPartitionLevel part_level, ObRawExpr *part_expr, ObRawExpr *subpart_expr, ObRawExpr *&expr); static int build_calc_partition_tablet_id_expr(ObRawExprFactory &expr_factory, const ObSQLSessionInfo &session, uint64_t ref_table_id, ObPartitionLevel part_level, ObRawExpr *part_expr, ObRawExpr *subpart_expr, ObRawExpr *&expr); static int build_get_subprogram_var(ObRawExprFactory &expr_factory, uint64_t package_id, uint64_t routine_id, int64_t var_idx, const ObExprResType *result_type, ObRawExpr *&expr, const ObSQLSessionInfo *session_info); static int build_exists_expr(ObRawExprFactory &expr_factory, const ObSQLSessionInfo *session_info, ObItemType type, ObRawExpr *param_expr, ObRawExpr *&exists_expr); static int build_ora_decode_expr(ObRawExprFactory *expr_factory, const ObSQLSessionInfo &session_info, ObRawExpr *&expr, ObIArray ¶m_exprs); template static bool find_expr(const common::ObIArray &exprs, const ObRawExpr* expr); template static int64_t get_expr_idx(const common::ObIArray &exprs, const ObRawExpr* expr); static int create_equal_expr(ObRawExprFactory &expr_factory, const ObSQLSessionInfo *session_info, const ObRawExpr *val_ref, const ObRawExpr *col_ref, ObRawExpr *&expr); static int create_double_op_expr(ObRawExprFactory &expr_factory, const ObSQLSessionInfo *session_info, ObItemType expr_type, ObRawExpr *&add_expr, const ObRawExpr *left_expr, const ObRawExpr *right_expr); static int make_set_op_expr(ObRawExprFactory &expr_factory, int64_t idx, ObItemType set_op_type, const ObExprResType &res_type, ObSQLSessionInfo *session_info, ObRawExpr *&out_expr); static int merge_variables(const common::ObIArray &src_vars, common::ObIArray &dst_vars); static int get_item_count(const ObRawExpr *expr, int64_t &count); static int get_array_param_index(const ObRawExpr *expr, int64_t ¶m_index); static int build_column_expr(ObRawExprFactory &expr_factory, const share::schema::ObColumnSchemaV2 &column_schema, ObColumnRefRawExpr *&column_expr); static bool is_same_column_ref(const ObRawExpr *column_ref1, const ObRawExpr *column_ref2); static int build_alias_column_expr(ObRawExprFactory &expr_factory, ObRawExpr *ref_expr, int32_t alias_level, ObAliasRefRawExpr *&alias_expr); static int build_query_output_ref(ObRawExprFactory &expr_factory, ObQueryRefRawExpr *query_ref, int64_t project_index, ObAliasRefRawExpr *&alias_expr); static int init_column_expr(const share::schema::ObColumnSchemaV2 &column_schema, ObColumnRefRawExpr &column_expr); static ObCollationLevel get_column_collation_level(const common::ObObjType &type); /* 计算基本列的flag */ static uint32_t calc_column_result_flag(const share::schema::ObColumnSchemaV2 &column_schema); static int expr_is_order_consistent(const ObRawExpr *from, const ObRawExpr *to, bool &is_consistent); static int is_expr_comparable(const ObRawExpr *expr, bool &can_be); static int exprs_contain_subquery(const common::ObIArray &exprs, bool &cnt_subquery); static int function_alias(ObRawExprFactory &expr_factory, ObSysFunRawExpr *&expr); //extract from const value static int extract_int_value(const ObRawExpr *expr, int64_t &val); //used for enum set type static int need_wrap_to_string(common::ObObjType param_type, common::ObObjType calc_type, const bool is_same_type_need, bool &need_wrap); static bool contain_id(const common::ObIArray &ids, const uint64_t target); static int clear_exprs_flag(const common::ObIArray &exprs, ObExprInfoFlag flag); static int resolve_udf_common_info(const ObString &db_name, const ObString &package_name, int64_t udf_id, int64_t package_id, const ObIArray &subprogram_path, int64_t udf_schema_version, int64_t pkg_schema_version, bool is_deterministic, bool is_parallel_enable, bool is_pkg_body_udf, bool is_pl_agg, int64_t type_id, ObUDFInfo &udf_info); static int resolve_udf_param_types(const share::schema::ObIRoutineInfo* func_info, share::schema::ObSchemaGetterGuard &schema_guard, sql::ObSQLSessionInfo &session_info, common::ObIAllocator &allocator, common::ObMySQLProxy &sql_proxy, ObUDFInfo &udf_info); static int resolve_udf_param_exprs(ObResolverParams ¶ms, const share::schema::ObIRoutineInfo *func_info, ObUDFInfo &udf_info); static int resolve_udf_param_exprs(const share::schema::ObIRoutineInfo* func_info, pl::ObPLBlockNS &secondary_namespace_, ObSchemaChecker &schema_checker, sql::ObSQLSessionInfo &session_info, ObIAllocator &allocator, bool is_prepare_protocol, sql::ObRawExprFactory &expr_factory, common::ObMySQLProxy &sql_proxy, ExternalParams *extern_param_info, ObUDFInfo &udf_info); static int rebuild_expr_params(ObUDFInfo &udf_info, sql::ObRawExprFactory *expr_factory, common::ObIArray &expr_params); static int resolve_udf_info(common::ObIAllocator &allocator, sql::ObRawExprFactory &expr_factory, sql::ObSQLSessionInfo &session_info, share::schema::ObSchemaGetterGuard &schema_guard, ObUDFInfo &udf_info); //判断expr里是否包含字符串前缀的表达式 static bool has_prefix_str_expr(const ObRawExpr &expr, const ObColumnRefRawExpr &orig_column_expr, const ObRawExpr *&substr_expr); static int build_like_expr(ObRawExprFactory &expr_factory, ObSQLSessionInfo *session_info, ObRawExpr *text_expr, ObRawExpr *pattern_expr, ObRawExpr *escape_expr, ObOpRawExpr *&like_expr); static int resolve_op_expr_for_oracle_implicit_cast(ObRawExprFactory &expr_factory, const ObSQLSessionInfo *session_info, ObOpRawExpr* &b_expr); static int resolve_op_expr_implicit_cast(ObRawExprFactory &expr_factory, const ObSQLSessionInfo *session_info, ObItemType op_type, ObRawExpr* &sub_expr1, ObRawExpr* &sub_expr2); static inline int resolve_op_expr_add_implicit_cast(ObRawExprFactory &expr_factory, const ObSQLSessionInfo *session_info, ObRawExpr *src_expr, const ObExprResType &dst_type, ObSysFunRawExpr *&func_expr); static int resolve_op_exprs_for_oracle_implicit_cast(ObRawExprFactory &expr_factory, const ObSQLSessionInfo *session_info, common::ObIArray &op_exprs); static int check_composite_cast(ObRawExpr *&expr, ObSchemaChecker &schema_checker); static int add_cast_to_multiset(ObRawExpr *&expr); // 对parent的所有子节点一次调用try_create_bool_expr,给每个前面子节点按需增加bool expr static int try_add_bool_expr(ObOpRawExpr *parent, ObRawExprFactory &expr_factory); // 针对case表达式的overload方法. 会给case expr的所有when expr前面按需增加bool expr static int try_add_bool_expr(ObCaseOpRawExpr *parent, ObRawExprFactory &expr_factory); // 判断src_epxr前面是否需要bool expr,如果需要则创建bool expr并加到src_expr前面 // 如果不需要则out_expr被赋值为原本的src_expr static int try_create_bool_expr(ObRawExpr *src_expr, ObRawExpr *&out_expr, ObRawExprFactory &expr_factory); // 根据表达式类型判断是否需要增加布尔表达式 // 因为有些表达式的返回结果就是布尔语义的,这些表达式前面就不用再增加布尔表达式 static int check_need_bool_expr(const ObRawExpr *expr, bool &need_bool_expr); static int check_is_bool_expr(const ObRawExpr *expr, bool &is_bool_expr); // parent_raw_expr -> child_raw_expr加入隐式cast表达式后,变为: // parent_raw_expr -> cast_raw_expr -> child_raw_expr // 该函数的作用是为了获得child_raw_expr,如果有多个cast_raw_expr,会迭代循环,一直循环到 // 第一个非隐式cast的表达式并返回 // deduce type阶段会调用它来忽略隐式cast expr static int get_real_expr_without_cast(const ObRawExpr *expr, const ObRawExpr *&out_expr); // build remove_const for const expr to remove const attribute. static int build_remove_const_expr(ObRawExprFactory &factory, ObSQLSessionInfo &session_info, ObRawExpr *arg, ObRawExpr *&out); static int build_wrapper_inner_expr(ObRawExprFactory &factory, ObSQLSessionInfo &session_info, ObRawExpr *arg, ObRawExpr *&out); static int build_dup_data_expr(ObRawExprFactory &factory, ObRawExpr *param, ObRawExpr *&new_param); static int build_inner_aggr_code_expr(ObRawExprFactory &factory, const ObSQLSessionInfo &session_info, ObRawExpr *&out); static int build_inner_wf_aggr_status_expr(ObRawExprFactory &factory, const ObSQLSessionInfo &session_info, ObOpPseudoColumnRawExpr *&out); static int build_pseudo_rollup_id(ObRawExprFactory &factory, const ObSQLSessionInfo &session_info, ObRawExpr *&out); static int build_pseudo_random(ObRawExprFactory &factory, const ObSQLSessionInfo &session_info, ObRawExpr *&out); static bool is_pseudo_column_like_expr(const ObRawExpr &expr); static bool is_sharable_expr(const ObRawExpr &expr); static int check_need_cast_expr(const ObExprResType &src_res_type, const ObExprResType &dst_res_type, bool &need_cast, bool &ignore_dup_cast_error); static int build_add_expr(ObRawExprFactory &expr_factory, ObRawExpr *param_expr1, ObRawExpr *param_expr2, ObOpRawExpr *&add_expr); static int build_minus_expr(ObRawExprFactory &expr_factory, ObRawExpr *param_expr1, ObRawExpr *param_expr2, ObOpRawExpr *&add_expr); static int build_date_add_expr(ObRawExprFactory &expr_factory, ObRawExpr *param_expr1, ObRawExpr *param_expr2, ObRawExpr *param_expr3, ObSysFunRawExpr *&date_add_expr); static int build_date_sub_expr(ObRawExprFactory &expr_factory, ObRawExpr *param_expr1, ObRawExpr *param_expr2, ObRawExpr *param_expr3, ObSysFunRawExpr *&date_sub_expr); static int build_common_binary_op_expr(ObRawExprFactory &expr_factory, const ObItemType expect_op_type, ObRawExpr *param_expr1, ObRawExpr *param_expr2, ObRawExpr *&expr); static int build_case_when_expr(ObRawExprFactory &expr_factory, ObRawExpr *when_expr, ObRawExpr *then_expr, ObRawExpr *default_expr, ObRawExpr *&case_when_expr); static int build_is_not_expr(ObRawExprFactory &expr_factory, ObRawExpr *param_expr1, ObRawExpr *param_expr2, ObRawExpr *&is_not_expr); static int build_is_not_null_expr(ObRawExprFactory &expr_factory, ObRawExpr *param_expr, bool is_not_null, ObRawExpr *&is_not_null_expr); static int process_window_complex_agg_expr(ObRawExprFactory &expr_factory, const ObItemType func_type, ObWinFunRawExpr *win_func, ObRawExpr *&agg_expr, common::ObIArray *win_exprs); static int build_common_aggr_expr(ObRawExprFactory &expr_factory, ObSQLSessionInfo *session_info, const ObItemType expect_op_type, ObRawExpr *param_expr, ObAggFunRawExpr *&aggr_expr); //专用于limit_expr/offset_expr中,用于构造case when limit_expr < 0 then 0 else limit_expr end static int build_case_when_expr_for_limit(ObRawExprFactory &expr_factory, ObRawExpr *limit_expr, ObRawExpr *&case_when_expr); static int build_not_expr(ObRawExprFactory &expr_factory, ObRawExpr *expr, ObRawExpr* ¬_expr); static int build_or_exprs(ObRawExprFactory &expr_factory, const ObIArray &exprs, ObRawExpr* &or_expr); static int build_and_expr(ObRawExprFactory &expr_factory, const ObIArray &exprs, ObRawExpr * &and_expr); static int new_parse_node(ParseNode *& node, ObRawExprFactory &expr_factory, ObItemType type, int num); static int new_parse_node(ParseNode *&node, ObRawExprFactory &expr_factory, ObItemType type, int num, common::ObString str_val); static int build_rownum_expr(ObRawExprFactory &expr_factory, ObRawExpr* &rownum_expr); static int build_rowid_expr(const ObDMLStmt *dml_stmt, ObRawExprFactory &expr_factory, ObIAllocator &alloc, const ObSQLSessionInfo &session_info, const share::schema::ObTableSchema &table_schema, const uint64_t logical_table_id, const ObIArray &rowkey_exprs, ObSysFunRawExpr *&rowid_expr); static int build_empty_rowid_expr(ObRawExprFactory &expr_factory, uint64_t table_id, ObRawExpr *&rowid_expr); static int build_to_outfile_expr(ObRawExprFactory &expr_factory, const ObSQLSessionInfo *session_info, const ObSelectIntoItem *into_item, const ObIArray &exprs, ObRawExpr* &to_outfile_expr); static int build_pack_expr(ObRawExprFactory &expr_factory, const bool is_ps, const ObSQLSessionInfo *session_info, const ObIArray *field_array, const ObIArray &input_exprs, ObRawExpr *&pack_expr); static int build_inner_row_cmp_expr(ObRawExprFactory &expr_factory, const ObSQLSessionInfo *session_info, ObRawExpr *cast_expr, ObRawExpr *input_expr, ObRawExpr *next_expr, const uint64_t ret_code, ObSysFunRawExpr *&new_expr); static int set_call_in_pl(ObRawExpr *&raw_expr); static int transform_query_udt_column_expr(const ObSQLSessionInfo& session, ObRawExprFactory &expr_factory, ObRawExpr *hidden_blob_expr, ObRawExpr *&new_expr); static int try_modify_udt_col_expr_for_gen_col_recursively(const ObSQLSessionInfo &session, const ObTableSchema &table_schema, ObIArray &resolved_cols, ObRawExprFactory &expr_factory, ObRawExpr *&expr); static int try_modify_expr_for_gen_col_recursively(const ObSQLSessionInfo &session, const obrpc::ObCreateIndexArg *arg, ObRawExprFactory &expr_factory, ObRawExpr *expr, bool &expr_changed); static int try_add_to_char_on_expr(const ObSQLSessionInfo &session, const obrpc::ObCreateIndexArg *arg, ObRawExprFactory &expr_factory, ObRawExpr *expr, bool &expr_changed); static int actual_add_to_char_on_expr(const ObSQLSessionInfo& session, const obrpc::ObCreateIndexArg *arg, ObRawExprFactory &expr_factory, ObRawExpr &src_expr, const common::ObObjType &data_type, ObSysFunRawExpr *&to_char_expr); static int try_add_nls_fmt_in_to_char_expr(const ObSQLSessionInfo &session, const obrpc::ObCreateIndexArg *arg, ObRawExprFactory &expr_factory, ObRawExpr *expr, bool &expr_changed); static int actual_add_nls_fmt_in_to_char_expr(const ObSQLSessionInfo& session, const obrpc::ObCreateIndexArg *arg, ObRawExprFactory &expr_factory, const ObObjType &data_type, ObSysFunRawExpr *to_char_expr); static int get_real_expr_without_generated_column(ObRawExpr *expr, ObRawExpr *&real_expr); static bool is_new_old_column_ref(const ParseNode *node); static int mock_obj_access_ref_node(common::ObIAllocator &allocator, ParseNode *&obj_access_node, const ParseNode *col_ref_node, const TgTimingEvent tg_timing_event); static int build_returning_lob_expr(ObRawExprFactory &factory, ObSQLSessionInfo &session_info, ObColumnRefRawExpr *ref_expr, ObSysFunRawExpr *&out); static const ObRawExpr *skip_implicit_cast(const ObRawExpr *e); /** * extract all params from the input expr * @param expr * @param params * @return */ static int extract_params(ObRawExpr* expr, common::ObIArray ¶ms); static int resolve_gen_column_udf_expr(ObRawExpr *&udf_expr, ObQualifiedName &q_name, // udf q_name ObRawExprFactory &expr_factory, const ObSQLSessionInfo &session_info, ObSchemaChecker *schema_checker, ObIArray &columns, // all columns after raw expr resolver ObIArray &real_exprs, // all resolved exprs before this one ObDMLStmt *stmt ); static int extract_params(common::ObIArray &exprs, common::ObIArray ¶ms); static int is_contain_params(const common::ObIArray &exprs, bool &is_contain); static int is_contain_params(const ObRawExpr *expr, bool &is_contain); static int add_calc_tablet_id_on_calc_rowid_expr(const ObDMLStmt *dml_stmt, ObRawExprFactory &expr_factory, const ObSQLSessionInfo &session_info, const share::schema::ObTableSchema &table_schema, const uint64_t logical_table_id, ObSysFunRawExpr *&calc_rowid_expr); static int add_calc_partition_id_on_calc_rowid_expr(const ObDMLStmt *dml_stmt, ObRawExprFactory &expr_factory, const ObSQLSessionInfo &session_info, const share::schema::ObTableSchema &table_schema, const uint64_t logical_table_id, ObSysFunRawExpr *&calc_rowid_expr); static int get_col_ref_expr_recursively(ObRawExpr *expr, ObColumnRefRawExpr *&column_expr); static int build_shadow_pk_expr(uint64_t table_id, uint64_t column_id, const ObDMLStmt &dml_stmt, ObRawExprFactory &expr_factory, const ObSQLSessionInfo &session_info, const share::schema::ObTableSchema &index_schema, ObColumnRefRawExpr *&spk_expr); static bool decimal_int_need_cast(const common::ObAccuracy &src_acc, const common::ObAccuracy &dst_acc); static int check_contain_case_when_exprs(const ObRawExpr *raw_expr, bool &contain); static bool decimal_int_need_cast(const common::ObPrecision src_p, const common::ObScale src_s, const common::ObPrecision dst_p, const common::ObScale dst_s); static int transform_udt_column_value_expr(ObRawExprFactory &expr_factory, ObRawExpr *old_expr, ObRawExpr *&new_expr); static int create_type_expr(ObRawExprFactory &expr_factory, ObConstRawExpr *&type_expr, const ObExprResType &dst_type, bool avoid_zero_len = false); static int check_is_valid_generated_col(ObRawExpr *expr, ObIAllocator &allocator); static bool is_column_ref_skip_implicit_cast(const ObRawExpr *expr); static int build_dummy_count_expr(ObRawExprFactory &expr_factory, const ObSQLSessionInfo *session_info, ObAggFunRawExpr *&expr); static int extract_local_vars_for_gencol(ObRawExpr *expr, const ObSQLMode sql_mode, ObColumnSchemaV2 &gen_col); static int check_contain_op_row_expr(const ObRawExpr *raw_expr, bool &contain); private : static int create_real_cast_expr(ObRawExprFactory &expr_factory, ObRawExpr *src_expr, const ObExprResType &dst_type, ObSysFunRawExpr *&func_expr, const ObSQLSessionInfo *session_info); static int ora_cmp_integer(const ObConstRawExpr &const_expr, const int64_t v, int &cmp_ret); ObRawExprUtils(); virtual ~ObRawExprUtils(); // disallow copy DISALLOW_COPY_AND_ASSIGN(ObRawExprUtils); }; template bool ObRawExprUtils::find_expr(const common::ObIArray &exprs, const ObRawExpr *expr) { return get_expr_idx(exprs, expr) != common::OB_INVALID_INDEX; } template int64_t ObRawExprUtils::get_expr_idx(const common::ObIArray &exprs, const ObRawExpr* expr) { int64_t expr_idx = common::OB_INVALID_INDEX; int64_t N = exprs.count(); for (int64_t i = 0; common::OB_INVALID_INDEX == expr_idx && i < N; i++) { if (exprs.at(i) == expr) { expr_idx = i; } } return expr_idx; } } } #endif /* _OB_RAW_EXPR_UTIL_H */