mirror of
https://github.com/MariaDB/server.git
synced 2025-01-19 05:22:25 +01:00
92bd6801b9
- 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.
1254 lines
46 KiB
Text
1254 lines
46 KiB
Text
SET @xml='<a aa1="aa1" aa2="aa2">a1<b ba1="ba1">b1<c>c1</c>b2</b>a2</a>';
|
|
SELECT extractValue(@xml,'/a');
|
|
extractValue(@xml,'/a')
|
|
a1 a2
|
|
SELECT extractValue(@xml,'/a/b');
|
|
extractValue(@xml,'/a/b')
|
|
b1 b2
|
|
SELECT extractValue(@xml,'/a/b/c');
|
|
extractValue(@xml,'/a/b/c')
|
|
c1
|
|
SELECT extractValue(@xml,'/a/@aa1');
|
|
extractValue(@xml,'/a/@aa1')
|
|
aa1
|
|
SELECT extractValue(@xml,'/a/@aa2');
|
|
extractValue(@xml,'/a/@aa2')
|
|
aa2
|
|
SELECT extractValue(@xml,'/a/@*');
|
|
extractValue(@xml,'/a/@*')
|
|
aa1 aa2
|
|
SELECT extractValue(@xml,'//@ba1');
|
|
extractValue(@xml,'//@ba1')
|
|
ba1
|
|
SELECT extractValue(@xml,'//a');
|
|
extractValue(@xml,'//a')
|
|
a1 a2
|
|
SELECT extractValue(@xml,'//b');
|
|
extractValue(@xml,'//b')
|
|
b1 b2
|
|
SELECT extractValue(@xml,'//c');
|
|
extractValue(@xml,'//c')
|
|
c1
|
|
SELECT extractValue(@xml,'/a//b');
|
|
extractValue(@xml,'/a//b')
|
|
b1 b2
|
|
SELECT extractValue(@xml,'/a//c');
|
|
extractValue(@xml,'/a//c')
|
|
c1
|
|
SELECT extractValue(@xml,'//*');
|
|
extractValue(@xml,'//*')
|
|
a1 b1 c1 b2 a2
|
|
SELECT extractValue(@xml,'/a//*');
|
|
extractValue(@xml,'/a//*')
|
|
b1 c1 b2
|
|
SELECT extractValue(@xml,'/./a');
|
|
extractValue(@xml,'/./a')
|
|
a1 a2
|
|
SELECT extractValue(@xml,'/a/b/.');
|
|
extractValue(@xml,'/a/b/.')
|
|
b1 b2
|
|
SELECT extractValue(@xml,'/a/b/..');
|
|
extractValue(@xml,'/a/b/..')
|
|
a1 a2
|
|
SELECT extractValue(@xml,'/a/b/../@aa1');
|
|
extractValue(@xml,'/a/b/../@aa1')
|
|
aa1
|
|
SELECT extractValue(@xml,'/*');
|
|
extractValue(@xml,'/*')
|
|
a1 a2
|
|
SELECT extractValue(@xml,'/*/*');
|
|
extractValue(@xml,'/*/*')
|
|
b1 b2
|
|
SELECT extractValue(@xml,'/*/*/*');
|
|
extractValue(@xml,'/*/*/*')
|
|
c1
|
|
SELECT extractValue(@xml,'/a/child::*');
|
|
extractValue(@xml,'/a/child::*')
|
|
b1 b2
|
|
SELECT extractValue(@xml,'/a/self::*');
|
|
extractValue(@xml,'/a/self::*')
|
|
a1 a2
|
|
SELECT extractValue(@xml,'/a/descendant::*');
|
|
extractValue(@xml,'/a/descendant::*')
|
|
b1 c1 b2
|
|
SELECT extractValue(@xml,'/a/descendant-or-self::*');
|
|
extractValue(@xml,'/a/descendant-or-self::*')
|
|
a1 b1 c1 b2 a2
|
|
SELECT extractValue(@xml,'/a/attribute::*');
|
|
extractValue(@xml,'/a/attribute::*')
|
|
aa1 aa2
|
|
SELECT extractValue(@xml,'/a/b/c/parent::*');
|
|
extractValue(@xml,'/a/b/c/parent::*')
|
|
b1 b2
|
|
SELECT extractValue(@xml,'/a/b/c/ancestor::*');
|
|
extractValue(@xml,'/a/b/c/ancestor::*')
|
|
a1 b1 b2 a2
|
|
SELECT extractValue(@xml,'/a/b/c/ancestor-or-self::*');
|
|
extractValue(@xml,'/a/b/c/ancestor-or-self::*')
|
|
a1 b1 c1 b2 a2
|
|
SELECT extractValue(@xml,'/descendant-or-self::*');
|
|
extractValue(@xml,'/descendant-or-self::*')
|
|
a1 b1 c1 b2 a2
|
|
SET @xml='<a>a11<b ba="ba11" ba="ba12">b11</b><b ba="ba21" ba="ba22">b21<c>c1</c>b22</b>a12</a>';
|
|
SELECT extractValue(@xml,'/a/b/c/ancestor-or-self::*');
|
|
extractValue(@xml,'/a/b/c/ancestor-or-self::*')
|
|
a11 b21 c1 b22 a12
|
|
SELECT extractValue(@xml,'//@ba');
|
|
extractValue(@xml,'//@ba')
|
|
ba11 ba12 ba21 ba22
|
|
SET @xml='<a><b>b</b><c>c</c></a>';
|
|
SELECT extractValue(@xml,'/a/b');
|
|
extractValue(@xml,'/a/b')
|
|
b
|
|
SELECT extractValue(@xml,'/a/c');
|
|
extractValue(@xml,'/a/c')
|
|
c
|
|
SELECT extractValue(@xml,'/a/child::b');
|
|
extractValue(@xml,'/a/child::b')
|
|
b
|
|
SELECT extractValue(@xml,'/a/child::c');
|
|
extractValue(@xml,'/a/child::c')
|
|
c
|
|
SET @xml='<a><b>b1</b><c>c1</c><b>b2</b><c>c2</c></a>';
|
|
SELECT extractValue(@xml,'/a/b[1]');
|
|
extractValue(@xml,'/a/b[1]')
|
|
b1
|
|
SELECT extractValue(@xml,'/a/b[2]');
|
|
extractValue(@xml,'/a/b[2]')
|
|
b2
|
|
SELECT extractValue(@xml,'/a/c[1]');
|
|
extractValue(@xml,'/a/c[1]')
|
|
c1
|
|
SELECT extractValue(@xml,'/a/c[2]');
|
|
extractValue(@xml,'/a/c[2]')
|
|
c2
|
|
SET @xml='<a><b x="xb1" x="xb2"/><c x="xc1" x="xc2"/></a>';
|
|
SELECT extractValue(@xml,'/a//@x');
|
|
extractValue(@xml,'/a//@x')
|
|
xb1 xb2 xc1 xc2
|
|
SELECT extractValue(@xml,'/a//@x[1]');
|
|
extractValue(@xml,'/a//@x[1]')
|
|
xb1 xc1
|
|
SELECT extractValue(@xml,'/a//@x[2]');
|
|
extractValue(@xml,'/a//@x[2]')
|
|
xb2 xc2
|
|
SET @xml='<a><b>b1</b><b>b2</b><c><b>c1b1</b><b>c1b2</b></c><c><b>c2b1</c></b></a>';
|
|
SELECT extractValue(@xml,'//b[1]');
|
|
extractValue(@xml,'//b[1]')
|
|
b1 c1b1 c2b1
|
|
SELECT extractValue(@xml,'/descendant::b[1]');
|
|
extractValue(@xml,'/descendant::b[1]')
|
|
b1
|
|
SET @xml='<a><b>b1</b><b>b2</b></a>';
|
|
SELECT extractValue(@xml,'/a/b[1+0]');
|
|
extractValue(@xml,'/a/b[1+0]')
|
|
b1
|
|
SELECT extractValue(@xml,'/a/b[1*1]');
|
|
extractValue(@xml,'/a/b[1*1]')
|
|
b1
|
|
SELECT extractValue(@xml,'/a/b[--1]');
|
|
extractValue(@xml,'/a/b[--1]')
|
|
b1
|
|
SELECT extractValue(@xml,'/a/b[2*1-1]');
|
|
extractValue(@xml,'/a/b[2*1-1]')
|
|
b1
|
|
SELECT extractValue(@xml,'/a/b[1+1]');
|
|
extractValue(@xml,'/a/b[1+1]')
|
|
b2
|
|
SELECT extractValue(@xml,'/a/b[1*2]');
|
|
extractValue(@xml,'/a/b[1*2]')
|
|
b2
|
|
SELECT extractValue(@xml,'/a/b[--2]');
|
|
extractValue(@xml,'/a/b[--2]')
|
|
b2
|
|
SELECT extractValue(@xml,'/a/b[1*(3-1)]');
|
|
extractValue(@xml,'/a/b[1*(3-1)]')
|
|
b2
|
|
SELECT extractValue(@xml,'//*[1=1]');
|
|
extractValue(@xml,'//*[1=1]')
|
|
b1 b2
|
|
SELECT extractValue(@xml,'//*[1!=1]');
|
|
extractValue(@xml,'//*[1!=1]')
|
|
|
|
SELECT extractValue(@xml,'//*[1>1]');
|
|
extractValue(@xml,'//*[1>1]')
|
|
|
|
SELECT extractValue(@xml,'//*[2>1]');
|
|
extractValue(@xml,'//*[2>1]')
|
|
b1 b2
|
|
SELECT extractValue(@xml,'//*[1>2]');
|
|
extractValue(@xml,'//*[1>2]')
|
|
|
|
SELECT extractValue(@xml,'//*[1>=1]');
|
|
extractValue(@xml,'//*[1>=1]')
|
|
b1 b2
|
|
SELECT extractValue(@xml,'//*[2>=1]');
|
|
extractValue(@xml,'//*[2>=1]')
|
|
b1 b2
|
|
SELECT extractValue(@xml,'//*[1>=2]');
|
|
extractValue(@xml,'//*[1>=2]')
|
|
|
|
SELECT extractValue(@xml,'//*[1<1]');
|
|
extractValue(@xml,'//*[1<1]')
|
|
|
|
SELECT extractValue(@xml,'//*[2<1]');
|
|
extractValue(@xml,'//*[2<1]')
|
|
|
|
SELECT extractValue(@xml,'//*[1<2]');
|
|
extractValue(@xml,'//*[1<2]')
|
|
b1 b2
|
|
SELECT extractValue(@xml,'//*[1<=1]');
|
|
extractValue(@xml,'//*[1<=1]')
|
|
b1 b2
|
|
SELECT extractValue(@xml,'//*[2<=1]');
|
|
extractValue(@xml,'//*[2<=1]')
|
|
|
|
SELECT extractValue(@xml,'//*[1<=2]');
|
|
extractValue(@xml,'//*[1<=2]')
|
|
b1 b2
|
|
SET @xml='<a><b>b11<c>c11</c></b><b>b21<c>c21</c></b></a>';
|
|
SELECT extractValue(@xml,'/a/b[c="c11"]');
|
|
extractValue(@xml,'/a/b[c="c11"]')
|
|
b11
|
|
SELECT extractValue(@xml,'/a/b[c="c21"]');
|
|
extractValue(@xml,'/a/b[c="c21"]')
|
|
b21
|
|
SET @xml='<a><b c="c11">b11</b><b c="c21">b21</b></a>';
|
|
SELECT extractValue(@xml,'/a/b[@c="c11"]');
|
|
extractValue(@xml,'/a/b[@c="c11"]')
|
|
b11
|
|
SELECT extractValue(@xml,'/a/b[@c="c21"]');
|
|
extractValue(@xml,'/a/b[@c="c21"]')
|
|
b21
|
|
SET @xml='<a>a1<b c="c11">b11<d>d11</d></b><b c="c21">b21<d>d21</d></b></a>';
|
|
SELECT extractValue(@xml, '/a/b[@c="c11"]/d');
|
|
extractValue(@xml, '/a/b[@c="c11"]/d')
|
|
d11
|
|
SELECT extractValue(@xml, '/a/b[@c="c21"]/d');
|
|
extractValue(@xml, '/a/b[@c="c21"]/d')
|
|
d21
|
|
SELECT extractValue(@xml, '/a/b[d="d11"]/@c');
|
|
extractValue(@xml, '/a/b[d="d11"]/@c')
|
|
c11
|
|
SELECT extractValue(@xml, '/a/b[d="d21"]/@c');
|
|
extractValue(@xml, '/a/b[d="d21"]/@c')
|
|
c21
|
|
SELECT extractValue(@xml, '/a[b="b11"]');
|
|
extractValue(@xml, '/a[b="b11"]')
|
|
a1
|
|
SELECT extractValue(@xml, '/a[b/@c="c11"]');
|
|
extractValue(@xml, '/a[b/@c="c11"]')
|
|
a1
|
|
SELECT extractValue(@xml, '/a[b/d="d11"]');
|
|
extractValue(@xml, '/a[b/d="d11"]')
|
|
a1
|
|
SELECT extractValue(@xml, '/a[/a/b="b11"]');
|
|
extractValue(@xml, '/a[/a/b="b11"]')
|
|
a1
|
|
SELECT extractValue(@xml, '/a[/a/b/@c="c11"]');
|
|
extractValue(@xml, '/a[/a/b/@c="c11"]')
|
|
a1
|
|
SELECT extractValue(@xml, '/a[/a/b/d="d11"]');
|
|
extractValue(@xml, '/a[/a/b/d="d11"]')
|
|
a1
|
|
SELECT extractValue('<a>a</a>', '/a[false()]');
|
|
extractValue('<a>a</a>', '/a[false()]')
|
|
|
|
SELECT extractValue('<a>a</a>', '/a[true()]');
|
|
extractValue('<a>a</a>', '/a[true()]')
|
|
a
|
|
SELECT extractValue('<a>a</a>', '/a[not(false())]');
|
|
extractValue('<a>a</a>', '/a[not(false())]')
|
|
a
|
|
SELECT extractValue('<a>a</a>', '/a[not(true())]');
|
|
extractValue('<a>a</a>', '/a[not(true())]')
|
|
|
|
SELECT extractValue('<a>a</a>', '/a[true() and true()]');
|
|
extractValue('<a>a</a>', '/a[true() and true()]')
|
|
a
|
|
SELECT extractValue('<a>a</a>', '/a[true() and false()]');
|
|
extractValue('<a>a</a>', '/a[true() and false()]')
|
|
|
|
SELECT extractValue('<a>a</a>', '/a[false()and false()]');
|
|
extractValue('<a>a</a>', '/a[false()and false()]')
|
|
|
|
SELECT extractValue('<a>a</a>', '/a[false()and true()]');
|
|
extractValue('<a>a</a>', '/a[false()and true()]')
|
|
|
|
SELECT extractValue('<a>a</a>', '/a[true() or true()]');
|
|
extractValue('<a>a</a>', '/a[true() or true()]')
|
|
a
|
|
SELECT extractValue('<a>a</a>', '/a[true() or false()]');
|
|
extractValue('<a>a</a>', '/a[true() or false()]')
|
|
a
|
|
SELECT extractValue('<a>a</a>', '/a[false()or false()]');
|
|
extractValue('<a>a</a>', '/a[false()or false()]')
|
|
|
|
SELECT extractValue('<a>a</a>', '/a[false()or true()]');
|
|
extractValue('<a>a</a>', '/a[false()or true()]')
|
|
a
|
|
SET @xml='<a>ab<b c="c" c="e">b1</b><b c="d">b2</b><b c="f" c="e">b3</b></a>';
|
|
select extractValue(@xml,'/a/b[@c="c"]');
|
|
extractValue(@xml,'/a/b[@c="c"]')
|
|
b1
|
|
select extractValue(@xml,'/a/b[@c="d"]');
|
|
extractValue(@xml,'/a/b[@c="d"]')
|
|
b2
|
|
select extractValue(@xml,'/a/b[@c="e"]');
|
|
extractValue(@xml,'/a/b[@c="e"]')
|
|
b1 b3
|
|
select extractValue(@xml,'/a/b[not(@c="e")]');
|
|
extractValue(@xml,'/a/b[not(@c="e")]')
|
|
b2
|
|
select extractValue(@xml,'/a/b[@c!="e"]');
|
|
extractValue(@xml,'/a/b[@c!="e"]')
|
|
b1 b2 b3
|
|
select extractValue(@xml,'/a/b[@c="c" or @c="d"]');
|
|
extractValue(@xml,'/a/b[@c="c" or @c="d"]')
|
|
b1 b2
|
|
select extractValue(@xml,'/a/b[@c="c" and @c="e"]');
|
|
extractValue(@xml,'/a/b[@c="c" and @c="e"]')
|
|
b1
|
|
SET @xml='<a><b c="c" d="d">b1</b><b d="d" e="e">b2</b></a>';
|
|
select extractValue(@xml,'/a/b[@c]');
|
|
extractValue(@xml,'/a/b[@c]')
|
|
b1
|
|
select extractValue(@xml,'/a/b[@d]');
|
|
extractValue(@xml,'/a/b[@d]')
|
|
b1 b2
|
|
select extractValue(@xml,'/a/b[@e]');
|
|
extractValue(@xml,'/a/b[@e]')
|
|
b2
|
|
select extractValue(@xml,'/a/b[not(@c)]');
|
|
extractValue(@xml,'/a/b[not(@c)]')
|
|
b2
|
|
select extractValue(@xml,'/a/b[not(@d)]');
|
|
extractValue(@xml,'/a/b[not(@d)]')
|
|
|
|
select extractValue(@xml,'/a/b[not(@e)]');
|
|
extractValue(@xml,'/a/b[not(@e)]')
|
|
b1
|
|
select extractValue(@xml, '/a/b[boolean(@c) or boolean(@d)]');
|
|
extractValue(@xml, '/a/b[boolean(@c) or boolean(@d)]')
|
|
b1 b2
|
|
select extractValue(@xml, '/a/b[boolean(@c) or boolean(@e)]');
|
|
extractValue(@xml, '/a/b[boolean(@c) or boolean(@e)]')
|
|
b1 b2
|
|
select extractValue(@xml, '/a/b[boolean(@d) or boolean(@e)]');
|
|
extractValue(@xml, '/a/b[boolean(@d) or boolean(@e)]')
|
|
b1 b2
|
|
select extractValue(@xml, '/a/b[boolean(@c) and boolean(@d)]');
|
|
extractValue(@xml, '/a/b[boolean(@c) and boolean(@d)]')
|
|
b1
|
|
select extractValue(@xml, '/a/b[boolean(@c) and boolean(@e)]');
|
|
extractValue(@xml, '/a/b[boolean(@c) and boolean(@e)]')
|
|
|
|
select extractValue(@xml, '/a/b[boolean(@d) and boolean(@e)]');
|
|
extractValue(@xml, '/a/b[boolean(@d) and boolean(@e)]')
|
|
b2
|
|
select extractValue(@xml, '/a/b[@c or @d]');
|
|
extractValue(@xml, '/a/b[@c or @d]')
|
|
b1 b2
|
|
select extractValue(@xml, '/a/b[@c or @e]');
|
|
extractValue(@xml, '/a/b[@c or @e]')
|
|
b1 b2
|
|
select extractValue(@xml, '/a/b[@d or @e]');
|
|
extractValue(@xml, '/a/b[@d or @e]')
|
|
b1 b2
|
|
select extractValue(@xml, '/a/b[@c and @d]');
|
|
extractValue(@xml, '/a/b[@c and @d]')
|
|
b1
|
|
select extractValue(@xml, '/a/b[@c and @e]');
|
|
extractValue(@xml, '/a/b[@c and @e]')
|
|
|
|
select extractValue(@xml, '/a/b[@d and @e]');
|
|
extractValue(@xml, '/a/b[@d and @e]')
|
|
b2
|
|
SET @xml='<a><b c="c">b1</b><b>b2</b></a>';
|
|
SELECT extractValue(@xml,'/a/b[@*]');
|
|
extractValue(@xml,'/a/b[@*]')
|
|
b1
|
|
SELECT extractValue(@xml,'/a/b[not(@*)]');
|
|
extractValue(@xml,'/a/b[not(@*)]')
|
|
b2
|
|
SELECT extractValue('<a>a</a>', '/a[ceiling(3.1)=4]');
|
|
extractValue('<a>a</a>', '/a[ceiling(3.1)=4]')
|
|
a
|
|
SELECT extractValue('<a>a</a>', '/a[floor(3.1)=3]');
|
|
extractValue('<a>a</a>', '/a[floor(3.1)=3]')
|
|
a
|
|
SELECT extractValue('<a>a</a>', '/a[round(3.1)=3]');
|
|
extractValue('<a>a</a>', '/a[round(3.1)=3]')
|
|
a
|
|
SELECT extractValue('<a>a</a>', '/a[round(3.8)=4]');
|
|
extractValue('<a>a</a>', '/a[round(3.8)=4]')
|
|
a
|
|
SELECT extractValue('<a><b>b</b><c>c</c></a>', '/a/b | /a/c');
|
|
extractValue('<a><b>b</b><c>c</c></a>', '/a/b | /a/c')
|
|
b c
|
|
select extractValue('<a b="b1" b="b2" b="b3"/>','/a/@b[position()=1]');
|
|
extractValue('<a b="b1" b="b2" b="b3"/>','/a/@b[position()=1]')
|
|
b1
|
|
select extractValue('<a b="b1" b="b2" b="b3"/>','/a/@b[position()=2]');
|
|
extractValue('<a b="b1" b="b2" b="b3"/>','/a/@b[position()=2]')
|
|
b2
|
|
select extractValue('<a b="b1" b="b2" b="b3"/>','/a/@b[position()=3]');
|
|
extractValue('<a b="b1" b="b2" b="b3"/>','/a/@b[position()=3]')
|
|
b3
|
|
select extractValue('<a b="b1" b="b2" b="b3"/>','/a/@b[1=position()]');
|
|
extractValue('<a b="b1" b="b2" b="b3"/>','/a/@b[1=position()]')
|
|
b1
|
|
select extractValue('<a b="b1" b="b2" b="b3"/>','/a/@b[2=position()]');
|
|
extractValue('<a b="b1" b="b2" b="b3"/>','/a/@b[2=position()]')
|
|
b2
|
|
select extractValue('<a b="b1" b="b2" b="b3"/>','/a/@b[3=position()]');
|
|
extractValue('<a b="b1" b="b2" b="b3"/>','/a/@b[3=position()]')
|
|
b3
|
|
select extractValue('<a b="b1" b="b2" b="b3"/>','/a/@b[2>=position()]');
|
|
extractValue('<a b="b1" b="b2" b="b3"/>','/a/@b[2>=position()]')
|
|
b1 b2
|
|
select extractValue('<a b="b1" b="b2" b="b3"/>','/a/@b[2<=position()]');
|
|
extractValue('<a b="b1" b="b2" b="b3"/>','/a/@b[2<=position()]')
|
|
b2 b3
|
|
select extractValue('<a b="b1" b="b2" b="b3"/>','/a/@b[position()=3 or position()=2]');
|
|
extractValue('<a b="b1" b="b2" b="b3"/>','/a/@b[position()=3 or position()=2]')
|
|
b2 b3
|
|
SELECT extractValue('<a>a<b>a1<c>c1</c></b><b>a2</b></a>','/a/b[count(c)=0]');
|
|
extractValue('<a>a<b>a1<c>c1</c></b><b>a2</b></a>','/a/b[count(c)=0]')
|
|
a2
|
|
SELECT extractValue('<a>a<b>a1<c>c1</c></b><b>a2</b></a>','/a/b[count(c)=1]');
|
|
extractValue('<a>a<b>a1<c>c1</c></b><b>a2</b></a>','/a/b[count(c)=1]')
|
|
a1
|
|
select extractValue('<a>a1<b ba="1" ba="2">b1</b><b>b2</b>4</a>','/a/b[sum(@ba)=3]');
|
|
extractValue('<a>a1<b ba="1" ba="2">b1</b><b>b2</b>4</a>','/a/b[sum(@ba)=3]')
|
|
b1
|
|
select extractValue('<a><b>b1</b><b>b2</b></a>','/a/b[1]');
|
|
extractValue('<a><b>b1</b><b>b2</b></a>','/a/b[1]')
|
|
b1
|
|
select extractValue('<a><b>b1</b><b>b2</b></a>','/a/b[boolean(1)]');
|
|
extractValue('<a><b>b1</b><b>b2</b></a>','/a/b[boolean(1)]')
|
|
b1 b2
|
|
select extractValue('<a><b>b1</b><b>b2</b></a>','/a/b[true()]');
|
|
extractValue('<a><b>b1</b><b>b2</b></a>','/a/b[true()]')
|
|
b1 b2
|
|
select extractValue('<a><b>b1</b><b>b2</b></a>','/a/b[number(true())]');
|
|
extractValue('<a><b>b1</b><b>b2</b></a>','/a/b[number(true())]')
|
|
b1
|
|
select extractValue('<a>ab</a>','/a[contains("abc","b")]');
|
|
extractValue('<a>ab</a>','/a[contains("abc","b")]')
|
|
ab
|
|
select extractValue('<a>ab</a>','/a[contains(.,"a")]');
|
|
extractValue('<a>ab</a>','/a[contains(.,"a")]')
|
|
ab
|
|
select extractValue('<a>ab</a>','/a[contains(.,"b")]');
|
|
extractValue('<a>ab</a>','/a[contains(.,"b")]')
|
|
ab
|
|
select extractValue('<a>ab</a>','/a[contains(.,"c")]');
|
|
extractValue('<a>ab</a>','/a[contains(.,"c")]')
|
|
|
|
select extractValue('<a b="1">ab</a>','/a[concat(@b,"2")="12"]');
|
|
extractValue('<a b="1">ab</a>','/a[concat(@b,"2")="12"]')
|
|
ab
|
|
SET @xml='<a b="11" b="12" b="21" b="22">ab</a>';
|
|
select extractValue(@xml, '/a/@b[substring(.,2)="1"]');
|
|
extractValue(@xml, '/a/@b[substring(.,2)="1"]')
|
|
11 21
|
|
select extractValue(@xml, '/a/@b[substring(.,2)="2"]');
|
|
extractValue(@xml, '/a/@b[substring(.,2)="2"]')
|
|
12 22
|
|
select extractValue(@xml, '/a/@b[substring(.,1,1)="1"]');
|
|
extractValue(@xml, '/a/@b[substring(.,1,1)="1"]')
|
|
11 12
|
|
select extractValue(@xml, '/a/@b[substring(.,1,1)="2"]');
|
|
extractValue(@xml, '/a/@b[substring(.,1,1)="2"]')
|
|
21 22
|
|
select extractValue(@xml, '/a/@b[substring(.,2,1)="1"]');
|
|
extractValue(@xml, '/a/@b[substring(.,2,1)="1"]')
|
|
11 21
|
|
select extractValue(@xml, '/a/@b[substring(.,2,1)="2"]');
|
|
extractValue(@xml, '/a/@b[substring(.,2,1)="2"]')
|
|
12 22
|
|
SET @xml='<a><b>b1</b><b>b2</b></a>';
|
|
SELECT extractValue(@xml, '/a/b[string-length("x")=1]');
|
|
extractValue(@xml, '/a/b[string-length("x")=1]')
|
|
b1 b2
|
|
SELECT extractValue(@xml, '/a/b[string-length("xx")=2]');
|
|
extractValue(@xml, '/a/b[string-length("xx")=2]')
|
|
b1 b2
|
|
SELECT extractValue(@xml, '/a/b[string-length("xxx")=2]');
|
|
extractValue(@xml, '/a/b[string-length("xxx")=2]')
|
|
|
|
SELECT extractValue(@xml, '/a/b[string-length("x")]');
|
|
extractValue(@xml, '/a/b[string-length("x")]')
|
|
b1
|
|
SELECT extractValue(@xml, '/a/b[string-length("xx")]');
|
|
extractValue(@xml, '/a/b[string-length("xx")]')
|
|
b2
|
|
SELECT extractValue(@xml, '/a/b[string-length()]');
|
|
extractValue(@xml, '/a/b[string-length()]')
|
|
b2
|
|
SELECT extractValue(@xml, 'string-length()');
|
|
ERROR HY000: XPATH syntax error: ''
|
|
SELECT extractValue(@xml, 'string-length("x")');
|
|
extractValue(@xml, 'string-length("x")')
|
|
1
|
|
SET @xml='<a b="b11" b="b12" b="b21" b="22"/>';
|
|
select extractValue(@xml,'/a/@b');
|
|
extractValue(@xml,'/a/@b')
|
|
b11 b12 b21 22
|
|
select extractValue(@xml,'/a/@b[contains(.,"1")]');
|
|
extractValue(@xml,'/a/@b[contains(.,"1")]')
|
|
b11 b12 b21
|
|
select extractValue(@xml,'/a/@b[contains(.,"1")][contains(.,"2")]');
|
|
extractValue(@xml,'/a/@b[contains(.,"1")][contains(.,"2")]')
|
|
b12 b21
|
|
select extractValue(@xml,'/a/@b[contains(.,"1")][contains(.,"2")][2]');
|
|
extractValue(@xml,'/a/@b[contains(.,"1")][contains(.,"2")][2]')
|
|
b21
|
|
SET @xml='<a>a1<b>b1<c>c1</c>b2</b>a2</a>';
|
|
select UpdateXML('<a>a1<b>b1<c>c1</c>b2</b>a2</a>','/a/b/c','+++++++++');
|
|
UpdateXML('<a>a1<b>b1<c>c1</c>b2</b>a2</a>','/a/b/c','+++++++++')
|
|
<a>a1<b>b1+++++++++b2</b>a2</a>
|
|
select UpdateXML('<a>a1<b>b1<c>c1</c>b2</b>a2</a>','/a/b/c','<c1>+++++++++</c1>');
|
|
UpdateXML('<a>a1<b>b1<c>c1</c>b2</b>a2</a>','/a/b/c','<c1>+++++++++</c1>')
|
|
<a>a1<b>b1<c1>+++++++++</c1>b2</b>a2</a>
|
|
select UpdateXML('<a>a1<b>b1<c>c1</c>b2</b>a2</a>','/a/b/c','<c1/>');
|
|
UpdateXML('<a>a1<b>b1<c>c1</c>b2</b>a2</a>','/a/b/c','<c1/>')
|
|
<a>a1<b>b1<c1/>b2</b>a2</a>
|
|
SET @xml='<a><b>bb</b></a>';
|
|
select UpdateXML(@xml, '/a/b', '<b>ccc</b>');
|
|
UpdateXML(@xml, '/a/b', '<b>ccc</b>')
|
|
<a><b>ccc</b></a>
|
|
SET @xml='<a aa1="aa1" aa2="aa2"><b bb1="bb1" bb2="bb2">bb</b></a>';
|
|
select UpdateXML(@xml, '/a/b', '<b>ccc</b>');
|
|
UpdateXML(@xml, '/a/b', '<b>ccc</b>')
|
|
<a aa1="aa1" aa2="aa2"><b>ccc</b></a>
|
|
select UpdateXML(@xml, '/a/@aa1', '');
|
|
UpdateXML(@xml, '/a/@aa1', '')
|
|
<a aa2="aa2"><b bb1="bb1" bb2="bb2">bb</b></a>
|
|
select UpdateXML(@xml, '/a/@aa1', 'aa3="aa3"');
|
|
UpdateXML(@xml, '/a/@aa1', 'aa3="aa3"')
|
|
<a aa3="aa3" aa2="aa2"><b bb1="bb1" bb2="bb2">bb</b></a>
|
|
select UpdateXML(@xml, '/a/@aa2', '');
|
|
UpdateXML(@xml, '/a/@aa2', '')
|
|
<a aa1="aa1" ><b bb1="bb1" bb2="bb2">bb</b></a>
|
|
select UpdateXML(@xml, '/a/@aa2', 'aa3="aa3"');
|
|
UpdateXML(@xml, '/a/@aa2', 'aa3="aa3"')
|
|
<a aa1="aa1" aa3="aa3"><b bb1="bb1" bb2="bb2">bb</b></a>
|
|
select UpdateXML(@xml, '/a/b/@bb1', '');
|
|
UpdateXML(@xml, '/a/b/@bb1', '')
|
|
<a aa1="aa1" aa2="aa2"><b bb2="bb2">bb</b></a>
|
|
select UpdateXML(@xml, '/a/b/@bb1', 'bb3="bb3"');
|
|
UpdateXML(@xml, '/a/b/@bb1', 'bb3="bb3"')
|
|
<a aa1="aa1" aa2="aa2"><b bb3="bb3" bb2="bb2">bb</b></a>
|
|
select UpdateXML(@xml, '/a/b/@bb2', '');
|
|
UpdateXML(@xml, '/a/b/@bb2', '')
|
|
<a aa1="aa1" aa2="aa2"><b bb1="bb1" >bb</b></a>
|
|
select UpdateXML(@xml, '/a/b/@bb2', 'bb3="bb3"');
|
|
UpdateXML(@xml, '/a/b/@bb2', 'bb3="bb3"')
|
|
<a aa1="aa1" aa2="aa2"><b bb1="bb1" bb3="bb3">bb</b></a>
|
|
select updatexml('<div><div><span>1</span><span>2</span></div></div>',
|
|
'/','<tr><td>1</td><td>2</td></tr>') as upd1;
|
|
upd1
|
|
<tr><td>1</td><td>2</td></tr>
|
|
select updatexml('', '/', '') as upd2;
|
|
upd2
|
|
|
|
SET @xml= '<order><clerk>lesser wombat</clerk></order>';
|
|
select extractvalue(@xml,'order/clerk');
|
|
extractvalue(@xml,'order/clerk')
|
|
lesser wombat
|
|
select extractvalue(@xml,'/order/clerk');
|
|
extractvalue(@xml,'/order/clerk')
|
|
lesser wombat
|
|
select extractvalue('<a><b>B</b></a>','/a|/b');
|
|
extractvalue('<a><b>B</b></a>','/a|/b')
|
|
|
|
select extractvalue('<a><b>B</b></a>','/a|b');
|
|
extractvalue('<a><b>B</b></a>','/a|b')
|
|
|
|
select extractvalue('<a>a<b>B</b></a>','/a|/b');
|
|
extractvalue('<a>a<b>B</b></a>','/a|/b')
|
|
a
|
|
select extractvalue('<a>a<b>B</b></a>','/a|b');
|
|
extractvalue('<a>a<b>B</b></a>','/a|b')
|
|
a
|
|
select extractvalue('<a>a<b>B</b></a>','a|/b');
|
|
extractvalue('<a>a<b>B</b></a>','a|/b')
|
|
a
|
|
select extractvalue('<a>A</a>','/<a>');
|
|
ERROR HY000: XPATH error: comparison of two nodesets is not supported: '<a>'
|
|
select extractvalue('<a><b>b</b><b!>b!</b!></a>','//b!');
|
|
ERROR HY000: XPATH syntax error: '!'
|
|
select extractvalue('<a>A<b>B<c>C</c></b></a>','/a/descendant::*');
|
|
extractvalue('<a>A<b>B<c>C</c></b></a>','/a/descendant::*')
|
|
B C
|
|
select extractvalue('<a>A<b>B<c>C</c></b></a>','/a/self::*');
|
|
extractvalue('<a>A<b>B<c>C</c></b></a>','/a/self::*')
|
|
A
|
|
select extractvalue('<a>A<b>B<c>C</c></b></a>','/a/descendant-or-self::*');
|
|
extractvalue('<a>A<b>B<c>C</c></b></a>','/a/descendant-or-self::*')
|
|
A B C
|
|
select extractvalue('<A_B>A</A_B>','/A_B');
|
|
extractvalue('<A_B>A</A_B>','/A_B')
|
|
A
|
|
select extractvalue('<a>A<b>B1</b><b>B2</b></a>','/a/b[position()]');
|
|
extractvalue('<a>A<b>B1</b><b>B2</b></a>','/a/b[position()]')
|
|
B1 B2
|
|
select extractvalue('<a>A<b>B1</b><b>B2</b></a>','/a/b[count(.)=last()]');
|
|
extractvalue('<a>A<b>B1</b><b>B2</b></a>','/a/b[count(.)=last()]')
|
|
B1 B2
|
|
select extractvalue('<a>A<b>B1</b><b>B2</b></a>','/a/b[last()]');
|
|
extractvalue('<a>A<b>B1</b><b>B2</b></a>','/a/b[last()]')
|
|
B2
|
|
select extractvalue('<a>A<b>B1</b><b>B2</b></a>','/a/b[last()-1]');
|
|
extractvalue('<a>A<b>B1</b><b>B2</b></a>','/a/b[last()-1]')
|
|
B1
|
|
select extractvalue('<a>A<b>B1</b><b>B2</b></a>','/a/b[last()=1]');
|
|
extractvalue('<a>A<b>B1</b><b>B2</b></a>','/a/b[last()=1]')
|
|
|
|
select extractvalue('<a>A<b>B1</b><b>B2</b></a>','/a/b[last()=2]');
|
|
extractvalue('<a>A<b>B1</b><b>B2</b></a>','/a/b[last()=2]')
|
|
B1 B2
|
|
select extractvalue('<a>A<b>B1</b><b>B2</b></a>','/a/b[last()=position()]');
|
|
extractvalue('<a>A<b>B1</b><b>B2</b></a>','/a/b[last()=position()]')
|
|
B2
|
|
select extractvalue('<a>A<b>B1</b><b>B2</b></a>','/a/b[count(.)]');
|
|
extractvalue('<a>A<b>B1</b><b>B2</b></a>','/a/b[count(.)]')
|
|
B2
|
|
select extractvalue('<a>A<b>B1</b><b>B2</b></a>','/a/b[count(.)-1]');
|
|
extractvalue('<a>A<b>B1</b><b>B2</b></a>','/a/b[count(.)-1]')
|
|
B1
|
|
select extractvalue('<a>A<b>B1</b><b>B2</b></a>','/a/b[count(.)=1]');
|
|
extractvalue('<a>A<b>B1</b><b>B2</b></a>','/a/b[count(.)=1]')
|
|
|
|
select extractvalue('<a>A<b>B1</b><b>B2</b></a>','/a/b[count(.)=2]');
|
|
extractvalue('<a>A<b>B1</b><b>B2</b></a>','/a/b[count(.)=2]')
|
|
B1 B2
|
|
select extractvalue('<a>A<b>B1</b><b>B2</b></a>','/a/b[count(.)=position()]');
|
|
extractvalue('<a>A<b>B1</b><b>B2</b></a>','/a/b[count(.)=position()]')
|
|
B2
|
|
select extractvalue('<a>Jack</a>','/a[contains(../a,"J")]');
|
|
extractvalue('<a>Jack</a>','/a[contains(../a,"J")]')
|
|
Jack
|
|
select extractvalue('<a>Jack</a>','/a[contains(../a,"j")]');
|
|
extractvalue('<a>Jack</a>','/a[contains(../a,"j")]')
|
|
Jack
|
|
select extractvalue('<a>Jack</a>','/a[contains(../a,"j")]' collate latin1_bin);
|
|
extractvalue('<a>Jack</a>','/a[contains(../a,"j")]' collate latin1_bin)
|
|
|
|
select extractvalue('<a>Jack</a>' collate latin1_bin,'/a[contains(../a,"j")]');
|
|
extractvalue('<a>Jack</a>' collate latin1_bin,'/a[contains(../a,"j")]')
|
|
|
|
select ExtractValue('<tag1><![CDATA[test]]></tag1>','/tag1');
|
|
ExtractValue('<tag1><![CDATA[test]]></tag1>','/tag1')
|
|
test
|
|
select extractValue('<a>a','/a');
|
|
extractValue('<a>a','/a')
|
|
NULL
|
|
Warnings:
|
|
Warning 1525 Incorrect XML value: 'parse error at line 1 pos 5: unexpected END-OF-INPUT'
|
|
select extractValue('<a>a<','/a');
|
|
extractValue('<a>a<','/a')
|
|
NULL
|
|
Warnings:
|
|
Warning 1525 Incorrect XML value: 'parse error at line 1 pos 6: END-OF-INPUT unexpected (ident or '/' wanted)'
|
|
select extractValue('<a>a</','/a');
|
|
extractValue('<a>a</','/a')
|
|
NULL
|
|
Warnings:
|
|
Warning 1525 Incorrect XML value: 'parse error at line 1 pos 7: END-OF-INPUT unexpected (ident wanted)'
|
|
select extractValue('<a>a</a','/a');
|
|
extractValue('<a>a</a','/a')
|
|
NULL
|
|
Warnings:
|
|
Warning 1525 Incorrect XML value: 'parse error at line 1 pos 8: END-OF-INPUT unexpected ('>' wanted)'
|
|
select extractValue('<a>a</a></b>','/a');
|
|
extractValue('<a>a</a></b>','/a')
|
|
NULL
|
|
Warnings:
|
|
Warning 1525 Incorrect XML value: 'parse error at line 1 pos 12: '</b>' unexpected (END-OF-INPUT wanted)'
|
|
select extractValue('<a b=>a</a>','/a');
|
|
extractValue('<a b=>a</a>','/a')
|
|
NULL
|
|
Warnings:
|
|
Warning 1525 Incorrect XML value: 'parse error at line 1 pos 7: '>' unexpected (ident or string wanted)'
|
|
select extractValue('<e>1</e>','position()');
|
|
ERROR HY000: XPATH syntax error: ''
|
|
select extractValue('<e>1</e>','last()');
|
|
ERROR HY000: XPATH syntax error: ''
|
|
select extractValue('<e><a>1</a></e>','/e/');
|
|
ERROR HY000: XPATH syntax error: ''
|
|
set names utf8;
|
|
select extractValue('<Ñ><r>r</r></Ñ>','/Ñ/r');
|
|
extractValue('<Ñ><r>r</r></Ñ>','/Ñ/r')
|
|
r
|
|
select extractValue('<r><Ñ>Ñ</Ñ></r>','/r/Ñ');
|
|
extractValue('<r><Ñ>Ñ</Ñ></r>','/r/Ñ')
|
|
Ñ
|
|
select extractValue('<Ñ r="r"/>','/Ñ/@r');
|
|
extractValue('<Ñ r="r"/>','/Ñ/@r')
|
|
r
|
|
select extractValue('<r Ñ="Ñ"/>','/r/@Ñ');
|
|
extractValue('<r Ñ="Ñ"/>','/r/@Ñ')
|
|
Ñ
|
|
DROP PROCEDURE IF EXISTS p2;
|
|
CREATE PROCEDURE p2 ()
|
|
BEGIN
|
|
DECLARE p LONGTEXT CHARACTER SET UTF8 DEFAULT '<Ñ><r>A</r></Ñ>';
|
|
SELECT EXTRACTVALUE(p,'/Ñ/r');
|
|
END//
|
|
CALL p2();
|
|
EXTRACTVALUE(p,'/Ñ/r')
|
|
A
|
|
DROP PROCEDURE p2;
|
|
select extractValue('<ns:element xmlns:ns="myns"/>','count(ns:element)');
|
|
extractValue('<ns:element xmlns:ns="myns"/>','count(ns:element)')
|
|
1
|
|
select extractValue('<ns:element xmlns:ns="myns">a</ns:element>','/ns:element');
|
|
extractValue('<ns:element xmlns:ns="myns">a</ns:element>','/ns:element')
|
|
a
|
|
select extractValue('<ns:element xmlns:ns="myns">a</ns:element>','/ns:element/@xmlns:ns');
|
|
extractValue('<ns:element xmlns:ns="myns">a</ns:element>','/ns:element/@xmlns:ns')
|
|
myns
|
|
select extractValue('<foo><foo.bar>Data</foo.bar><something>Otherdata</something></foo>','/foo/foo.bar');
|
|
extractValue('<foo><foo.bar>Data</foo.bar><something>Otherdata</something></foo>','/foo/foo.bar')
|
|
Data
|
|
select extractValue('<foo><foo.bar>Data</foo.bar><something>Otherdata</something></foo>','/foo/something');
|
|
extractValue('<foo><foo.bar>Data</foo.bar><something>Otherdata</something></foo>','/foo/something')
|
|
Otherdata
|
|
select extractValue('<zot><tim0><01>10:39:15</01><02>140</02></tim0></zot>','/zot/tim0/02');
|
|
ERROR HY000: XPATH syntax error: '02'
|
|
select extractValue('<zot><tim0><01>10:39:15</01><02>140</02></tim0></zot>','//*');
|
|
extractValue('<zot><tim0><01>10:39:15</01><02>140</02></tim0></zot>','//*')
|
|
NULL
|
|
Warnings:
|
|
Warning 1525 Incorrect XML value: 'parse error at line 1 pos 13: unknown token unexpected (ident or '/' wanted)'
|
|
select extractValue('<.>test</.>','//*');
|
|
extractValue('<.>test</.>','//*')
|
|
NULL
|
|
Warnings:
|
|
Warning 1525 Incorrect XML value: 'parse error at line 1 pos 2: unknown token unexpected (ident or '/' wanted)'
|
|
select extractValue('<->test</->','//*');
|
|
extractValue('<->test</->','//*')
|
|
NULL
|
|
Warnings:
|
|
Warning 1525 Incorrect XML value: 'parse error at line 1 pos 2: unknown token unexpected (ident or '/' wanted)'
|
|
select extractValue('<:>test</:>','//*');
|
|
extractValue('<:>test</:>','//*')
|
|
test
|
|
select extractValue('<_>test</_>','//*');
|
|
extractValue('<_>test</_>','//*')
|
|
test
|
|
select extractValue('<x.-_:>test</x.-_:>','//*');
|
|
extractValue('<x.-_:>test</x.-_:>','//*')
|
|
test
|
|
set @xml= "<entry><id>pt10</id><pt>10</pt></entry><entry><id>pt50</id><pt>50</pt></entry>";
|
|
select ExtractValue(@xml, "/entry[(pt=10)]/id");
|
|
ExtractValue(@xml, "/entry[(pt=10)]/id")
|
|
pt10
|
|
select ExtractValue(@xml, "/entry[(pt!=10)]/id");
|
|
ExtractValue(@xml, "/entry[(pt!=10)]/id")
|
|
pt50
|
|
select ExtractValue(@xml, "/entry[(pt<10)]/id");
|
|
ExtractValue(@xml, "/entry[(pt<10)]/id")
|
|
|
|
select ExtractValue(@xml, "/entry[(pt<=10)]/id");
|
|
ExtractValue(@xml, "/entry[(pt<=10)]/id")
|
|
pt10
|
|
select ExtractValue(@xml, "/entry[(pt>10)]/id");
|
|
ExtractValue(@xml, "/entry[(pt>10)]/id")
|
|
pt50
|
|
select ExtractValue(@xml, "/entry[(pt>=10)]/id");
|
|
ExtractValue(@xml, "/entry[(pt>=10)]/id")
|
|
pt10 pt50
|
|
select ExtractValue(@xml, "/entry[(pt=50)]/id");
|
|
ExtractValue(@xml, "/entry[(pt=50)]/id")
|
|
pt50
|
|
select ExtractValue(@xml, "/entry[(pt!=50)]/id");
|
|
ExtractValue(@xml, "/entry[(pt!=50)]/id")
|
|
pt10
|
|
select ExtractValue(@xml, "/entry[(pt<50)]/id");
|
|
ExtractValue(@xml, "/entry[(pt<50)]/id")
|
|
pt10
|
|
select ExtractValue(@xml, "/entry[(pt<=50)]/id");
|
|
ExtractValue(@xml, "/entry[(pt<=50)]/id")
|
|
pt10 pt50
|
|
select ExtractValue(@xml, "/entry[(pt>50)]/id");
|
|
ExtractValue(@xml, "/entry[(pt>50)]/id")
|
|
|
|
select ExtractValue(@xml, "/entry[(pt>=50)]/id");
|
|
ExtractValue(@xml, "/entry[(pt>=50)]/id")
|
|
pt50
|
|
select ExtractValue(@xml, "/entry[(10=pt)]/id");
|
|
ExtractValue(@xml, "/entry[(10=pt)]/id")
|
|
pt10
|
|
select ExtractValue(@xml, "/entry[(10!=pt)]/id");
|
|
ExtractValue(@xml, "/entry[(10!=pt)]/id")
|
|
pt50
|
|
select ExtractValue(@xml, "/entry[(10>pt)]/id");
|
|
ExtractValue(@xml, "/entry[(10>pt)]/id")
|
|
|
|
select ExtractValue(@xml, "/entry[(10>=pt)]/id");
|
|
ExtractValue(@xml, "/entry[(10>=pt)]/id")
|
|
pt10
|
|
select ExtractValue(@xml, "/entry[(10<pt)]/id");
|
|
ExtractValue(@xml, "/entry[(10<pt)]/id")
|
|
pt50
|
|
select ExtractValue(@xml, "/entry[(10<=pt)]/id");
|
|
ExtractValue(@xml, "/entry[(10<=pt)]/id")
|
|
pt10 pt50
|
|
select ExtractValue(@xml, "/entry[(50=pt)]/id");
|
|
ExtractValue(@xml, "/entry[(50=pt)]/id")
|
|
pt50
|
|
select ExtractValue(@xml, "/entry[(50!=pt)]/id");
|
|
ExtractValue(@xml, "/entry[(50!=pt)]/id")
|
|
pt10
|
|
select ExtractValue(@xml, "/entry[(50>pt)]/id");
|
|
ExtractValue(@xml, "/entry[(50>pt)]/id")
|
|
pt10
|
|
select ExtractValue(@xml, "/entry[(50>=pt)]/id");
|
|
ExtractValue(@xml, "/entry[(50>=pt)]/id")
|
|
pt10 pt50
|
|
select ExtractValue(@xml, "/entry[(50<pt)]/id");
|
|
ExtractValue(@xml, "/entry[(50<pt)]/id")
|
|
|
|
select ExtractValue(@xml, "/entry[(50<=pt)]/id");
|
|
ExtractValue(@xml, "/entry[(50<=pt)]/id")
|
|
pt50
|
|
select ExtractValue('<a><b><Text>test</Text></b></a>','/a/b/Text');
|
|
ExtractValue('<a><b><Text>test</Text></b></a>','/a/b/Text')
|
|
test
|
|
select ExtractValue('<a><b><comment>test</comment></b></a>','/a/b/comment');
|
|
ExtractValue('<a><b><comment>test</comment></b></a>','/a/b/comment')
|
|
test
|
|
select ExtractValue('<a><b><node>test</node></b></a>','/a/b/node');
|
|
ExtractValue('<a><b><node>test</node></b></a>','/a/b/node')
|
|
test
|
|
select ExtractValue('<a><b><processing-instruction>test</processing-instruction></b></a>','/a/b/processing-instruction');
|
|
ExtractValue('<a><b><processing-instruction>test</processing-instruction></b></a>','/a/b/processing-instruction')
|
|
test
|
|
select ExtractValue('<a><and>test</and></a>', '/a/and');
|
|
ExtractValue('<a><and>test</and></a>', '/a/and')
|
|
test
|
|
select ExtractValue('<a><or>test</or></a>', '/a/or');
|
|
ExtractValue('<a><or>test</or></a>', '/a/or')
|
|
test
|
|
select ExtractValue('<a><mod>test</mod></a>', '/a/mod');
|
|
ExtractValue('<a><mod>test</mod></a>', '/a/mod')
|
|
test
|
|
select ExtractValue('<a><div>test</div></a>', '/a/div');
|
|
ExtractValue('<a><div>test</div></a>', '/a/div')
|
|
test
|
|
select ExtractValue('<a><and:and>test</and:and></a>', '/a/and:and');
|
|
ExtractValue('<a><and:and>test</and:and></a>', '/a/and:and')
|
|
test
|
|
select ExtractValue('<a><or:or>test</or:or></a>', '/a/or:or');
|
|
ExtractValue('<a><or:or>test</or:or></a>', '/a/or:or')
|
|
test
|
|
select ExtractValue('<a><mod:mod>test</mod:mod></a>', '/a/mod:mod');
|
|
ExtractValue('<a><mod:mod>test</mod:mod></a>', '/a/mod:mod')
|
|
test
|
|
select ExtractValue('<a><div:div>test</div:div></a>', '/a/div:div');
|
|
ExtractValue('<a><div:div>test</div:div></a>', '/a/div:div')
|
|
test
|
|
select ExtractValue('<a><ancestor>test</ancestor></a>', '/a/ancestor');
|
|
ExtractValue('<a><ancestor>test</ancestor></a>', '/a/ancestor')
|
|
test
|
|
select ExtractValue('<a><ancestor-or-self>test</ancestor-or-self></a>', '/a/ancestor-or-self');
|
|
ExtractValue('<a><ancestor-or-self>test</ancestor-or-self></a>', '/a/ancestor-or-self')
|
|
test
|
|
select ExtractValue('<a><attribute>test</attribute></a>', '/a/attribute');
|
|
ExtractValue('<a><attribute>test</attribute></a>', '/a/attribute')
|
|
test
|
|
select ExtractValue('<a><child>test</child></a>', '/a/child');
|
|
ExtractValue('<a><child>test</child></a>', '/a/child')
|
|
test
|
|
select ExtractValue('<a><descendant>test</descendant></a>', '/a/descendant');
|
|
ExtractValue('<a><descendant>test</descendant></a>', '/a/descendant')
|
|
test
|
|
select ExtractValue('<a><descendant-or-self>test</descendant-or-self></a>', '/a/descendant-or-self');
|
|
ExtractValue('<a><descendant-or-self>test</descendant-or-self></a>', '/a/descendant-or-self')
|
|
test
|
|
select ExtractValue('<a><following>test</following></a>', '/a/following');
|
|
ExtractValue('<a><following>test</following></a>', '/a/following')
|
|
test
|
|
select ExtractValue('<a><following-sibling>test</following-sibling></a>', '/a/following-sibling');
|
|
ExtractValue('<a><following-sibling>test</following-sibling></a>', '/a/following-sibling')
|
|
test
|
|
select ExtractValue('<a><namespace>test</namespace></a>', '/a/namespace');
|
|
ExtractValue('<a><namespace>test</namespace></a>', '/a/namespace')
|
|
test
|
|
select ExtractValue('<a><parent>test</parent></a>', '/a/parent');
|
|
ExtractValue('<a><parent>test</parent></a>', '/a/parent')
|
|
test
|
|
select ExtractValue('<a><preceding>test</preceding></a>', '/a/preceding');
|
|
ExtractValue('<a><preceding>test</preceding></a>', '/a/preceding')
|
|
test
|
|
select ExtractValue('<a><preceding-sibling>test</preceding-sibling></a>', '/a/preceding-sibling');
|
|
ExtractValue('<a><preceding-sibling>test</preceding-sibling></a>', '/a/preceding-sibling')
|
|
test
|
|
select ExtractValue('<a><self>test</self></a>', '/a/self');
|
|
ExtractValue('<a><self>test</self></a>', '/a/self')
|
|
test
|
|
set @i=1;
|
|
select ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/b[$@i]');
|
|
ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/b[$@i]')
|
|
b1
|
|
set @i=2;
|
|
select ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/b[$@i]');
|
|
ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/b[$@i]')
|
|
b2
|
|
set @i=NULL;
|
|
select ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/b[$@i]');
|
|
ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/b[$@i]')
|
|
|
|
CREATE PROCEDURE spxml(xml VARCHAR(128))
|
|
BEGIN
|
|
DECLARE c INT;
|
|
DECLARE i INT DEFAULT 1;
|
|
SET c= ExtractValue(xml,'count(/a/b)');
|
|
SET @i= c;
|
|
WHILE i <= c DO
|
|
BEGIN
|
|
SELECT i, @i, ExtractValue(xml,'/a/b[$i]'), ExtractValue(xml,'/a/b[$@i]');
|
|
SET i= i + 1;
|
|
SET @i= @i - 1;
|
|
END;
|
|
END WHILE;
|
|
END|
|
|
call spxml('<a><b>b1</b><b>b2</b><b>b3</b></a>');
|
|
i @i ExtractValue(xml,'/a/b[$i]') ExtractValue(xml,'/a/b[$@i]')
|
|
1 3 b1 b3
|
|
i @i ExtractValue(xml,'/a/b[$i]') ExtractValue(xml,'/a/b[$@i]')
|
|
2 2 b2 b2
|
|
i @i ExtractValue(xml,'/a/b[$i]') ExtractValue(xml,'/a/b[$@i]')
|
|
3 1 b3 b1
|
|
drop procedure spxml;
|
|
Multiple matches, but no index specification
|
|
SELECT ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/b');
|
|
ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/b')
|
|
b1 b2
|
|
No matches
|
|
SELECT ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/c');
|
|
ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/c')
|
|
|
|
Index out of range
|
|
SELECT ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/b[-1]');
|
|
ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/b[-1]')
|
|
|
|
SELECT ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/b[10]');
|
|
ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/b[10]')
|
|
|
|
With string-to-number conversion
|
|
SELECT ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/b["1"]');
|
|
ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/b["1"]')
|
|
b1
|
|
SELECT ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/b["1 and string"]');
|
|
ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/b["1 and string"]')
|
|
b1
|
|
Warnings:
|
|
Warning 1292 Truncated incorrect INTEGER value: '1 and string'
|
|
Warning 1292 Truncated incorrect INTEGER value: '1 and string'
|
|
SELECT ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/b["string and 1"]');
|
|
ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/b["string and 1"]')
|
|
|
|
Warnings:
|
|
Warning 1292 Truncated incorrect INTEGER value: 'string and 1'
|
|
Warning 1292 Truncated incorrect INTEGER value: 'string and 1'
|
|
SELECT ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/b["string"]');
|
|
ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/b["string"]')
|
|
|
|
Warnings:
|
|
Warning 1292 Truncated incorrect INTEGER value: 'string'
|
|
Warning 1292 Truncated incorrect INTEGER value: 'string'
|
|
String-to-number conversion from a user variable
|
|
SET @i='1';
|
|
SELECT ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/b[$@i]');
|
|
ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/b[$@i]')
|
|
b1
|
|
SET @i='1 and string';
|
|
SELECT ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/b[$@i]');
|
|
ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/b[$@i]')
|
|
b1
|
|
SET @i='string and 1';
|
|
SELECT ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/b[$@i]');
|
|
ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/b[$@i]')
|
|
|
|
SET @i='string';
|
|
SELECT ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/b[$@i]');
|
|
ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/b[$@i]')
|
|
|
|
String-to-number conversion with a CHAR SP variable
|
|
CREATE PROCEDURE spxml(xml VARCHAR(128), i CHAR(16))
|
|
BEGIN
|
|
SELECT ExtractValue(xml,'/a/b[$i]');
|
|
END|
|
|
CALL spxml('<a><b>b1</b><b>b2</b></a>', '1');
|
|
ExtractValue(xml,'/a/b[$i]')
|
|
b1
|
|
CALL spxml('<a><b>b1</b><b>b2</b></a>', '1 and string');
|
|
ExtractValue(xml,'/a/b[$i]')
|
|
b1
|
|
Warnings:
|
|
Warning 1292 Truncated incorrect INTEGER value: '1 and string '
|
|
Warning 1292 Truncated incorrect INTEGER value: '1 and string '
|
|
CALL spxml('<a><b>b1</b><b>b2</b></a>', 'string and 1');
|
|
ExtractValue(xml,'/a/b[$i]')
|
|
|
|
Warnings:
|
|
Warning 1292 Truncated incorrect INTEGER value: 'string and 1 '
|
|
Warning 1292 Truncated incorrect INTEGER value: 'string and 1 '
|
|
CALL spxml('<a><b>b1</b><b>b2</b></a>', 'string');
|
|
ExtractValue(xml,'/a/b[$i]')
|
|
|
|
Warnings:
|
|
Warning 1292 Truncated incorrect INTEGER value: 'string '
|
|
Warning 1292 Truncated incorrect INTEGER value: 'string '
|
|
DROP PROCEDURE spxml;
|
|
select UpdateXML('<a>a</a>',repeat('a b ',1000),'');
|
|
ERROR HY000: XPATH syntax error: 'b a b a b a b a b a b a b a b a '
|
|
select ExtractValue('<a>a</a>', '/a[@x=@y0123456789_0123456789_0123456789_0123456789]');
|
|
ERROR HY000: XPATH error: comparison of two nodesets is not supported: '=@y0123456789_0123456789_0123456'
|
|
select ExtractValue('<a>a</a>', '/a[@x=$y0123456789_0123456789_0123456789_0123456789]');
|
|
ERROR HY000: Unknown XPATH variable at: '$y0123456789_0123456789_01234567'
|
|
select updatexml(NULL, 1, 1), updatexml(1, NULL, 1), updatexml(1, 1, NULL);
|
|
updatexml(NULL, 1, 1) updatexml(1, NULL, 1) updatexml(1, 1, NULL)
|
|
NULL NULL NULL
|
|
select updatexml(NULL, NULL, 1), updatexml(1, NULL, NULL),
|
|
updatexml(NULL, 1, NULL);
|
|
updatexml(NULL, NULL, 1) updatexml(1, NULL, NULL) updatexml(NULL, 1, NULL)
|
|
NULL NULL NULL
|
|
select updatexml(NULL, NULL, NULL);
|
|
updatexml(NULL, NULL, NULL)
|
|
NULL
|
|
CREATE TABLE t1(a INT NOT NULL);
|
|
INSERT INTO t1 VALUES (0), (0);
|
|
SELECT 1 FROM t1 ORDER BY(UPDATEXML(a, '1', '1'));
|
|
1
|
|
1
|
|
1
|
|
DROP TABLE t1;
|
|
SET @xml=
|
|
'<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
|
<html>
|
|
<head>
|
|
<title> Title - document with document declaration</title>
|
|
</head>
|
|
<body> Hi, Im a webpage with document a declaration </body>
|
|
</html>';
|
|
SELECT ExtractValue(@xml, 'html/head/title');
|
|
ExtractValue(@xml, 'html/head/title')
|
|
Title - document with document declaration
|
|
SELECT ExtractValue(@xml, 'html/body');
|
|
ExtractValue(@xml, 'html/body')
|
|
Hi, Im a webpage with document a declaration
|
|
SELECT ExtractValue('<xml "xxx" "yyy">CharData</xml>', '/xml');
|
|
ExtractValue('<xml "xxx" "yyy">CharData</xml>', '/xml')
|
|
NULL
|
|
Warnings:
|
|
Warning 1525 Incorrect XML value: 'parse error at line 1 pos 11: STRING unexpected ('>' wanted)'
|
|
SELECT ExtractValue('<xml xxx "yyy">CharData</xml>', '/xml');
|
|
ExtractValue('<xml xxx "yyy">CharData</xml>', '/xml')
|
|
NULL
|
|
Warnings:
|
|
Warning 1525 Incorrect XML value: 'parse error at line 1 pos 17: STRING unexpected ('>' wanted)'
|
|
set @x=10;
|
|
select extractvalue('<a></a>','$@x/a');
|
|
ERROR HY000: XPATH syntax error: '/a'
|
|
select extractvalue('<a></a>','round(123.4)/a');
|
|
ERROR HY000: XPATH syntax error: '/a'
|
|
select extractvalue('<a></a>','1/a');
|
|
ERROR HY000: XPATH syntax error: '/a'
|
|
select extractvalue('<a></a>','"b"/a');
|
|
ERROR HY000: XPATH syntax error: '/a'
|
|
select extractvalue('<a></a>','(1)/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;
|
|
#
|
|
# Bug#57257 Replace(ExtractValue(...)) causes MySQL crash
|
|
#
|
|
SET NAMES utf8;
|
|
SELECT REPLACE(EXTRACTVALUE('1', '/a'),'ds','');
|
|
REPLACE(EXTRACTVALUE('1', '/a'),'ds','')
|
|
|
|
#
|
|
# Bug #57820 extractvalue crashes
|
|
#
|
|
SELECT AVG(DISTINCT EXTRACTVALUE((''),('$@k')));
|
|
AVG(DISTINCT EXTRACTVALUE((''),('$@k')))
|
|
NULL
|
|
#
|
|
# Bug#57279 updatexml dies with: Assertion failed: str_arg[length] == 0
|
|
#
|
|
SELECT UPDATEXML(NULL, (LPAD(0.1111E-15, '2011', 1)), 1);
|
|
ERROR 22007: Illegal double '111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111' value found during parsing
|
|
SELECT EXTRACTVALUE('', LPAD(0.1111E-15, '2011', 1));
|
|
ERROR 22007: Illegal double '111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111' value found during parsing
|
|
#
|
|
# Bug #44332 my_xml_scan reads behind the end of buffer
|
|
#
|
|
SELECT UPDATEXML(CONVERT(_latin1'<' USING utf8),'1','1');
|
|
UPDATEXML(CONVERT(_latin1'<' USING utf8),'1','1')
|
|
NULL
|
|
Warnings:
|
|
Warning 1525 Incorrect XML value: 'parse error at line 1 pos 2: END-OF-INPUT unexpected (ident or '/' wanted)'
|
|
SELECT UPDATEXML(CONVERT(_latin1'<!--' USING utf8),'1','1');
|
|
UPDATEXML(CONVERT(_latin1'<!--' USING utf8),'1','1')
|
|
NULL
|
|
#
|
|
# Bug#11766725 (bug#59901): EXTRACTVALUE STILL BROKEN AFTER FIX FOR BUG #44332
|
|
#
|
|
SELECT ExtractValue(CONVERT('<\"', BINARY(10)), 1);
|
|
ExtractValue(CONVERT('<\"', BINARY(10)), 1)
|
|
NULL
|
|
Warnings:
|
|
Warning 1525 Incorrect XML value: 'parse error at line 1 pos 11: STRING unexpected (ident or '/' wanted)'
|
|
End of 5.1 tests
|
|
#
|
|
# Start of 5.5 tests
|
|
#
|
|
#
|
|
# Bug#58175 xml functions read initialized bytes when conversions happen
|
|
#
|
|
SET NAMES latin1;
|
|
SELECT UPDATEXML(CONVERT('' USING swe7), TRUNCATE('',1), 0);
|
|
UPDATEXML(CONVERT('' USING swe7), TRUNCATE('',1), 0)
|
|
NULL
|
|
#
|
|
# Bug#12375190: UPDATEXML CRASHES ON SIMPLE INPUTS
|
|
#
|
|
SELECT UPDATEXML('','(a)/a','');
|
|
UPDATEXML('','(a)/a','')
|
|
|
|
SELECT UPDATEXML('<a><a>x</a></a>','(a)/a','<b />');
|
|
UPDATEXML('<a><a>x</a></a>','(a)/a','<b />')
|
|
<a><b /></a>
|
|
SELECT UPDATEXML('<a><c><a>x</a></c></a>','(a)/a','<b />');
|
|
UPDATEXML('<a><c><a>x</a></c></a>','(a)/a','<b />')
|
|
<a><c><a>x</a></c></a>
|
|
SELECT UPDATEXML('<a><c><a>x</a></c></a>','(a)//a','<b />');
|
|
UPDATEXML('<a><c><a>x</a></c></a>','(a)//a','<b />')
|
|
<a><c><b /></c></a>
|
|
SELECT ExtractValue('<a><a>aa</a><b>bb</b></a>','(a)/a|(a)/b');
|
|
ExtractValue('<a><a>aa</a><b>bb</b></a>','(a)/a|(a)/b')
|
|
aa bb
|
|
SELECT ExtractValue('<a><b>abc</b><c>2</c><d>1</d></a>','substring(/a/b,..)');
|
|
ExtractValue('<a><b>abc</b><c>2</c><d>1</d></a>','substring(/a/b,..)')
|
|
|
|
#
|
|
# Bug#62429 XML: ExtractValue, UpdateXML max arg length 127 chars
|
|
#
|
|
CREATE TABLE t1 (id INT AUTO_INCREMENT, txt VARCHAR(1000), PRIMARY KEY(id));
|
|
INSERT INTO t1 (txt) VALUES
|
|
(CONCAT('<', REPEAT('a',127), '>127</', REPEAT('a',127), '>')),
|
|
(CONCAT('<', REPEAT('a',128), '>128</', REPEAT('a',128), '>')),
|
|
(CONCAT('<', REPEAT('a',63), '><', REPEAT('b',63), '>63/63</', REPEAT('b',63), '></', REPEAT('a',63),'>')),
|
|
(CONCAT('<', REPEAT('a',63), '><', REPEAT('b',64), '>63/64</', REPEAT('b',64), '></', REPEAT('a',63),'>'));
|
|
SELECT
|
|
txt,
|
|
EXTRACTVALUE(txt, CONCAT('/', REPEAT('a', 127))) as a127,
|
|
EXTRACTVALUE(txt, CONCAT('/', REPEAT('a', 128))) as a128,
|
|
EXTRACTVALUE(txt, CONCAT('//', REPEAT('b', 63))) as a63b63,
|
|
EXTRACTVALUE(txt, CONCAT('//', REPEAT('b', 64))) as a63b64
|
|
FROM t1;
|
|
txt <aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>127</aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>
|
|
a127 127
|
|
a128
|
|
a63b63
|
|
a63b64
|
|
txt <aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>128</aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>
|
|
a127
|
|
a128 128
|
|
a63b63
|
|
a63b64
|
|
txt <aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa><bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb>63/63</bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb></aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>
|
|
a127
|
|
a128
|
|
a63b63 63/63
|
|
a63b64
|
|
txt <aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa><bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb>63/64</bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb></aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>
|
|
a127
|
|
a128
|
|
a63b63
|
|
a63b64 63/64
|
|
SELECT UPDATEXML(txt, CONCAT('//', REPEAT('b', 63)), '63/63+') FROM t1;
|
|
UPDATEXML(txt, CONCAT('//', REPEAT('b', 63)), '63/63+') <aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>127</aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>
|
|
UPDATEXML(txt, CONCAT('//', REPEAT('b', 63)), '63/63+') <aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>128</aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>
|
|
UPDATEXML(txt, CONCAT('//', REPEAT('b', 63)), '63/63+') <aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>63/63+</aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>
|
|
UPDATEXML(txt, CONCAT('//', REPEAT('b', 63)), '63/63+') <aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa><bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb>63/64</bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb></aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>
|
|
DROP TABLE t1;
|
|
CREATE TABLE t1 (a TEXT);
|
|
INSERT INTO t1 VALUES (CONCAT('<a><', REPEAT('b',128),'>b128</',REPEAT('b',128),'><',REPEAT('c',512),'>c512</',REPEAT('c',512),'></a>'));
|
|
SELECT ExtractValue (a, CONCAT('//',REPEAT('c',512))) AS c512 FROM t1;
|
|
c512 c512
|
|
DROP TABLE t1;
|
|
#
|
|
# End of 5.5 tests
|
|
#
|
|
#
|
|
# Start of 10.0 tests
|
|
#
|
|
#
|
|
# MDEV-5689 ExtractValue(xml, 'substring(/x,/y)') crashes
|
|
#
|
|
SELECT ExtractValue('<a><b>abc</b><c>2</c><d>1</d></a>','substring(/a/b,..)') AS e;
|
|
e
|
|
|
|
SELECT ExtractValue('<a><b>abc</b><c>2</c><d>1</d></a>','substring(/a/b,/a/c)') AS e;
|
|
e
|
|
bc
|
|
SELECT ExtractValue('<a><b>abc</b><c>2</c><d>1</d></a>','substring(/a/b,/a/d)') AS e;
|
|
e
|
|
abc
|
|
SELECT ExtractValue('<a><b>abc</b><c>2</c><d>1</d></a>','substring(/a/b,/a/c,/a/d)') AS e;
|
|
e
|
|
b
|
|
SELECT ExtractValue('<a><b>abc</b><c>2</c><d>1</d></a>','substring(/a/b,/a/d,/a/c)') AS e;
|
|
e
|
|
ab
|
|
#
|
|
# MDEV-5709 ExtractValue() with XPath variable references returns wrong result
|
|
#
|
|
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;
|
|
c1 c2 xpath
|
|
1 b1 b1
|
|
2 b2 b2
|
|
SELECT * FROM t1 WHERE c2=IF(@i:=c1,ExtractValue('<a><b>b1</b><b>b2</b></a>','//b[$@i]'),0);
|
|
c1 c2
|
|
1 b1
|
|
2 b2
|
|
DROP TABLE t1;
|
|
#
|
|
# End of 10.0 tests
|
|
#
|