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()
|
} else if (ObLongTextType == group_by_expr->get_data_type()
|
||||||
|| ObLobType == group_by_expr->get_data_type()
|
|| ObLobType == group_by_expr->get_data_type()
|
||||||
|| ObJsonType == 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;
|
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++) {
|
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;
|
ret = OB_ERR_UNEXPECTED;
|
||||||
LOG_WARN("rollup expr is null", K(ret));
|
LOG_WARN("rollup expr is null", K(ret));
|
||||||
} else if (ObLongTextType == rollup_expr->get_data_type()
|
} 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;
|
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++) {
|
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()
|
} else if (ObLongTextType == groupby_expr->get_data_type()
|
||||||
|| ObLobType == groupby_expr->get_data_type()
|
|| ObLobType == groupby_expr->get_data_type()
|
||||||
|| ObJsonType == 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;
|
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;
|
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
|
// 2. the order item should be exists in select items if has distinct
|
||||||
int ObSelectResolver::check_order_by()
|
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
|
// 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();
|
bool need_check = !select_stmt->is_single_set_query();
|
||||||
if (need_check) {
|
if (need_check) {
|
||||||
// 1. check lob type
|
// 1. check lob type or udt
|
||||||
common::ObArray<ObRawExpr*> order_item_exprs;
|
common::ObArray<ObRawExpr*> order_item_exprs;
|
||||||
common::ObIArray<OrderItem> &order_items = select_stmt->get_order_items();
|
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
|
// 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())
|
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_lob_tc(order_items.at(i).expr_->get_data_type())
|
||||||
|| ob_is_json_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;
|
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) {
|
} else if (has_distinct) {
|
||||||
if (OB_FAIL(order_item_exprs.push_back(order_items.at(i).expr_))) {
|
if (OB_FAIL(order_item_exprs.push_back(order_items.at(i).expr_))) {
|
||||||
LOG_WARN("fail to push back expr", K(ret));
|
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())
|
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_lob_tc(order_items.at(i).expr_->get_data_type())
|
||||||
|| ob_is_json_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;
|
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;
|
ret = OB_ERR_UNEXPECTED;
|
||||||
LOG_WARN("param is null", K(ret));
|
LOG_WARN("param is null", K(ret));
|
||||||
} else if (ob_is_lob_locator(param_expr->get_data_type())
|
} 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;
|
ret = OB_ERR_INVALID_TYPE_FOR_OP;
|
||||||
LOG_WARN("invalid partition by expr", K(ret), K(i), KPC(param_expr));
|
LOG_WARN("invalid partition by expr", K(ret), K(i), KPC(param_expr));
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user