From 98f8d4dd131339e944d639fb9c5600c0b0881e0e Mon Sep 17 00:00:00 2001 From: GroundWu <1175416256@qq.com> Date: Mon, 18 Sep 2023 07:40:15 +0000 Subject: [PATCH] [xml] fix ObPathVarObject mem leak --- src/sql/engine/expr/ob_expr_extract_value.cpp | 4 +- src/sql/engine/expr/ob_expr_extract_xml.cpp | 4 +- src/sql/engine/expr/ob_expr_update_xml.cpp | 6 +- unittest/share/test_xpath.cpp | 64 +++++++++---------- unittest/share/test_xpath_filter.cpp | 12 ++-- 5 files changed, 45 insertions(+), 45 deletions(-) diff --git a/src/sql/engine/expr/ob_expr_extract_value.cpp b/src/sql/engine/expr/ob_expr_extract_value.cpp index 9068fe343e..14e9db846e 100644 --- a/src/sql/engine/expr/ob_expr_extract_value.cpp +++ b/src/sql/engine/expr/ob_expr_extract_value.cpp @@ -98,7 +98,7 @@ int ObExprExtractValue::eval_extract_value(const ObExpr &expr, ObEvalCtx &ctx, O ObIMulModeBase *xml_doc = NULL; ObPathExprIter xpath_iter(&allocator); ObString default_ns; - ObPathVarObject *prefix_ns = NULL; + ObPathVarObject prefix_ns(allocator); ObNodeMemType expect_type = ObNodeMemType::BINARY_TYPE; ObString xml_res; ObCollationType cs_type = CS_TYPE_INVALID; @@ -132,7 +132,7 @@ int ObExprExtractValue::eval_extract_value(const ObExpr &expr, ObEvalCtx &ctx, O if (OB_FAIL(ret)) { } else if (OB_FAIL(ObXMLExprHelper::get_xml_base(xml_mem_ctx, xml_datum, cs_type, expect_type, xml_doc))) { LOG_WARN("fail to parse xml doc", K(ret)); - } else if (OB_FAIL(extract_xpath_result(xml_mem_ctx, xpath_str, default_ns, xml_doc, prefix_ns, xml_res))) { + } else if (OB_FAIL(extract_xpath_result(xml_mem_ctx, xpath_str, default_ns, xml_doc, &prefix_ns, xml_res))) { LOG_WARN("fail to extract xpath result", K(ret), K(xpath_str)); } else if (xml_res.empty()) { res.set_null(); diff --git a/src/sql/engine/expr/ob_expr_extract_xml.cpp b/src/sql/engine/expr/ob_expr_extract_xml.cpp index 8e3de7475c..16ffb6e8b5 100644 --- a/src/sql/engine/expr/ob_expr_extract_xml.cpp +++ b/src/sql/engine/expr/ob_expr_extract_xml.cpp @@ -92,7 +92,7 @@ int ObExprExtractXml::eval_extract_xml(const ObExpr &expr, ObEvalCtx &ctx, ObDat ObIMulModeBase *xml_doc = NULL; ObPathExprIter xpath_iter(&allocator); ObString default_ns; - ObPathVarObject *prefix_ns = NULL; + ObPathVarObject prefix_ns(allocator); ObString xml_res; ObXmlDocument *root = nullptr; ObMulModeNodeType node_type = M_MAX_TYPE; @@ -128,7 +128,7 @@ int ObExprExtractXml::eval_extract_xml(const ObExpr &expr, ObEvalCtx &ctx, ObDat if (OB_FAIL(ret)) { } else if (OB_FAIL(ObXMLExprHelper::get_xml_base(mem_ctx, xml_datum, cs_type, expect_type, xml_doc))) { LOG_WARN("fail to parse xml doc", K(ret)); - } else if (OB_FAIL(xpath_iter.init(mem_ctx, xpath_str, default_ns, xml_doc, prefix_ns))) { + } else if (OB_FAIL(xpath_iter.init(mem_ctx, xpath_str, default_ns, xml_doc, &prefix_ns))) { LOG_WARN("fail to init xpath iterator", K(xpath_str), K(default_ns), K(ret)); ObXMLExprHelper::replace_xpath_ret_code(ret); } else if (OB_FAIL(concat_xpath_result(xpath_iter, cs_type, root, node_type, mem_ctx))) { diff --git a/src/sql/engine/expr/ob_expr_update_xml.cpp b/src/sql/engine/expr/ob_expr_update_xml.cpp index b67852e242..994569e021 100644 --- a/src/sql/engine/expr/ob_expr_update_xml.cpp +++ b/src/sql/engine/expr/ob_expr_update_xml.cpp @@ -113,7 +113,7 @@ int ObExprUpdateXml::eval_update_xml(const ObExpr &expr, ObEvalCtx &ctx, ObDatum ObIMulModeBase *xml_tree = NULL; bool has_namespace_str = false; int64_t num_child = expr.arg_cnt_; - ObPathVarObject *prefix_ns = NULL; + ObPathVarObject prefix_ns(allocator); ObString default_ns; ObCollationType cs_type = CS_TYPE_INVALID; ObMulModeMemCtx* xml_mem_ctx = nullptr; @@ -161,8 +161,8 @@ int ObExprUpdateXml::eval_update_xml(const ObExpr &expr, ObEvalCtx &ctx, ObDatum } else if (xpath_str.empty()) { ret = OB_ERR_INVALID_XPATH_EXPRESSION; LOG_WARN("xpath is empty", K(ret)); - } else if (OB_FAIL(update_xml_tree(xml_mem_ctx, expr.args_[i+1], ctx, xpath_str, default_ns, prefix_ns, xml_tree))) { - LOG_WARN("fail to do update in xml tree", K(ret), K(xml_tree), K(xpath_str), K(default_ns), K(prefix_ns), K(i+1)); + } else if (OB_FAIL(update_xml_tree(xml_mem_ctx, expr.args_[i+1], ctx, xpath_str, default_ns, &prefix_ns, xml_tree))) { + LOG_WARN("fail to do update in xml tree", K(ret), K(xml_tree), K(xpath_str), K(default_ns), K(i+1)); } } // set result diff --git a/unittest/share/test_xpath.cpp b/unittest/share/test_xpath.cpp index 7f3b3e4a3e..459f2e9e2e 100644 --- a/unittest/share/test_xpath.cpp +++ b/unittest/share/test_xpath.cpp @@ -228,7 +228,7 @@ TEST_F(TestXPath, test_ns) ObArenaAllocator allocator(ObModIds::TEST); ObMulModeMemCtx* ctx = nullptr; ASSERT_EQ(ObXmlUtil::create_mulmode_tree_context(&allocator, ctx), OB_SUCCESS); - ObPathVarObject ans; + ObPathVarObject ans(allocator); ObString data_value("ns_str"); ObDatum* data = static_cast (allocator.alloc(sizeof(ObDatum))); @@ -541,7 +541,7 @@ TEST_F(TestXPath, test_seek_element_by_tag) // tested std::cout<