bugfix: disable minmax and count_to_exists rewrite when stmt has rownum
This commit is contained in:
@ -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
|
||||||
|
|||||||
@ -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));
|
||||||
|
|||||||
Reference in New Issue
Block a user