Fix an order by udt bug
This commit is contained in:
@ -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));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user