fix aggr-first JA pullup bug

This commit is contained in:
jinmaoli
2023-11-22 12:40:37 +00:00
committed by ob-robot
parent db97322f68
commit 53d768d872
2 changed files with 30 additions and 0 deletions

View File

@ -441,6 +441,10 @@ int ObTransformAggrSubquery::check_aggr_first_validity(ObQueryRefRawExpr &query_
if (OB_ISNULL(subquery = query_ref.get_ref_stmt())) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("subquery is null", K(ret));
} else if (OB_FAIL(check_nested_subquery(query_ref, is_valid))) {
LOG_WARN("failed to check nested subquery", K(ret));
} else if (!is_valid) {
OPT_TRACE("exec param reference another subquery");
// 0. check single set
} else if (OB_FAIL(check_single_set_subquery(*subquery,
is_valid,
@ -1439,6 +1443,10 @@ int ObTransformAggrSubquery::check_join_first_validity(ObQueryRefRawExpr &query_
if (OB_ISNULL(subquery = query_ref.get_ref_stmt()) || OB_ISNULL(ctx_) || OB_ISNULL(ctx_->exec_ctx_)) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("subquery is null", K(ret));
} else if (OB_FAIL(check_nested_subquery(query_ref, is_valid))) {
LOG_WARN("failed to check nested subquery", K(ret));
} else if (!is_valid) {
OPT_TRACE("exec param reference another subquery");
// 0. check single set
} else if (OB_FAIL(check_single_set_subquery(*subquery,
is_valid,
@ -2671,3 +2679,23 @@ int ObTransformAggrSubquery::convert_limit_as_aggr(ObSelectStmt *subquery,
}
return ret;
}
int ObTransformAggrSubquery::check_nested_subquery(ObQueryRefRawExpr &query_ref,
bool &is_valid)
{
int ret = OB_SUCCESS;
for (int64_t i = 0; OB_SUCC(ret) && is_valid && i < query_ref.get_exec_params().count(); i++) {
ObExecParamRawExpr* exec_param = NULL;
ObRawExpr* outer_expr = NULL;
if (OB_ISNULL(exec_param = query_ref.get_exec_params().at(i))) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("unexpected null", K(ret));
} else if (OB_ISNULL(outer_expr = exec_param->get_ref_expr())) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("unexpected null", K(ret));
} else if (outer_expr->has_flag(CNT_SUB_QUERY)) {
is_valid = false;
}
}
return ret;
}

View File

@ -281,6 +281,8 @@ private:
int convert_limit_as_aggr(ObSelectStmt *subquery, TransformParam &trans_param);
ObHint* get_sub_unnest_hint(ObSelectStmt &subquery, int64_t pullup_strategy);
ObItemType get_unnest_strategy(int64_t pullup_strategy);
int check_nested_subquery(ObQueryRefRawExpr &query_ref, bool &is_valid);
private:
common::ObSEArray<ObRawExpr *, 8, common::ModulePageAllocator, true> no_rewrite_exprs_;
common::ObSEArray<TransStmtInfo, 4, common::ModulePageAllocator, true> trans_stmt_infos_;