mirror of
				https://github.com/MariaDB/server.git
				synced 2025-11-03 14:33:32 +03:00 
			
		
		
		
	mysql-test/r/xml.result:
  - Adding test case
  - Fixing error message
mysql-test/t/xml.test:
  Adding test case
sql/item_xmlfunc.cc:
  For grammar rules with loops like:
  
    AdditiveExpr ::= MultiplicativeExpr ('+' MultiplicativeExpr)*
  
  If we scanned scanned '+' and then met an error when parsing
  MultiplicativeExpr, then we should fully stop parsing - without
  trying to apply any other rules.
  
  Fix: add "error" member into MY_XPATH structure,
  and make my_xpath_parse_term() never return success
  as soon as error set.
strings/xml.c:
  Adding my_xml_ctype map for flags, indicating
  whether a character is a space character, is a
  valid identifier start character, is a valid
  identifier body character. Using this map to
  properly scan identifiers. Also, using this map
  to scan spaces faster (instead of strchr).
		
	
		
			
				
	
	
		
			379 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			379 lines
		
	
	
		
			15 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');
 | 
						|
SELECT extractValue(@xml,'/a/b');
 | 
						|
SELECT extractValue(@xml,'/a/b/c');
 | 
						|
SELECT extractValue(@xml,'/a/@aa1');
 | 
						|
SELECT extractValue(@xml,'/a/@aa2');
 | 
						|
SELECT extractValue(@xml,'/a/@*');
 | 
						|
SELECT extractValue(@xml,'//@ba1');
 | 
						|
 | 
						|
SELECT extractValue(@xml,'//a');
 | 
						|
SELECT extractValue(@xml,'//b');
 | 
						|
SELECT extractValue(@xml,'//c');
 | 
						|
SELECT extractValue(@xml,'/a//b');
 | 
						|
SELECT extractValue(@xml,'/a//c');
 | 
						|
SELECT extractValue(@xml,'//*');
 | 
						|
SELECT extractValue(@xml,'/a//*');
 | 
						|
SELECT extractValue(@xml,'/./a');
 | 
						|
SELECT extractValue(@xml,'/a/b/.');
 | 
						|
SELECT extractValue(@xml,'/a/b/..');
 | 
						|
SELECT extractValue(@xml,'/a/b/../@aa1');
 | 
						|
SELECT extractValue(@xml,'/*');
 | 
						|
SELECT extractValue(@xml,'/*/*');
 | 
						|
SELECT extractValue(@xml,'/*/*/*');
 | 
						|
 | 
						|
SELECT extractValue(@xml,'/a/child::*');
 | 
						|
SELECT extractValue(@xml,'/a/self::*');
 | 
						|
SELECT extractValue(@xml,'/a/descendant::*');
 | 
						|
SELECT extractValue(@xml,'/a/descendant-or-self::*');
 | 
						|
SELECT extractValue(@xml,'/a/attribute::*');
 | 
						|
SELECT extractValue(@xml,'/a/b/c/parent::*');
 | 
						|
SELECT extractValue(@xml,'/a/b/c/ancestor::*');
 | 
						|
SELECT extractValue(@xml,'/a/b/c/ancestor-or-self::*');
 | 
						|
SELECT extractValue(@xml,'/descendant-or-self::*');
 | 
						|
 | 
						|
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::*');
 | 
						|
SELECT extractValue(@xml,'//@ba');
 | 
						|
 | 
						|
SET @xml='<a><b>b</b><c>c</c></a>';
 | 
						|
SELECT extractValue(@xml,'/a/b');
 | 
						|
SELECT extractValue(@xml,'/a/c');
 | 
						|
SELECT extractValue(@xml,'/a/child::b');
 | 
						|
SELECT extractValue(@xml,'/a/child::c');
 | 
						|
 | 
						|
SET @xml='<a><b>b1</b><c>c1</c><b>b2</b><c>c2</c></a>';
 | 
						|
