bugfix: disable minmax and count_to_exists rewrite when stmt has rownum

This commit is contained in:
obdev
2024-02-08 01:26:33 +00:00
committed by ob-robot
parent 9ac40529e5
commit b6c37b4cda
2 changed files with 10 additions and 0 deletions

View File

@ -190,12 +190,17 @@ int ObTransformCountToExists::check_trans_valid(ObDMLStmt *stmt, ObRawExpr *expr
ObRawExpr *sel_expr = NULL; ObRawExpr *sel_expr = NULL;
bool is_sel_expr_valid = false; bool is_sel_expr_valid = false;
bool is_const_expr_valid = false; bool is_const_expr_valid = false;
bool has_rownum = false;
if (OB_ISNULL(tmp_subquery = tmp_subquery_expr->get_ref_stmt())) { if (OB_ISNULL(tmp_subquery = tmp_subquery_expr->get_ref_stmt())) {
ret = OB_ERR_UNEXPECTED; ret = OB_ERR_UNEXPECTED;
LOG_WARN("get unexpected null", K(ret)); LOG_WARN("get unexpected null", K(ret));
} else if (OB_ISNULL(sel_expr = tmp_subquery->get_select_item(0).expr_)) { } else if (OB_ISNULL(sel_expr = tmp_subquery->get_select_item(0).expr_)) {
ret = OB_ERR_UNEXPECTED; ret = OB_ERR_UNEXPECTED;
LOG_WARN("get unexpected null expr", K(ret)); LOG_WARN("get unexpected null expr", K(ret));
} else if (OB_FAIL(tmp_subquery->has_rownum(has_rownum))) {
LOG_WARN("failed to check if subquery has rownum", K(ret));
} else if (has_rownum) {
// do nothing
} else if (tmp_subquery_expr->get_ref_count() > 1 || } else if (tmp_subquery_expr->get_ref_count() > 1 ||
tmp_subquery->has_having() || !tmp_subquery->is_scala_group_by()) { tmp_subquery->has_having() || !tmp_subquery->is_scala_group_by()) {
// only scalar group by subquery without having and referred by once can be transformed // only scalar group by subquery without having and referred by once can be transformed

View File

@ -85,6 +85,7 @@ int ObTransformMinMax::check_transform_validity(ObTransformerCtx &ctx,
const ObAggFunRawExpr *expr = NULL; const ObAggFunRawExpr *expr = NULL;
aggr_expr = NULL; aggr_expr = NULL;
is_valid = false; is_valid = false;
bool has_rownum = false;
if (OB_ISNULL(select_stmt)) { if (OB_ISNULL(select_stmt)) {
ret = OB_ERR_UNEXPECTED; ret = OB_ERR_UNEXPECTED;
LOG_WARN("unexpected null", K(ret), K(select_stmt)); LOG_WARN("unexpected null", K(ret), K(select_stmt));
@ -95,6 +96,10 @@ int ObTransformMinMax::check_transform_validity(ObTransformerCtx &ctx,
select_stmt->get_aggr_item_size() != 1 || select_stmt->get_aggr_item_size() != 1 ||
!select_stmt->is_scala_group_by()) { !select_stmt->is_scala_group_by()) {
OPT_TRACE("not a simple query"); OPT_TRACE("not a simple query");
} else if (OB_FAIL(select_stmt->has_rownum(has_rownum))) {
LOG_WARN("failed to check if select stmt has rownum", K(ret));
} else if (has_rownum) {
OPT_TRACE("stmt has rownum");
} else if (OB_ISNULL(expr = select_stmt->get_aggr_items().at(0))) { } else if (OB_ISNULL(expr = select_stmt->get_aggr_items().at(0))) {
ret = OB_ERR_UNEXPECTED; ret = OB_ERR_UNEXPECTED;
LOG_WARN("params have null", K(ret), KP(expr)); LOG_WARN("params have null", K(ret), KP(expr));