Fix an order by udt bug

This commit is contained in:
xianyu-w
2023-01-03 09:16:29 +00:00
committed by ob-robot
parent 5ba864f256
commit ae962fba65

View File

@ -753,9 +753,10 @@ int ObSelectResolver::check_group_by()
} else if (ObLongTextType == group_by_expr->get_data_type()
|| ObLobType == group_by_expr->get_data_type()
|| ObJsonType == group_by_expr->get_data_type()
|| ObGeometryType == group_by_expr->get_data_type()) {
|| ObGeometryType == group_by_expr->get_data_type()
|| ObExtendType == group_by_expr->get_data_type()) {
ret = OB_ERR_INVALID_TYPE_FOR_OP;
LOG_WARN("group by lob expr is not allowed", K(ret));
LOG_WARN("group by lob or udt expr is not allowed", K(ret));
}
}
for (int64_t i = 0; OB_SUCC(ret) && i < select_stmt->get_rollup_expr_size(); i++) {
@ -764,9 +765,10 @@ int ObSelectResolver::check_group_by()
ret = OB_ERR_UNEXPECTED;
LOG_WARN("rollup expr is null", K(ret));
} else if (ObLongTextType == rollup_expr->get_data_type()
|| ObLobType == rollup_expr->get_data_type()) {
|| ObLobType == rollup_expr->get_data_type()
|| ObExtendType == rollup_expr->get_data_type()) {
ret = OB_ERR_INVALID_TYPE_FOR_OP;
LOG_WARN("group by lob expr is not allowed", K(ret));
LOG_WARN("group by lob or udt expr is not allowed", K(ret));
}
}
for (int64_t i = 0; OB_SUCC(ret) && i < select_stmt->get_grouping_sets_items_size(); i++) {
@ -786,9 +788,10 @@ int ObSelectResolver::check_group_by()
} else if (ObLongTextType == groupby_expr->get_data_type()
|| ObLobType == groupby_expr->get_data_type()
|| ObJsonType == groupby_expr->get_data_type()
|| ObGeometryType == groupby_expr->get_data_type()) {
|| ObGeometryType == groupby_expr->get_data_type()
|| ObExtendType == groupby_expr->get_data_type()) {
ret = OB_ERR_INVALID_TYPE_FOR_OP;
LOG_WARN("group by lob expr is not allowed", K(ret));
LOG_WARN("group by lob or udt expr is not allowed", K(ret));
}
}
}
@ -867,7 +870,7 @@ int ObSelectResolver::check_group_by()
return ret;
}
// 1. lob type can't be ordered
// 1. lob or udt type can't be ordered
// 2. the order item should be exists in select items if has distinct
int ObSelectResolver::check_order_by()
{
@ -882,7 +885,7 @@ int ObSelectResolver::check_order_by()
// eg: select distinct count(*) from t1 order by c1; -- return single row,then don't check
bool need_check = !select_stmt->is_single_set_query();
if (need_check) {
// 1. check lob type
// 1. check lob type or udt
common::ObArray<ObRawExpr*> order_item_exprs;
common::ObIArray<OrderItem> &order_items = select_stmt->get_order_items();
// special case: select count(*) from t1 order by c1; --c1 is blob, but optimized to be remove
@ -890,9 +893,10 @@ int ObSelectResolver::check_order_by()
if (ob_is_text_tc(order_items.at(i).expr_->get_data_type())
|| ob_is_lob_tc(order_items.at(i).expr_->get_data_type())
|| ob_is_json_tc(order_items.at(i).expr_->get_data_type())
|| ob_is_geometry_tc(order_items.at(i).expr_->get_data_type())) {
|| ob_is_geometry_tc(order_items.at(i).expr_->get_data_type())
|| ob_is_extend(order_items.at(i).expr_->get_data_type())) {
ret = OB_ERR_INVALID_TYPE_FOR_OP;
LOG_WARN("lob expr can't order", K(ret), K(*order_items.at(i).expr_));
LOG_WARN("lob expr or udt can't order", K(ret), K(*order_items.at(i).expr_));
} else if (has_distinct) {
if (OB_FAIL(order_item_exprs.push_back(order_items.at(i).expr_))) {
LOG_WARN("fail to push back expr", K(ret));
@ -6431,9 +6435,10 @@ int ObSelectResolver::check_window_exprs()
if (ob_is_text_tc(order_items.at(i).expr_->get_data_type())
|| ob_is_lob_tc(order_items.at(i).expr_->get_data_type())
|| ob_is_json_tc(order_items.at(i).expr_->get_data_type())
|| ob_is_geometry_tc(order_items.at(i).expr_->get_data_type())) {
|| ob_is_geometry_tc(order_items.at(i).expr_->get_data_type())
|| ob_is_extend(order_items.at(i).expr_->get_data_type())) {
ret = OB_ERR_INVALID_TYPE_FOR_OP;
LOG_WARN("lob expr can't order", K(ret), K(*order_items.at(i).expr_));
LOG_WARN("lob or udt expr can't order", K(ret), K(*order_items.at(i).expr_));
}
}
}
@ -6444,7 +6449,8 @@ int ObSelectResolver::check_window_exprs()
ret = OB_ERR_UNEXPECTED;
LOG_WARN("param is null", K(ret));
} else if (ob_is_lob_locator(param_expr->get_data_type())
|| ob_is_text_tc(param_expr->get_data_type())) {
|| ob_is_text_tc(param_expr->get_data_type())
|| ob_is_extend(param_expr->get_data_type())) {
ret = OB_ERR_INVALID_TYPE_FOR_OP;
LOG_WARN("invalid partition by expr", K(ret), K(i), KPC(param_expr));
}