SELECT extractValue(@xml,'/a/b[1]');
 | 
						|
SELECT extractValue(@xml,'/a/b[2]');
 | 
						|
SELECT extractValue(@xml,'/a/c[1]');
 | 
						|
SELECT extractValue(@xml,'/a/c[2]');
 | 
						|
 | 
						|
SET @xml='<a><b x="xb1" x="xb2"/><c x="xc1" x="xc2"/></a>';
 | 
						|
SELECT extractValue(@xml,'/a//@x');
 | 
						|
SELECT extractValue(@xml,'/a//@x[1]');
 | 
						|
SELECT extractValue(@xml,'/a//@x[2]');
 | 
						|
 | 
						|
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]');
 | 
						|
SELECT extractValue(@xml,'/descendant::b[1]');
 | 
						|
 | 
						|
SET @xml='<a><b>b1</b><b>b2</b></a>';
 | 
						|
SELECT extractValue(@xml,'/a/b[1+0]');
 | 
						|
SELECT extractValue(@xml,'/a/b[1*1]');
 | 
						|
SELECT extractValue(@xml,'/a/b[--1]');
 | 
						|
SELECT extractValue(@xml,'/a/b[2*1-1]');
 | 
						|
 | 
						|
SELECT extractValue(@xml,'/a/b[1+1]');
 | 
						|
SELECT extractValue(@xml,'/a/b[1*2]');
 | 
						|
SELECT extractValue(@xml,'/a/b[--2]');
 | 
						|
SELECT extractValue(@xml,'/a/b[1*(3-1)]');
 | 
						|
 | 
						|
SELECT extractValue(@xml,'//*[1=1]');
 | 
						|
SELECT extractValue(@xml,'//*[1!=1]');
 | 
						|
SELECT extractValue(@xml,'//*[1>1]');
 | 
						|
SELECT extractValue(@xml,'//*[2>1]');
 | 
						|
SELECT extractValue(@xml,'//*[1>2]');
 | 
						|
SELECT extractValue(@xml,'//*[1>=1]');
 | 
						|
SELECT extractValue(@xml,'//*[2>=1]');
 | 
						|
SELECT extractValue(@xml,'//*[1>=2]');
 | 
						|
SELECT extractValue(@xml,'//*[1<1]');
 | 
						|
SELECT extractValue(@xml,'//*[2<1]');
 | 
						|
SELECT extractValue(@xml,'//*[1<2]');
 | 
						|
SELECT extractValue(@xml,'//*[1<=1]');
 | 
						|
SELECT extractValue(@xml,'//*[2<=1]');
 | 
						|
SELECT extractValue(@xml,'//*[1<=2]');
 | 
						|
 | 
						|
SET @xml='<a><b>b11<c>c11</c></b><b>b21<c>c21</c></b></a>';
 | 
						|
SELECT extractValue(@xml,'/a/b[c="c11"]');
 | 
						|
SELECT extractValue(@xml,'/a/b[c="c21"]');
 | 
						|
 | 
						|
SET @xml='<a><b c="c11">b11</b><b c="c21">b21</b></a>';
 | 
						|
SELECT extractValue(@xml,'/a/b[@c="c11"]');
 | 
						|
SELECT extractValue(@xml,'/a/b[@c="c21"]');
 | 
						|
 | 
						|
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');
 | 
						|
SELECT extractValue(@xml, '/a/b[@c="c21"]/d');
 | 
						|
SELECT extractValue(@xml, '/a/b[d="d11"]/@c');
 | 
						|
SELECT extractValue(@xml, '/a/b[d="d21"]/@c');
 | 
						|
SELECT extractValue(@xml, '/a[b="b11"]');
 | 
						|
SELECT extractValue(@xml, '/a[b/@c="c11"]');
 | 
						|
SELECT extractValue(@xml, '/a[b/d="d11"]');
 | 
						|
