Fix core at ObSysFunRawExpr::inner_same_as when compare CONCAT expr with T_OP_CNN expr
This commit is contained in:
		| @ -1941,27 +1941,25 @@ bool ObOpRawExpr::inner_same_as( | ||||
|   } else if (expr.get_expr_type() != get_expr_type()) { | ||||
|     need_cmp = false; | ||||
|   } | ||||
|  | ||||
|   if (need_cmp) { | ||||
|     const ObOpRawExpr *m_expr = static_cast<const ObOpRawExpr *>(&expr); | ||||
|     if (BOTH_CMP == cmp_type || REGULAR_CMP == cmp_type) { | ||||
|       if (this->get_param_count() == m_expr->get_param_count()) { | ||||
|       if (this->get_param_count() == expr.get_param_count()) { | ||||
|         bool_ret = true; | ||||
|         for (int64_t i = 0; bool_ret && i < m_expr->get_param_count(); ++i) { | ||||
|           if (NULL == this->get_param_expr(i) || NULL == m_expr->get_param_expr(i) | ||||
|               || !(this->get_param_expr(i)->same_as(*m_expr->get_param_expr(i), check_context))) { | ||||
|         for (int64_t i = 0; bool_ret && i < expr.get_param_count(); ++i) { | ||||
|           if (NULL == this->get_param_expr(i) || NULL == expr.get_param_expr(i) | ||||
|               || !(this->get_param_expr(i)->same_as(*expr.get_param_expr(i), check_context))) { | ||||
|             bool_ret = false; | ||||
|           } | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|     if (!bool_ret && (BOTH_CMP == cmp_type || REVERSE_CMP == cmp_type)) { | ||||
|       if (NULL == this->get_param_expr(0) || NULL == m_expr->get_param_expr(0) | ||||
|           || NULL == this->get_param_expr(1) || NULL == m_expr->get_param_expr(1)) { | ||||
|       if (NULL == this->get_param_expr(0) || NULL == expr.get_param_expr(0) | ||||
|           || NULL == this->get_param_expr(1) || NULL == expr.get_param_expr(1)) { | ||||
|         /* bool_ret = false; */ | ||||
|       } else { | ||||
|         bool_ret = this->get_param_expr(0)->same_as(*m_expr->get_param_expr(1), check_context) | ||||
|             && this->get_param_expr(1)->same_as(*m_expr->get_param_expr(0), check_context); | ||||
|         bool_ret = this->get_param_expr(0)->same_as(*expr.get_param_expr(1), check_context) | ||||
|             && this->get_param_expr(1)->same_as(*expr.get_param_expr(0), check_context); | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| @ -3387,11 +3385,11 @@ bool ObSysFunRawExpr::inner_same_as( | ||||
|     ObExprEqualCheckContext *check_context) const | ||||
| { | ||||
|   bool bool_ret = false; | ||||
|   const ObSysFunRawExpr *s_expr = static_cast<const ObSysFunRawExpr *>(&expr); | ||||
|   if (get_expr_type() != expr.get_expr_type()) { | ||||
|   } else if (T_FUN_SYS_RAND == get_expr_type() | ||||
|              || T_FUN_SYS_GUID == get_expr_type()) { | ||||
|   } else { | ||||
|   } else if (expr.is_sys_func_expr()) { | ||||
|     const ObSysFunRawExpr *s_expr = static_cast<const ObSysFunRawExpr *>(&expr); | ||||
|     if (ObCharset::case_insensitive_equal(func_name_, s_expr->get_func_name()) | ||||
|         && this->get_param_count() == s_expr->get_param_count()) { | ||||
|       bool_ret = true; | ||||
| @ -3434,6 +3432,18 @@ bool ObSysFunRawExpr::inner_same_as( | ||||
|         bool_ret = result_type_.get_scale() == s_expr->get_result_type().get_scale(); | ||||
|       } | ||||
|     } | ||||
|   } else if (expr.is_op_expr() && T_OP_CNN == expr.get_expr_type()) { | ||||
|     //for cases which compares concat('xxx','xxx') with 'xxx'||'xxx' | ||||
|     const ObOpRawExpr *m_expr = static_cast<const ObOpRawExpr *>(&expr); | ||||
|     if (this->get_param_count() == m_expr->get_param_count()) { | ||||
|       bool_ret = true; | ||||
|       for (int64_t i = 0; bool_ret && i < m_expr->get_param_count(); ++i) { | ||||
|         if (NULL == this->get_param_expr(i) || NULL == m_expr->get_param_expr(i) | ||||
|             || !(this->get_param_expr(i)->same_as(*m_expr->get_param_expr(i), check_context))) { | ||||
|           bool_ret = false; | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|   return bool_ret; | ||||
| } | ||||
|  | ||||
		Reference in New Issue
	
	Block a user
	 obdev
					obdev