mirror of
https://github.com/MariaDB/server.git
synced 2025-01-20 05:52:27 +01:00
5f8bd7fe0f
XPath without a XPath syntax error item_xmlfunc.cc: Error message didn't happen because after a failing attempt to parse RelativeLocationPath, my_xpath_parse_AbsoluteLocationPath() returned success. Changeing logic a bit: - Try to parse EOF first, return success if true. - Then try to parse RelativeLocationPath(), return success if true. - Otherwise return failure. xml.result: Adding test case. Also, this change made it possible to generate an error message earlier in the case of another bad XPATH syntax. xml.test: Adding test case. sql/item_xmlfunc.cc: Bug #18172 XML: Extractvalue() accepts mallformed XPath without a XPath syntax error Error message didn't happen because after a failing attempt to parse RelativeLocationPath(), my_xpath_parse_AbsoluteLocationPath() returned with 1. Changeing logic a bit: check for EOF first. Then try to parse RelativeLocationPath(). If the latter fails, return failure. mysql-test/t/xml.test: Adding test case. mysql-test/r/xml.result: Adding test case. Also, this change makes error message to be generated earlier in the case of another bad XPATH syntax.
297 lines
12 KiB
Text
297 lines
12 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');
|
|
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"]');
|
|
|
|
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 #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/');
|
|
|