SELECT extractValue(@xml, '/a[/a/b="b11"]');
 | 
						|
SELECT extractValue(@xml, '/a[/a/b/@c="c11"]');
 | 
						|
SELECT extractValue(@xml, '/a[/a/b/d="d11"]');
 | 
						|
 | 
						|
SELECT extractValue('<a>a</a>', '/a[false()]');
 | 
						|
SELECT extractValue('<a>a</a>', '/a[true()]');
 | 
						|
SELECT extractValue('<a>a</a>', '/a[not(false())]');
 | 
						|
SELECT extractValue('<a>a</a>', '/a[not(true())]');
 | 
						|
SELECT extractValue('<a>a</a>', '/a[true() and true()]');
 | 
						|
SELECT extractValue('<a>a</a>', '/a[true() and false()]');
 | 
						|
SELECT extractValue('<a>a</a>', '/a[false()and false()]');
 | 
						|
SELECT extractValue('<a>a</a>', '/a[false()and true()]');
 | 
						|
SELECT extractValue('<a>a</a>', '/a[true() or true()]');
 | 
						|
SELECT extractValue('<a>a</a>', '/a[true() or false()]');
 | 
						|
SELECT extractValue('<a>a</a>', '/a[false()or false()]');
 | 
						|
SELECT extractValue('<a>a</a>', '/a[false()or true()]');
 | 
						|
 | 
						|
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"]');
 | 
						|
select extractValue(@xml,'/a/b[@c="d"]');
 | 
						|
select extractValue(@xml,'/a/b[@c="e"]');
 | 
						|
select extractValue(@xml,'/a/b[not(@c="e")]');
 | 
						|
select extractValue(@xml,'/a/b[@c!="e"]');
 | 
						|
select extractValue(@xml,'/a/b[@c="c" or @c="d"]');
 | 
						|
select extractValue(@xml,'/a/b[@c="c" and @c="e"]');
 | 
						|
 | 
						|
SET @xml='<a><b c="c" d="d">b1</b><b d="d" e="e">b2</b></a>';
 | 
						|
select extractValue(@xml,'/a/b[@c]');
 | 
						|
select extractValue(@xml,'/a/b[@d]');
 | 
						|
select extractValue(@xml,'/a/b[@e]');
 | 
						|
select extractValue(@xml,'/a/b[not(@c)]');
 | 
						|
select extractValue(@xml,'/a/b[not(@d)]');
 | 
						|
select extractValue(@xml,'/a/b[not(@e)]');
 | 
						|
 | 
						|
select extractValue(@xml, '/a/b[boolean(@c) or boolean(@d)]');
 | 
						|
select extractValue(@xml, '/a/b[boolean(@c) or boolean(@e)]');
 | 
						|
select extractValue(@xml, '/a/b[boolean(@d) or boolean(@e)]');
 | 
						|
select extractValue(@xml, '/a/b[boolean(@c) and boolean(@d)]');
 | 
						|
select extractValue(@xml, '/a/b[boolean(@c) and boolean(@e)]');
 | 
						|
select extractValue(@xml, '/a/b[boolean(@d) and boolean(@e)]');
 | 
						|
 | 
						|
select extractValue(@xml, '/a/b[@c or @d]');
 | 
						|
select extractValue(@xml, '/a/b[@c or @e]');
 | 
						|
select extractValue(@xml, '/a/b[@d or @e]');
 | 
						|
select extractValue(@xml, '/a/b[@c and @d]');
 | 
						|
select extractValue(@xml, '/a/b[@c and @e]');
 | 
						|
select extractValue(@xml, '/a/b[@d and @e]');
 | 
						|
 | 
						|
SET @xml='<a><b c="c">b1</b><b>b2</b></a>';
 | 
						|
SELECT extractValue(@xml,'/a/b[@*]');
 | 
						|
