Commit 47b4f007 authored by bar@mysql.com's avatar bar@mysql.com

Bug#16315 XML: extractvalue() handles self badly

xml.result, xml.test:
  Adding test case.
item_xmlfunc.cc:
  Adding a special function to handle "self" axis.
  Previously "child" and "self" were handled the same.
parent 3fb0e543
...@@ -65,6 +65,9 @@ c1 ...@@ -65,6 +65,9 @@ c1
SELECT extractValue(@xml,'/a/child::*'); SELECT extractValue(@xml,'/a/child::*');
extractValue(@xml,'/a/child::*') extractValue(@xml,'/a/child::*')
b1 b2 b1 b2
SELECT extractValue(@xml,'/a/self::*');
extractValue(@xml,'/a/self::*')
a1 a2
SELECT extractValue(@xml,'/a/descendant::*'); SELECT extractValue(@xml,'/a/descendant::*');
extractValue(@xml,'/a/descendant::*') extractValue(@xml,'/a/descendant::*')
b1 c1 b2 b1 c1 b2
...@@ -546,3 +549,12 @@ select extractvalue('<a>A</a>','/<a>'); ...@@ -546,3 +549,12 @@ select extractvalue('<a>A</a>','/<a>');
ERROR HY000: XPATH syntax error: '>' ERROR HY000: XPATH syntax error: '>'
select extractvalue('<a><b>b</b><b!>b!</b!></a>','//b!'); select extractvalue('<a><b>b</b><b!>b!</b!></a>','//b!');
ERROR HY000: XPATH syntax error: '!' 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 C
select extractvalue('<a>A<b>B<c>C</c></b></a>','/a/self::*');
extractvalue('<a>A<b>B<c>C</c></b></a>','/a/self::*')
A
select 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 C
...@@ -23,6 +23,7 @@ SELECT extractValue(@xml,'/*/*'); ...@@ -23,6 +23,7 @@ SELECT extractValue(@xml,'/*/*');
SELECT extractValue(@xml,'/*/*/*'); SELECT extractValue(@xml,'/*/*/*');
SELECT extractValue(@xml,'/a/child::*'); SELECT extractValue(@xml,'/a/child::*');
SELECT extractValue(@xml,'/a/self::*');
SELECT extractValue(@xml,'/a/descendant::*'); SELECT extractValue(@xml,'/a/descendant::*');
SELECT extractValue(@xml,'/a/descendant-or-self::*'); SELECT extractValue(@xml,'/a/descendant-or-self::*');
SELECT extractValue(@xml,'/a/attribute::*'); SELECT extractValue(@xml,'/a/attribute::*');
...@@ -243,3 +244,10 @@ select extractvalue('<a>A</a>','/<a>'); ...@@ -243,3 +244,10 @@ select extractvalue('<a>A</a>','/<a>');
# #
--error 1105 --error 1105
select extractvalue('<a><b>b</b><b!>b!</b!></a>','//b!'); select extractvalue('<a><b>b</b><b!>b!</b!></a>','//b!');
#
# Bug #16315 XML: extractvalue() handles self badly
#
select extractvalue('<a>A<b>B<c>C</c></b></a>','/a/descendant::*');
select extractvalue('<a>A<b>B<c>C</c></b></a>','/a/self::*');
select extractvalue('<a>A<b>B<c>C</c></b></a>','/a/descendant-or-self::*');
...@@ -252,6 +252,18 @@ class Item_nodeset_func_axisbyname :public Item_nodeset_func ...@@ -252,6 +252,18 @@ class Item_nodeset_func_axisbyname :public Item_nodeset_func
}; };
/* Returns self */
class Item_nodeset_func_selfbyname: public Item_nodeset_func_axisbyname
{
public:
Item_nodeset_func_selfbyname(Item *a, const char *n_arg, uint l_arg,
String *pxml):
Item_nodeset_func_axisbyname(a, n_arg, l_arg, pxml) {}
const char *func_name() const { return "xpath_selfbyname"; }
String *val_nodeset(String *nodeset);
};
/* Returns children */ /* Returns children */
class Item_nodeset_func_childbyname: public Item_nodeset_func_axisbyname class Item_nodeset_func_childbyname: public Item_nodeset_func_axisbyname
{ {
...@@ -572,6 +584,20 @@ String * Item_nodeset_func_union::val_nodeset(String *nodeset) ...@@ -572,6 +584,20 @@ String * Item_nodeset_func_union::val_nodeset(String *nodeset)
} }
String *Item_nodeset_func_selfbyname::val_nodeset(String *nodeset)
{
prepare(nodeset);
for (MY_XPATH_FLT *flt= fltbeg; flt < fltend; flt++)
{
uint pos= 0;
MY_XML_NODE *self= &nodebeg[flt->num];
if (validname(self))
((XPathFilter*)nodeset)->append_element(flt->num,pos++);
}
return nodeset;
}
String *Item_nodeset_func_childbyname::val_nodeset(String *nodeset) String *Item_nodeset_func_childbyname::val_nodeset(String *nodeset)
{ {
prepare(nodeset); prepare(nodeset);
...@@ -945,6 +971,9 @@ static Item* nametestfunc(MY_XPATH *xpath, ...@@ -945,6 +971,9 @@ static Item* nametestfunc(MY_XPATH *xpath,
case MY_XPATH_AXIS_ATTRIBUTE: case MY_XPATH_AXIS_ATTRIBUTE:
res= new Item_nodeset_func_attributebyname(arg, beg, len, xpath->pxml); res= new Item_nodeset_func_attributebyname(arg, beg, len, xpath->pxml);
break; break;
case MY_XPATH_AXIS_SELF:
res= new Item_nodeset_func_selfbyname(arg, beg, len, xpath->pxml);
break;
default: default:
res= new Item_nodeset_func_childbyname(arg, beg, len, xpath->pxml); res= new Item_nodeset_func_childbyname(arg, beg, len, xpath->pxml);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment