diff --git a/src/sql/ob_select_stmt_printer.cpp b/src/sql/ob_select_stmt_printer.cpp index 824a31b552..125659da1d 100644 --- a/src/sql/ob_select_stmt_printer.cpp +++ b/src/sql/ob_select_stmt_printer.cpp @@ -768,8 +768,23 @@ int ObSelectStmtPrinter::print_order_by() const OrderItem &order_item = select_stmt->get_order_item(i); ObRawExpr *order_expr = order_item.expr_; int64_t sel_item_pos = -1; - for (int64_t j = 0; j < select_stmt->get_select_item_size(); ++j) { - if (order_item.expr_ == select_stmt->get_select_item(j).expr_) { + if (OB_ISNULL(order_expr)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("unexpected null", K(ret)); + } else if (T_FUN_SYS_CAST == order_expr->get_expr_type() && + CM_IS_IMPLICIT_CAST(order_expr->get_extra())) { + order_expr = order_expr->get_param_expr(0); + } + for (int64_t j = 0; OB_SUCC(ret) && j < select_stmt->get_select_item_size(); ++j) { + ObRawExpr *select_expr = select_stmt->get_select_item(j).expr_; + if (OB_ISNULL(select_expr)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("unexpected null", K(ret)); + } else if (T_FUN_SYS_CAST == select_expr->get_expr_type() && + CM_IS_IMPLICIT_CAST(select_expr->get_extra())) { + select_expr = select_expr->get_param_expr(0); + } + if (order_expr == select_expr) { sel_item_pos = j + 1; break; } diff --git a/src/sql/rewrite/ob_transform_min_max.cpp b/src/sql/rewrite/ob_transform_min_max.cpp index 9c5610d8fd..b007782082 100644 --- a/src/sql/rewrite/ob_transform_min_max.cpp +++ b/src/sql/rewrite/ob_transform_min_max.cpp @@ -82,6 +82,7 @@ int ObTransformMinMax::check_transform_validity(ObSelectStmt *select_stmt, int ret = OB_SUCCESS; const ObRawExpr *select_expr = NULL; is_valid = false; + bool invalid_for_dblink = false; if (OB_ISNULL(select_stmt)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("unexpected null", K(ret), K(select_stmt)); @@ -95,7 +96,13 @@ int ObTransformMinMax::check_transform_validity(ObSelectStmt *select_stmt, || select_stmt->get_aggr_item_size() != 1) { //do nothing OPT_TRACE("not a simple query"); - } else if (OB_FAIL(is_valid_select_list(*select_stmt, select_expr, is_valid))) { + } else if (OB_FAIL(ObTransformUtils::check_stmt_from_one_dblink(select_stmt, invalid_for_dblink))) { + LOG_WARN("failed to check if all tables from one dblink", K(ret)); + } else if (invalid_for_dblink) { + is_valid = false; + // do not transform, + // for compatibility with Oracle before 12c + } else if (OB_FAIL(is_valid_select_list(*select_stmt, select_expr, is_valid))) { LOG_WARN("failed to check is valid select list", K(ret)); } else if (!is_valid) { //do nothing