SELECT extractValue(@xml,'/a/b[not(@*)]');
 | 
						|
 | 
						|
SELECT extractValue('<a>a</a>', '/a[ceiling(3.1)=4]');
 | 
						|
SELECT extractValue('<a>a</a>', '/a[floor(3.1)=3]');
 | 
						|
SELECT extractValue('<a>a</a>', '/a[round(3.1)=3]');
 | 
						|
SELECT extractValue('<a>a</a>', '/a[round(3.8)=4]');
 | 
						|
 | 
						|
SELECT extractValue('<a><b>b</b><c>c</c></a>', '/a/b | /a/c');
 | 
						|
 | 
						|
select extractValue('<a b="b1" b="b2" b="b3"/>','/a/@b[position()=1]');
 | 
						|
select extractValue('<a b="b1" b="b2" b="b3"/>','/a/@b[position()=2]');
 | 
						|
select extractValue('<a b="b1" b="b2" b="b3"/>','/a/@b[position()=3]');
 | 
						|
select extractValue('<a b="b1" b="b2" b="b3"/>','/a/@b[1=position()]');
 | 
						|
select extractValue('<a b="b1" b="b2" b="b3"/>','/a/@b[2=position()]');
 | 
						|
select extractValue('<a b="b1" b="b2" b="b3"/>','/a/@b[3=position()]');
 | 
						|
select extractValue('<a b="b1" b="b2" b="b3"/>','/a/@b[2>=position()]');
 | 
						|
select extractValue('<a b="b1" b="b2" b="b3"/>','/a/@b[2<=position()]');
 | 
						|
select extractValue('<a b="b1" b="b2" b="b3"/>','/a/@b[position()=3 or position()=2]');
 | 
						|
 | 
						|
SELECT extractValue('<a>a<b>a1<c>c1</c></b><b>a2</b></a>','/a/b[count(c)=0]');
 | 
						|
SELECT extractValue('<a>a<b>a1<c>c1</c></b><b>a2</b></a>','/a/b[count(c)=1]');
 | 
						|
select extractValue('<a>a1<b ba="1" ba="2">b1</b><b>b2</b>4</a>','/a/b[sum(@ba)=3]');
 | 
						|
 | 
						|
select extractValue('<a><b>b1</b><b>b2</b></a>','/a/b[1]');
 | 
						|
select extractValue('<a><b>b1</b><b>b2</b></a>','/a/b[boolean(1)]');
 | 
						|
select extractValue('<a><b>b1</b><b>b2</b></a>','/a/b[true()]');
 | 
						|
select extractValue('<a><b>b1</b><b>b2</b></a>','/a/b[number(true())]');
 | 
						|
 | 
						|
select extractValue('<a>ab</a>','/a[contains("abc","b")]');
 | 
						|
select extractValue('<a>ab</a>','/a[contains(.,"a")]');
 | 
						|
select extractValue('<a>ab</a>','/a[contains(.,"b")]');
 | 
						|
select extractValue('<a>ab</a>','/a[contains(.,"c")]');
 | 
						|
 | 
						|
select extractValue('<a b="1">ab</a>','/a[concat(@b,"2")="12"]');
 | 
						|
 | 
						|
SET @xml='<a b="11" b="12" b="21" b="22">ab</a>';
 | 
						|
select extractValue(@xml, '/a/@b[substring(.,2)="1"]');
 | 
						|
select extractValue(@xml, '/a/@b[substring(.,2)="2"]');
 | 
						|
select extractValue(@xml, '/a/@b[substring(.,1,1)="1"]');
 | 
						|
select extractValue(@xml, '/a/@b[substring(.,1,1)="2"]');
 | 
						|
select extractValue(@xml, '/a/@b[substring(.,2,1)="1"]');
 | 
						|
select extractValue(@xml, '/a/@b[substring(.,2,1)="2"]');
 | 
						|
 | 
						|
#
 | 
						|
