Bug#43183 ExctractValue() brings result list in missorder
The problem is that XML functions(items) do not reset null_value before their execution and further item excution may use null_value value of the previous result. The fix is to reset null_value. mysql-test/r/xml.result: test result mysql-test/t/xml.test: test case sql/item_xmlfunc.cc: The problem is that XML functions(items) do not reset null_value before their execution and further item excution may use null_value value of the previous result. The fix is to reset null_value.
This commit is contained in:
parent
968069d845
commit
b46dc9ca4d
@ -1064,4 +1064,33 @@ select extractvalue('<a></a>','"b"/a');
|
|||||||
ERROR HY000: XPATH syntax error: '/a'
|
ERROR HY000: XPATH syntax error: '/a'
|
||||||
select extractvalue('<a></a>','(1)/a');
|
select extractvalue('<a></a>','(1)/a');
|
||||||
ERROR HY000: XPATH syntax error: '/a'
|
ERROR HY000: XPATH syntax error: '/a'
|
||||||
|
CREATE TABLE IF NOT EXISTS t1 (
|
||||||
|
id int(10) unsigned NOT NULL AUTO_INCREMENT,
|
||||||
|
xml text,
|
||||||
|
PRIMARY KEY (id)
|
||||||
|
) ENGINE=MyISAM;
|
||||||
|
INSERT INTO t1 (id, xml) VALUES
|
||||||
|
(15, '<?xml version="1.0"?><bla name="blubb"></bla>'),
|
||||||
|
(14, '<xml version="kaputt">');
|
||||||
|
SELECT
|
||||||
|
extractvalue( xml, '/bla/@name' ),
|
||||||
|
extractvalue( xml, '/bla/@name' )
|
||||||
|
FROM t1 ORDER BY t1.id;
|
||||||
|
extractvalue( xml, '/bla/@name' ) extractvalue( xml, '/bla/@name' )
|
||||||
|
NULL NULL
|
||||||
|
blubb blubb
|
||||||
|
Warnings:
|
||||||
|
Warning 1525 Incorrect XML value: 'parse error at line 1 pos 23: unexpected END-OF-INPUT'
|
||||||
|
Warning 1525 Incorrect XML value: 'parse error at line 1 pos 23: unexpected END-OF-INPUT'
|
||||||
|
SELECT
|
||||||
|
UpdateXML(xml, '/bla/@name', 'test'),
|
||||||
|
UpdateXML(xml, '/bla/@name', 'test')
|
||||||
|
FROM t1 ORDER BY t1.id;
|
||||||
|
UpdateXML(xml, '/bla/@name', 'test') UpdateXML(xml, '/bla/@name', 'test')
|
||||||
|
NULL NULL
|
||||||
|
<?xml version="1.0"?><bla test></bla> <?xml version="1.0"?><bla test></bla>
|
||||||
|
Warnings:
|
||||||
|
Warning 1525 Incorrect XML value: 'parse error at line 1 pos 23: unexpected END-OF-INPUT'
|
||||||
|
Warning 1525 Incorrect XML value: 'parse error at line 1 pos 23: unexpected END-OF-INPUT'
|
||||||
|
DROP TABLE t1;
|
||||||
End of 5.1 tests
|
End of 5.1 tests
|
||||||
|
@ -590,4 +590,31 @@ select extractvalue('<a></a>','"b"/a');
|
|||||||
--error ER_UNKNOWN_ERROR
|
--error ER_UNKNOWN_ERROR
|
||||||
select extractvalue('<a></a>','(1)/a');
|
select extractvalue('<a></a>','(1)/a');
|
||||||
|
|
||||||
|
#
|
||||||
|
# Bug#43183 ExctractValue() brings result list in missorder
|
||||||
|
#
|
||||||
|
CREATE TABLE IF NOT EXISTS t1 (
|
||||||
|
id int(10) unsigned NOT NULL AUTO_INCREMENT,
|
||||||
|
xml text,
|
||||||
|
PRIMARY KEY (id)
|
||||||
|
) ENGINE=MyISAM;
|
||||||
|
|
||||||
|
INSERT INTO t1 (id, xml) VALUES
|
||||||
|
(15, '<?xml version="1.0"?><bla name="blubb"></bla>'),
|
||||||
|
(14, '<xml version="kaputt">');
|
||||||
|
|
||||||
|
|
||||||
|
SELECT
|
||||||
|
extractvalue( xml, '/bla/@name' ),
|
||||||
|
extractvalue( xml, '/bla/@name' )
|
||||||
|
FROM t1 ORDER BY t1.id;
|
||||||
|
|
||||||
|
|
||||||
|
SELECT
|
||||||
|
UpdateXML(xml, '/bla/@name', 'test'),
|
||||||
|
UpdateXML(xml, '/bla/@name', 'test')
|
||||||
|
FROM t1 ORDER BY t1.id;
|
||||||
|
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
--echo End of 5.1 tests
|
--echo End of 5.1 tests
|
||||||
|
@ -2785,6 +2785,7 @@ String *Item_xml_str_func::parse_xml(String *raw_xml, String *parsed_xml_buf)
|
|||||||
String *Item_func_xml_extractvalue::val_str(String *str)
|
String *Item_func_xml_extractvalue::val_str(String *str)
|
||||||
{
|
{
|
||||||
String *res;
|
String *res;
|
||||||
|
null_value= 0;
|
||||||
if (!nodeset_func ||
|
if (!nodeset_func ||
|
||||||
!(res= args[0]->val_str(str)) ||
|
!(res= args[0]->val_str(str)) ||
|
||||||
!parse_xml(res, &pxml))
|
!parse_xml(res, &pxml))
|
||||||
@ -2801,6 +2802,7 @@ String *Item_func_xml_update::val_str(String *str)
|
|||||||
{
|
{
|
||||||
String *res, *nodeset, *rep;
|
String *res, *nodeset, *rep;
|
||||||
|
|
||||||
|
null_value= 0;
|
||||||
if (!nodeset_func ||
|
if (!nodeset_func ||
|
||||||
!(res= args[0]->val_str(str)) ||
|
!(res= args[0]->val_str(str)) ||
|
||||||
!(rep= args[2]->val_str(&tmp_value3)) ||
|
!(rep= args[2]->val_str(&tmp_value3)) ||
|
||||||
|
Loading…
x
Reference in New Issue
Block a user