Loading mysql-test/r/xml.result +12 −0 Original line number Diff line number Diff line Loading @@ -65,6 +65,9 @@ c1 SELECT extractValue(@xml,'/a/child::*'); extractValue(@xml,'/a/child::*') b1 b2 SELECT extractValue(@xml,'/a/self::*'); extractValue(@xml,'/a/self::*') a1 a2 SELECT extractValue(@xml,'/a/descendant::*'); extractValue(@xml,'/a/descendant::*') b1 c1 b2 Loading Loading @@ -546,6 +549,15 @@ select extractvalue('<a>A</a>','/<a>'); ERROR HY000: XPATH syntax error: '>' select extractvalue('<a><b>b</b><b!>b!</b!></a>','//b!'); ERROR HY000: XPATH syntax error: '!' select extractvalue('<a>A<b>B<c>C</c></b></a>','/a/descendant::*'); extractvalue('<a>A<b>B<c>C</c></b></a>','/a/descendant::*') B 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 select extractvalue('<A_B>A</A_B>','/A_B'); extractvalue('<A_B>A</A_B>','/A_B') A mysql-test/t/xml.test +6 −0 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ SELECT extractValue(@xml,'/*/*'); SELECT extractValue(@xml,'/*/*/*'); SELECT extractValue(@xml,'/a/child::*'); SELECT extractValue(@xml,'/a/self::*'); SELECT extractValue(@xml,'/a/descendant::*'); SELECT extractValue(@xml,'/a/descendant-or-self::*'); SELECT extractValue(@xml,'/a/attribute::*'); Loading Loading @@ -245,6 +246,11 @@ select extractvalue('<a>A</a>','/<a>'); 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::*'); # Bug #16320 XML: extractvalue() won't accept names containing underscores # select extractvalue('<A_B>A</A_B>','/A_B'); sql/item_xmlfunc.cc +29 −0 Original line number Diff line number Diff line Loading @@ -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 */ class Item_nodeset_func_childbyname: public Item_nodeset_func_axisbyname { Loading Loading @@ -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) { prepare(nodeset); Loading Loading @@ -945,6 +971,9 @@ static Item* nametestfunc(MY_XPATH *xpath, case MY_XPATH_AXIS_ATTRIBUTE: res= new Item_nodeset_func_attributebyname(arg, beg, len, xpath->pxml); break; case MY_XPATH_AXIS_SELF: res= new Item_nodeset_func_selfbyname(arg, beg, len, xpath->pxml); break; default: res= new Item_nodeset_func_childbyname(arg, beg, len, xpath->pxml); } Loading Loading
mysql-test/r/xml.result +12 −0 Original line number Diff line number Diff line Loading @@ -65,6 +65,9 @@ c1 SELECT extractValue(@xml,'/a/child::*'); extractValue(@xml,'/a/child::*') b1 b2 SELECT extractValue(@xml,'/a/self::*'); extractValue(@xml,'/a/self::*') a1 a2 SELECT extractValue(@xml,'/a/descendant::*'); extractValue(@xml,'/a/descendant::*') b1 c1 b2 Loading Loading @@ -546,6 +549,15 @@ select extractvalue('<a>A</a>','/<a>'); ERROR HY000: XPATH syntax error: '>' select extractvalue('<a><b>b</b><b!>b!</b!></a>','//b!'); ERROR HY000: XPATH syntax error: '!' select extractvalue('<a>A<b>B<c>C</c></b></a>','/a/descendant::*'); extractvalue('<a>A<b>B<c>C</c></b></a>','/a/descendant::*') B 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 select extractvalue('<A_B>A</A_B>','/A_B'); extractvalue('<A_B>A</A_B>','/A_B') A
mysql-test/t/xml.test +6 −0 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ SELECT extractValue(@xml,'/*/*'); SELECT extractValue(@xml,'/*/*/*'); SELECT extractValue(@xml,'/a/child::*'); SELECT extractValue(@xml,'/a/self::*'); SELECT extractValue(@xml,'/a/descendant::*'); SELECT extractValue(@xml,'/a/descendant-or-self::*'); SELECT extractValue(@xml,'/a/attribute::*'); Loading Loading @@ -245,6 +246,11 @@ select extractvalue('<a>A</a>','/<a>'); 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::*'); # Bug #16320 XML: extractvalue() won't accept names containing underscores # select extractvalue('<A_B>A</A_B>','/A_B');
sql/item_xmlfunc.cc +29 −0 Original line number Diff line number Diff line Loading @@ -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 */ class Item_nodeset_func_childbyname: public Item_nodeset_func_axisbyname { Loading Loading @@ -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) { prepare(nodeset); Loading Loading @@ -945,6 +971,9 @@ static Item* nametestfunc(MY_XPATH *xpath, case MY_XPATH_AXIS_ATTRIBUTE: res= new Item_nodeset_func_attributebyname(arg, beg, len, xpath->pxml); break; case MY_XPATH_AXIS_SELF: res= new Item_nodeset_func_selfbyname(arg, beg, len, xpath->pxml); break; default: res= new Item_nodeset_func_childbyname(arg, beg, len, xpath->pxml); } Loading