# Bug#16319: XML: extractvalue() returns syntax errors for some functions
 | 
						|
#
 | 
						|
SET @xml='<a><b>b1</b><b>b2</b></a>';
 | 
						|
SELECT extractValue(@xml, '/a/b[string-length("x")=1]');
 | 
						|
SELECT extractValue(@xml, '/a/b[string-length("xx")=2]');
 | 
						|
SELECT extractValue(@xml, '/a/b[string-length("xxx")=2]');
 | 
						|
SELECT extractValue(@xml, '/a/b[string-length("x")]');
 | 
						|
SELECT extractValue(@xml, '/a/b[string-length("xx")]');
 | 
						|
SELECT extractValue(@xml, '/a/b[string-length()]');
 | 
						|
--error 1105
 | 
						|
SELECT extractValue(@xml, 'string-length()');
 | 
						|
SELECT extractValue(@xml, 'string-length("x")');
 | 
						|
 | 
						|
SET @xml='<a b="b11" b="b12" b="b21" b="22"/>';
 | 
						|
select extractValue(@xml,'/a/@b');
 | 
						|
select extractValue(@xml,'/a/@b[contains(.,"1")]');
 | 
						|
select extractValue(@xml,'/a/@b[contains(.,"1")][contains(.,"2")]');
 | 
						|
select extractValue(@xml,'/a/@b[contains(.,"1")][contains(.,"2")][2]');
 | 
						|
 | 
						|
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','+++++++++');
 | 
						|
select UpdateXML('<a>a1<b>b1<c>c1</c>b2</b>a2</a>','/a/b/c','<c1>+++++++++</c1>');
 | 
						|
select UpdateXML('<a>a1<b>b1<c>c1</c>b2</b>a2</a>','/a/b/c','<c1/>');
 | 
						|
 | 
						|
SET @xml='<a><b>bb</b></a>';
 | 
						|
select UpdateXML(@xml, '/a/b', '<b>ccc</b>');
 | 
						|
 | 
						|
SET @xml='<a aa1="aa1" aa2="aa2"><b bb1="bb1" bb2="bb2">bb</b></a>';
 | 
						|
select UpdateXML(@xml, '/a/b', '<b>ccc</b>');
 | 
						|
select UpdateXML(@xml, '/a/@aa1', '');
 | 
						|
select UpdateXML(@xml, '/a/@aa1', 'aa3="aa3"');
 | 
						|
select UpdateXML(@xml, '/a/@aa2', '');
 | 
						|
select UpdateXML(@xml, '/a/@aa2', 'aa3="aa3"');
 | 
						|
select UpdateXML(@xml, '/a/b/@bb1', '');
 | 
						|
select UpdateXML(@xml, '/a/b/@bb1', 'bb3="bb3"');
 | 
						|
select UpdateXML(@xml, '/a/b/@bb2', '');
 | 
						|
select UpdateXML(@xml, '/a/b/@bb2', 'bb3="bb3"');
 | 
						|
 | 
						|
#
 | 
						|
#  Bug#16234 XML: Crash if ExtractValue()
 | 
						|
#
 | 
						|
SET @xml= '<order><clerk>lesser wombat</clerk></order>';
 | 
						|
select extractvalue(@xml,'order/clerk');
 | 
						|
select extractvalue(@xml,'/order/clerk');
 | 
						|
 | 
						|
#
 | 
						|
# Bug#16314 XML: extractvalue() crash if vertical bar
 | 
						|
#
 | 
						|
select extractvalue('<a><b>B</b></a>','/a|/b');
 | 
						|
select extractvalue('<a><b>B</b></a>','/a|b');
 | 
						|
select extractvalue('<a>a<b>B</b></a>','/a|/b');
 | 
						|
select extractvalue('<a>a<b>B</b></a>','/a|b');
 | 
						|
select extractvalue('<a>a<b>B</b></a>','a|/b');
 | 
						|
 | 
						|
