diff options
author | Alexander Barkov <bar@mariadb.org> | 2014-03-23 15:15:07 +0400 |
---|---|---|
committer | Alexander Barkov <bar@mariadb.org> | 2014-03-23 15:15:07 +0400 |
commit | 92bd6801b9315607ab7f2af2ea45066a3ffbd70b (patch) | |
tree | 8afc045667f0b376a4ef2a2aa0fccc2bd5e12811 /mysql-test/t/xml.test | |
parent | e0f75b1bffa6ff5bacf7c72728fd356658fd9276 (diff) | |
download | mariadb-git-92bd6801b9315607ab7f2af2ea45066a3ffbd70b.tar.gz |
A joint patch for:
- MDEV-5689 ExtractValue(xml, 'substring(/x,/y)') crashes
- MDEV-5709 ExtractValue() with XPath variable references returns wrong result.
Description:
1. The main problem was that that nodeset_func->fix_fields() was
called in Item_func_xml_extractvalue::val_str() and
Item_func_xml_update::val_str(), which led in some cases to
execution of the XPath engine *before* having a parsed XML value.
Moved to Item_xml_str_func::fix_fields().
2. Cleanup: added a new method Item_xml_str_func::fix_fields() and moved
most of the code from Item_xml_str_func::fix_length_and_dec()
to Item_xml_str_func::fix_fields(), to follow the usual Item layout.
3. Cleanup: a parsed XML value is useless without the raw XML value
it was built from.
Previously the parsed and the raw values where stored in separate String
instances. It was hard to follow how they are synchronized.
Added a helper class XML which contains both parsed and raw values.
Makes things easier to read and modify.
4. MDEV-5709: const_item() could incorrectly return a "true"
result when XPath expression contains users/SP variable references.
Now nodeset_func->const_item() is also taken into account to
catch such cases.
5. Minor code enhancements.
Diffstat (limited to 'mysql-test/t/xml.test')
-rw-r--r-- | mysql-test/t/xml.test | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/mysql-test/t/xml.test b/mysql-test/t/xml.test index e84e3ac247f..bc9a74fd8cd 100644 --- a/mysql-test/t/xml.test +++ b/mysql-test/t/xml.test @@ -707,6 +707,36 @@ INSERT INTO t1 VALUES (CONCAT('<a><', REPEAT('b',128),'>b128</',REPEAT('b',128), SELECT ExtractValue (a, CONCAT('//',REPEAT('c',512))) AS c512 FROM t1; DROP TABLE t1; +--horizontal_results + --echo # --echo # End of 5.5 tests --echo # + +--echo # +--echo # Start of 10.0 tests +--echo # + + +--echo # +--echo # MDEV-5689 ExtractValue(xml, 'substring(/x,/y)') crashes +--echo # +SELECT ExtractValue('<a><b>abc</b><c>2</c><d>1</d></a>','substring(/a/b,..)') AS e; +SELECT ExtractValue('<a><b>abc</b><c>2</c><d>1</d></a>','substring(/a/b,/a/c)') AS e; +SELECT ExtractValue('<a><b>abc</b><c>2</c><d>1</d></a>','substring(/a/b,/a/d)') AS e; +SELECT ExtractValue('<a><b>abc</b><c>2</c><d>1</d></a>','substring(/a/b,/a/c,/a/d)') AS e; +SELECT ExtractValue('<a><b>abc</b><c>2</c><d>1</d></a>','substring(/a/b,/a/d,/a/c)') AS e; + +--echo # +--echo # MDEV-5709 ExtractValue() with XPath variable references returns wrong result +--echo # +CREATE TABLE t1 (c1 INT, c2 VARCHAR(10)); +INSERT INTO t1 VALUES (1,'b1'),(2,'b2'); +SELECT *,IF(@i:=c1,ExtractValue('<a><b>b1</b><b>b2</b></a>','//b[$@i]'),0) AS xpath FROM t1; +SELECT * FROM t1 WHERE c2=IF(@i:=c1,ExtractValue('<a><b>b1</b><b>b2</b></a>','//b[$@i]'),0); +DROP TABLE t1; + + +--echo # +--echo # End of 10.0 tests +--echo # |