don't handle aggr_first_unnest if order by has an correlated param.

This commit is contained in:
jingtaoye35 2023-09-25 06:10:24 +00:00 committed by ob-robot
parent a4561fe900
commit 3b8d433e92
2 changed files with 39 additions and 5 deletions

View File

@ -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)

View File

@ -228,8 +228,8 @@ private:
int replace_count_const(ObAggFunRawExpr *agg_expr, ObRawExpr *not_null_expr);
int check_can_use_outer_join(TransformParam &param, 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);