fix some window func bugs

This commit is contained in:
wangt1xiuyi
2023-08-14 07:18:41 +00:00
committed by ob-robot
parent ef9887b33b
commit e067fa2e07
14 changed files with 261 additions and 17 deletions

View File

@ -6419,6 +6419,12 @@ int ObRawExprResolverImpl::process_window_function_node(const ParseNode *node, O
LOG_WARN("fail to add param expr", K(ret));
} else if (OB_FAIL(func_params.push_back(n_expr))) {
LOG_WARN("fail to add param expr", K(ret));
} else if (OB_FAIL(n_expr->extract_info())) {
LOG_WARN("faield to extract info", K(ret));
} else if (OB_UNLIKELY(lib::is_mysql_mode() && !n_expr->is_const_expr())) {
ret = OB_INVALID_ARGUMENT;
LOG_WARN("invalid arguments to nth_value", K(ret));
LOG_USER_ERROR(OB_INVALID_ARGUMENT, "nth_value");
} else {
win_func->set_is_from_first(NULL == func_node->children_[2] || T_FIRST == func_node->children_[2]->type_);
win_func->set_is_ignore_null(!(NULL == func_node->children_[3] || T_RESPECT == func_node->children_[3]->type_));
@ -6535,10 +6541,16 @@ int ObRawExprResolverImpl::process_window_function_node(const ParseNode *node, O
break;
}
}
if(OB_SUCC(ret) && NULL == named_win) {
if (OB_SUCC(ret) && NULL == named_win) {
ret = OB_ERR_WINDOW_NAME_IS_NOT_DEFINE;
LOG_WARN("name win not exist", K(name), K(ret), K(named_windows));
LOG_USER_ERROR(OB_ERR_WINDOW_NAME_IS_NOT_DEFINE, name.length(), name.ptr());
} else if (OB_UNLIKELY(ctx_.current_scope_ == T_NAMED_WINDOWS_SCOPE &&
named_win->has_frame_orig())) {
ret = OB_EER_WINDOW_NO_INHERIT_FRAME;
LOG_WARN("Named window cann't be modified by another framing property", K(ret));
ObString tmp_name = named_win->get_win_name().empty() ? ObString("<unnamed window>") : named_win->get_win_name();
LOG_USER_ERROR(OB_EER_WINDOW_NO_INHERIT_FRAME, tmp_name.length(), tmp_name.ptr());
}
}
}
@ -6676,6 +6688,13 @@ int ObRawExprResolverImpl::process_window_function_node(const ParseNode *node, O
if (OB_SUCC(ret) && NULL != frame_node) {
if (OB_FAIL(process_frame_node(frame_node, frame))) {
LOG_WARN("process window node failed", K(ret));
} else if (lib::is_mysql_mode() &&
OB_UNLIKELY((frame.get_upper().interval_expr_ != NULL && !frame.get_upper().interval_expr_->is_const_expr()) ||
(frame.get_lower().interval_expr_ != NULL && !frame.get_lower().interval_expr_->is_const_expr()))) {
ret = OB_ERR_WINDOW_RANGE_BOUND_NOT_CONSTANT;
LOG_WARN("Window has a non-constant frame bound.", K(ret), KPC(frame.get_upper().interval_expr_), KPC(frame.get_lower().interval_expr_));
ObString tmp_name = named_win == NULL ? ObString("<unnamed window>") : named_win->get_win_name();
LOG_USER_ERROR(OB_ERR_WINDOW_RANGE_BOUND_NOT_CONSTANT, tmp_name.length(), tmp_name.ptr());
}
}
if (OB_SUCC(ret)) {
@ -6914,6 +6933,8 @@ int ObRawExprResolverImpl::process_interval_node(const ParseNode *node,
} else if (OB_ISNULL(interval_expr)) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("NULL ptr", K(ret), K(interval_expr));
} else if (OB_FAIL(interval_expr->extract_info())) {
LOG_WARN("fail to extract info", K(interval_expr), K(ret));
} else if (!is_nmb_literal) {
// date type
ParseNode *date_unit_node = node->children_[1];
@ -6922,8 +6943,10 @@ int ObRawExprResolverImpl::process_interval_node(const ParseNode *node,
} else if (OB_ISNULL(date_unit_expr)) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("NULL ptr", K(ret), K(date_unit_expr));
} else if (OB_FAIL(date_unit_expr->extract_info())) {
LOG_WARN("fail to extract info", K(interval_expr), K(ret));
} else if (!date_unit_expr->is_const_raw_expr()) {
ret = OB_ERR_UNEXPECTED;
ret = OB_INVALID_ARGUMENT;
LOG_WARN("not const expr error", K(ret), K(date_unit_expr->get_expr_type()));
} else {/*do nothing*/}
}