You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

593 lines
22 KiB

  1. SET @xml='<a aa1="aa1" aa2="aa2">a1<b ba1="ba1">b1<c>c1</c>b2</b>a2</a>';
  2. SELECT extractValue(@xml,'/a');
  3. SELECT extractValue(@xml,'/a/b');
  4. SELECT extractValue(@xml,'/a/b/c');
  5. SELECT extractValue(@xml,'/a/@aa1');
  6. SELECT extractValue(@xml,'/a/@aa2');
  7. SELECT extractValue(@xml,'/a/@*');
  8. SELECT extractValue(@xml,'//@ba1');
  9. SELECT extractValue(@xml,'//a');
  10. SELECT extractValue(@xml,'//b');
  11. SELECT extractValue(@xml,'//c');
  12. SELECT extractValue(@xml,'/a//b');
  13. SELECT extractValue(@xml,'/a//c');
  14. SELECT extractValue(@xml,'//*');
  15. SELECT extractValue(@xml,'/a//*');
  16. SELECT extractValue(@xml,'/./a');
  17. SELECT extractValue(@xml,'/a/b/.');
  18. SELECT extractValue(@xml,'/a/b/..');
  19. SELECT extractValue(@xml,'/a/b/../@aa1');
  20. SELECT extractValue(@xml,'/*');
  21. SELECT extractValue(@xml,'/*/*');
  22. SELECT extractValue(@xml,'/*/*/*');
  23. SELECT extractValue(@xml,'/a/child::*');
  24. SELECT extractValue(@xml,'/a/self::*');
  25. SELECT extractValue(@xml,'/a/descendant::*');
  26. SELECT extractValue(@xml,'/a/descendant-or-self::*');
  27. SELECT extractValue(@xml,'/a/attribute::*');
  28. SELECT extractValue(@xml,'/a/b/c/parent::*');
  29. SELECT extractValue(@xml,'/a/b/c/ancestor::*');
  30. SELECT extractValue(@xml,'/a/b/c/ancestor-or-self::*');
  31. SELECT extractValue(@xml,'/descendant-or-self::*');
  32. SET @xml='<a>a11<b ba="ba11" ba="ba12">b11</b><b ba="ba21" ba="ba22">b21<c>c1</c>b22</b>a12</a>';
  33. SELECT extractValue(@xml,'/a/b/c/ancestor-or-self::*');
  34. SELECT extractValue(@xml,'//@ba');
  35. SET @xml='<a><b>b</b><c>c</c></a>';
  36. SELECT extractValue(@xml,'/a/b');
  37. SELECT extractValue(@xml,'/a/c');
  38. SELECT extractValue(@xml,'/a/child::b');
  39. SELECT extractValue(@xml,'/a/child::c');
  40. SET @xml='<a><b>b1</b><c>c1</c><b>b2</b><c>c2</c></a>';
  41. SELECT extractValue(@xml,'/a/b[1]');
  42. SELECT extractValue(@xml,'/a/b[2]');
  43. SELECT extractValue(@xml,'/a/c[1]');
  44. SELECT extractValue(@xml,'/a/c[2]');
  45. SET @xml='<a><b x="xb1" x="xb2"/><c x="xc1" x="xc2"/></a>';
  46. SELECT extractValue(@xml,'/a//@x');
  47. SELECT extractValue(@xml,'/a//@x[1]');
  48. SELECT extractValue(@xml,'/a//@x[2]');
  49. SET @xml='<a><b>b1</b><b>b2</b><c><b>c1b1</b><b>c1b2</b></c><c><b>c2b1</c></b></a>';
  50. SELECT extractValue(@xml,'//b[1]');
  51. SELECT extractValue(@xml,'/descendant::b[1]');
  52. SET @xml='<a><b>b1</b><b>b2</b></a>';
  53. SELECT extractValue(@xml,'/a/b[1+0]');
  54. SELECT extractValue(@xml,'/a/b[1*1]');
  55. SELECT extractValue(@xml,'/a/b[--1]');
  56. SELECT extractValue(@xml,'/a/b[2*1-1]');
  57. SELECT extractValue(@xml,'/a/b[1+1]');
  58. SELECT extractValue(@xml,'/a/b[1*2]');
  59. SELECT extractValue(@xml,'/a/b[--2]');
  60. SELECT extractValue(@xml,'/a/b[1*(3-1)]');
  61. SELECT extractValue(@xml,'//*[1=1]');
  62. SELECT extractValue(@xml,'//*[1!=1]');
  63. SELECT extractValue(@xml,'//*[1>1]');
  64. SELECT extractValue(@xml,'//*[2>1]');
  65. SELECT extractValue(@xml,'//*[1>2]');
  66. SELECT extractValue(@xml,'//*[1>=1]');
  67. SELECT extractValue(@xml,'//*[2>=1]');
  68. SELECT extractValue(@xml,'//*[1>=2]');
  69. SELECT extractValue(@xml,'//*[1<1]');
  70. SELECT extractValue(@xml,'//*[2<1]');
  71. SELECT extractValue(@xml,'//*[1<2]');
  72. SELECT extractValue(@xml,'//*[1<=1]');
  73. SELECT extractValue(@xml,'//*[2<=1]');
  74. SELECT extractValue(@xml,'//*[1<=2]');
  75. SET @xml='<a><b>b11<c>c11</c></b><b>b21<c>c21</c></b></a>';
  76. SELECT extractValue(@xml,'/a/b[c="c11"]');
  77. SELECT extractValue(@xml,'/a/b[c="c21"]');
  78. SET @xml='<a><b c="c11">b11</b><b c="c21">b21</b></a>';
  79. SELECT extractValue(@xml,'/a/b[@c="c11"]');
  80. SELECT extractValue(@xml,'/a/b[@c="c21"]');
  81. SET @xml='<a>a1<b c="c11">b11<d>d11</d></b><b c="c21">b21<d>d21</d></b></a>';
  82. SELECT extractValue(@xml, '/a/b[@c="c11"]/d');
  83. SELECT extractValue(@xml, '/a/b[@c="c21"]/d');
  84. SELECT extractValue(@xml, '/a/b[d="d11"]/@c');
  85. SELECT extractValue(@xml, '/a/b[d="d21"]/@c');
  86. SELECT extractValue(@xml, '/a[b="b11"]');
  87. SELECT extractValue(@xml, '/a[b/@c="c11"]');
  88. SELECT extractValue(@xml, '/a[b/d="d11"]');
  89. SELECT extractValue(@xml, '/a[/a/b="b11"]');
  90. SELECT extractValue(@xml, '/a[/a/b/@c="c11"]');
  91. SELECT extractValue(@xml, '/a[/a/b/d="d11"]');
  92. SELECT extractValue('<a>a</a>', '/a[false()]');
  93. SELECT extractValue('<a>a</a>', '/a[true()]');
  94. SELECT extractValue('<a>a</a>', '/a[not(false())]');
  95. SELECT extractValue('<a>a</a>', '/a[not(true())]');
  96. SELECT extractValue('<a>a</a>', '/a[true() and true()]');
  97. SELECT extractValue('<a>a</a>', '/a[true() and false()]');
  98. SELECT extractValue('<a>a</a>', '/a[false()and false()]');
  99. SELECT extractValue('<a>a</a>', '/a[false()and true()]');
  100. SELECT extractValue('<a>a</a>', '/a[true() or true()]');
  101. SELECT extractValue('<a>a</a>', '/a[true() or false()]');
  102. SELECT extractValue('<a>a</a>', '/a[false()or false()]');
  103. SELECT extractValue('<a>a</a>', '/a[false()or true()]');
  104. SET @xml='<a>ab<b c="c" c="e">b1</b><b c="d">b2</b><b c="f" c="e">b3</b></a>';
  105. select extractValue(@xml,'/a/b[@c="c"]');
  106. select extractValue(@xml,'/a/b[@c="d"]');
  107. select extractValue(@xml,'/a/b[@c="e"]');
  108. select extractValue(@xml,'/a/b[not(@c="e")]');
  109. select extractValue(@xml,'/a/b[@c!="e"]');
  110. select extractValue(@xml,'/a/b[@c="c" or @c="d"]');
  111. select extractValue(@xml,'/a/b[@c="c" and @c="e"]');
  112. SET @xml='<a><b c="c" d="d">b1</b><b d="d" e="e">b2</b></a>';
  113. select extractValue(@xml,'/a/b[@c]');
  114. select extractValue(@xml,'/a/b[@d]');
  115. select extractValue(@xml,'/a/b[@e]');
  116. select extractValue(@xml,'/a/b[not(@c)]');
  117. select extractValue(@xml,'/a/b[not(@d)]');
  118. select extractValue(@xml,'/a/b[not(@e)]');
  119. select extractValue(@xml, '/a/b[boolean(@c) or boolean(@d)]');
  120. select extractValue(@xml, '/a/b[boolean(@c) or boolean(@e)]');
  121. select extractValue(@xml, '/a/b[boolean(@d) or boolean(@e)]');
  122. select extractValue(@xml, '/a/b[boolean(@c) and boolean(@d)]');
  123. select extractValue(@xml, '/a/b[boolean(@c) and boolean(@e)]');
  124. select extractValue(@xml, '/a/b[boolean(@d) and boolean(@e)]');
  125. select extractValue(@xml, '/a/b[@c or @d]');
  126. select extractValue(@xml, '/a/b[@c or @e]');
  127. select extractValue(@xml, '/a/b[@d or @e]');
  128. select extractValue(@xml, '/a/b[@c and @d]');
  129. select extractValue(@xml, '/a/b[@c and @e]');
  130. select extractValue(@xml, '/a/b[@d and @e]');
  131. SET @xml='<a><b c="c">b1</b><b>b2</b></a>';
  132. SELECT extractValue(@xml,'/a/b[@*]');
  133. SELECT extractValue(@xml,'/a/b[not(@*)]');
  134. SELECT extractValue('<a>a</a>', '/a[ceiling(3.1)=4]');
  135. SELECT extractValue('<a>a</a>', '/a[floor(3.1)=3]');
  136. SELECT extractValue('<a>a</a>', '/a[round(3.1)=3]');
  137. SELECT extractValue('<a>a</a>', '/a[round(3.8)=4]');
  138. SELECT extractValue('<a><b>b</b><c>c</c></a>', '/a/b | /a/c');
  139. select extractValue('<a b="b1" b="b2" b="b3"/>','/a/@b[position()=1]');
  140. select extractValue('<a b="b1" b="b2" b="b3"/>','/a/@b[position()=2]');
  141. select extractValue('<a b="b1" b="b2" b="b3"/>','/a/@b[position()=3]');
  142. select extractValue('<a b="b1" b="b2" b="b3"/>','/a/@b[1=position()]');
  143. select extractValue('<a b="b1" b="b2" b="b3"/>','/a/@b[2=position()]');
  144. select extractValue('<a b="b1" b="b2" b="b3"/>','/a/@b[3=position()]');
  145. select extractValue('<a b="b1" b="b2" b="b3"/>','/a/@b[2>=position()]');
  146. select extractValue('<a b="b1" b="b2" b="b3"/>','/a/@b[2<=position()]');
  147. select extractValue('<a b="b1" b="b2" b="b3"/>','/a/@b[position()=3 or position()=2]');
  148. SELECT extractValue('<a>a<b>a1<c>c1</c></b><b>a2</b></a>','/a/b[count(c)=0]');
  149. SELECT extractValue('<a>a<b>a1<c>c1</c></b><b>a2</b></a>','/a/b[count(c)=1]');
  150. select extractValue('<a>a1<b ba="1" ba="2">b1</b><b>b2</b>4</a>','/a/b[sum(@ba)=3]');
  151. select extractValue('<a><b>b1</b><b>b2</b></a>','/a/b[1]');
  152. select extractValue('<a><b>b1</b><b>b2</b></a>','/a/b[boolean(1)]');
  153. select extractValue('<a><b>b1</b><b>b2</b></a>','/a/b[true()]');
  154. select extractValue('<a><b>b1</b><b>b2</b></a>','/a/b[number(true())]');
  155. select extractValue('<a>ab</a>','/a[contains("abc","b")]');
  156. select extractValue('<a>ab</a>','/a[contains(.,"a")]');
  157. select extractValue('<a>ab</a>','/a[contains(.,"b")]');
  158. select extractValue('<a>ab</a>','/a[contains(.,"c")]');
  159. select extractValue('<a b="1">ab</a>','/a[concat(@b,"2")="12"]');
  160. SET @xml='<a b="11" b="12" b="21" b="22">ab</a>';
  161. select extractValue(@xml, '/a/@b[substring(.,2)="1"]');
  162. select extractValue(@xml, '/a/@b[substring(.,2)="2"]');
  163. select extractValue(@xml, '/a/@b[substring(.,1,1)="1"]');
  164. select extractValue(@xml, '/a/@b[substring(.,1,1)="2"]');
  165. select extractValue(@xml, '/a/@b[substring(.,2,1)="1"]');
  166. select extractValue(@xml, '/a/@b[substring(.,2,1)="2"]');
  167. #
  168. # Bug#16319: XML: extractvalue() returns syntax errors for some functions
  169. #
  170. SET @xml='<a><b>b1</b><b>b2</b></a>';
  171. SELECT extractValue(@xml, '/a/b[string-length("x")=1]');
  172. SELECT extractValue(@xml, '/a/b[string-length("xx")=2]');
  173. SELECT extractValue(@xml, '/a/b[string-length("xxx")=2]');
  174. SELECT extractValue(@xml, '/a/b[string-length("x")]');
  175. SELECT extractValue(@xml, '/a/b[string-length("xx")]');
  176. SELECT extractValue(@xml, '/a/b[string-length()]');
  177. --error 1105
  178. SELECT extractValue(@xml, 'string-length()');
  179. SELECT extractValue(@xml, 'string-length("x")');
  180. SET @xml='<a b="b11" b="b12" b="b21" b="22"/>';
  181. select extractValue(@xml,'/a/@b');
  182. select extractValue(@xml,'/a/@b[contains(.,"1")]');
  183. select extractValue(@xml,'/a/@b[contains(.,"1")][contains(.,"2")]');
  184. select extractValue(@xml,'/a/@b[contains(.,"1")][contains(.,"2")][2]');
  185. SET @xml='<a>a1<b>b1<c>c1</c>b2</b>a2</a>';
  186. select UpdateXML('<a>a1<b>b1<c>c1</c>b2</b>a2</a>','/a/b/c','+++++++++');
  187. select UpdateXML('<a>a1<b>b1<c>c1</c>b2</b>a2</a>','/a/b/c','<c1>+++++++++</c1>');
  188. select UpdateXML('<a>a1<b>b1<c>c1</c>b2</b>a2</a>','/a/b/c','<c1/>');
  189. SET @xml='<a><b>bb</b></a>';
  190. select UpdateXML(@xml, '/a/b', '<b>ccc</b>');
  191. SET @xml='<a aa1="aa1" aa2="aa2"><b bb1="bb1" bb2="bb2">bb</b></a>';
  192. select UpdateXML(@xml, '/a/b', '<b>ccc</b>');
  193. select UpdateXML(@xml, '/a/@aa1', '');
  194. select UpdateXML(@xml, '/a/@aa1', 'aa3="aa3"');
  195. select UpdateXML(@xml, '/a/@aa2', '');
  196. select UpdateXML(@xml, '/a/@aa2', 'aa3="aa3"');
  197. select UpdateXML(@xml, '/a/b/@bb1', '');
  198. select UpdateXML(@xml, '/a/b/@bb1', 'bb3="bb3"');
  199. select UpdateXML(@xml, '/a/b/@bb2', '');
  200. select UpdateXML(@xml, '/a/b/@bb2', 'bb3="bb3"');
  201. #
  202. # Bug#27898 UPDATEXML Crashes the Server!
  203. #
  204. select updatexml('<div><div><span>1</span><span>2</span></div></div>',
  205. '/','<tr><td>1</td><td>2</td></tr>') as upd1;
  206. select updatexml('', '/', '') as upd2;
  207. #
  208. # Bug#16234 XML: Crash if ExtractValue()
  209. #
  210. SET @xml= '<order><clerk>lesser wombat</clerk></order>';
  211. select extractvalue(@xml,'order/clerk');
  212. select extractvalue(@xml,'/order/clerk');
  213. #
  214. # Bug#16314 XML: extractvalue() crash if vertical bar
  215. #
  216. select extractvalue('<a><b>B</b></a>','/a|/b');
  217. select extractvalue('<a><b>B</b></a>','/a|b');
  218. select extractvalue('<a>a<b>B</b></a>','/a|/b');
  219. select extractvalue('<a>a<b>B</b></a>','/a|b');
  220. select extractvalue('<a>a<b>B</b></a>','a|/b');
  221. #
  222. # Bug#16312 XML: extractvalue() crash if angle brackets
  223. #
  224. --error 1105
  225. select extractvalue('<a>A</a>','/<a>');
  226. #
  227. # Bug#16313 XML: extractvalue() ignores '!' in names
  228. #
  229. --error 1105
  230. select extractvalue('<a><b>b</b><b!>b!</b!></a>','//b!');
  231. #
  232. # Bug #16315 XML: extractvalue() handles self badly
  233. #
  234. select extractvalue('<a>A<b>B<c>C</c></b></a>','/a/descendant::*');
  235. select extractvalue('<a>A<b>B<c>C</c></b></a>','/a/self::*');
  236. select extractvalue('<a>A<b>B<c>C</c></b></a>','/a/descendant-or-self::*');
  237. # Bug #16320 XML: extractvalue() won't accept names containing underscores
  238. #
  239. select extractvalue('<A_B>A</A_B>','/A_B');
  240. #
  241. # Bug#16318: XML: extractvalue() incorrectly returns last() = 1
  242. #
  243. select extractvalue('<a>A<b>B1</b><b>B2</b></a>','/a/b[position()]');
  244. select extractvalue('<a>A<b>B1</b><b>B2</b></a>','/a/b[count(.)=last()]');
  245. select extractvalue('<a>A<b>B1</b><b>B2</b></a>','/a/b[last()]');
  246. select extractvalue('<a>A<b>B1</b><b>B2</b></a>','/a/b[last()-1]');
  247. select extractvalue('<a>A<b>B1</b><b>B2</b></a>','/a/b[last()=1]');
  248. select extractvalue('<a>A<b>B1</b><b>B2</b></a>','/a/b[last()=2]');
  249. select extractvalue('<a>A<b>B1</b><b>B2</b></a>','/a/b[last()=position()]');
  250. select extractvalue('<a>A<b>B1</b><b>B2</b></a>','/a/b[count(.)]');
  251. select extractvalue('<a>A<b>B1</b><b>B2</b></a>','/a/b[count(.)-1]');
  252. select extractvalue('<a>A<b>B1</b><b>B2</b></a>','/a/b[count(.)=1]');
  253. select extractvalue('<a>A<b>B1</b><b>B2</b></a>','/a/b[count(.)=2]');
  254. select extractvalue('<a>A<b>B1</b><b>B2</b></a>','/a/b[count(.)=position()]');
  255. #
  256. # Bug#16316: XML: extractvalue() is case-sensitive with contains()
  257. #
  258. select extractvalue('<a>Jack</a>','/a[contains(../a,"J")]');
  259. select extractvalue('<a>Jack</a>','/a[contains(../a,"j")]');
  260. select extractvalue('<a>Jack</a>','/a[contains(../a,"j")]' collate latin1_bin);
  261. select extractvalue('<a>Jack</a>' collate latin1_bin,'/a[contains(../a,"j")]');
  262. #
  263. # Bug#18285: ExtractValue not returning character
  264. # data within <![CDATA[]]> as expected
  265. #
  266. select ExtractValue('<tag1><![CDATA[test]]></tag1>','/tag1');
  267. #
  268. # Bug#18201: XML: ExtractValue works even if the xml fragment
  269. # is not well-formed xml
  270. #
  271. select extractValue('<a>a','/a');
  272. select extractValue('<a>a<','/a');
  273. select extractValue('<a>a</','/a');
  274. select extractValue('<a>a</a','/a');
  275. select extractValue('<a>a</a></b>','/a');
  276. select extractValue('<a b=>a</a>','/a');
  277. #
  278. # Bug #18171 XML: ExtractValue: the XPath position()
  279. # function crashes the server!
  280. #
  281. --error 1105
  282. select extractValue('<e>1</e>','position()');
  283. --error 1105
  284. select extractValue('<e>1</e>','last()');
  285. #
  286. # Bug #18172 XML: Extractvalue() accepts mallformed
  287. # XPath without a XPath syntax error
  288. #
  289. --error 1105
  290. select extractValue('<e><a>1</a></e>','/e/');
  291. #
  292. # Bug#16233: XML: ExtractValue() fails with special characters
  293. #
  294. set names utf8;
  295. select extractValue('<Ñ><r>r</r></Ñ>','/Ñ/r');
  296. select extractValue('<r><Ñ>Ñ</Ñ></r>','/r/Ñ');
  297. select extractValue('<Ñ r="r"/>','/Ñ/@r');
  298. select extractValue('<r Ñ="Ñ"/>','/r/@Ñ');
  299. --disable_warnings
  300. DROP PROCEDURE IF EXISTS p2;
  301. --enable_warnings
  302. DELIMITER //;
  303. CREATE PROCEDURE p2 ()
  304. BEGIN
  305. DECLARE p LONGTEXT CHARACTER SET UTF8 DEFAULT '<Ñ><r>A</r></Ñ>';
  306. SELECT EXTRACTVALUE(p,'/Ñ/r');
  307. END//
  308. DELIMITER ;//
  309. CALL p2();
  310. DROP PROCEDURE p2;
  311. #
  312. # Bug#18170: XML: ExtractValue():
  313. # XPath expression can't use QNames (colon in names)
  314. #
  315. select extractValue('<ns:element xmlns:ns="myns"/>','count(ns:element)');
  316. select extractValue('<ns:element xmlns:ns="myns">a</ns:element>','/ns:element');
  317. select extractValue('<ns:element xmlns:ns="myns">a</ns:element>','/ns:element/@xmlns:ns');
  318. #
  319. # Bug#20795 extractvalue() won't accept names containing a dot (.)
  320. #
  321. select extractValue('<foo><foo.bar>Data</foo.bar><something>Otherdata</something></foo>','/foo/foo.bar');
  322. select extractValue('<foo><foo.bar>Data</foo.bar><something>Otherdata</something></foo>','/foo/something');
  323. #
  324. # Bug#20854 XML functions: wrong result in ExtractValue
  325. #
  326. --error 1105
  327. select extractValue('<zot><tim0><01>10:39:15</01><02>140</02></tim0></zot>','/zot/tim0/02');
  328. select extractValue('<zot><tim0><01>10:39:15</01><02>140</02></tim0></zot>','//*');
  329. # dot and dash are bad identtifier start character
  330. select extractValue('<.>test</.>','//*');
  331. select extractValue('<->test</->','//*');
  332. # semicolon is good identifier start character
  333. select extractValue('<:>test</:>','//*');
  334. # underscore is good identifier start character
  335. select extractValue('<_>test</_>','//*');
  336. # dot, dash, underscore and semicolon are good identifier middle characters
  337. select extractValue('<x.-_:>test</x.-_:>','//*');
  338. #
  339. # Bug#22823 gt and lt operators appear to be
  340. # reversed in ExtractValue() command
  341. #
  342. set @xml= "<entry><id>pt10</id><pt>10</pt></entry><entry><id>pt50</id><pt>50</pt></entry>";
  343. select ExtractValue(@xml, "/entry[(pt=10)]/id");
  344. select ExtractValue(@xml, "/entry[(pt!=10)]/id");
  345. select ExtractValue(@xml, "/entry[(pt<10)]/id");
  346. select ExtractValue(@xml, "/entry[(pt<=10)]/id");
  347. select ExtractValue(@xml, "/entry[(pt>10)]/id");
  348. select ExtractValue(@xml, "/entry[(pt>=10)]/id");
  349. select ExtractValue(@xml, "/entry[(pt=50)]/id");
  350. select ExtractValue(@xml, "/entry[(pt!=50)]/id");
  351. select ExtractValue(@xml, "/entry[(pt<50)]/id");
  352. select ExtractValue(@xml, "/entry[(pt<=50)]/id");
  353. select ExtractValue(@xml, "/entry[(pt>50)]/id");
  354. select ExtractValue(@xml, "/entry[(pt>=50)]/id");
  355. select ExtractValue(@xml, "/entry[(10=pt)]/id");
  356. select ExtractValue(@xml, "/entry[(10!=pt)]/id");
  357. select ExtractValue(@xml, "/entry[(10>pt)]/id");
  358. select ExtractValue(@xml, "/entry[(10>=pt)]/id");
  359. select ExtractValue(@xml, "/entry[(10<pt)]/id");
  360. select ExtractValue(@xml, "/entry[(10<=pt)]/id");
  361. select ExtractValue(@xml, "/entry[(50=pt)]/id");
  362. select ExtractValue(@xml, "/entry[(50!=pt)]/id");
  363. select ExtractValue(@xml, "/entry[(50>pt)]/id");
  364. select ExtractValue(@xml, "/entry[(50>=pt)]/id");
  365. select ExtractValue(@xml, "/entry[(50<pt)]/id");
  366. select ExtractValue(@xml, "/entry[(50<=pt)]/id");
  367. #
  368. # Bug#24747 XPath error with the node name "Text"
  369. #
  370. #
  371. # Test nodetypes in node name context
  372. #
  373. select ExtractValue('<a><b><Text>test</Text></b></a>','/a/b/Text');
  374. select ExtractValue('<a><b><comment>test</comment></b></a>','/a/b/comment');
  375. select ExtractValue('<a><b><node>test</node></b></a>','/a/b/node');
  376. select ExtractValue('<a><b><processing-instruction>test</processing-instruction></b></a>','/a/b/processing-instruction');
  377. #
  378. # Test keywords in node name contexts
  379. #
  380. select ExtractValue('<a><and>test</and></a>', '/a/and');
  381. select ExtractValue('<a><or>test</or></a>', '/a/or');
  382. select ExtractValue('<a><mod>test</mod></a>', '/a/mod');
  383. select ExtractValue('<a><div>test</div></a>', '/a/div');
  384. select ExtractValue('<a><and:and>test</and:and></a>', '/a/and:and');
  385. select ExtractValue('<a><or:or>test</or:or></a>', '/a/or:or');
  386. select ExtractValue('<a><mod:mod>test</mod:mod></a>', '/a/mod:mod');
  387. select ExtractValue('<a><div:div>test</div:div></a>', '/a/div:div');
  388. #
  389. # Test axis names in node name context
  390. #
  391. select ExtractValue('<a><ancestor>test</ancestor></a>', '/a/ancestor');
  392. select ExtractValue('<a><ancestor-or-self>test</ancestor-or-self></a>', '/a/ancestor-or-self');
  393. select ExtractValue('<a><attribute>test</attribute></a>', '/a/attribute');
  394. select ExtractValue('<a><child>test</child></a>', '/a/child');
  395. select ExtractValue('<a><descendant>test</descendant></a>', '/a/descendant');
  396. select ExtractValue('<a><descendant-or-self>test</descendant-or-self></a>', '/a/descendant-or-self');
  397. select ExtractValue('<a><following>test</following></a>', '/a/following');
  398. select ExtractValue('<a><following-sibling>test</following-sibling></a>', '/a/following-sibling');
  399. select ExtractValue('<a><namespace>test</namespace></a>', '/a/namespace');
  400. select ExtractValue('<a><parent>test</parent></a>', '/a/parent');
  401. select ExtractValue('<a><preceding>test</preceding></a>', '/a/preceding');
  402. select ExtractValue('<a><preceding-sibling>test</preceding-sibling></a>', '/a/preceding-sibling');
  403. select ExtractValue('<a><self>test</self></a>', '/a/self');
  404. #
  405. # Bug#26518 XPath and variables problem
  406. # Check with user defined variables
  407. #
  408. set @i=1;
  409. select ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/b[$@i]');
  410. set @i=2;
  411. select ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/b[$@i]');
  412. set @i=NULL;
  413. select ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/b[$@i]');
  414. #
  415. # Check variables in a stored procedure - both local and user variables
  416. # Make sure that SP and local variables with the same name work together.
  417. #
  418. DELIMITER |;
  419. CREATE PROCEDURE spxml(xml VARCHAR(128))
  420. BEGIN
  421. DECLARE c INT;
  422. DECLARE i INT DEFAULT 1;
  423. SET c= ExtractValue(xml,'count(/a/b)');
  424. SET @i= c;
  425. WHILE i <= c DO
  426. BEGIN
  427. SELECT i, @i, ExtractValue(xml,'/a/b[$i]'), ExtractValue(xml,'/a/b[$@i]');
  428. SET i= i + 1;
  429. SET @i= @i - 1;
  430. END;
  431. END WHILE;
  432. END|
  433. DELIMITER ;|
  434. call spxml('<a><b>b1</b><b>b2</b><b>b3</b></a>');
  435. drop procedure spxml;
  436. #
  437. # Additional tests for bug#26518
  438. --echo Multiple matches, but no index specification
  439. SELECT ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/b');
  440. --echo No matches
  441. SELECT ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/c');
  442. --echo Index out of range
  443. SELECT ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/b[-1]');
  444. SELECT ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/b[10]');
  445. --echo With string-to-number conversion
  446. SELECT ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/b["1"]');
  447. SELECT ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/b["1 and string"]');
  448. SELECT ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/b["string and 1"]');
  449. SELECT ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/b["string"]');
  450. --echo String-to-number conversion from a user variable
  451. SET @i='1';
  452. SELECT ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/b[$@i]');
  453. SET @i='1 and string';
  454. SELECT ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/b[$@i]');
  455. SET @i='string and 1';
  456. SELECT ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/b[$@i]');
  457. SET @i='string';
  458. SELECT ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/b[$@i]');
  459. --echo String-to-number conversion with a CHAR SP variable
  460. DELIMITER |;
  461. CREATE PROCEDURE spxml(xml VARCHAR(128), i CHAR(16))
  462. BEGIN
  463. SELECT ExtractValue(xml,'/a/b[$i]');
  464. END|
  465. DELIMITER ;|
  466. CALL spxml('<a><b>b1</b><b>b2</b></a>', '1');
  467. CALL spxml('<a><b>b1</b><b>b2</b></a>', '1 and string');
  468. CALL spxml('<a><b>b1</b><b>b2</b></a>', 'string and 1');
  469. CALL spxml('<a><b>b1</b><b>b2</b></a>', 'string');
  470. DROP PROCEDURE spxml;
  471. #
  472. # Bug#28558 UpdateXML called with garbage crashes server
  473. #
  474. --error 1105
  475. select UpdateXML('<a>a</a>',repeat('a b ',1000),'');
  476. --error 1105
  477. select ExtractValue('<a>a</a>', '/a[@x=@y0123456789_0123456789_0123456789_0123456789]');
  478. --error 1105
  479. select ExtractValue('<a>a</a>', '/a[@x=$y0123456789_0123456789_0123456789_0123456789]');
  480. #
  481. # Bug #31438: updatexml still crashes
  482. #
  483. select updatexml(NULL, 1, 1), updatexml(1, NULL, 1), updatexml(1, 1, NULL);
  484. select updatexml(NULL, NULL, 1), updatexml(1, NULL, NULL),
  485. updatexml(NULL, 1, NULL);
  486. select updatexml(NULL, NULL, NULL);
  487. #
  488. # Bug #32557: order by updatexml causes assertion in filesort
  489. #
  490. CREATE TABLE t1(a INT NOT NULL);
  491. INSERT INTO t1 VALUES (0), (0);
  492. SELECT 1 FROM t1 ORDER BY(UPDATEXML(a, '1', '1'));
  493. DROP TABLE t1;
  494. #
  495. # BUG#38227 EXTRACTVALUE doesn't work with DTD declarations
  496. #
  497. # Check that quoted strings work fine in DOCTYPE declaration.
  498. #
  499. SET @xml=
  500. '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  501. <html>
  502. <head>
  503. <title> Title - document with document declaration</title>
  504. </head>
  505. <body> Hi, Im a webpage with document a declaration </body>
  506. </html>';
  507. SELECT ExtractValue(@xml, 'html/head/title');
  508. SELECT ExtractValue(@xml, 'html/body');
  509. # These two documents will fail.
  510. # Quoted strings are not allowed in regular tags
  511. #
  512. SELECT ExtractValue('<xml "xxx" "yyy">CharData</xml>', '/xml');
  513. SELECT ExtractValue('<xml xxx "yyy">CharData</xml>', '/xml');
  514. #
  515. # Bug#42495 updatexml: Assertion failed: xpath->context, file .\item_xmlfunc.cc, line 2507
  516. #
  517. set @x=10;
  518. --error ER_UNKNOWN_ERROR
  519. select extractvalue('<a></a>','$@x/a');
  520. --error ER_UNKNOWN_ERROR
  521. select extractvalue('<a></a>','round(123.4)/a');
  522. --error ER_UNKNOWN_ERROR
  523. select extractvalue('<a></a>','1/a');
  524. --error ER_UNKNOWN_ERROR
  525. select extractvalue('<a></a>','"b"/a');
  526. --error ER_UNKNOWN_ERROR
  527. select extractvalue('<a></a>','(1)/a');
  528. --echo End of 5.1 tests