mirror of
https://github.com/MariaDB/server.git
synced 2025-08-01 03:47:19 +03:00
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.
This commit is contained in:
@ -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>');
|
|||||||
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,'/*/*');
|
|||||||
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>');
|
|||||||
#
|
#
|
||||||
--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 @@ public:
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/* 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)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
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,
|
|||||||
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);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user