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.

1311 lines
47 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. extractValue(@xml,'/a')
  4. a1 a2
  5. SELECT extractValue(@xml,'/a/b');
  6. extractValue(@xml,'/a/b')
  7. b1 b2
  8. SELECT extractValue(@xml,'/a/b/c');
  9. extractValue(@xml,'/a/b/c')
  10. c1
  11. SELECT extractValue(@xml,'/a/@aa1');
  12. extractValue(@xml,'/a/@aa1')
  13. aa1
  14. SELECT extractValue(@xml,'/a/@aa2');
  15. extractValue(@xml,'/a/@aa2')
  16. aa2
  17. SELECT extractValue(@xml,'/a/@*');
  18. extractValue(@xml,'/a/@*')
  19. aa1 aa2
  20. SELECT extractValue(@xml,'//@ba1');
  21. extractValue(@xml,'//@ba1')
  22. ba1
  23. SELECT extractValue(@xml,'//a');
  24. extractValue(@xml,'//a')
  25. a1 a2
  26. SELECT extractValue(@xml,'//b');
  27. extractValue(@xml,'//b')
  28. b1 b2
  29. SELECT extractValue(@xml,'//c');
  30. extractValue(@xml,'//c')
  31. c1
  32. SELECT extractValue(@xml,'/a//b');
  33. extractValue(@xml,'/a//b')
  34. b1 b2
  35. SELECT extractValue(@xml,'/a//c');
  36. extractValue(@xml,'/a//c')
  37. c1
  38. SELECT extractValue(@xml,'//*');
  39. extractValue(@xml,'//*')
  40. a1 b1 c1 b2 a2
  41. SELECT extractValue(@xml,'/a//*');
  42. extractValue(@xml,'/a//*')
  43. b1 c1 b2
  44. SELECT extractValue(@xml,'/./a');
  45. extractValue(@xml,'/./a')
  46. a1 a2
  47. SELECT extractValue(@xml,'/a/b/.');
  48. extractValue(@xml,'/a/b/.')
  49. b1 b2
  50. SELECT extractValue(@xml,'/a/b/..');
  51. extractValue(@xml,'/a/b/..')
  52. a1 a2
  53. SELECT extractValue(@xml,'/a/b/../@aa1');
  54. extractValue(@xml,'/a/b/../@aa1')
  55. aa1
  56. SELECT extractValue(@xml,'/*');
  57. extractValue(@xml,'/*')
  58. a1 a2
  59. SELECT extractValue(@xml,'/*/*');
  60. extractValue(@xml,'/*/*')
  61. b1 b2
  62. SELECT extractValue(@xml,'/*/*/*');
  63. extractValue(@xml,'/*/*/*')
  64. c1
  65. SELECT extractValue(@xml,'/a/child::*');
  66. extractValue(@xml,'/a/child::*')
  67. b1 b2
  68. SELECT extractValue(@xml,'/a/self::*');
  69. extractValue(@xml,'/a/self::*')
  70. a1 a2
  71. SELECT extractValue(@xml,'/a/descendant::*');
  72. extractValue(@xml,'/a/descendant::*')
  73. b1 c1 b2
  74. SELECT extractValue(@xml,'/a/descendant-or-self::*');
  75. extractValue(@xml,'/a/descendant-or-self::*')
  76. a1 b1 c1 b2 a2
  77. SELECT extractValue(@xml,'/a/attribute::*');
  78. extractValue(@xml,'/a/attribute::*')
  79. aa1 aa2
  80. SELECT extractValue(@xml,'/a/b/c/parent::*');
  81. extractValue(@xml,'/a/b/c/parent::*')
  82. b1 b2
  83. SELECT extractValue(@xml,'/a/b/c/ancestor::*');
  84. extractValue(@xml,'/a/b/c/ancestor::*')
  85. a1 b1 b2 a2
  86. SELECT extractValue(@xml,'/a/b/c/ancestor-or-self::*');
  87. extractValue(@xml,'/a/b/c/ancestor-or-self::*')
  88. a1 b1 c1 b2 a2
  89. SELECT extractValue(@xml,'/descendant-or-self::*');
  90. extractValue(@xml,'/descendant-or-self::*')
  91. a1 b1 c1 b2 a2
  92. SET @xml='<a>a11<b ba="ba11" ba="ba12">b11</b><b ba="ba21" ba="ba22">b21<c>c1</c>b22</b>a12</a>';
  93. SELECT extractValue(@xml,'/a/b/c/ancestor-or-self::*');
  94. extractValue(@xml,'/a/b/c/ancestor-or-self::*')
  95. a11 b21 c1 b22 a12
  96. SELECT extractValue(@xml,'//@ba');
  97. extractValue(@xml,'//@ba')
  98. ba11 ba12 ba21 ba22
  99. SET @xml='<a><b>b</b><c>c</c></a>';
  100. SELECT extractValue(@xml,'/a/b');
  101. extractValue(@xml,'/a/b')
  102. b
  103. SELECT extractValue(@xml,'/a/c');
  104. extractValue(@xml,'/a/c')
  105. c
  106. SELECT extractValue(@xml,'/a/child::b');
  107. extractValue(@xml,'/a/child::b')
  108. b
  109. SELECT extractValue(@xml,'/a/child::c');
  110. extractValue(@xml,'/a/child::c')
  111. c
  112. SET @xml='<a><b>b1</b><c>c1</c><b>b2</b><c>c2</c></a>';
  113. SELECT extractValue(@xml,'/a/b[1]');
  114. extractValue(@xml,'/a/b[1]')
  115. b1
  116. SELECT extractValue(@xml,'/a/b[2]');
  117. extractValue(@xml,'/a/b[2]')
  118. b2
  119. SELECT extractValue(@xml,'/a/c[1]');
  120. extractValue(@xml,'/a/c[1]')
  121. c1
  122. SELECT extractValue(@xml,'/a/c[2]');
  123. extractValue(@xml,'/a/c[2]')
  124. c2
  125. SET @xml='<a><b x="xb1" x="xb2"/><c x="xc1" x="xc2"/></a>';
  126. SELECT extractValue(@xml,'/a//@x');
  127. extractValue(@xml,'/a//@x')
  128. xb1 xb2 xc1 xc2
  129. SELECT extractValue(@xml,'/a//@x[1]');
  130. extractValue(@xml,'/a//@x[1]')
  131. xb1 xc1
  132. SELECT extractValue(@xml,'/a//@x[2]');
  133. extractValue(@xml,'/a//@x[2]')
  134. xb2 xc2
  135. SET @xml='<a><b>b1</b><b>b2</b><c><b>c1b1</b><b>c1b2</b></c><c><b>c2b1</b></c></a>';
  136. SELECT extractValue(@xml,'//b[1]');
  137. extractValue(@xml,'//b[1]')
  138. b1 c1b1 c2b1
  139. SELECT extractValue(@xml,'/descendant::b[1]');
  140. extractValue(@xml,'/descendant::b[1]')
  141. b1
  142. SET @xml='<a><b>b1</b><b>b2</b></a>';
  143. SELECT extractValue(@xml,'/a/b[1+0]');
  144. extractValue(@xml,'/a/b[1+0]')
  145. b1
  146. SELECT extractValue(@xml,'/a/b[1*1]');
  147. extractValue(@xml,'/a/b[1*1]')
  148. b1
  149. SELECT extractValue(@xml,'/a/b[--1]');
  150. extractValue(@xml,'/a/b[--1]')
  151. b1
  152. SELECT extractValue(@xml,'/a/b[2*1-1]');
  153. extractValue(@xml,'/a/b[2*1-1]')
  154. b1
  155. SELECT extractValue(@xml,'/a/b[1+1]');
  156. extractValue(@xml,'/a/b[1+1]')
  157. b2
  158. SELECT extractValue(@xml,'/a/b[1*2]');
  159. extractValue(@xml,'/a/b[1*2]')
  160. b2
  161. SELECT extractValue(@xml,'/a/b[--2]');
  162. extractValue(@xml,'/a/b[--2]')
  163. b2
  164. SELECT extractValue(@xml,'/a/b[1*(3-1)]');
  165. extractValue(@xml,'/a/b[1*(3-1)]')
  166. b2
  167. SELECT extractValue(@xml,'//*[1=1]');
  168. extractValue(@xml,'//*[1=1]')
  169. b1 b2
  170. SELECT extractValue(@xml,'//*[1!=1]');
  171. extractValue(@xml,'//*[1!=1]')
  172. SELECT extractValue(@xml,'//*[1>1]');
  173. extractValue(@xml,'//*[1>1]')
  174. SELECT extractValue(@xml,'//*[2>1]');
  175. extractValue(@xml,'//*[2>1]')
  176. b1 b2
  177. SELECT extractValue(@xml,'//*[1>2]');
  178. extractValue(@xml,'//*[1>2]')
  179. SELECT extractValue(@xml,'//*[1>=1]');
  180. extractValue(@xml,'//*[1>=1]')
  181. b1 b2
  182. SELECT extractValue(@xml,'//*[2>=1]');
  183. extractValue(@xml,'//*[2>=1]')
  184. b1 b2
  185. SELECT extractValue(@xml,'//*[1>=2]');
  186. extractValue(@xml,'//*[1>=2]')
  187. SELECT extractValue(@xml,'//*[1<1]');
  188. extractValue(@xml,'//*[1<1]')
  189. SELECT extractValue(@xml,'//*[2<1]');
  190. extractValue(@xml,'//*[2<1]')
  191. SELECT extractValue(@xml,'//*[1<2]');
  192. extractValue(@xml,'//*[1<2]')
  193. b1 b2
  194. SELECT extractValue(@xml,'//*[1<=1]');
  195. extractValue(@xml,'//*[1<=1]')
  196. b1 b2
  197. SELECT extractValue(@xml,'//*[2<=1]');
  198. extractValue(@xml,'//*[2<=1]')
  199. SELECT extractValue(@xml,'//*[1<=2]');
  200. extractValue(@xml,'//*[1<=2]')
  201. b1 b2
  202. SET @xml='<a><b>b11<c>c11</c></b><b>b21<c>c21</c></b></a>';
  203. SELECT extractValue(@xml,'/a/b[c="c11"]');
  204. extractValue(@xml,'/a/b[c="c11"]')
  205. b11
  206. SELECT extractValue(@xml,'/a/b[c="c21"]');
  207. extractValue(@xml,'/a/b[c="c21"]')
  208. b21
  209. SET @xml='<a><b c="c11">b11</b><b c="c21">b21</b></a>';
  210. SELECT extractValue(@xml,'/a/b[@c="c11"]');
  211. extractValue(@xml,'/a/b[@c="c11"]')
  212. b11
  213. SELECT extractValue(@xml,'/a/b[@c="c21"]');
  214. extractValue(@xml,'/a/b[@c="c21"]')
  215. b21
  216. SET @xml='<a>a1<b c="c11">b11<d>d11</d></b><b c="c21">b21<d>d21</d></b></a>';
  217. SELECT extractValue(@xml, '/a/b[@c="c11"]/d');
  218. extractValue(@xml, '/a/b[@c="c11"]/d')
  219. d11
  220. SELECT extractValue(@xml, '/a/b[@c="c21"]/d');
  221. extractValue(@xml, '/a/b[@c="c21"]/d')
  222. d21
  223. SELECT extractValue(@xml, '/a/b[d="d11"]/@c');
  224. extractValue(@xml, '/a/b[d="d11"]/@c')
  225. c11
  226. SELECT extractValue(@xml, '/a/b[d="d21"]/@c');
  227. extractValue(@xml, '/a/b[d="d21"]/@c')
  228. c21
  229. SELECT extractValue(@xml, '/a[b="b11"]');
  230. extractValue(@xml, '/a[b="b11"]')
  231. a1
  232. SELECT extractValue(@xml, '/a[b/@c="c11"]');
  233. extractValue(@xml, '/a[b/@c="c11"]')
  234. a1
  235. SELECT extractValue(@xml, '/a[b/d="d11"]');
  236. extractValue(@xml, '/a[b/d="d11"]')
  237. a1
  238. SELECT extractValue(@xml, '/a[/a/b="b11"]');
  239. extractValue(@xml, '/a[/a/b="b11"]')
  240. a1
  241. SELECT extractValue(@xml, '/a[/a/b/@c="c11"]');
  242. extractValue(@xml, '/a[/a/b/@c="c11"]')
  243. a1
  244. SELECT extractValue(@xml, '/a[/a/b/d="d11"]');
  245. extractValue(@xml, '/a[/a/b/d="d11"]')
  246. a1
  247. SELECT extractValue('<a>a</a>', '/a[false()]');
  248. extractValue('<a>a</a>', '/a[false()]')
  249. SELECT extractValue('<a>a</a>', '/a[true()]');
  250. extractValue('<a>a</a>', '/a[true()]')
  251. a
  252. SELECT extractValue('<a>a</a>', '/a[not(false())]');
  253. extractValue('<a>a</a>', '/a[not(false())]')
  254. a
  255. SELECT extractValue('<a>a</a>', '/a[not(true())]');
  256. extractValue('<a>a</a>', '/a[not(true())]')
  257. SELECT extractValue('<a>a</a>', '/a[true() and true()]');
  258. extractValue('<a>a</a>', '/a[true() and true()]')
  259. a
  260. SELECT extractValue('<a>a</a>', '/a[true() and false()]');
  261. extractValue('<a>a</a>', '/a[true() and false()]')
  262. SELECT extractValue('<a>a</a>', '/a[false()and false()]');
  263. extractValue('<a>a</a>', '/a[false()and false()]')
  264. SELECT extractValue('<a>a</a>', '/a[false()and true()]');
  265. extractValue('<a>a</a>', '/a[false()and true()]')
  266. SELECT extractValue('<a>a</a>', '/a[true() or true()]');
  267. extractValue('<a>a</a>', '/a[true() or true()]')
  268. a
  269. SELECT extractValue('<a>a</a>', '/a[true() or false()]');
  270. extractValue('<a>a</a>', '/a[true() or false()]')
  271. a
  272. SELECT extractValue('<a>a</a>', '/a[false()or false()]');
  273. extractValue('<a>a</a>', '/a[false()or false()]')
  274. SELECT extractValue('<a>a</a>', '/a[false()or true()]');
  275. extractValue('<a>a</a>', '/a[false()or true()]')
  276. a
  277. SET @xml='<a>ab<b c="c" c="e">b1</b><b c="d">b2</b><b c="f" c="e">b3</b></a>';
  278. select extractValue(@xml,'/a/b[@c="c"]');
  279. extractValue(@xml,'/a/b[@c="c"]')
  280. b1
  281. select extractValue(@xml,'/a/b[@c="d"]');
  282. extractValue(@xml,'/a/b[@c="d"]')
  283. b2
  284. select extractValue(@xml,'/a/b[@c="e"]');
  285. extractValue(@xml,'/a/b[@c="e"]')
  286. b1 b3
  287. select extractValue(@xml,'/a/b[not(@c="e")]');
  288. extractValue(@xml,'/a/b[not(@c="e")]')
  289. b2
  290. select extractValue(@xml,'/a/b[@c!="e"]');
  291. extractValue(@xml,'/a/b[@c!="e"]')
  292. b1 b2 b3
  293. select extractValue(@xml,'/a/b[@c="c" or @c="d"]');
  294. extractValue(@xml,'/a/b[@c="c" or @c="d"]')
  295. b1 b2
  296. select extractValue(@xml,'/a/b[@c="c" and @c="e"]');
  297. extractValue(@xml,'/a/b[@c="c" and @c="e"]')
  298. b1
  299. SET @xml='<a><b c="c" d="d">b1</b><b d="d" e="e">b2</b></a>';
  300. select extractValue(@xml,'/a/b[@c]');
  301. extractValue(@xml,'/a/b[@c]')
  302. b1
  303. select extractValue(@xml,'/a/b[@d]');
  304. extractValue(@xml,'/a/b[@d]')
  305. b1 b2
  306. select extractValue(@xml,'/a/b[@e]');
  307. extractValue(@xml,'/a/b[@e]')
  308. b2
  309. select extractValue(@xml,'/a/b[not(@c)]');
  310. extractValue(@xml,'/a/b[not(@c)]')
  311. b2
  312. select extractValue(@xml,'/a/b[not(@d)]');
  313. extractValue(@xml,'/a/b[not(@d)]')
  314. select extractValue(@xml,'/a/b[not(@e)]');
  315. extractValue(@xml,'/a/b[not(@e)]')
  316. b1
  317. select extractValue(@xml, '/a/b[boolean(@c) or boolean(@d)]');
  318. extractValue(@xml, '/a/b[boolean(@c) or boolean(@d)]')
  319. b1 b2
  320. select extractValue(@xml, '/a/b[boolean(@c) or boolean(@e)]');
  321. extractValue(@xml, '/a/b[boolean(@c) or boolean(@e)]')
  322. b1 b2
  323. select extractValue(@xml, '/a/b[boolean(@d) or boolean(@e)]');
  324. extractValue(@xml, '/a/b[boolean(@d) or boolean(@e)]')
  325. b1 b2
  326. select extractValue(@xml, '/a/b[boolean(@c) and boolean(@d)]');
  327. extractValue(@xml, '/a/b[boolean(@c) and boolean(@d)]')
  328. b1
  329. select extractValue(@xml, '/a/b[boolean(@c) and boolean(@e)]');
  330. extractValue(@xml, '/a/b[boolean(@c) and boolean(@e)]')
  331. select extractValue(@xml, '/a/b[boolean(@d) and boolean(@e)]');
  332. extractValue(@xml, '/a/b[boolean(@d) and boolean(@e)]')
  333. b2
  334. select extractValue(@xml, '/a/b[@c or @d]');
  335. extractValue(@xml, '/a/b[@c or @d]')
  336. b1 b2
  337. select extractValue(@xml, '/a/b[@c or @e]');
  338. extractValue(@xml, '/a/b[@c or @e]')
  339. b1 b2
  340. select extractValue(@xml, '/a/b[@d or @e]');
  341. extractValue(@xml, '/a/b[@d or @e]')
  342. b1 b2
  343. select extractValue(@xml, '/a/b[@c and @d]');
  344. extractValue(@xml, '/a/b[@c and @d]')
  345. b1
  346. select extractValue(@xml, '/a/b[@c and @e]');
  347. extractValue(@xml, '/a/b[@c and @e]')
  348. select extractValue(@xml, '/a/b[@d and @e]');
  349. extractValue(@xml, '/a/b[@d and @e]')
  350. b2
  351. SET @xml='<a><b c="c">b1</b><b>b2</b></a>';
  352. SELECT extractValue(@xml,'/a/b[@*]');
  353. extractValue(@xml,'/a/b[@*]')
  354. b1
  355. SELECT extractValue(@xml,'/a/b[not(@*)]');
  356. extractValue(@xml,'/a/b[not(@*)]')
  357. b2
  358. SELECT extractValue('<a>a</a>', '/a[ceiling(3.1)=4]');
  359. extractValue('<a>a</a>', '/a[ceiling(3.1)=4]')
  360. a
  361. SELECT extractValue('<a>a</a>', '/a[floor(3.1)=3]');
  362. extractValue('<a>a</a>', '/a[floor(3.1)=3]')
  363. a
  364. SELECT extractValue('<a>a</a>', '/a[round(3.1)=3]');
  365. extractValue('<a>a</a>', '/a[round(3.1)=3]')
  366. a
  367. SELECT extractValue('<a>a</a>', '/a[round(3.8)=4]');
  368. extractValue('<a>a</a>', '/a[round(3.8)=4]')
  369. a
  370. SELECT extractValue('<a><b>b</b><c>c</c></a>', '/a/b | /a/c');
  371. extractValue('<a><b>b</b><c>c</c></a>', '/a/b | /a/c')
  372. b c
  373. select extractValue('<a b="b1" b="b2" b="b3"/>','/a/@b[position()=1]');
  374. extractValue('<a b="b1" b="b2" b="b3"/>','/a/@b[position()=1]')
  375. b1
  376. select extractValue('<a b="b1" b="b2" b="b3"/>','/a/@b[position()=2]');
  377. extractValue('<a b="b1" b="b2" b="b3"/>','/a/@b[position()=2]')
  378. b2
  379. select extractValue('<a b="b1" b="b2" b="b3"/>','/a/@b[position()=3]');
  380. extractValue('<a b="b1" b="b2" b="b3"/>','/a/@b[position()=3]')
  381. b3
  382. select extractValue('<a b="b1" b="b2" b="b3"/>','/a/@b[1=position()]');
  383. extractValue('<a b="b1" b="b2" b="b3"/>','/a/@b[1=position()]')
  384. b1
  385. select extractValue('<a b="b1" b="b2" b="b3"/>','/a/@b[2=position()]');
  386. extractValue('<a b="b1" b="b2" b="b3"/>','/a/@b[2=position()]')
  387. b2
  388. select extractValue('<a b="b1" b="b2" b="b3"/>','/a/@b[3=position()]');
  389. extractValue('<a b="b1" b="b2" b="b3"/>','/a/@b[3=position()]')
  390. b3
  391. select extractValue('<a b="b1" b="b2" b="b3"/>','/a/@b[2>=position()]');
  392. extractValue('<a b="b1" b="b2" b="b3"/>','/a/@b[2>=position()]')
  393. b1 b2
  394. select extractValue('<a b="b1" b="b2" b="b3"/>','/a/@b[2<=position()]');
  395. extractValue('<a b="b1" b="b2" b="b3"/>','/a/@b[2<=position()]')
  396. b2 b3
  397. select extractValue('<a b="b1" b="b2" b="b3"/>','/a/@b[position()=3 or position()=2]');
  398. extractValue('<a b="b1" b="b2" b="b3"/>','/a/@b[position()=3 or position()=2]')
  399. b2 b3
  400. SELECT extractValue('<a>a<b>a1<c>c1</c></b><b>a2</b></a>','/a/b[count(c)=0]');
  401. extractValue('<a>a<b>a1<c>c1</c></b><b>a2</b></a>','/a/b[count(c)=0]')
  402. a2
  403. SELECT extractValue('<a>a<b>a1<c>c1</c></b><b>a2</b></a>','/a/b[count(c)=1]');
  404. extractValue('<a>a<b>a1<c>c1</c></b><b>a2</b></a>','/a/b[count(c)=1]')
  405. a1
  406. select extractValue('<a>a1<b ba="1" ba="2">b1</b><b>b2</b>4</a>','/a/b[sum(@ba)=3]');
  407. extractValue('<a>a1<b ba="1" ba="2">b1</b><b>b2</b>4</a>','/a/b[sum(@ba)=3]')
  408. b1
  409. select extractValue('<a><b>b1</b><b>b2</b></a>','/a/b[1]');
  410. extractValue('<a><b>b1</b><b>b2</b></a>','/a/b[1]')
  411. b1
  412. select extractValue('<a><b>b1</b><b>b2</b></a>','/a/b[boolean(1)]');
  413. extractValue('<a><b>b1</b><b>b2</b></a>','/a/b[boolean(1)]')
  414. b1 b2
  415. select extractValue('<a><b>b1</b><b>b2</b></a>','/a/b[true()]');
  416. extractValue('<a><b>b1</b><b>b2</b></a>','/a/b[true()]')
  417. b1 b2
  418. select extractValue('<a><b>b1</b><b>b2</b></a>','/a/b[number(true())]');
  419. extractValue('<a><b>b1</b><b>b2</b></a>','/a/b[number(true())]')
  420. b1
  421. select extractValue('<a>ab</a>','/a[contains("abc","b")]');
  422. extractValue('<a>ab</a>','/a[contains("abc","b")]')
  423. ab
  424. select extractValue('<a>ab</a>','/a[contains(.,"a")]');
  425. extractValue('<a>ab</a>','/a[contains(.,"a")]')
  426. ab
  427. select extractValue('<a>ab</a>','/a[contains(.,"b")]');
  428. extractValue('<a>ab</a>','/a[contains(.,"b")]')
  429. ab
  430. select extractValue('<a>ab</a>','/a[contains(.,"c")]');
  431. extractValue('<a>ab</a>','/a[contains(.,"c")]')
  432. select extractValue('<a b="1">ab</a>','/a[concat(@b,"2")="12"]');
  433. extractValue('<a b="1">ab</a>','/a[concat(@b,"2")="12"]')
  434. ab
  435. SET @xml='<a b="11" b="12" b="21" b="22">ab</a>';
  436. select extractValue(@xml, '/a/@b[substring(.,2)="1"]');
  437. extractValue(@xml, '/a/@b[substring(.,2)="1"]')
  438. 11 21
  439. select extractValue(@xml, '/a/@b[substring(.,2)="2"]');
  440. extractValue(@xml, '/a/@b[substring(.,2)="2"]')
  441. 12 22
  442. select extractValue(@xml, '/a/@b[substring(.,1,1)="1"]');
  443. extractValue(@xml, '/a/@b[substring(.,1,1)="1"]')
  444. 11 12
  445. select extractValue(@xml, '/a/@b[substring(.,1,1)="2"]');
  446. extractValue(@xml, '/a/@b[substring(.,1,1)="2"]')
  447. 21 22
  448. select extractValue(@xml, '/a/@b[substring(.,2,1)="1"]');
  449. extractValue(@xml, '/a/@b[substring(.,2,1)="1"]')
  450. 11 21
  451. select extractValue(@xml, '/a/@b[substring(.,2,1)="2"]');
  452. extractValue(@xml, '/a/@b[substring(.,2,1)="2"]')
  453. 12 22
  454. SET @xml='<a><b>b1</b><b>b2</b></a>';
  455. SELECT extractValue(@xml, '/a/b[string-length("x")=1]');
  456. extractValue(@xml, '/a/b[string-length("x")=1]')
  457. b1 b2
  458. SELECT extractValue(@xml, '/a/b[string-length("xx")=2]');
  459. extractValue(@xml, '/a/b[string-length("xx")=2]')
  460. b1 b2
  461. SELECT extractValue(@xml, '/a/b[string-length("xxx")=2]');
  462. extractValue(@xml, '/a/b[string-length("xxx")=2]')
  463. SELECT extractValue(@xml, '/a/b[string-length("x")]');
  464. extractValue(@xml, '/a/b[string-length("x")]')
  465. b1
  466. SELECT extractValue(@xml, '/a/b[string-length("xx")]');
  467. extractValue(@xml, '/a/b[string-length("xx")]')
  468. b2
  469. SELECT extractValue(@xml, '/a/b[string-length()]');
  470. extractValue(@xml, '/a/b[string-length()]')
  471. b2
  472. SELECT extractValue(@xml, 'string-length()');
  473. ERROR HY000: XPATH syntax error: ''
  474. SELECT extractValue(@xml, 'string-length("x")');
  475. extractValue(@xml, 'string-length("x")')
  476. 1
  477. SET @xml='<a b="b11" b="b12" b="b21" b="22"/>';
  478. select extractValue(@xml,'/a/@b');
  479. extractValue(@xml,'/a/@b')
  480. b11 b12 b21 22
  481. select extractValue(@xml,'/a/@b[contains(.,"1")]');
  482. extractValue(@xml,'/a/@b[contains(.,"1")]')
  483. b11 b12 b21
  484. select extractValue(@xml,'/a/@b[contains(.,"1")][contains(.,"2")]');
  485. extractValue(@xml,'/a/@b[contains(.,"1")][contains(.,"2")]')
  486. b12 b21
  487. select extractValue(@xml,'/a/@b[contains(.,"1")][contains(.,"2")][2]');
  488. extractValue(@xml,'/a/@b[contains(.,"1")][contains(.,"2")][2]')
  489. b21
  490. SET @xml='<a>a1<b>b1<c>c1</c>b2</b>a2</a>';
  491. select UpdateXML('<a>a1<b>b1<c>c1</c>b2</b>a2</a>','/a/b/c','+++++++++');
  492. UpdateXML('<a>a1<b>b1<c>c1</c>b2</b>a2</a>','/a/b/c','+++++++++')
  493. <a>a1<b>b1+++++++++b2</b>a2</a>
  494. select UpdateXML('<a>a1<b>b1<c>c1</c>b2</b>a2</a>','/a/b/c','<c1>+++++++++</c1>');
  495. UpdateXML('<a>a1<b>b1<c>c1</c>b2</b>a2</a>','/a/b/c','<c1>+++++++++</c1>')
  496. <a>a1<b>b1<c1>+++++++++</c1>b2</b>a2</a>
  497. select UpdateXML('<a>a1<b>b1<c>c1</c>b2</b>a2</a>','/a/b/c','<c1/>');
  498. UpdateXML('<a>a1<b>b1<c>c1</c>b2</b>a2</a>','/a/b/c','<c1/>')
  499. <a>a1<b>b1<c1/>b2</b>a2</a>
  500. SET @xml='<a><b>bb</b></a>';
  501. select UpdateXML(@xml, '/a/b', '<b>ccc</b>');
  502. UpdateXML(@xml, '/a/b', '<b>ccc</b>')
  503. <a><b>ccc</b></a>
  504. SET @xml='<a aa1="aa1" aa2="aa2"><b bb1="bb1" bb2="bb2">bb</b></a>';
  505. select UpdateXML(@xml, '/a/b', '<b>ccc</b>');
  506. UpdateXML(@xml, '/a/b', '<b>ccc</b>')
  507. <a aa1="aa1" aa2="aa2"><b>ccc</b></a>
  508. select UpdateXML(@xml, '/a/@aa1', '');
  509. UpdateXML(@xml, '/a/@aa1', '')
  510. <a aa2="aa2"><b bb1="bb1" bb2="bb2">bb</b></a>
  511. select UpdateXML(@xml, '/a/@aa1', 'aa3="aa3"');
  512. UpdateXML(@xml, '/a/@aa1', 'aa3="aa3"')
  513. <a aa3="aa3" aa2="aa2"><b bb1="bb1" bb2="bb2">bb</b></a>
  514. select UpdateXML(@xml, '/a/@aa2', '');
  515. UpdateXML(@xml, '/a/@aa2', '')
  516. <a aa1="aa1" ><b bb1="bb1" bb2="bb2">bb</b></a>
  517. select UpdateXML(@xml, '/a/@aa2', 'aa3="aa3"');
  518. UpdateXML(@xml, '/a/@aa2', 'aa3="aa3"')
  519. <a aa1="aa1" aa3="aa3"><b bb1="bb1" bb2="bb2">bb</b></a>
  520. select UpdateXML(@xml, '/a/b/@bb1', '');
  521. UpdateXML(@xml, '/a/b/@bb1', '')
  522. <a aa1="aa1" aa2="aa2"><b bb2="bb2">bb</b></a>
  523. select UpdateXML(@xml, '/a/b/@bb1', 'bb3="bb3"');
  524. UpdateXML(@xml, '/a/b/@bb1', 'bb3="bb3"')
  525. <a aa1="aa1" aa2="aa2"><b bb3="bb3" bb2="bb2">bb</b></a>
  526. select UpdateXML(@xml, '/a/b/@bb2', '');
  527. UpdateXML(@xml, '/a/b/@bb2', '')
  528. <a aa1="aa1" aa2="aa2"><b bb1="bb1" >bb</b></a>
  529. select UpdateXML(@xml, '/a/b/@bb2', 'bb3="bb3"');
  530. UpdateXML(@xml, '/a/b/@bb2', 'bb3="bb3"')
  531. <a aa1="aa1" aa2="aa2"><b bb1="bb1" bb3="bb3">bb</b></a>
  532. select updatexml('<div><div><span>1</span><span>2</span></div></div>',
  533. '/','<tr><td>1</td><td>2</td></tr>') as upd1;
  534. upd1
  535. <tr><td>1</td><td>2</td></tr>
  536. select updatexml('', '/', '') as upd2;
  537. upd2
  538. SET @xml= '<order><clerk>lesser wombat</clerk></order>';
  539. select extractvalue(@xml,'order/clerk');
  540. extractvalue(@xml,'order/clerk')
  541. lesser wombat
  542. select extractvalue(@xml,'/order/clerk');
  543. extractvalue(@xml,'/order/clerk')
  544. lesser wombat
  545. select extractvalue('<a><b>B</b></a>','/a|/b');
  546. extractvalue('<a><b>B</b></a>','/a|/b')
  547. select extractvalue('<a><b>B</b></a>','/a|b');
  548. extractvalue('<a><b>B</b></a>','/a|b')
  549. select extractvalue('<a>a<b>B</b></a>','/a|/b');
  550. extractvalue('<a>a<b>B</b></a>','/a|/b')
  551. a
  552. select extractvalue('<a>a<b>B</b></a>','/a|b');
  553. extractvalue('<a>a<b>B</b></a>','/a|b')
  554. a
  555. select extractvalue('<a>a<b>B</b></a>','a|/b');
  556. extractvalue('<a>a<b>B</b></a>','a|/b')
  557. a
  558. select extractvalue('<a>A</a>','/<a>');
  559. ERROR HY000: XPATH error: comparison of two nodesets is not supported: '<a>'
  560. select extractvalue('<a><b>b</b><b!>b!</b!></a>','//b!');
  561. ERROR HY000: XPATH syntax error: '!'
  562. select extractvalue('<a>A<b>B<c>C</c></b></a>','/a/descendant::*');
  563. extractvalue('<a>A<b>B<c>C</c></b></a>','/a/descendant::*')
  564. B C
  565. select extractvalue('<a>A<b>B<c>C</c></b></a>','/a/self::*');
  566. extractvalue('<a>A<b>B<c>C</c></b></a>','/a/self::*')
  567. A
  568. select extractvalue('<a>A<b>B<c>C</c></b></a>','/a/descendant-or-self::*');
  569. extractvalue('<a>A<b>B<c>C</c></b></a>','/a/descendant-or-self::*')
  570. A B C
  571. select extractvalue('<A_B>A</A_B>','/A_B');
  572. extractvalue('<A_B>A</A_B>','/A_B')
  573. A
  574. select extractvalue('<a>A<b>B1</b><b>B2</b></a>','/a/b[position()]');
  575. extractvalue('<a>A<b>B1</b><b>B2</b></a>','/a/b[position()]')
  576. B1 B2
  577. select extractvalue('<a>A<b>B1</b><b>B2</b></a>','/a/b[count(.)=last()]');
  578. extractvalue('<a>A<b>B1</b><b>B2</b></a>','/a/b[count(.)=last()]')
  579. B1 B2
  580. select extractvalue('<a>A<b>B1</b><b>B2</b></a>','/a/b[last()]');
  581. extractvalue('<a>A<b>B1</b><b>B2</b></a>','/a/b[last()]')
  582. B2
  583. select extractvalue('<a>A<b>B1</b><b>B2</b></a>','/a/b[last()-1]');
  584. extractvalue('<a>A<b>B1</b><b>B2</b></a>','/a/b[last()-1]')
  585. B1
  586. select extractvalue('<a>A<b>B1</b><b>B2</b></a>','/a/b[last()=1]');
  587. extractvalue('<a>A<b>B1</b><b>B2</b></a>','/a/b[last()=1]')
  588. select extractvalue('<a>A<b>B1</b><b>B2</b></a>','/a/b[last()=2]');
  589. extractvalue('<a>A<b>B1</b><b>B2</b></a>','/a/b[last()=2]')
  590. B1 B2
  591. select extractvalue('<a>A<b>B1</b><b>B2</b></a>','/a/b[last()=position()]');
  592. extractvalue('<a>A<b>B1</b><b>B2</b></a>','/a/b[last()=position()]')
  593. B2
  594. select extractvalue('<a>A<b>B1</b><b>B2</b></a>','/a/b[count(.)]');
  595. extractvalue('<a>A<b>B1</b><b>B2</b></a>','/a/b[count(.)]')
  596. B2
  597. select extractvalue('<a>A<b>B1</b><b>B2</b></a>','/a/b[count(.)-1]');
  598. extractvalue('<a>A<b>B1</b><b>B2</b></a>','/a/b[count(.)-1]')
  599. B1
  600. select extractvalue('<a>A<b>B1</b><b>B2</b></a>','/a/b[count(.)=1]');
  601. extractvalue('<a>A<b>B1</b><b>B2</b></a>','/a/b[count(.)=1]')
  602. select extractvalue('<a>A<b>B1</b><b>B2</b></a>','/a/b[count(.)=2]');
  603. extractvalue('<a>A<b>B1</b><b>B2</b></a>','/a/b[count(.)=2]')
  604. B1 B2
  605. select extractvalue('<a>A<b>B1</b><b>B2</b></a>','/a/b[count(.)=position()]');
  606. extractvalue('<a>A<b>B1</b><b>B2</b></a>','/a/b[count(.)=position()]')
  607. B2
  608. select extractvalue('<a>Jack</a>','/a[contains(../a,"J")]');
  609. extractvalue('<a>Jack</a>','/a[contains(../a,"J")]')
  610. Jack
  611. select extractvalue('<a>Jack</a>','/a[contains(../a,"j")]');
  612. extractvalue('<a>Jack</a>','/a[contains(../a,"j")]')
  613. Jack
  614. select extractvalue('<a>Jack</a>','/a[contains(../a,"j")]' collate latin1_bin);
  615. extractvalue('<a>Jack</a>','/a[contains(../a,"j")]' collate latin1_bin)
  616. select extractvalue('<a>Jack</a>' collate latin1_bin,'/a[contains(../a,"j")]');
  617. extractvalue('<a>Jack</a>' collate latin1_bin,'/a[contains(../a,"j")]')
  618. select ExtractValue('<tag1><![CDATA[test]]></tag1>','/tag1');
  619. ExtractValue('<tag1><![CDATA[test]]></tag1>','/tag1')
  620. test
  621. select extractValue('<a>a','/a');
  622. extractValue('<a>a','/a')
  623. NULL
  624. Warnings:
  625. Warning 1525 Incorrect XML value: 'parse error at line 1 pos 5: unexpected END-OF-INPUT'
  626. select extractValue('<a>a<','/a');
  627. extractValue('<a>a<','/a')
  628. NULL
  629. Warnings:
  630. Warning 1525 Incorrect XML value: 'parse error at line 1 pos 6: END-OF-INPUT unexpected (ident or '/' wanted)'
  631. select extractValue('<a>a</','/a');
  632. extractValue('<a>a</','/a')
  633. NULL
  634. Warnings:
  635. Warning 1525 Incorrect XML value: 'parse error at line 1 pos 7: END-OF-INPUT unexpected (ident wanted)'
  636. select extractValue('<a>a</a','/a');
  637. extractValue('<a>a</a','/a')
  638. NULL
  639. Warnings:
  640. Warning 1525 Incorrect XML value: 'parse error at line 1 pos 8: END-OF-INPUT unexpected ('>' wanted)'
  641. select extractValue('<a>a</a></b>','/a');
  642. extractValue('<a>a</a></b>','/a')
  643. NULL
  644. Warnings:
  645. Warning 1525 Incorrect XML value: 'parse error at line 1 pos 12: '</b>' unexpected (END-OF-INPUT wanted)'
  646. select extractValue('<a b=>a</a>','/a');
  647. extractValue('<a b=>a</a>','/a')
  648. NULL
  649. Warnings:
  650. Warning 1525 Incorrect XML value: 'parse error at line 1 pos 7: '>' unexpected (ident or string wanted)'
  651. select extractValue('<e>1</e>','position()');
  652. ERROR HY000: XPATH syntax error: ''
  653. select extractValue('<e>1</e>','last()');
  654. ERROR HY000: XPATH syntax error: ''
  655. select extractValue('<e><a>1</a></e>','/e/');
  656. ERROR HY000: XPATH syntax error: ''
  657. set names utf8;
  658. select extractValue('<Ñ><r>r</r></Ñ>','/Ñ/r');
  659. extractValue('<Ñ><r>r</r></Ñ>','/Ñ/r')
  660. r
  661. select extractValue('<r><Ñ>Ñ</Ñ></r>','/r/Ñ');
  662. extractValue('<r><Ñ>Ñ</Ñ></r>','/r/Ñ')
  663. Ñ
  664. select extractValue('<Ñ r="r"/>','/Ñ/@r');
  665. extractValue('<Ñ r="r"/>','/Ñ/@r')
  666. r
  667. select extractValue('<r Ñ="Ñ"/>','/r/@Ñ');
  668. extractValue('<r Ñ="Ñ"/>','/r/@Ñ')
  669. Ñ
  670. DROP PROCEDURE IF EXISTS p2;
  671. CREATE PROCEDURE p2 ()
  672. BEGIN
  673. DECLARE p LONGTEXT CHARACTER SET UTF8 DEFAULT '<Ñ><r>A</r></Ñ>';
  674. SELECT EXTRACTVALUE(p,'/Ñ/r');
  675. END//
  676. CALL p2();
  677. EXTRACTVALUE(p,'/Ñ/r')
  678. A
  679. DROP PROCEDURE p2;
  680. select extractValue('<ns:element xmlns:ns="myns"/>','count(ns:element)');
  681. extractValue('<ns:element xmlns:ns="myns"/>','count(ns:element)')
  682. 1
  683. select extractValue('<ns:element xmlns:ns="myns">a</ns:element>','/ns:element');
  684. extractValue('<ns:element xmlns:ns="myns">a</ns:element>','/ns:element')
  685. a
  686. select extractValue('<ns:element xmlns:ns="myns">a</ns:element>','/ns:element/@xmlns:ns');
  687. extractValue('<ns:element xmlns:ns="myns">a</ns:element>','/ns:element/@xmlns:ns')
  688. myns
  689. select extractValue('<foo><foo.bar>Data</foo.bar><something>Otherdata</something></foo>','/foo/foo.bar');
  690. extractValue('<foo><foo.bar>Data</foo.bar><something>Otherdata</something></foo>','/foo/foo.bar')
  691. Data
  692. select extractValue('<foo><foo.bar>Data</foo.bar><something>Otherdata</something></foo>','/foo/something');
  693. extractValue('<foo><foo.bar>Data</foo.bar><something>Otherdata</something></foo>','/foo/something')
  694. Otherdata
  695. select extractValue('<zot><tim0><01>10:39:15</01><02>140</02></tim0></zot>','/zot/tim0/02');
  696. ERROR HY000: XPATH syntax error: '02'
  697. select extractValue('<zot><tim0><01>10:39:15</01><02>140</02></tim0></zot>','//*');
  698. extractValue('<zot><tim0><01>10:39:15</01><02>140</02></tim0></zot>','//*')
  699. NULL
  700. Warnings:
  701. Warning 1525 Incorrect XML value: 'parse error at line 1 pos 13: unknown token unexpected (ident or '/' wanted)'
  702. select extractValue('<.>test</.>','//*');
  703. extractValue('<.>test</.>','//*')
  704. NULL
  705. Warnings:
  706. Warning 1525 Incorrect XML value: 'parse error at line 1 pos 2: unknown token unexpected (ident or '/' wanted)'
  707. select extractValue('<->test</->','//*');
  708. extractValue('<->test</->','//*')
  709. NULL
  710. Warnings:
  711. Warning 1525 Incorrect XML value: 'parse error at line 1 pos 2: unknown token unexpected (ident or '/' wanted)'
  712. select extractValue('<:>test</:>','//*');
  713. extractValue('<:>test</:>','//*')
  714. test
  715. select extractValue('<_>test</_>','//*');
  716. extractValue('<_>test</_>','//*')
  717. test
  718. select extractValue('<x.-_:>test</x.-_:>','//*');
  719. extractValue('<x.-_:>test</x.-_:>','//*')
  720. test
  721. set @xml= "<entry><id>pt10</id><pt>10</pt></entry><entry><id>pt50</id><pt>50</pt></entry>";
  722. select ExtractValue(@xml, "/entry[(pt=10)]/id");
  723. ExtractValue(@xml, "/entry[(pt=10)]/id")
  724. pt10
  725. select ExtractValue(@xml, "/entry[(pt!=10)]/id");
  726. ExtractValue(@xml, "/entry[(pt!=10)]/id")
  727. pt50
  728. select ExtractValue(@xml, "/entry[(pt<10)]/id");
  729. ExtractValue(@xml, "/entry[(pt<10)]/id")
  730. select ExtractValue(@xml, "/entry[(pt<=10)]/id");
  731. ExtractValue(@xml, "/entry[(pt<=10)]/id")
  732. pt10
  733. select ExtractValue(@xml, "/entry[(pt>10)]/id");
  734. ExtractValue(@xml, "/entry[(pt>10)]/id")
  735. pt50
  736. select ExtractValue(@xml, "/entry[(pt>=10)]/id");
  737. ExtractValue(@xml, "/entry[(pt>=10)]/id")
  738. pt10 pt50
  739. select ExtractValue(@xml, "/entry[(pt=50)]/id");
  740. ExtractValue(@xml, "/entry[(pt=50)]/id")
  741. pt50
  742. select ExtractValue(@xml, "/entry[(pt!=50)]/id");
  743. ExtractValue(@xml, "/entry[(pt!=50)]/id")
  744. pt10
  745. select ExtractValue(@xml, "/entry[(pt<50)]/id");
  746. ExtractValue(@xml, "/entry[(pt<50)]/id")
  747. pt10
  748. select ExtractValue(@xml, "/entry[(pt<=50)]/id");
  749. ExtractValue(@xml, "/entry[(pt<=50)]/id")
  750. pt10 pt50
  751. select ExtractValue(@xml, "/entry[(pt>50)]/id");
  752. ExtractValue(@xml, "/entry[(pt>50)]/id")
  753. select ExtractValue(@xml, "/entry[(pt>=50)]/id");
  754. ExtractValue(@xml, "/entry[(pt>=50)]/id")
  755. pt50
  756. select ExtractValue(@xml, "/entry[(10=pt)]/id");
  757. ExtractValue(@xml, "/entry[(10=pt)]/id")
  758. pt10
  759. select ExtractValue(@xml, "/entry[(10!=pt)]/id");
  760. ExtractValue(@xml, "/entry[(10!=pt)]/id")
  761. pt50
  762. select ExtractValue(@xml, "/entry[(10>pt)]/id");
  763. ExtractValue(@xml, "/entry[(10>pt)]/id")
  764. select ExtractValue(@xml, "/entry[(10>=pt)]/id");
  765. ExtractValue(@xml, "/entry[(10>=pt)]/id")
  766. pt10
  767. select ExtractValue(@xml, "/entry[(10<pt)]/id");
  768. ExtractValue(@xml, "/entry[(10<pt)]/id")
  769. pt50
  770. select ExtractValue(@xml, "/entry[(10<=pt)]/id");
  771. ExtractValue(@xml, "/entry[(10<=pt)]/id")
  772. pt10 pt50
  773. select ExtractValue(@xml, "/entry[(50=pt)]/id");
  774. ExtractValue(@xml, "/entry[(50=pt)]/id")
  775. pt50
  776. select ExtractValue(@xml, "/entry[(50!=pt)]/id");
  777. ExtractValue(@xml, "/entry[(50!=pt)]/id")
  778. pt10
  779. select ExtractValue(@xml, "/entry[(50>pt)]/id");
  780. ExtractValue(@xml, "/entry[(50>pt)]/id")
  781. pt10
  782. select ExtractValue(@xml, "/entry[(50>=pt)]/id");
  783. ExtractValue(@xml, "/entry[(50>=pt)]/id")
  784. pt10 pt50
  785. select ExtractValue(@xml, "/entry[(50<pt)]/id");
  786. ExtractValue(@xml, "/entry[(50<pt)]/id")
  787. select ExtractValue(@xml, "/entry[(50<=pt)]/id");
  788. ExtractValue(@xml, "/entry[(50<=pt)]/id")
  789. pt50
  790. select ExtractValue('<a><b><Text>test</Text></b></a>','/a/b/Text');
  791. ExtractValue('<a><b><Text>test</Text></b></a>','/a/b/Text')
  792. test
  793. select ExtractValue('<a><b><comment>test</comment></b></a>','/a/b/comment');
  794. ExtractValue('<a><b><comment>test</comment></b></a>','/a/b/comment')
  795. test
  796. select ExtractValue('<a><b><node>test</node></b></a>','/a/b/node');
  797. ExtractValue('<a><b><node>test</node></b></a>','/a/b/node')
  798. test
  799. select ExtractValue('<a><b><processing-instruction>test</processing-instruction></b></a>','/a/b/processing-instruction');
  800. ExtractValue('<a><b><processing-instruction>test</processing-instruction></b></a>','/a/b/processing-instruction')
  801. test
  802. select ExtractValue('<a><and>test</and></a>', '/a/and');
  803. ExtractValue('<a><and>test</and></a>', '/a/and')
  804. test
  805. select ExtractValue('<a><or>test</or></a>', '/a/or');
  806. ExtractValue('<a><or>test</or></a>', '/a/or')
  807. test
  808. select ExtractValue('<a><mod>test</mod></a>', '/a/mod');
  809. ExtractValue('<a><mod>test</mod></a>', '/a/mod')
  810. test
  811. select ExtractValue('<a><div>test</div></a>', '/a/div');
  812. ExtractValue('<a><div>test</div></a>', '/a/div')
  813. test
  814. select ExtractValue('<a><and:and>test</and:and></a>', '/a/and:and');
  815. ExtractValue('<a><and:and>test</and:and></a>', '/a/and:and')
  816. test
  817. select ExtractValue('<a><or:or>test</or:or></a>', '/a/or:or');
  818. ExtractValue('<a><or:or>test</or:or></a>', '/a/or:or')
  819. test
  820. select ExtractValue('<a><mod:mod>test</mod:mod></a>', '/a/mod:mod');
  821. ExtractValue('<a><mod:mod>test</mod:mod></a>', '/a/mod:mod')
  822. test
  823. select ExtractValue('<a><div:div>test</div:div></a>', '/a/div:div');
  824. ExtractValue('<a><div:div>test</div:div></a>', '/a/div:div')
  825. test
  826. select ExtractValue('<a><ancestor>test</ancestor></a>', '/a/ancestor');
  827. ExtractValue('<a><ancestor>test</ancestor></a>', '/a/ancestor')
  828. test
  829. select ExtractValue('<a><ancestor-or-self>test</ancestor-or-self></a>', '/a/ancestor-or-self');
  830. ExtractValue('<a><ancestor-or-self>test</ancestor-or-self></a>', '/a/ancestor-or-self')
  831. test
  832. select ExtractValue('<a><attribute>test</attribute></a>', '/a/attribute');
  833. ExtractValue('<a><attribute>test</attribute></a>', '/a/attribute')
  834. test
  835. select ExtractValue('<a><child>test</child></a>', '/a/child');
  836. ExtractValue('<a><child>test</child></a>', '/a/child')
  837. test
  838. select ExtractValue('<a><descendant>test</descendant></a>', '/a/descendant');
  839. ExtractValue('<a><descendant>test</descendant></a>', '/a/descendant')
  840. test
  841. select ExtractValue('<a><descendant-or-self>test</descendant-or-self></a>', '/a/descendant-or-self');
  842. ExtractValue('<a><descendant-or-self>test</descendant-or-self></a>', '/a/descendant-or-self')
  843. test
  844. select ExtractValue('<a><following>test</following></a>', '/a/following');
  845. ExtractValue('<a><following>test</following></a>', '/a/following')
  846. test
  847. select ExtractValue('<a><following-sibling>test</following-sibling></a>', '/a/following-sibling');
  848. ExtractValue('<a><following-sibling>test</following-sibling></a>', '/a/following-sibling')
  849. test
  850. select ExtractValue('<a><namespace>test</namespace></a>', '/a/namespace');
  851. ExtractValue('<a><namespace>test</namespace></a>', '/a/namespace')
  852. test
  853. select ExtractValue('<a><parent>test</parent></a>', '/a/parent');
  854. ExtractValue('<a><parent>test</parent></a>', '/a/parent')
  855. test
  856. select ExtractValue('<a><preceding>test</preceding></a>', '/a/preceding');
  857. ExtractValue('<a><preceding>test</preceding></a>', '/a/preceding')
  858. test
  859. select ExtractValue('<a><preceding-sibling>test</preceding-sibling></a>', '/a/preceding-sibling');
  860. ExtractValue('<a><preceding-sibling>test</preceding-sibling></a>', '/a/preceding-sibling')
  861. test
  862. select ExtractValue('<a><self>test</self></a>', '/a/self');
  863. ExtractValue('<a><self>test</self></a>', '/a/self')
  864. test
  865. set @i=1;
  866. select ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/b[$@i]');
  867. ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/b[$@i]')
  868. b1
  869. set @i=2;
  870. select ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/b[$@i]');
  871. ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/b[$@i]')
  872. b2
  873. set @i=NULL;
  874. select ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/b[$@i]');
  875. ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/b[$@i]')
  876. CREATE PROCEDURE spxml(xml VARCHAR(128))
  877. BEGIN
  878. DECLARE c INT;
  879. DECLARE i INT DEFAULT 1;
  880. SET c= ExtractValue(xml,'count(/a/b)');
  881. SET @i= c;
  882. WHILE i <= c DO
  883. BEGIN
  884. SELECT i, @i, ExtractValue(xml,'/a/b[$i]'), ExtractValue(xml,'/a/b[$@i]');
  885. SET i= i + 1;
  886. SET @i= @i - 1;
  887. END;
  888. END WHILE;
  889. END|
  890. call spxml('<a><b>b1</b><b>b2</b><b>b3</b></a>');
  891. i @i ExtractValue(xml,'/a/b[$i]') ExtractValue(xml,'/a/b[$@i]')
  892. 1 3 b1 b3
  893. i @i ExtractValue(xml,'/a/b[$i]') ExtractValue(xml,'/a/b[$@i]')
  894. 2 2 b2 b2
  895. i @i ExtractValue(xml,'/a/b[$i]') ExtractValue(xml,'/a/b[$@i]')
  896. 3 1 b3 b1
  897. drop procedure spxml;
  898. Multiple matches, but no index specification
  899. SELECT ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/b');
  900. ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/b')
  901. b1 b2
  902. No matches
  903. SELECT ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/c');
  904. ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/c')
  905. Index out of range
  906. SELECT ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/b[-1]');
  907. ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/b[-1]')
  908. SELECT ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/b[10]');
  909. ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/b[10]')
  910. With string-to-number conversion
  911. SELECT ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/b["1"]');
  912. ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/b["1"]')
  913. b1
  914. SELECT ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/b["1 and string"]');
  915. ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/b["1 and string"]')
  916. b1
  917. Warnings:
  918. Warning 1292 Truncated incorrect INTEGER value: '1 and string'
  919. Warning 1292 Truncated incorrect INTEGER value: '1 and string'
  920. SELECT ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/b["string and 1"]');
  921. ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/b["string and 1"]')
  922. Warnings:
  923. Warning 1292 Truncated incorrect INTEGER value: 'string and 1'
  924. Warning 1292 Truncated incorrect INTEGER value: 'string and 1'
  925. SELECT ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/b["string"]');
  926. ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/b["string"]')
  927. Warnings:
  928. Warning 1292 Truncated incorrect INTEGER value: 'string'
  929. Warning 1292 Truncated incorrect INTEGER value: 'string'
  930. String-to-number conversion from a user variable
  931. SET @i='1';
  932. SELECT ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/b[$@i]');
  933. ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/b[$@i]')
  934. b1
  935. SET @i='1 and string';
  936. SELECT ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/b[$@i]');
  937. ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/b[$@i]')
  938. b1
  939. SET @i='string and 1';
  940. SELECT ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/b[$@i]');
  941. ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/b[$@i]')
  942. SET @i='string';
  943. SELECT ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/b[$@i]');
  944. ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/b[$@i]')
  945. String-to-number conversion with a CHAR SP variable
  946. CREATE PROCEDURE spxml(xml VARCHAR(128), i CHAR(16))
  947. BEGIN
  948. SELECT ExtractValue(xml,'/a/b[$i]');
  949. END|
  950. CALL spxml('<a><b>b1</b><b>b2</b></a>', '1');
  951. ExtractValue(xml,'/a/b[$i]')
  952. b1
  953. CALL spxml('<a><b>b1</b><b>b2</b></a>', '1 and string');
  954. ExtractValue(xml,'/a/b[$i]')
  955. b1
  956. Warnings:
  957. Warning 1292 Truncated incorrect INTEGER value: '1 and string '
  958. Warning 1292 Truncated incorrect INTEGER value: '1 and string '
  959. CALL spxml('<a><b>b1</b><b>b2</b></a>', 'string and 1');
  960. ExtractValue(xml,'/a/b[$i]')
  961. Warnings:
  962. Warning 1292 Truncated incorrect INTEGER value: 'string and 1 '
  963. Warning 1292 Truncated incorrect INTEGER value: 'string and 1 '
  964. CALL spxml('<a><b>b1</b><b>b2</b></a>', 'string');
  965. ExtractValue(xml,'/a/b[$i]')
  966. Warnings:
  967. Warning 1292 Truncated incorrect INTEGER value: 'string '
  968. Warning 1292 Truncated incorrect INTEGER value: 'string '
  969. DROP PROCEDURE spxml;
  970. select UpdateXML('<a>a</a>',repeat('a b ',1000),'');
  971. ERROR HY000: XPATH syntax error: 'b a b a b a b a b a b a b a b a '
  972. select ExtractValue('<a>a</a>', '/a[@x=@y0123456789_0123456789_0123456789_0123456789]');
  973. ERROR HY000: XPATH error: comparison of two nodesets is not supported: '=@y0123456789_0123456789_0123456'
  974. select ExtractValue('<a>a</a>', '/a[@x=$y0123456789_0123456789_0123456789_0123456789]');
  975. ERROR HY000: Unknown XPATH variable at: '$y0123456789_0123456789_01234567'
  976. select updatexml(NULL, 1, 1), updatexml(1, NULL, 1), updatexml(1, 1, NULL);
  977. updatexml(NULL, 1, 1) updatexml(1, NULL, 1) updatexml(1, 1, NULL)
  978. NULL NULL NULL
  979. select updatexml(NULL, NULL, 1), updatexml(1, NULL, NULL),
  980. updatexml(NULL, 1, NULL);
  981. updatexml(NULL, NULL, 1) updatexml(1, NULL, NULL) updatexml(NULL, 1, NULL)
  982. NULL NULL NULL
  983. select updatexml(NULL, NULL, NULL);
  984. updatexml(NULL, NULL, NULL)
  985. NULL
  986. CREATE TABLE t1(a INT NOT NULL);
  987. INSERT INTO t1 VALUES (0), (0);
  988. SELECT 1 FROM t1 ORDER BY(UPDATEXML(a, '1', '1'));
  989. 1
  990. 1
  991. 1
  992. DROP TABLE t1;
  993. SET @xml=
  994. '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  995. <html>
  996. <head>
  997. <title> Title - document with document declaration</title>
  998. </head>
  999. <body> Hi, Im a webpage with document a declaration </body>
  1000. </html>';
  1001. SELECT ExtractValue(@xml, 'html/head/title');
  1002. ExtractValue(@xml, 'html/head/title')
  1003. Title - document with document declaration
  1004. SELECT ExtractValue(@xml, 'html/body');
  1005. ExtractValue(@xml, 'html/body')
  1006. Hi, Im a webpage with document a declaration
  1007. SELECT ExtractValue('<xml "xxx" "yyy">CharData</xml>', '/xml');
  1008. ExtractValue('<xml "xxx" "yyy">CharData</xml>', '/xml')
  1009. NULL
  1010. Warnings:
  1011. Warning 1525 Incorrect XML value: 'parse error at line 1 pos 11: STRING unexpected ('>' wanted)'
  1012. SELECT ExtractValue('<xml xxx "yyy">CharData</xml>', '/xml');
  1013. ExtractValue('<xml xxx "yyy">CharData</xml>', '/xml')
  1014. NULL
  1015. Warnings:
  1016. Warning 1525 Incorrect XML value: 'parse error at line 1 pos 17: STRING unexpected ('>' wanted)'
  1017. set @x=10;
  1018. select extractvalue('<a></a>','$@x/a');
  1019. ERROR HY000: XPATH syntax error: '/a'
  1020. select extractvalue('<a></a>','round(123.4)/a');
  1021. ERROR HY000: XPATH syntax error: '/a'
  1022. select extractvalue('<a></a>','1/a');
  1023. ERROR HY000: XPATH syntax error: '/a'
  1024. select extractvalue('<a></a>','"b"/a');
  1025. ERROR HY000: XPATH syntax error: '/a'
  1026. select extractvalue('<a></a>','(1)/a');
  1027. ERROR HY000: XPATH syntax error: '/a'
  1028. CREATE TABLE IF NOT EXISTS t1 (
  1029. id int(10) unsigned NOT NULL AUTO_INCREMENT,
  1030. xml text,
  1031. PRIMARY KEY (id)
  1032. ) ENGINE=MyISAM;
  1033. INSERT INTO t1 (id, xml) VALUES
  1034. (15, '<?xml version="1.0"?><bla name="blubb"></bla>'),
  1035. (14, '<xml version="kaputt">');
  1036. SELECT
  1037. extractvalue( xml, '/bla/@name' ),
  1038. extractvalue( xml, '/bla/@name' )
  1039. FROM t1 ORDER BY t1.id;
  1040. extractvalue( xml, '/bla/@name' ) extractvalue( xml, '/bla/@name' )
  1041. NULL NULL
  1042. blubb blubb
  1043. Warnings:
  1044. Warning 1525 Incorrect XML value: 'parse error at line 1 pos 23: unexpected END-OF-INPUT'
  1045. Warning 1525 Incorrect XML value: 'parse error at line 1 pos 23: unexpected END-OF-INPUT'
  1046. SELECT
  1047. UpdateXML(xml, '/bla/@name', 'test'),
  1048. UpdateXML(xml, '/bla/@name', 'test')
  1049. FROM t1 ORDER BY t1.id;
  1050. UpdateXML(xml, '/bla/@name', 'test') UpdateXML(xml, '/bla/@name', 'test')
  1051. NULL NULL
  1052. <?xml version="1.0"?><bla test></bla> <?xml version="1.0"?><bla test></bla>
  1053. Warnings:
  1054. Warning 1525 Incorrect XML value: 'parse error at line 1 pos 23: unexpected END-OF-INPUT'
  1055. Warning 1525 Incorrect XML value: 'parse error at line 1 pos 23: unexpected END-OF-INPUT'
  1056. DROP TABLE t1;
  1057. #
  1058. # Bug#57257 Replace(ExtractValue(...)) causes MySQL crash
  1059. #
  1060. SET NAMES utf8;
  1061. SELECT REPLACE(EXTRACTVALUE('1', '/a'),'ds','');
  1062. REPLACE(EXTRACTVALUE('1', '/a'),'ds','')
  1063. #
  1064. # Bug #57820 extractvalue crashes
  1065. #
  1066. SELECT AVG(DISTINCT EXTRACTVALUE((''),('$@k')));
  1067. AVG(DISTINCT EXTRACTVALUE((''),('$@k')))
  1068. NULL
  1069. #
  1070. # Bug#57279 updatexml dies with: Assertion failed: str_arg[length] == 0
  1071. #
  1072. SELECT UPDATEXML(NULL, (LPAD(0.1111E-15, '2011', 1)), 1);
  1073. ERROR 22007: Illegal double '111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111' value found during parsing
  1074. SELECT EXTRACTVALUE('', LPAD(0.1111E-15, '2011', 1));
  1075. ERROR 22007: Illegal double '111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111' value found during parsing
  1076. #
  1077. # Bug #44332 my_xml_scan reads behind the end of buffer
  1078. #
  1079. SELECT UPDATEXML(CONVERT(_latin1'<' USING utf8),'1','1');
  1080. UPDATEXML(CONVERT(_latin1'<' USING utf8),'1','1')
  1081. NULL
  1082. Warnings:
  1083. Warning 1525 Incorrect XML value: 'parse error at line 1 pos 2: END-OF-INPUT unexpected (ident or '/' wanted)'
  1084. SELECT UPDATEXML(CONVERT(_latin1'<!--' USING utf8),'1','1');
  1085. UPDATEXML(CONVERT(_latin1'<!--' USING utf8),'1','1')
  1086. NULL
  1087. #
  1088. # Bug#11766725 (bug#59901): EXTRACTVALUE STILL BROKEN AFTER FIX FOR BUG #44332
  1089. #
  1090. SELECT ExtractValue(CONVERT('<\"', BINARY(10)), 1);
  1091. ExtractValue(CONVERT('<\"', BINARY(10)), 1)
  1092. NULL
  1093. Warnings:
  1094. Warning 1525 Incorrect XML value: 'parse error at line 1 pos 11: STRING unexpected (ident or '/' wanted)'
  1095. End of 5.1 tests
  1096. #
  1097. # Start of 5.3 tests
  1098. #
  1099. #
  1100. # MDEV-5338 XML parser accepts malformed data
  1101. #
  1102. SELECT ExtractValue('<a>xxx</c>','/a/b');
  1103. ExtractValue('<a>xxx</c>','/a/b')
  1104. NULL
  1105. Warnings:
  1106. Warning 1525 Incorrect XML value: 'parse error at line 1 pos 10: '</c>' unexpected ('</a>' wanted)'
  1107. SELECT ExtractValue('<a><b>xxx</c></a>','/a/b');
  1108. ExtractValue('<a><b>xxx</c></a>','/a/b')
  1109. NULL
  1110. Warnings:
  1111. Warning 1525 Incorrect XML value: 'parse error at line 1 pos 13: '</c>' unexpected ('</b>' wanted)'
  1112. #
  1113. # End of 5.3 tests
  1114. #
  1115. # Start of 5.5 tests
  1116. #
  1117. #
  1118. # Bug#58175 xml functions read initialized bytes when conversions happen
  1119. #
  1120. SET NAMES latin1;
  1121. SELECT UPDATEXML(CONVERT('' USING swe7), TRUNCATE('',1), 0);
  1122. UPDATEXML(CONVERT('' USING swe7), TRUNCATE('',1), 0)
  1123. NULL
  1124. Warnings:
  1125. Warning 1292 Truncated incorrect DOUBLE value: ''
  1126. #
  1127. # Bug#12375190: UPDATEXML CRASHES ON SIMPLE INPUTS
  1128. #
  1129. SELECT UPDATEXML('','(a)/a','');
  1130. UPDATEXML('','(a)/a','')
  1131. SELECT UPDATEXML('<a><a>x</a></a>','(a)/a','<b />');
  1132. UPDATEXML('<a><a>x</a></a>','(a)/a','<b />')
  1133. <a><b /></a>
  1134. SELECT UPDATEXML('<a><c><a>x</a></c></a>','(a)/a','<b />');
  1135. UPDATEXML('<a><c><a>x</a></c></a>','(a)/a','<b />')
  1136. <a><c><a>x</a></c></a>
  1137. SELECT UPDATEXML('<a><c><a>x</a></c></a>','(a)//a','<b />');
  1138. UPDATEXML('<a><c><a>x</a></c></a>','(a)//a','<b />')
  1139. <a><c><b /></c></a>
  1140. SELECT ExtractValue('<a><a>aa</a><b>bb</b></a>','(a)/a|(a)/b');
  1141. ExtractValue('<a><a>aa</a><b>bb</b></a>','(a)/a|(a)/b')
  1142. aa bb
  1143. SELECT ExtractValue('<a><b>abc</b><c>2</c><d>1</d></a>','substring(/a/b,..)');
  1144. ExtractValue('<a><b>abc</b><c>2</c><d>1</d></a>','substring(/a/b,..)')
  1145. Warnings:
  1146. Warning 1292 Truncated incorrect INTEGER value: ''
  1147. #
  1148. # Bug#62429 XML: ExtractValue, UpdateXML max arg length 127 chars
  1149. #
  1150. CREATE TABLE t1 (id INT AUTO_INCREMENT, txt VARCHAR(1000), PRIMARY KEY(id));
  1151. INSERT INTO t1 (txt) VALUES
  1152. (CONCAT('<', REPEAT('a',127), '>127</', REPEAT('a',127), '>')),
  1153. (CONCAT('<', REPEAT('a',128), '>128</', REPEAT('a',128), '>')),
  1154. (CONCAT('<', REPEAT('a',63), '><', REPEAT('b',63), '>63/63</', REPEAT('b',63), '></', REPEAT('a',63),'>')),
  1155. (CONCAT('<', REPEAT('a',63), '><', REPEAT('b',64), '>63/64</', REPEAT('b',64), '></', REPEAT('a',63),'>'));
  1156. SELECT
  1157. txt,
  1158. EXTRACTVALUE(txt, CONCAT('/', REPEAT('a', 127))) as a127,
  1159. EXTRACTVALUE(txt, CONCAT('/', REPEAT('a', 128))) as a128,
  1160. EXTRACTVALUE(txt, CONCAT('//', REPEAT('b', 63))) as a63b63,
  1161. EXTRACTVALUE(txt, CONCAT('//', REPEAT('b', 64))) as a63b64
  1162. FROM t1;
  1163. txt <aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>127</aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>
  1164. a127 127
  1165. a128
  1166. a63b63
  1167. a63b64
  1168. txt <aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>128</aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>
  1169. a127
  1170. a128 128
  1171. a63b63
  1172. a63b64
  1173. txt <aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa><bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb>63/63</bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb></aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>
  1174. a127
  1175. a128
  1176. a63b63 63/63
  1177. a63b64
  1178. txt <aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa><bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb>63/64</bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb></aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>
  1179. a127
  1180. a128
  1181. a63b63
  1182. a63b64 63/64
  1183. SELECT UPDATEXML(txt, CONCAT('//', REPEAT('b', 63)), '63/63+') FROM t1;
  1184. UPDATEXML(txt, CONCAT('//', REPEAT('b', 63)), '63/63+') <aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>127</aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>
  1185. UPDATEXML(txt, CONCAT('//', REPEAT('b', 63)), '63/63+') <aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>128</aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>
  1186. UPDATEXML(txt, CONCAT('//', REPEAT('b', 63)), '63/63+') <aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>63/63+</aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>
  1187. UPDATEXML(txt, CONCAT('//', REPEAT('b', 63)), '63/63+') <aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa><bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb>63/64</bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb></aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>
  1188. DROP TABLE t1;
  1189. CREATE TABLE t1 (a TEXT);
  1190. INSERT INTO t1 VALUES (CONCAT('<a><', REPEAT('b',128),'>b128</',REPEAT('b',128),'><',REPEAT('c',512),'>c512</',REPEAT('c',512),'></a>'));
  1191. SELECT ExtractValue (a, CONCAT('//',REPEAT('c',512))) AS c512 FROM t1;
  1192. c512 c512
  1193. DROP TABLE t1;
  1194. #
  1195. # End of 5.5 tests
  1196. #
  1197. #
  1198. # Start of 10.0 tests
  1199. #
  1200. #
  1201. # MDEV-5689 ExtractValue(xml, 'substring(/x,/y)') crashes
  1202. #
  1203. SELECT ExtractValue('<a><b>abc</b><c>2</c><d>1</d></a>','substring(/a/b,..)') AS e;
  1204. e
  1205. Warnings:
  1206. Warning 1292 Truncated incorrect INTEGER value: ''
  1207. SELECT ExtractValue('<a><b>abc</b><c>2</c><d>1</d></a>','substring(/a/b,/a/c)') AS e;
  1208. e
  1209. bc
  1210. SELECT ExtractValue('<a><b>abc</b><c>2</c><d>1</d></a>','substring(/a/b,/a/d)') AS e;
  1211. e
  1212. abc
  1213. SELECT ExtractValue('<a><b>abc</b><c>2</c><d>1</d></a>','substring(/a/b,/a/c,/a/d)') AS e;
  1214. e
  1215. b
  1216. SELECT ExtractValue('<a><b>abc</b><c>2</c><d>1</d></a>','substring(/a/b,/a/d,/a/c)') AS e;
  1217. e
  1218. ab
  1219. #
  1220. # MDEV-5709 ExtractValue() with XPath variable references returns wrong result
  1221. #
  1222. CREATE TABLE t1 (c1 INT, c2 VARCHAR(10));
  1223. INSERT INTO t1 VALUES (1,'b1'),(2,'b2');
  1224. SELECT *,IF(@i:=c1,ExtractValue('<a><b>b1</b><b>b2</b></a>','//b[$@i]'),0) AS xpath FROM t1;
  1225. c1 c2 xpath
  1226. 1 b1 b1
  1227. 2 b2 b2
  1228. SELECT * FROM t1 WHERE c2=IF(@i:=c1,ExtractValue('<a><b>b1</b><b>b2</b></a>','//b[$@i]'),0);
  1229. c1 c2
  1230. 1 b1
  1231. 2 b2
  1232. DROP TABLE t1;
  1233. #
  1234. # MDEV-15118 ExtractValue(xml,something_complex) does not work
  1235. #
  1236. CREATE TABLE t1 (a TEXT);
  1237. INSERT INTO t1 VALUES (CONCAT('<a>aaa</a>'));
  1238. SELECT ExtractValue(a, '/a') AS a FROM t1;
  1239. a
  1240. aaa
  1241. SELECT ExtractValue(a, FROM_BASE64(TO_BASE64('/a'))) AS a FROM t1;
  1242. a
  1243. aaa
  1244. DROP TABLE t1;
  1245. #
  1246. # End of 10.0 tests
  1247. #
  1248. #
  1249. # Start of 10.2 tests
  1250. #
  1251. #
  1252. # MDEV-10134 Add full support for DEFAULT
  1253. #
  1254. CREATE TABLE t1 (a TEXT, b TEXT DEFAULT ExtractValue(a, '/a/b'));
  1255. INSERT INTO t1 (a) VALUES ('<a><b>bbb</b></a>');
  1256. SELECT b FROM t1;
  1257. b
  1258. bbb
  1259. DROP TABLE t1;
  1260. CREATE TABLE t1 (a TEXT, b TEXT DEFAULT UpdateXML(a, '/a/b','<b>xxx</b>'));
  1261. INSERT INTO t1 (a) VALUES ('<a><b>bbb</b></a>');
  1262. SELECT b FROM t1;
  1263. b
  1264. <a><b>xxx</b></a>
  1265. DROP TABLE t1;
  1266. #
  1267. # End of 10.2 tests
  1268. #