#
 | 
						|
# Bug#16312 XML: extractvalue() crash if angle brackets
 | 
						|
#
 | 
						|
--error 1105
 | 
						|
select extractvalue('<a>A</a>','/<a>');
 | 
						|
 | 
						|
#
 | 
						|
# Bug#16313 XML: extractvalue() ignores '!' in names
 | 
						|
#
 | 
						|
--error 1105
 | 
						|
select extractvalue('<a><b>b</b><b!>b!</b!></a>','//b!');
 | 
						|
 | 
						|
#
 | 
						|
# Bug #16315 XML: extractvalue() handles self badly
 | 
						|
#
 | 
						|
select extractvalue('<a>A<b>B<c>C</c></b></a>','/a/descendant::*');
 | 
						|
select extractvalue('<a>A<b>B<c>C</c></b></a>','/a/self::*');
 | 
						|
select extractvalue('<a>A<b>B<c>C</c></b></a>','/a/descendant-or-self::*');
 | 
						|
# Bug #16320 XML: extractvalue() won't accept names containing underscores
 | 
						|
#
 | 
						|
select extractvalue('<A_B>A</A_B>','/A_B');
 | 
						|
 | 
						|
#
 | 
						|
# Bug#16318: XML: extractvalue() incorrectly returns last() = 1
 | 
						|
#
 | 
						|
select extractvalue('<a>A<b>B1</b><b>B2</b></a>','/a/b[position()]');
 | 
						|
select extractvalue('<a>A<b>B1</b><b>B2</b></a>','/a/b[count(.)=last()]');
 | 
						|
select extractvalue('<a>A<b>B1</b><b>B2</b></a>','/a/b[last()]');
 | 
						|
select 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()=1]');
 | 
						|
select extractvalue('<a>A<b>B1</b><b>B2</b></a>','/a/b[last()=2]');
 | 
						|
select extractvalue('<a>A<b>B1</b><b>B2</b></a>','/a/b[last()=position()]');
 | 
						|
select extractvalue('<a>A<b>B1</b><b>B2</b></a>','/a/b[count(.)]');
 | 
						|
select 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(.)=1]');
 | 
						|
select extractvalue('<a>A<b>B1</b><b>B2</b></a>','/a/b[count(.)=2]');
 | 
						|
select extractvalue('<a>A<b>B1</b><b>B2</b></a>','/a/b[count(.)=position()]');
 | 
						|
#
 | 
						|
# Bug#16316: XML: extractvalue() is case-sensitive with contains()
 | 
						|
#
 | 
						|
select extractvalue('<a>Jack</a>','/a[contains(../a,"J")]');
 | 
						|
select extractvalue('<a>Jack</a>','/a[contains(../a,"j")]');
 | 
						|
select extractvalue('<a>Jack</a>','/a[contains(../a,"j")]' collate latin1_bin);
 | 
						|
select extractvalue('<a>Jack</a>' collate latin1_bin,'/a[contains(../a,"j")]');
 | 
						|
 | 
						|
#
 | 
						|
# Bug#18285: ExtractValue not returning character
 | 
						|
# data within <![CDATA[]]> as expected
 | 
						|
#
 | 
						|
select ExtractValue('<tag1><![CDATA[test]]></tag1>','/tag1');
 | 
						|
 | 
						|
#
 | 
						|
# Bug#18201: XML: ExtractValue works even if the xml fragment
 | 
						|
# is not well-formed xml
 | 
						|
#
 | 
						|
select extractValue('<a>a','/a');
 | 
						|
select extractValue('<a>a<','/a');
 | 
						|
select extractValue('<a>a</','/a');
 | 
						|
select extractValue('<a>a</a','/a');
 | 
						|
select extractValue('<a>a</a></b>','/a');
 | 
						|
select extractValue('<a b=>a</a>','/a');
 | 
						|
 | 
						|
#
 | 
						|
