[xml] fix ObPathVarObject mem leak

This commit is contained in:
GroundWu
2023-09-18 07:40:15 +00:00
committed by ob-robot
parent e1b1c0e61e
commit 98f8d4dd13
5 changed files with 45 additions and 45 deletions

View File

@ -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();

View File

@ -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))) {

View File

@ -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

View File

@ -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<ObDatum*> (allocator.alloc(sizeof(ObDatum)));
@ -541,7 +541,7 @@ TEST_F(TestXPath, test_seek_element_by_tag) // tested
std::cout<<str0.ptr()<<std::endl;
ObString str1 = "bookstore/book/title";
ObString default_ns;
ObPathVarObject pass;
ObPathVarObject pass(allocator);
ObDatum data;
data.set_string("bbb");
ret = pass.add("a", &data);
@ -632,7 +632,7 @@ TEST_F(TestXPath, test_seek_ellipsis_case) // tested
std::cout<<str0.ptr()<<std::endl;
ObString str1 = "//text()";
ObString default_ns;
ObPathVarObject pass;
ObPathVarObject pass(allocator);
ObDatum data;
data.set_string("bbb");
ret = pass.add("a", &data);
@ -715,7 +715,7 @@ TEST_F(TestXPath, test_seek_suite_ellipsis) // tested
std::cout<<str0.ptr()<<std::endl;
ObString str1 = "/descendant-or-self::node()/@name";
ObString default_ns;
ObPathVarObject pass;
ObPathVarObject pass(allocator);
ObDatum data;
data.set_string("ns2");
ret = pass.add("h", &data);
@ -798,7 +798,7 @@ TEST_F(TestXPath, test_seek_suite_case) // tested
std::cout<<str0.ptr()<<std::endl;
ObString str1 = "/ns1:a/ns2:b/@b1";
ObString default_ns("ns1");
ObPathVarObject pass;
ObPathVarObject pass(allocator);
ObDatum data;
data.set_string("ns2");
ret = pass.add("h", &data);
@ -881,7 +881,7 @@ TEST_F(TestXPath, test_seek_suite_filter) // tested
std::cout<<str0.ptr()<<std::endl;
ObString str1 = "/s/a99[//text() > \"离开\"]";
ObString default_ns;
ObPathVarObject pass;
ObPathVarObject pass(allocator);
ObDatum data;
data.set_string("bbb");
ret = pass.add("a", &data);
@ -964,7 +964,7 @@ TEST_F(TestXPath, test_seek_suite_complex_filter) // tested
std::cout<<str0.ptr()<<std::endl;
ObString str1 = "/a[//text() >= -100]/node()[self::node()/node() < 3]";
ObString default_ns;
ObPathVarObject pass;
ObPathVarObject pass(allocator);
ObDatum data;
data.set_string("bbb");
ret = pass.add("a", &data);
@ -1047,7 +1047,7 @@ TEST_F(TestXPath, test_seek_descendant_or_self_text) // tested
std::cout<<str0.ptr()<<std::endl;
ObString str1 = "a/descendant-or-self::text()";
ObString default_ns;
ObPathVarObject pass;
ObPathVarObject pass(allocator);
ObDatum data;
data.set_string("bbb");
ret = pass.add("a", &data);
@ -1128,7 +1128,7 @@ TEST_F(TestXPath, test_seek_all_element) // tested
std::cout<<str0.ptr()<<std::endl;
ObString str1 = "bookstore/book/*";
ObString default_ns;
ObPathVarObject pass;
ObPathVarObject pass(allocator);
ObDatum data;
data.set_string("bbb");
ret = pass.add("a", &data);
@ -1186,7 +1186,7 @@ TEST_F(TestXPath, test_seek_ns_element) // to test
std::cout<<str0.ptr()<<std::endl;
ObString str1 = "bookstore/bbb:book";
ObString default_ns;
ObPathVarObject pass;
ObPathVarObject pass(allocator);
ObDatum data;
data.set_string("bbb");
ret = pass.add("a", &data);
@ -1246,7 +1246,7 @@ TEST_F(TestXPath, test_seek_root) // tested
std::cout<<str0.ptr()<<std::endl;
ObString str1 = "/";
ObString default_ns;
ObPathVarObject pass;
ObPathVarObject pass(allocator);
ObDatum data;
data.set_string("bbb");
ret = pass.add("a", &data);
@ -1305,7 +1305,7 @@ TEST_F(TestXPath, test_seek_all_attribute) // to test
ret = ObXmlParserUtils::parse_document_text(ctx, xml_text, doc);
ASSERT_EQ(OB_SUCCESS, ret);
ObString default_ns;
ObPathVarObject pass;
ObPathVarObject pass(allocator);
ObDatum data;
data.set_string("bbb");
ret = pass.add("a", &data);
@ -1388,7 +1388,7 @@ TEST_F(TestXPath, test_seek_certain_attribute) // to test
ret = ObXmlParserUtils::parse_document_text(ctx, xml_text, doc);
ASSERT_EQ(OB_SUCCESS, ret);
ObString default_ns;
ObPathVarObject pass;
ObPathVarObject pass(allocator);
ObDatum data;
data.set_string("bbb");
ret = pass.add("a", &data);
@ -1473,7 +1473,7 @@ TEST_F(TestXPath, test_seek_ns_attribute) // to test
std::cout<<str0.ptr()<<std::endl;
ObString str1 = "bookstore/book/@bbb:lang";
ObString default_ns;
ObPathVarObject pass;
ObPathVarObject pass(allocator);
ObDatum data;
data.set_string("bbb");
ret = pass.add("a", &data);
@ -1555,7 +1555,7 @@ TEST_F(TestXPath, test_seek_node) // tested
std::cout<<str0.ptr()<<std::endl;
ObString str1 = "bookstore/node()";
ObString default_ns;
ObPathVarObject pass;
ObPathVarObject pass(allocator);
ObDatum data;
data.set_string("bbb");
ret = pass.add("a", &data);
@ -1614,7 +1614,7 @@ TEST_F(TestXPath, test_seek_text) // tested
std::cout<<str0.ptr()<<std::endl;
ObString str1 = "bookstore/book/text()";
ObString default_ns;
ObPathVarObject pass;
ObPathVarObject pass(allocator);
ObDatum data;
data.set_string("bbb");
ret = pass.add("a", &data);
@ -1672,7 +1672,7 @@ TEST_F(TestXPath, test_seek_comment) // tested
std::cout<<str0.ptr()<<std::endl;
ObString str1 = "bookstore/comment()";
ObString default_ns;
ObPathVarObject pass;
ObPathVarObject pass(allocator);
ObDatum data;
data.set_string("bbb");
ret = pass.add("a", &data);
@ -1730,7 +1730,7 @@ TEST_F(TestXPath, test_seek_pi_wildcard) // tested
std::cout<<str0.ptr()<<std::endl;
ObString str1 = "bookstore/processing-instruction()";
ObString default_ns;
ObPathVarObject pass;
ObPathVarObject pass(allocator);
ObDatum data;
data.set_string("bbb");
ret = pass.add("a", &data);
@ -1788,7 +1788,7 @@ TEST_F(TestXPath, test_seek_certain_pi) // tested
std::cout<<str0.ptr()<<std::endl;
ObString str1 = "bookstore/processing-instruction(\"price2\")";
ObString default_ns;
ObPathVarObject pass;
ObPathVarObject pass(allocator);
ObDatum data;
data.set_string("bbb");
ret = pass.add("a", &data);
@ -1847,7 +1847,7 @@ TEST_F(TestXPath, test_seek_default_ns_attribute)
std::cout<<str0.ptr()<<std::endl;
ObString str1 = "/ns1:a/ns2:b/@b1";
ObString default_ns("ns1");
ObPathVarObject pass;
ObPathVarObject pass(allocator);
ObDatum data;
data.set_string("ns2");
ret = pass.add("h", &data);
@ -1912,7 +1912,7 @@ TEST_F(TestXPath, test_seek_self)
std::cout<<str0.ptr()<<std::endl;
ObString str1 = "/root/*/b/*/self::*";
ObString default_ns;
ObPathVarObject pass;
ObPathVarObject pass(allocator);
ObDatum data;
data.set_string("ns2");
ret = pass.add("h", &data);
@ -1977,7 +1977,7 @@ TEST_F(TestXPath, test_seek_basic_descendant) // tested
std::cout<<str0.ptr()<<std::endl;
ObString str1 = "root/*/b/b1/descendant::*";
ObString default_ns;
ObPathVarObject pass;
ObPathVarObject pass(allocator);
ObDatum data;
data.set_string("ns2");
ret = pass.add("h", &data);
@ -2042,7 +2042,7 @@ TEST_F(TestXPath, test_seek_descendant) // tested
std::cout<<str0.ptr()<<std::endl;
ObString str1 = "root/*/b/descendant::*/node()/text()";
ObString default_ns;
ObPathVarObject pass;
ObPathVarObject pass(allocator);
ObDatum data;
data.set_string("ns2");
ret = pass.add("h", &data);
@ -2106,7 +2106,7 @@ TEST_F(TestXPath, test_seek_descendant_or_self) // tested
std::cout<<str0.ptr()<<std::endl;
ObString str1 = "root/*/b/descendant-or-self::*/node()/text()";
ObString default_ns;
ObPathVarObject pass;
ObPathVarObject pass(allocator);
ObDatum data;
data.set_string("ns2");
ret = pass.add("h", &data);
@ -2172,7 +2172,7 @@ TEST_F(TestXPath, test_seek_descendant_self_text) // tested
std::cout<<str0.ptr()<<std::endl;
ObString str1 = "/descendant-or-self::node()/text()";
ObString default_ns;
ObPathVarObject pass;
ObPathVarObject pass(allocator);
ObDatum data;
data.set_string("ns2");
ret = pass.add("h", &data);
@ -2236,7 +2236,7 @@ TEST_F(TestXPath, test_seek_user_extract)
std::cout<<str0.ptr()<<std::endl;
ObString str1 = "/Rule/Format";
ObString default_ns;
ObPathVarObject pass;
ObPathVarObject pass(allocator);
ObDatum data;
data.set_string("ns2");
ret = pass.add("h", &data);
@ -2300,7 +2300,7 @@ TEST_F(TestXPath, test_seek_parent) // tested
std::cout<<str0.ptr()<<std::endl;
ObString str1 = "root/*/b/b2/b22/parent::*";
ObString default_ns;
ObPathVarObject pass;
ObPathVarObject pass(allocator);
ObDatum data;
data.set_string("ns2");
ret = pass.add("h", &data);
@ -2388,7 +2388,7 @@ TEST_F(TestXPath, test_seek_parent_child) // tested
std::cout<<str0.ptr()<<std::endl;
ObString str1 = "root/*/b/b2/b22/parent::*/node()";
ObString default_ns;
ObPathVarObject pass;
ObPathVarObject pass(allocator);
ObDatum data;
data.set_string("ns2");
ret = pass.add("h", &data);
@ -2455,7 +2455,7 @@ TEST_F(TestXPath, test_seek_ancestor) // tested
std::cout<<str0.ptr()<<std::endl;
ObString str1 = "root/*/b/b2/b22/ancestor::*";
ObString default_ns;
ObPathVarObject pass;
ObPathVarObject pass(allocator);
ObDatum data;
data.set_string("ns2");
ret = pass.add("h", &data);
@ -2545,7 +2545,7 @@ TEST_F(TestXPath, test_seek_ancestor_or_self) //tested
std::cout<<str0.ptr()<<std::endl;
ObString str1 = "root/*/b/b2/b22/ancestor::*";
ObString default_ns;
ObPathVarObject pass;
ObPathVarObject pass(allocator);
ObDatum data;
data.set_string("ns2");
ret = pass.add("h", &data);
@ -2607,7 +2607,7 @@ TEST_F(TestXPath, test_seek_root_ancestor) // tested
std::cout<<str0.ptr()<<std::endl;
ObString str1 = "root/ancestor::*";
ObString default_ns;
ObPathVarObject pass;
ObPathVarObject pass(allocator);
ObDatum data;
data.set_string("ns2");
ret = pass.add("h", &data);
@ -2656,7 +2656,7 @@ TEST_F(TestXPath, test_seek_root_parent) // tested
std::cout<<str0.ptr()<<std::endl;
ObString str1 = "root/parent::*";
ObString default_ns;
ObPathVarObject pass;
ObPathVarObject pass(allocator);
ObDatum data;
data.set_string("ns2");
ret = pass.add("h", &data);

View File

@ -62,7 +62,7 @@ TEST_F(TestXPathFilter, test_false_function)
ObString enter_xpath = func_false_enter[i];
std::cout << enter_xpath.ptr() << std::endl;
ObString default_ns;
ObPathVarObject pass;
ObPathVarObject pass(allocator);
ObDatum data;
data.set_string("ns2");
ret = pass.add("h", &data);
@ -117,7 +117,7 @@ TEST_F(TestXPathFilter, test_function)
ObString enter_xpath = func_enter[i];
std::cout << enter_xpath.ptr() << std::endl;
ObString default_ns;
ObPathVarObject pass;
ObPathVarObject pass(allocator);
ObDatum data;
data.set_string("ns2");
ret = pass.add("h", &data);
@ -164,7 +164,7 @@ TEST_F(TestXPathFilter, test_complex_in_predicate)
ObString enter_xpath = "/tmp/a[/tmp/a = \"xyz\"]";
std::cout << enter_xpath.ptr() << std::endl;
ObString default_ns;
ObPathVarObject pass;
ObPathVarObject pass(allocator);
ObDatum data;
data.set_string("ns2");
ret = pass.add("h", &data);
@ -414,7 +414,7 @@ TEST_F(TestXPathFilter, test_in_predicate)
ObString enter_xpath = enter_predicate[i];
std::cout << enter_xpath.ptr() << std::endl;
ObString default_ns;
ObPathVarObject pass;
ObPathVarObject pass(allocator);
ObDatum data;
data.set_string("ns2");
ret = pass.add("h", &data);
@ -576,7 +576,7 @@ TEST_F(TestXPathFilter, test_false_in_predicate)
std::cout << "TEST: " << i << std::endl;
std::cout << enter_xpath.ptr() << std::endl;
ObString default_ns;
ObPathVarObject pass;
ObPathVarObject pass(allocator);
ObDatum data;
data.set_string("ns2");
ret = pass.add("h", &data);
@ -635,7 +635,7 @@ TEST_F(TestXPathFilter, test_equal_compare)
ObString enter_xpath = enter_compare[i];
std::cout << enter_xpath.ptr() << std::endl;
ObString default_ns;
ObPathVarObject pass;
ObPathVarObject pass(allocator);
ObDatum data;
data.set_string("ns2");
ret = pass.add("h", &data);