fix bug about dateadd func
This commit is contained in:
		| @ -5825,7 +5825,6 @@ int ObRawExprResolverImpl::process_fun_sys_node(const ParseNode *node, ObRawExpr | ||||
|   int ret = OB_SUCCESS; | ||||
|   ObSysFunRawExpr *func_expr = NULL; | ||||
|   ObString func_name; | ||||
|   ObString actual_name; | ||||
|   if (OB_ISNULL(node) || OB_ISNULL(ctx_.session_info_)) { | ||||
|     ret = OB_INVALID_ARGUMENT; | ||||
|     LOG_WARN("invalid argument", K(ret), K(node), KP(ctx_.session_info_)); | ||||
| @ -5839,10 +5838,6 @@ int ObRawExprResolverImpl::process_fun_sys_node(const ParseNode *node, ObRawExpr | ||||
|     LOG_WARN("func_expr is null"); | ||||
|   } else { | ||||
|     ObString name(node->children_[0]->str_len_, node->children_[0]->str_value_); | ||||
|     if (0 == name.case_compare("date_add_interval_date") || 0 == name.case_compare("date_add_date_interval")){ | ||||
|       actual_name = name; | ||||
|       name = ObString::make_string("date_add"); | ||||
|     } | ||||
|     if (OB_FAIL(check_internal_function(name))) { | ||||
|       LOG_WARN("unexpected internal function", K(ret)); | ||||
|     } | ||||
| @ -5944,7 +5939,7 @@ int ObRawExprResolverImpl::process_fun_sys_node(const ParseNode *node, ObRawExpr | ||||
|         } | ||||
|  | ||||
|         if (OB_SUCC(ret)) { | ||||
|           if (OB_FAIL(process_sys_func_params(*func_expr, current_columns_count, actual_name))) { | ||||
|           if (OB_FAIL(process_sys_func_params(*func_expr, current_columns_count))) { | ||||
|             LOG_WARN("fail process sys func params", K(ret)); | ||||
|           } | ||||
|         } | ||||
| @ -5994,7 +5989,7 @@ int ObRawExprResolverImpl::process_fun_sys_node(const ParseNode *node, ObRawExpr | ||||
|   return ret; | ||||
| } | ||||
|  | ||||
| int ObRawExprResolverImpl::process_sys_func_params(ObSysFunRawExpr &func_expr, int current_columns_count, ObString &node_name) | ||||
| int ObRawExprResolverImpl::process_sys_func_params(ObSysFunRawExpr &func_expr, int current_columns_count) | ||||
| { | ||||
|   int ret = OB_SUCCESS; | ||||
|   const ObExprOperatorType expr_type = ObExprOperatorFactory::get_type_by_name(func_expr.get_func_name()); | ||||
| @ -6034,25 +6029,48 @@ int ObRawExprResolverImpl::process_sys_func_params(ObSysFunRawExpr &func_expr, i | ||||
|       } | ||||
|       break; | ||||
|     case T_FUN_SYS_DATE_ADD: | ||||
|       if (0 == node_name.case_compare("date_add_interval_date")) { | ||||
|         if (3 == func_expr.get_param_count()) { | ||||
|           ObRawExpr *expr0 = func_expr.get_param_expr(0); | ||||
|           ObRawExpr *expr1 = func_expr.get_param_expr(1); | ||||
|           if (OB_FAIL(func_expr.remove_param_expr(0))) { | ||||
|         // Added a fourth parameter to distinguish between “date + interval” and “interval + date” | ||||
|         // So you should use it to distinguish these two cases | ||||
|         if(4 == func_expr.get_param_count()) { | ||||
|           ObRawExpr *expr3 = func_expr.get_param_expr(3); | ||||
|           if(OB_LIKELY(NULL != expr3 && expr3->is_const_raw_expr())) { | ||||
|             ObConstRawExpr *const_expr = static_cast<ObConstRawExpr *>(expr3); | ||||
|             int64_t expr3_val = OB_INVALID_ID; | ||||
|             if(T_INT == const_expr->get_expr_type()) { | ||||
|               if (OB_FAIL(const_expr->get_value().get_int(expr3_val))) { | ||||
|                 ret = OB_ERR_UNEXPECTED; | ||||
|                 LOG_WARN("get fourth para value from date_add func failed", K(ret)); | ||||
|               } else if (2 == expr3_val) { | ||||
|                 ObRawExpr *expr0 = func_expr.get_param_expr(0); | ||||
|                 ObRawExpr *expr1 = func_expr.get_param_expr(1); | ||||
|                 if (OB_FAIL(func_expr.remove_param_expr(3))) { | ||||
|                   ret = OB_ERR_UNEXPECTED; | ||||
|                   LOG_WARN("the func expr param3 is invalid", K(ret)); | ||||
|                 } else if (OB_FAIL(func_expr.remove_param_expr(0))) { | ||||
|                   ret = OB_ERR_UNEXPECTED; | ||||
|                   LOG_WARN("the func expr param0 is invalid", K(ret)); | ||||
|                 } else if (OB_FAIL(func_expr.remove_param_expr(0))) { | ||||
|                   ret = OB_ERR_UNEXPECTED; | ||||
|                   LOG_WARN("the func expr param0 is invalid", K(ret)); | ||||
|                 } else if (OB_FAIL(func_expr.add_param_expr(expr0))) { | ||||
|                   ret = OB_ERR_UNEXPECTED; | ||||
|                   LOG_WARN("the func expr param0 is invalid", K(ret)); | ||||
|                 } else if (OB_FAIL(func_expr.add_param_expr(expr1))) { | ||||
|                   ret = OB_ERR_UNEXPECTED; | ||||
|                   LOG_WARN("the func expr param0 is invalid", K(ret)); | ||||
|                 } | ||||
|               } else if (1 == expr3_val) { | ||||
|                 if (OB_FAIL(func_expr.remove_param_expr(3))) { | ||||
|                   ret = OB_ERR_UNEXPECTED; | ||||
|                   LOG_WARN("the func expr param3 is invalid", K(ret)); | ||||
|                 } | ||||
|               } | ||||
|             } | ||||
|           } else { | ||||
|             ret = OB_ERR_UNEXPECTED; | ||||
|             LOG_WARN("the func expr param0 is invalid", K(ret)); | ||||
|           } else if (OB_FAIL(func_expr.remove_param_expr(0))) { | ||||
|             ret = OB_ERR_UNEXPECTED; | ||||
|             LOG_WARN("the func expr param0 is invalid", K(ret)); | ||||
|           } else if (OB_FAIL(func_expr.add_param_expr(expr0))) { | ||||
|             ret = OB_ERR_UNEXPECTED; | ||||
|             LOG_WARN("the func expr param0 is invalid", K(ret)); | ||||
|           } else if (OB_FAIL(func_expr.add_param_expr(expr1))) { | ||||
|             ret = OB_ERR_UNEXPECTED; | ||||
|             LOG_WARN("the func expr param0 is invalid", K(ret)); | ||||
|             LOG_WARN("the func expr3 is null or not const expr", K(ret)); | ||||
|           } | ||||
|         } | ||||
|       } | ||||
|       break; | ||||
|     default: | ||||
|       break; | ||||
|  | ||||
		Reference in New Issue
	
	Block a user
	 obdev
					obdev