don't handle aggr_first_unnest if order by has an correlated param.
This commit is contained in:
parent
a4561fe900
commit
3b8d433e92
@ -522,21 +522,26 @@ int ObTransformAggrSubquery::check_aggr_first_validity(ObQueryRefRawExpr &query_
|
||||
LOG_WARN("failed to check select validity for limit 1", K(ret));
|
||||
} else if (!is_valid) {
|
||||
OPT_TRACE("select item is lob or const");
|
||||
} else if (OB_FAIL(check_subquery_orderby(query_ref, is_valid))) {
|
||||
LOG_WARN("failed to check order_by validity", K(ret));
|
||||
} else if (!is_valid) {
|
||||
LOG_TRACE("order by item is invalid", K(is_valid));
|
||||
OPT_TRACE("subquery order by item contain correlated subquery");
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ObTransformAggrSubquery::check_subquery_select(ObQueryRefRawExpr &query_ref,
|
||||
int ObTransformAggrSubquery::check_subquery_select(const ObQueryRefRawExpr &query_ref,
|
||||
bool &is_valid)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
ObSelectStmt *subquery = NULL;
|
||||
const ObSelectStmt *subquery = NULL;
|
||||
if (OB_ISNULL(subquery = query_ref.get_ref_stmt())) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("subquery stmt is null", K(ret));
|
||||
}
|
||||
for (int64_t i = 0; OB_SUCC(ret) && is_valid && i < subquery->get_select_item_size(); ++i) {
|
||||
ObRawExpr *select_expr = NULL;
|
||||
const ObRawExpr *select_expr = NULL;
|
||||
bool bret = false;
|
||||
if (OB_ISNULL(select_expr = subquery->get_select_item(i).expr_)) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
@ -552,6 +557,35 @@ int ObTransformAggrSubquery::check_subquery_select(ObQueryRefRawExpr &query_ref,
|
||||
return ret;
|
||||
}
|
||||
|
||||
// whether 'order by' subquery in current subquery has any correlated expr.
|
||||
int ObTransformAggrSubquery::check_subquery_orderby(const ObQueryRefRawExpr &query_ref,
|
||||
bool &is_valid)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
const ObSelectStmt *subquery = NULL;
|
||||
is_valid = true;
|
||||
if (OB_ISNULL(subquery = query_ref.get_ref_stmt())) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("subquery stmt is null", K(ret));
|
||||
}
|
||||
for (int64_t i = 0; OB_SUCC(ret) && is_valid && i < subquery->get_order_item_size(); ++i) {
|
||||
const ObRawExpr *expr = NULL;
|
||||
bool is_correlated = false;
|
||||
if (OB_ISNULL(expr = subquery->get_order_item(i).expr_)) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("select expr is null", K(ret));
|
||||
} else if (OB_FAIL(ObTransformUtils::is_correlated_expr(query_ref.get_exec_params(),
|
||||
expr,
|
||||
is_correlated))) {
|
||||
LOG_WARN("failed to check is correlated", K(ret));
|
||||
} else if (is_correlated) {
|
||||
is_valid = false;
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
int ObTransformAggrSubquery::check_subquery_select_for_limit_1(ObSelectStmt &subquery,
|
||||
bool &is_valid,
|
||||
ObIArray<ObPCParamEqualInfo> &equal_param_info)
|
||||
|
@ -228,8 +228,8 @@ private:
|
||||
int replace_count_const(ObAggFunRawExpr *agg_expr, ObRawExpr *not_null_expr);
|
||||
|
||||
int check_can_use_outer_join(TransformParam ¶m, bool &is_valid);
|
||||
|
||||
int check_subquery_select(ObQueryRefRawExpr &query_ref, bool &is_valid);
|
||||
int check_subquery_select(const ObQueryRefRawExpr &query_ref, bool &is_valid);
|
||||
int check_subquery_orderby(const ObQueryRefRawExpr &query_ref, bool &is_valid);
|
||||
|
||||
int check_subquery_select_for_limit_1(ObSelectStmt &subquery, bool &is_valid, ObIArray<ObPCParamEqualInfo>& equal_param_info);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user