From aeabb293adba237a4947bd7e98e0764b482ada61 Mon Sep 17 00:00:00 2001 From: helloamateur Date: Mon, 17 Feb 2025 21:45:58 +0000 Subject: [PATCH] [ARRAY] hash join bugfix --- .../engine/join/hash_join/ob_hash_join_vec_op.cpp | 3 +++ src/sql/resolver/expr/ob_raw_expr.cpp | 12 ++++++++++++ 2 files changed, 15 insertions(+) diff --git a/src/sql/engine/join/hash_join/ob_hash_join_vec_op.cpp b/src/sql/engine/join/hash_join/ob_hash_join_vec_op.cpp index 85a38fc741..334dd23c37 100644 --- a/src/sql/engine/join/hash_join/ob_hash_join_vec_op.cpp +++ b/src/sql/engine/join/hash_join/ob_hash_join_vec_op.cpp @@ -2464,6 +2464,9 @@ int ObHashJoinVecOp::calc_hash_value_and_skip_null(const ObIArray &join ObExpr *expr = join_keys.at(idx); // expr ptr check in cg, not check here if (OB_FAIL(expr->eval_vector(eval_ctx_, *brs))) { LOG_WARN("eval failed", K(ret)); + } else if (OB_UNLIKELY(expr->is_nested_expr()) && + OB_FAIL(expr->cast_to_uniform(brs->size_, eval_ctx_, brs->skip_))) { + LOG_WARN("nested expr cast to uniform failed", K(ret)); } else { const bool is_batch_seed = (idx > 0); ObIVector *vector = expr->get_vector(eval_ctx_); diff --git a/src/sql/resolver/expr/ob_raw_expr.cpp b/src/sql/resolver/expr/ob_raw_expr.cpp index a66ba55b0d..9191d79fcf 100644 --- a/src/sql/resolver/expr/ob_raw_expr.cpp +++ b/src/sql/resolver/expr/ob_raw_expr.cpp @@ -301,6 +301,18 @@ int ObRawExpr::deep_copy(ObIRawExprCopier &copier, LOG_WARN("failed to assign other expr", K(ret)); } else if (OB_FAIL(inner_deep_copy(copier))) { LOG_WARN("failed to deep copy new allocator", K(ret)); + } else if (OB_UNLIKELY(other.get_attr_count() > 0) && get_attr_count() == 0) { + for (int64_t i = 0; i < other.get_attr_count() && OB_SUCC(ret); i++) { + ObRawExpr *attr_expr = NULL; + if (OB_FAIL(copier.copy(other.get_attr_expr(i), attr_expr))) { + LOG_WARN("failed to copy attr expr", K(ret)); + } else if (OB_ISNULL(attr_expr)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("null expr", K(ret)); + } else if (OB_FAIL(add_attr_expr(attr_expr))) { + LOG_WARN("fail to add attr expr", K(ret)); + } + } } } return ret;