# Bug #18171 XML: ExtractValue: the XPath position()
 | 
						|
# function crashes the server!
 | 
						|
#
 | 
						|
--error 1105
 | 
						|
select extractValue('<e>1</e>','position()');
 | 
						|
--error 1105
 | 
						|
select extractValue('<e>1</e>','last()');
 | 
						|
 | 
						|
 | 
						|
#
 | 
						|
# Bug #18172 XML: Extractvalue() accepts mallformed
 | 
						|
# XPath without a XPath syntax error
 | 
						|
#
 | 
						|
--error 1105
 | 
						|
select extractValue('<e><a>1</a></e>','/e/');
 | 
						|
 | 
						|
#
 | 
						|
# Bug#16233: XML: ExtractValue() fails with special characters
 | 
						|
#
 | 
						|
set names utf8;
 | 
						|
select extractValue('<Ñ><r>r</r></Ñ>','/Ñ/r');
 | 
						|
select extractValue('<r><Ñ>Ñ</Ñ></r>','/r/Ñ');
 | 
						|
select extractValue('<Ñ r="r"/>','/Ñ/@r');
 | 
						|
select extractValue('<r Ñ="Ñ"/>','/r/@Ñ');
 | 
						|
--disable_warnings
 | 
						|
DROP PROCEDURE IF EXISTS p2;
 | 
						|
--enable_warnings
 | 
						|
DELIMITER //;
 | 
						|
CREATE PROCEDURE p2 ()
 | 
						|
BEGIN
 | 
						|
 DECLARE p LONGTEXT CHARACTER SET UTF8 DEFAULT '<Ñ><r>A</r></Ñ>';
 | 
						|
 SELECT EXTRACTVALUE(p,'/Ñ/r');
 | 
						|
END//
 | 
						|
DELIMITER ;//
 | 
						|
CALL p2();
 | 
						|
DROP PROCEDURE p2;
 | 
						|
 | 
						|
#
 | 
						|
# Bug#18170: XML: ExtractValue():
 | 
						|
# XPath expression can't use QNames (colon in names)
 | 
						|
#
 | 
						|
select extractValue('<ns:element xmlns:ns="myns"/>','count(ns:element)');
 | 
						|
select extractValue('<ns:element xmlns:ns="myns">a</ns:element>','/ns:element');
 | 
						|
select extractValue('<ns:element xmlns:ns="myns">a</ns:element>','/ns:element/@xmlns:ns');
 | 
						|
 | 
						|
#
 | 
						|
# Bug#20795 extractvalue() won't accept names containing a dot (.)
 | 
						|
#
 | 
						|
select extractValue('<foo><foo.bar>Data</foo.bar><something>Otherdata</something></foo>','/foo/foo.bar');
 | 
						|
select extractValue('<foo><foo.bar>Data</foo.bar><something>Otherdata</something></foo>','/foo/something');
 | 
						|
 | 
						|
#
 | 
						|
# Bug#20854 XML functions: wrong result in ExtractValue
 | 
						|
#
 | 
						|
--error 1105
 | 
						|
select extractValue('<zot><tim0><01>10:39:15</01><02>140</02></tim0></zot>','/zot/tim0/02');
 | 
						|
select extractValue('<zot><tim0><01>10:39:15</01><02>140</02></tim0></zot>','//*');
 | 
						|
# dot and dash are bad identtifier start character
 | 
						|
select extractValue('<.>test</.>','//*');
 | 
						|
select extractValue('<->test</->','//*');
 | 
						|
# semicolon is good identifier start character
 | 
						|
select extractValue('<:>test</:>','//*');
 | 
						|
# underscore is good identifier start character
 | 
						|
select extractValue('<_>test</_>','//*');
 | 
						|
# dot, dash, underscore and semicolon are good identifier middle characters
 | 
						|
select extractValue('<x.-_:>test</x.-_:>','//*');
 |