mirror of
				https://github.com/MariaDB/server.git
				synced 2025-11-02 02:53:04 +03:00 
			
		
		
		
	Also fixes 16314: XML: extractvalue() crash if vertical bar xml.result, xml.test: Adding test case item_xmlfunc.cc: Using root element as a context node, instead of NULL, with relative paths. sql/item_xmlfunc.cc: Bug#16234 XML: Crash if ExtractValue() Also fixes 16314: XML: extractvalue() crash if vertical bar Use root element as a context node, instead of NULL, with relative paths. mysql-test/t/xml.test: Adding test case mysql-test/r/xml.result: Adding test case
		
			
				
	
	
		
			545 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			545 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
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/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="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>
 | 
						|
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
 |