 Bug#16313 XML: extractvalue() ignores '!' in names
xml.result, xml.test:
Adding test case.
item_xmlfunc.cc:
Fixed that the "!" character written at the end was ignored.
Now if we try to scan "!=", and if "!" is not
followed by "=", we rollback lex scanner back
to "!" token, so the parser will start to check
the next rule from the "!" character again.
Previously parser started from the next character,
which was EOF in the example in xml.test,
which led to query being successfully parsed,
instead of producing a syntax error.
sql/item_xmlfunc.cc:
Bug#16313 XML: extractvalue() ignores '!' in names
'!' at the end was ignored.
Now if we try to scan "!=", and if "!" is not
followed by "=", we rollback lex scanner back
to "!" token, so the parser will start to check
the next rule from the "!" character again.
Previously it started from the next character,
which was EOF in the example in xml.test, and
which led to query being successfully parsed,
instead of producing a syntax error.
mysql-test/t/xml.test:
Adding test case.
mysql-test/r/xml.result:
Adding test case.
20 years ago |
|
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 a2SELECT extractValue(@xml,'/a/b');extractValue(@xml,'/a/b')b1 b2SELECT extractValue(@xml,'/a/b/c');extractValue(@xml,'/a/b/c')c1SELECT extractValue(@xml,'/a/@aa1');extractValue(@xml,'/a/@aa1')aa1SELECT extractValue(@xml,'/a/@aa2');extractValue(@xml,'/a/@aa2')aa2SELECT extractValue(@xml,'/a/@*');extractValue(@xml,'/a/@*')aa1 aa2SELECT extractValue(@xml,'//@ba1');extractValue(@xml,'//@ba1')ba1SELECT extractValue(@xml,'//a');extractValue(@xml,'//a')a1 a2SELECT extractValue(@xml,'//b');extractValue(@xml,'//b')b1 b2SELECT extractValue(@xml,'//c');extractValue(@xml,'//c')c1SELECT extractValue(@xml,'/a//b');extractValue(@xml,'/a//b')b1 b2SELECT extractValue(@xml,'/a//c');extractValue(@xml,'/a//c')c1SELECT extractValue(@xml,'//*');extractValue(@xml,'//*')a1 b1 c1 b2 a2SELECT extractValue(@xml,'/a//*');extractValue(@xml,'/a//*')b1 c1 b2SELECT extractValue(@xml,'/./a');extractValue(@xml,'/./a')a1 a2SELECT extractValue(@xml,'/a/b/.');extractValue(@xml,'/a/b/.')b1 b2SELECT extractValue(@xml,'/a/b/..');extractValue(@xml,'/a/b/..')a1 a2SELECT extractValue(@xml,'/a/b/../@aa1');extractValue(@xml,'/a/b/../@aa1')aa1SELECT extractValue(@xml,'/*');extractValue(@xml,'/*')a1 a2SELECT extractValue(@xml,'/*/*');extractValue(@xml,'/*/*')b1 b2SELECT extractValue(@xml,'/*/*/*');extractValue(@xml,'/*/*/*')c1SELECT extractValue(@xml,'/a/child::*');extractValue(@xml,'/a/child::*')b1 b2SELECT extractValue(@xml,'/a/self::*');extractValue(@xml,'/a/self::*')a1 a2SELECT extractValue(@xml,'/a/descendant::*');extractValue(@xml,'/a/descendant::*')b1 c1 b2SELECT extractValue(@xml,'/a/descendant-or-self::*');extractValue(@xml,'/a/descendant-or-self::*')a1 b1 c1 b2 a2SELECT extractValue(@xml,'/a/attribute::*');extractValue(@xml,'/a/attribute::*')aa1 aa2SELECT extractValue(@xml,'/a/b/c/parent::*');extractValue(@xml,'/a/b/c/parent::*')b1 b2SELECT extractValue(@xml,'/a/b/c/ancestor::*');extractValue(@xml,'/a/b/c/ancestor::*')a1 b1 b2 a2SELECT extractValue(@xml,'/a/b/c/ancestor-or-self::*');extractValue(@xml,'/a/b/c/ancestor-or-self::*')a1 b1 c1 b2 a2SELECT extractValue(@xml,'/descendant-or-self::*');extractValue(@xml,'/descendant-or-self::*')a1 b1 c1 b2 a2SET @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 a12SELECT extractValue(@xml,'//@ba');extractValue(@xml,'//@ba')ba11 ba12 ba21 ba22SET @xml='<a><b>b</b><c>c</c></a>';SELECT extractValue(@xml,'/a/b');extractValue(@xml,'/a/b')bSELECT extractValue(@xml,'/a/c');extractValue(@xml,'/a/c')cSELECT extractValue(@xml,'/a/child::b');extractValue(@xml,'/a/child::b')bSELECT extractValue(@xml,'/a/child::c');extractValue(@xml,'/a/child::c')cSET @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]')b1SELECT extractValue(@xml,'/a/b[2]');extractValue(@xml,'/a/b[2]')b2SELECT extractValue(@xml,'/a/c[1]');extractValue(@xml,'/a/c[1]')c1SELECT extractValue(@xml,'/a/c[2]');extractValue(@xml,'/a/c[2]')c2SET @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 xc2SELECT extractValue(@xml,'/a//@x[1]');extractValue(@xml,'/a//@x[1]')xb1 xc1SELECT extractValue(@xml,'/a//@x[2]');extractValue(@xml,'/a//@x[2]')xb2 xc2SET @xml='<a><b>b1</b><b>b2</b><c><b>c1b1</b><b>c1b2</b></c><c><b>c2b1</b></c></a>';SELECT extractValue(@xml,'//b[1]');extractValue(@xml,'//b[1]')b1 c1b1 c2b1SELECT extractValue(@xml,'/descendant::b[1]');extractValue(@xml,'/descendant::b[1]')b1SET @xml='<a><b>b1</b><b>b2</b></a>';SELECT extractValue(@xml,'/a/b[1+0]');extractValue(@xml,'/a/b[1+0]')b1SELECT extractValue(@xml,'/a/b[1*1]');extractValue(@xml,'/a/b[1*1]')b1SELECT extractValue(@xml,'/a/b[--1]');extractValue(@xml,'/a/b[--1]')b1SELECT extractValue(@xml,'/a/b[2*1-1]');extractValue(@xml,'/a/b[2*1-1]')b1SELECT extractValue(@xml,'/a/b[1+1]');extractValue(@xml,'/a/b[1+1]')b2SELECT extractValue(@xml,'/a/b[1*2]');extractValue(@xml,'/a/b[1*2]')b2SELECT extractValue(@xml,'/a/b[--2]');extractValue(@xml,'/a/b[--2]')b2SELECT extractValue(@xml,'/a/b[1*(3-1)]');extractValue(@xml,'/a/b[1*(3-1)]')b2SELECT extractValue(@xml,'//*[1=1]');extractValue(@xml,'//*[1=1]')b1 b2SELECT 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 b2SELECT extractValue(@xml,'//*[1>2]');extractValue(@xml,'//*[1>2]')
SELECT extractValue(@xml,'//*[1>=1]');extractValue(@xml,'//*[1>=1]')b1 b2SELECT extractValue(@xml,'//*[2>=1]');extractValue(@xml,'//*[2>=1]')b1 b2SELECT 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 b2SELECT extractValue(@xml,'//*[1<=1]');extractValue(@xml,'//*[1<=1]')b1 b2SELECT extractValue(@xml,'//*[2<=1]');extractValue(@xml,'//*[2<=1]')
SELECT extractValue(@xml,'//*[1<=2]');extractValue(@xml,'//*[1<=2]')b1 b2SET @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"]')b11SELECT extractValue(@xml,'/a/b[c="c21"]');extractValue(@xml,'/a/b[c="c21"]')b21SET @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"]')b11SELECT extractValue(@xml,'/a/b[@c="c21"]');extractValue(@xml,'/a/b[@c="c21"]')b21SET @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')d11SELECT extractValue(@xml, '/a/b[@c="c21"]/d');extractValue(@xml, '/a/b[@c="c21"]/d')d21SELECT extractValue(@xml, '/a/b[d="d11"]/@c');extractValue(@xml, '/a/b[d="d11"]/@c')c11SELECT extractValue(@xml, '/a/b[d="d21"]/@c');extractValue(@xml, '/a/b[d="d21"]/@c')c21SELECT extractValue(@xml, '/a[b="b11"]');extractValue(@xml, '/a[b="b11"]')a1SELECT extractValue(@xml, '/a[b/@c="c11"]');extractValue(@xml, '/a[b/@c="c11"]')a1SELECT extractValue(@xml, '/a[b/d="d11"]');extractValue(@xml, '/a[b/d="d11"]')a1SELECT extractValue(@xml, '/a[/a/b="b11"]');extractValue(@xml, '/a[/a/b="b11"]')a1SELECT extractValue(@xml, '/a[/a/b/@c="c11"]');extractValue(@xml, '/a[/a/b/@c="c11"]')a1SELECT extractValue(@xml, '/a[/a/b/d="d11"]');extractValue(@xml, '/a[/a/b/d="d11"]')a1SELECT 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()]')aSELECT extractValue('<a>a</a>', '/a[not(false())]');extractValue('<a>a</a>', '/a[not(false())]')aSELECT 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()]')aSELECT 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()]')aSELECT extractValue('<a>a</a>', '/a[true() or false()]');extractValue('<a>a</a>', '/a[true() or false()]')aSELECT 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()]')aSET @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"]')b1select extractValue(@xml,'/a/b[@c="d"]');extractValue(@xml,'/a/b[@c="d"]')b2select extractValue(@xml,'/a/b[@c="e"]');extractValue(@xml,'/a/b[@c="e"]')b1 b3select extractValue(@xml,'/a/b[not(@c="e")]');extractValue(@xml,'/a/b[not(@c="e")]')b2select extractValue(@xml,'/a/b[@c!="e"]');extractValue(@xml,'/a/b[@c!="e"]')b1 b2 b3select extractValue(@xml,'/a/b[@c="c" or @c="d"]');extractValue(@xml,'/a/b[@c="c" or @c="d"]')b1 b2select extractValue(@xml,'/a/b[@c="c" and @c="e"]');extractValue(@xml,'/a/b[@c="c" and @c="e"]')b1SET @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]')b1select extractValue(@xml,'/a/b[@d]');extractValue(@xml,'/a/b[@d]')b1 b2select extractValue(@xml,'/a/b[@e]');extractValue(@xml,'/a/b[@e]')b2select extractValue(@xml,'/a/b[not(@c)]');extractValue(@xml,'/a/b[not(@c)]')b2select 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)]')b1select extractValue(@xml, '/a/b[boolean(@c) or boolean(@d)]');extractValue(@xml, '/a/b[boolean(@c) or boolean(@d)]')b1 b2select extractValue(@xml, '/a/b[boolean(@c) or boolean(@e)]');extractValue(@xml, '/a/b[boolean(@c) or boolean(@e)]')b1 b2select extractValue(@xml, '/a/b[boolean(@d) or boolean(@e)]');extractValue(@xml, '/a/b[boolean(@d) or boolean(@e)]')b1 b2select extractValue(@xml, '/a/b[boolean(@c) and boolean(@d)]');extractValue(@xml, '/a/b[boolean(@c) and boolean(@d)]')b1select 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)]')b2select extractValue(@xml, '/a/b[@c or @d]');extractValue(@xml, '/a/b[@c or @d]')b1 b2select extractValue(@xml, '/a/b[@c or @e]');extractValue(@xml, '/a/b[@c or @e]')b1 b2select extractValue(@xml, '/a/b[@d or @e]');extractValue(@xml, '/a/b[@d or @e]')b1 b2select extractValue(@xml, '/a/b[@c and @d]');extractValue(@xml, '/a/b[@c and @d]')b1select 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]')b2SET @xml='<a><b c="c">b1</b><b>b2</b></a>';SELECT extractValue(@xml,'/a/b[@*]');extractValue(@xml,'/a/b[@*]')b1SELECT extractValue(@xml,'/a/b[not(@*)]');extractValue(@xml,'/a/b[not(@*)]')b2SELECT extractValue('<a>a</a>', '/a[ceiling(3.1)=4]');extractValue('<a>a</a>', '/a[ceiling(3.1)=4]')aSELECT extractValue('<a>a</a>', '/a[floor(3.1)=3]');extractValue('<a>a</a>', '/a[floor(3.1)=3]')aSELECT extractValue('<a>a</a>', '/a[round(3.1)=3]');extractValue('<a>a</a>', '/a[round(3.1)=3]')aSELECT extractValue('<a>a</a>', '/a[round(3.8)=4]');extractValue('<a>a</a>', '/a[round(3.8)=4]')aSELECT 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 cselect extractValue('<a b="b1" b="b2" b="b3"/>','/a/@b[position()=1]');extractValue('<a b="b1" b="b2" b="b3"/>','/a/@b[position()=1]')b1select extractValue('<a b="b1" b="b2" b="b3"/>','/a/@b[position()=2]');extractValue('<a b="b1" b="b2" b="b3"/>','/a/@b[position()=2]')b2select extractValue('<a b="b1" b="b2" b="b3"/>','/a/@b[position()=3]');extractValue('<a b="b1" b="b2" b="b3"/>','/a/@b[position()=3]')b3select extractValue('<a b="b1" b="b2" b="b3"/>','/a/@b[1=position()]');extractValue('<a b="b1" b="b2" b="b3"/>','/a/@b[1=position()]')b1select extractValue('<a b="b1" b="b2" b="b3"/>','/a/@b[2=position()]');extractValue('<a b="b1" b="b2" b="b3"/>','/a/@b[2=position()]')b2select extractValue('<a b="b1" b="b2" b="b3"/>','/a/@b[3=position()]');extractValue('<a b="b1" b="b2" b="b3"/>','/a/@b[3=position()]')b3select 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 b2select 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 b3select 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 b3SELECT 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]')a2SELECT 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]')a1select 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]')b1select extractValue('<a><b>b1</b><b>b2</b></a>','/a/b[1]');extractValue('<a><b>b1</b><b>b2</b></a>','/a/b[1]')b1select 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 b2select 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 b2select 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())]')b1select extractValue('<a>ab</a>','/a[contains("abc","b")]');extractValue('<a>ab</a>','/a[contains("abc","b")]')abselect extractValue('<a>ab</a>','/a[contains(.,"a")]');extractValue('<a>ab</a>','/a[contains(.,"a")]')abselect extractValue('<a>ab</a>','/a[contains(.,"b")]');extractValue('<a>ab</a>','/a[contains(.,"b")]')abselect 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"]')abSET @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 21select extractValue(@xml, '/a/@b[substring(.,2)="2"]');extractValue(@xml, '/a/@b[substring(.,2)="2"]')12 22select extractValue(@xml, '/a/@b[substring(.,1,1)="1"]');extractValue(@xml, '/a/@b[substring(.,1,1)="1"]')11 12select extractValue(@xml, '/a/@b[substring(.,1,1)="2"]');extractValue(@xml, '/a/@b[substring(.,1,1)="2"]')21 22select extractValue(@xml, '/a/@b[substring(.,2,1)="1"]');extractValue(@xml, '/a/@b[substring(.,2,1)="1"]')11 21select extractValue(@xml, '/a/@b[substring(.,2,1)="2"]');extractValue(@xml, '/a/@b[substring(.,2,1)="2"]')12 22SET @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 b2SELECT extractValue(@xml, '/a/b[string-length("xx")=2]');extractValue(@xml, '/a/b[string-length("xx")=2]')b1 b2SELECT 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")]')b1SELECT extractValue(@xml, '/a/b[string-length("xx")]');extractValue(@xml, '/a/b[string-length("xx")]')b2SELECT extractValue(@xml, '/a/b[string-length()]');extractValue(@xml, '/a/b[string-length()]')b2SELECT extractValue(@xml, 'string-length()');ERROR HY000: XPATH syntax error: ''SELECT extractValue(@xml, 'string-length("x")');extractValue(@xml, 'string-length("x")')1SET @xml='<a b="b11" b="b12" b="b21" b="22"/>';select extractValue(@xml,'/a/@b');extractValue(@xml,'/a/@b')b11 b12 b21 22select extractValue(@xml,'/a/@b[contains(.,"1")]');extractValue(@xml,'/a/@b[contains(.,"1")]')b11 b12 b21select extractValue(@xml,'/a/@b[contains(.,"1")][contains(.,"2")]');extractValue(@xml,'/a/@b[contains(.,"1")][contains(.,"2")]')b12 b21select extractValue(@xml,'/a/@b[contains(.,"1")][contains(.,"2")][2]');extractValue(@xml,'/a/@b[contains(.,"1")][contains(.,"2")][2]')b21SET @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 wombatselect extractvalue(@xml,'/order/clerk');extractvalue(@xml,'/order/clerk')lesser wombatselect 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')aselect extractvalue('<a>a<b>B</b></a>','/a|b');extractvalue('<a>a<b>B</b></a>','/a|b')aselect extractvalue('<a>a<b>B</b></a>','a|/b');extractvalue('<a>a<b>B</b></a>','a|/b')aselect 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 Cselect extractvalue('<a>A<b>B<c>C</c></b></a>','/a/self::*');extractvalue('<a>A<b>B<c>C</c></b></a>','/a/self::*')Aselect 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 Cselect extractvalue('<A_B>A</A_B>','/A_B');extractvalue('<A_B>A</A_B>','/A_B')Aselect 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 B2select 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 B2select 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()]')B2select 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]')B1select 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 B2select 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()]')B2select 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(.)]')B2select 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]')B1select 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 B2select 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()]')B2select extractvalue('<a>Jack</a>','/a[contains(../a,"J")]');extractvalue('<a>Jack</a>','/a[contains(../a,"J")]')Jackselect extractvalue('<a>Jack</a>','/a[contains(../a,"j")]');extractvalue('<a>Jack</a>','/a[contains(../a,"j")]')Jackselect 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')testselect extractValue('<a>a','/a');extractValue('<a>a','/a')NULLWarnings: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')NULLWarnings: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')NULLWarnings: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')NULLWarnings: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')NULLWarnings: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')NULLWarnings: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')rselect extractValue('<r><Ñ>Ñ</Ñ></r>','/r/Ñ');extractValue('<r><Ñ>Ñ</Ñ></r>','/r/Ñ')Ñselect extractValue('<Ñ r="r"/>','/Ñ/@r');extractValue('<Ñ r="r"/>','/Ñ/@r')rselect extractValue('<r Ñ="Ñ"/>','/r/@Ñ');extractValue('<r Ñ="Ñ"/>','/r/@Ñ')ÑDROP PROCEDURE IF EXISTS p2;CREATE PROCEDURE p2 ()BEGINDECLARE p LONGTEXT CHARACTER SET UTF8 DEFAULT '<Ñ><r>A</r></Ñ>';SELECT EXTRACTVALUE(p,'/Ñ/r');END//CALL p2();EXTRACTVALUE(p,'/Ñ/r')ADROP PROCEDURE p2;select extractValue('<ns:element xmlns:ns="myns"/>','count(ns:element)');extractValue('<ns:element xmlns:ns="myns"/>','count(ns:element)')1select extractValue('<ns:element xmlns:ns="myns">a</ns:element>','/ns:element');extractValue('<ns:element xmlns:ns="myns">a</ns:element>','/ns:element')aselect 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')mynsselect 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')Dataselect 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')Otherdataselect 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>','//*')NULLWarnings:Warning 1525 Incorrect XML value: 'parse error at line 1 pos 13: unknown token unexpected (ident or '/' wanted)'select extractValue('<.>test</.>','//*');extractValue('<.>test</.>','//*')NULLWarnings:Warning 1525 Incorrect XML value: 'parse error at line 1 pos 2: unknown token unexpected (ident or '/' wanted)'select extractValue('<->test</->','//*');extractValue('<->test</->','//*')NULLWarnings:Warning 1525 Incorrect XML value: 'parse error at line 1 pos 2: unknown token unexpected (ident or '/' wanted)'select extractValue('<:>test</:>','//*');extractValue('<:>test</:>','//*')testselect extractValue('<_>test</_>','//*');extractValue('<_>test</_>','//*')testselect extractValue('<x.-_:>test</x.-_:>','//*');extractValue('<x.-_:>test</x.-_:>','//*')testset @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")pt10select ExtractValue(@xml, "/entry[(pt!=10)]/id");ExtractValue(@xml, "/entry[(pt!=10)]/id")pt50select 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")pt10select ExtractValue(@xml, "/entry[(pt>10)]/id");ExtractValue(@xml, "/entry[(pt>10)]/id")pt50select ExtractValue(@xml, "/entry[(pt>=10)]/id");ExtractValue(@xml, "/entry[(pt>=10)]/id")pt10 pt50select ExtractValue(@xml, "/entry[(pt=50)]/id");ExtractValue(@xml, "/entry[(pt=50)]/id")pt50select ExtractValue(@xml, "/entry[(pt!=50)]/id");ExtractValue(@xml, "/entry[(pt!=50)]/id")pt10select ExtractValue(@xml, "/entry[(pt<50)]/id");ExtractValue(@xml, "/entry[(pt<50)]/id")pt10select ExtractValue(@xml, "/entry[(pt<=50)]/id");ExtractValue(@xml, "/entry[(pt<=50)]/id")pt10 pt50select 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")pt50select ExtractValue(@xml, "/entry[(10=pt)]/id");ExtractValue(@xml, "/entry[(10=pt)]/id")pt10select ExtractValue(@xml, "/entry[(10!=pt)]/id");ExtractValue(@xml, "/entry[(10!=pt)]/id")pt50select 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")pt10select ExtractValue(@xml, "/entry[(10<pt)]/id");ExtractValue(@xml, "/entry[(10<pt)]/id")pt50select ExtractValue(@xml, "/entry[(10<=pt)]/id");ExtractValue(@xml, "/entry[(10<=pt)]/id")pt10 pt50select ExtractValue(@xml, "/entry[(50=pt)]/id");ExtractValue(@xml, "/entry[(50=pt)]/id")pt50select ExtractValue(@xml, "/entry[(50!=pt)]/id");ExtractValue(@xml, "/entry[(50!=pt)]/id")pt10select ExtractValue(@xml, "/entry[(50>pt)]/id");ExtractValue(@xml, "/entry[(50>pt)]/id")pt10select ExtractValue(@xml, "/entry[(50>=pt)]/id");ExtractValue(@xml, "/entry[(50>=pt)]/id")pt10 pt50select 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")pt50select ExtractValue('<a><b><Text>test</Text></b></a>','/a/b/Text');ExtractValue('<a><b><Text>test</Text></b></a>','/a/b/Text')testselect ExtractValue('<a><b><comment>test</comment></b></a>','/a/b/comment');ExtractValue('<a><b><comment>test</comment></b></a>','/a/b/comment')testselect ExtractValue('<a><b><node>test</node></b></a>','/a/b/node');ExtractValue('<a><b><node>test</node></b></a>','/a/b/node')testselect 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')testselect ExtractValue('<a><and>test</and></a>', '/a/and');ExtractValue('<a><and>test</and></a>', '/a/and')testselect ExtractValue('<a><or>test</or></a>', '/a/or');ExtractValue('<a><or>test</or></a>', '/a/or')testselect ExtractValue('<a><mod>test</mod></a>', '/a/mod');ExtractValue('<a><mod>test</mod></a>', '/a/mod')testselect ExtractValue('<a><div>test</div></a>', '/a/div');ExtractValue('<a><div>test</div></a>', '/a/div')testselect ExtractValue('<a><and:and>test</and:and></a>', '/a/and:and');ExtractValue('<a><and:and>test</and:and></a>', '/a/and:and')testselect ExtractValue('<a><or:or>test</or:or></a>', '/a/or:or');ExtractValue('<a><or:or>test</or:or></a>', '/a/or:or')testselect ExtractValue('<a><mod:mod>test</mod:mod></a>', '/a/mod:mod');ExtractValue('<a><mod:mod>test</mod:mod></a>', '/a/mod:mod')testselect ExtractValue('<a><div:div>test</div:div></a>', '/a/div:div');ExtractValue('<a><div:div>test</div:div></a>', '/a/div:div')testselect ExtractValue('<a><ancestor>test</ancestor></a>', '/a/ancestor');ExtractValue('<a><ancestor>test</ancestor></a>', '/a/ancestor')testselect 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')testselect ExtractValue('<a><attribute>test</attribute></a>', '/a/attribute');ExtractValue('<a><attribute>test</attribute></a>', '/a/attribute')testselect ExtractValue('<a><child>test</child></a>', '/a/child');ExtractValue('<a><child>test</child></a>', '/a/child')testselect ExtractValue('<a><descendant>test</descendant></a>', '/a/descendant');ExtractValue('<a><descendant>test</descendant></a>', '/a/descendant')testselect 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')testselect ExtractValue('<a><following>test</following></a>', '/a/following');ExtractValue('<a><following>test</following></a>', '/a/following')testselect ExtractValue('<a><following-sibling>test</following-sibling></a>', '/a/following-sibling');ExtractValue('<a><following-sibling>test</following-sibling></a>', '/a/following-sibling')testselect ExtractValue('<a><namespace>test</namespace></a>', '/a/namespace');ExtractValue('<a><namespace>test</namespace></a>', '/a/namespace')testselect ExtractValue('<a><parent>test</parent></a>', '/a/parent');ExtractValue('<a><parent>test</parent></a>', '/a/parent')testselect ExtractValue('<a><preceding>test</preceding></a>', '/a/preceding');ExtractValue('<a><preceding>test</preceding></a>', '/a/preceding')testselect ExtractValue('<a><preceding-sibling>test</preceding-sibling></a>', '/a/preceding-sibling');ExtractValue('<a><preceding-sibling>test</preceding-sibling></a>', '/a/preceding-sibling')testselect ExtractValue('<a><self>test</self></a>', '/a/self');ExtractValue('<a><self>test</self></a>', '/a/self')testset @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]')b1set @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]')b2set @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))BEGINDECLARE c INT;DECLARE i INT DEFAULT 1;SET c= ExtractValue(xml,'count(/a/b)');SET @i= c;WHILE i <= c DOBEGINSELECT 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 b3i @i ExtractValue(xml,'/a/b[$i]') ExtractValue(xml,'/a/b[$@i]')2 2 b2 b2i @i ExtractValue(xml,'/a/b[$i]') ExtractValue(xml,'/a/b[$@i]')3 1 b3 b1drop procedure spxml;Multiple matches, but no index specificationSELECT ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/b');ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/b')b1 b2No matchesSELECT 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 rangeSELECT 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 conversionSELECT ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/b["1"]');ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/b["1"]')b1SELECT 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"]')b1Warnings: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 variableSET @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]')b1SET @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]')b1SET @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 variableCREATE PROCEDURE spxml(xml VARCHAR(128), i CHAR(16))BEGINSELECT ExtractValue(xml,'/a/b[$i]');END|CALL spxml('<a><b>b1</b><b>b2</b></a>', '1');ExtractValue(xml,'/a/b[$i]')b1CALL spxml('<a><b>b1</b><b>b2</b></a>', '1 and string');ExtractValue(xml,'/a/b[$i]')b1Warnings: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 NULLselect 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 NULLselect updatexml(NULL, NULL, NULL);updatexml(NULL, NULL, NULL)NULLCREATE TABLE t1(a INT NOT NULL);INSERT INTO t1 VALUES (0), (0);SELECT 1 FROM t1 ORDER BY(UPDATEXML(a, '1', '1'));111DROP 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 declarationSELECT 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')NULLWarnings: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')NULLWarnings: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">');SELECTextractvalue( xml, '/bla/@name' ),extractvalue( xml, '/bla/@name' )FROM t1 ORDER BY t1.id;extractvalue( xml, '/bla/@name' ) extractvalue( xml, '/bla/@name' )NULL NULLblubb blubbWarnings: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'SELECTUpdateXML(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 parsingSELECT 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')NULLWarnings: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)NULLWarnings: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.3 tests### MDEV-5338 XML parser accepts malformed data#SELECT ExtractValue('<a>xxx</c>','/a/b');ExtractValue('<a>xxx</c>','/a/b')NULLWarnings:Warning 1525 Incorrect XML value: 'parse error at line 1 pos 10: '</c>' unexpected ('</a>' wanted)'SELECT ExtractValue('<a><b>xxx</c></a>','/a/b');ExtractValue('<a><b>xxx</c></a>','/a/b')NULLWarnings:Warning 1525 Incorrect XML value: 'parse error at line 1 pos 13: '</c>' unexpected ('</b>' wanted)'## End of 5.3 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)NULLWarnings:Warning 1292 Truncated incorrect DOUBLE value: ''## 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 bbSELECT 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,..)')
Warnings:Warning 1292 Truncated incorrect INTEGER value: ''## 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),'>'));SELECTtxt,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 a63b64FROM t1;txt <aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>127</aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>a127 127a128 a63b63 a63b64 txt <aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>128</aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>a127 a128 128a63b63 a63b64 txt <aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa><bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb>63/63</bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb></aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>a127 a128 a63b63 63/63a63b64 txt <aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa><bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb>63/64</bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb></aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>a127 a128 a63b63 a63b64 63/64SELECT 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 c512DROP 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
Warnings:Warning 1292 Truncated incorrect INTEGER value: ''SELECT ExtractValue('<a><b>abc</b><c>2</c><d>1</d></a>','substring(/a/b,/a/c)') AS e;ebcSELECT ExtractValue('<a><b>abc</b><c>2</c><d>1</d></a>','substring(/a/b,/a/d)') AS e;eabcSELECT ExtractValue('<a><b>abc</b><c>2</c><d>1</d></a>','substring(/a/b,/a/c,/a/d)') AS e;ebSELECT ExtractValue('<a><b>abc</b><c>2</c><d>1</d></a>','substring(/a/b,/a/d,/a/c)') AS e;eab## 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 xpath1 b1 b12 b2 b2SELECT * FROM t1 WHERE c2=IF(@i:=c1,ExtractValue('<a><b>b1</b><b>b2</b></a>','//b[$@i]'),0);c1 c21 b12 b2DROP TABLE t1;## MDEV-15118 ExtractValue(xml,something_complex) does not work#CREATE TABLE t1 (a TEXT);INSERT INTO t1 VALUES (CONCAT('<a>aaa</a>'));SELECT ExtractValue(a, '/a') AS a FROM t1;aaaaSELECT ExtractValue(a, FROM_BASE64(TO_BASE64('/a'))) AS a FROM t1;aaaaDROP TABLE t1;## End of 10.0 tests### Start of 10.2 tests### MDEV-10134 Add full support for DEFAULT#CREATE TABLE t1 (a TEXT, b TEXT DEFAULT ExtractValue(a, '/a/b'));INSERT INTO t1 (a) VALUES ('<a><b>bbb</b></a>');SELECT b FROM t1;bbbbDROP TABLE t1;CREATE TABLE t1 (a TEXT, b TEXT DEFAULT UpdateXML(a, '/a/b','<b>xxx</b>'));INSERT INTO t1 (a) VALUES ('<a><b>bbb</b></a>');SELECT b FROM t1;b<a><b>xxx</b></a>DROP TABLE t1;## End of 10.2 tests#
|