Bug#22823 gt and lt operators appear to be reversed in ExtractValue() command
Problem: "greater than" and "less than" XPath operators appeared to have been implemented in reverse. Fix: swap arguments to eq_func() and eq_func_reverse() to provide correct operation result. mysql-test/r/xml.result: Adding test case mysql-test/t/xml.test: Adding test case sql/item_xmlfunc.cc: Pass argumemtns to eq_func() and eq_func_reverse() in correct order: nodeset argument first, then scalar argument. Also, fixing eq_func_reverse() to do correct conversion, e.g: "scalar > nodeset" into "nodeset < scalar" instead of wrong "nodeset <= scalar" "scalar >= nodeset" into "nodeset <= scalar" instead of wrong "nodeset < scalar".
This commit is contained in:
parent
81eb1ccda2
commit
7595cb06eb
@ -736,3 +736,76 @@ test
|
|||||||
select extractValue('<x.-_:>test</x.-_:>','//*');
|
select extractValue('<x.-_:>test</x.-_:>','//*');
|
||||||
extractValue('<x.-_:>test</x.-_:>','//*')
|
extractValue('<x.-_:>test</x.-_:>','//*')
|
||||||
test
|
test
|
||||||
|
set @xml= "<entry><id>pt10</id><pt>10</pt></entry><entry><id>pt50</id><pt>50</pt></entry>";
|
||||||
|
select ExtractValue(@xml, "/entry[(pt=10)]/id");
|
||||||
|
ExtractValue(@xml, "/entry[(pt=10)]/id")
|
||||||
|
pt10
|
||||||
|
select ExtractValue(@xml, "/entry[(pt!=10)]/id");
|
||||||
|
ExtractValue(@xml, "/entry[(pt!=10)]/id")
|
||||||
|
pt50
|
||||||
|
select ExtractValue(@xml, "/entry[(pt<10)]/id");
|
||||||
|
ExtractValue(@xml, "/entry[(pt<10)]/id")
|
||||||
|
|
||||||
|
select ExtractValue(@xml, "/entry[(pt<=10)]/id");
|
||||||
|
ExtractValue(@xml, "/entry[(pt<=10)]/id")
|
||||||
|
pt10
|
||||||
|
select ExtractValue(@xml, "/entry[(pt>10)]/id");
|
||||||
|
ExtractValue(@xml, "/entry[(pt>10)]/id")
|
||||||
|
pt50
|
||||||
|
select ExtractValue(@xml, "/entry[(pt>=10)]/id");
|
||||||
|
ExtractValue(@xml, "/entry[(pt>=10)]/id")
|
||||||
|
pt10 pt50
|
||||||
|
select ExtractValue(@xml, "/entry[(pt=50)]/id");
|
||||||
|
ExtractValue(@xml, "/entry[(pt=50)]/id")
|
||||||
|
pt50
|
||||||
|
select ExtractValue(@xml, "/entry[(pt!=50)]/id");
|
||||||
|
ExtractValue(@xml, "/entry[(pt!=50)]/id")
|
||||||
|
pt10
|
||||||
|
select ExtractValue(@xml, "/entry[(pt<50)]/id");
|
||||||
|
ExtractValue(@xml, "/entry[(pt<50)]/id")
|
||||||
|
pt10
|
||||||
|
select ExtractValue(@xml, "/entry[(pt<=50)]/id");
|
||||||
|
ExtractValue(@xml, "/entry[(pt<=50)]/id")
|
||||||
|
pt10 pt50
|
||||||
|
select ExtractValue(@xml, "/entry[(pt>50)]/id");
|
||||||
|
ExtractValue(@xml, "/entry[(pt>50)]/id")
|
||||||
|
|
||||||
|
select ExtractValue(@xml, "/entry[(pt>=50)]/id");
|
||||||
|
ExtractValue(@xml, "/entry[(pt>=50)]/id")
|
||||||
|
pt50
|
||||||
|
select ExtractValue(@xml, "/entry[(10=pt)]/id");
|
||||||
|
ExtractValue(@xml, "/entry[(10=pt)]/id")
|
||||||
|
pt10
|
||||||
|
select ExtractValue(@xml, "/entry[(10!=pt)]/id");
|
||||||
|
ExtractValue(@xml, "/entry[(10!=pt)]/id")
|
||||||
|
pt50
|
||||||
|
select ExtractValue(@xml, "/entry[(10>pt)]/id");
|
||||||
|
ExtractValue(@xml, "/entry[(10>pt)]/id")
|
||||||
|
|
||||||
|
select ExtractValue(@xml, "/entry[(10>=pt)]/id");
|
||||||
|
ExtractValue(@xml, "/entry[(10>=pt)]/id")
|
||||||
|
pt10
|
||||||
|
select ExtractValue(@xml, "/entry[(10<pt)]/id");
|
||||||
|
ExtractValue(@xml, "/entry[(10<pt)]/id")
|
||||||
|
pt50
|
||||||
|
select ExtractValue(@xml, "/entry[(10<=pt)]/id");
|
||||||
|
ExtractValue(@xml, "/entry[(10<=pt)]/id")
|
||||||
|
pt10 pt50
|
||||||
|
select ExtractValue(@xml, "/entry[(50=pt)]/id");
|
||||||
|
ExtractValue(@xml, "/entry[(50=pt)]/id")
|
||||||
|
pt50
|
||||||
|
select ExtractValue(@xml, "/entry[(50!=pt)]/id");
|
||||||
|
ExtractValue(@xml, "/entry[(50!=pt)]/id")
|
||||||
|
pt10
|
||||||
|
select ExtractValue(@xml, "/entry[(50>pt)]/id");
|
||||||
|
ExtractValue(@xml, "/entry[(50>pt)]/id")
|
||||||
|
pt10
|
||||||
|
select ExtractValue(@xml, "/entry[(50>=pt)]/id");
|
||||||
|
ExtractValue(@xml, "/entry[(50>=pt)]/id")
|
||||||
|
pt10 pt50
|
||||||
|
select ExtractValue(@xml, "/entry[(50<pt)]/id");
|
||||||
|
ExtractValue(@xml, "/entry[(50<pt)]/id")
|
||||||
|
|
||||||
|
select ExtractValue(@xml, "/entry[(50<=pt)]/id");
|
||||||
|
ExtractValue(@xml, "/entry[(50<=pt)]/id")
|
||||||
|
pt50
|
||||||
|
@ -376,3 +376,33 @@ select extractValue('<:>test</:>','//*');
|
|||||||
select extractValue('<_>test</_>','//*');
|
select extractValue('<_>test</_>','//*');
|
||||||
# dot, dash, underscore and semicolon are good identifier middle characters
|
# dot, dash, underscore and semicolon are good identifier middle characters
|
||||||
select extractValue('<x.-_:>test</x.-_:>','//*');
|
select extractValue('<x.-_:>test</x.-_:>','//*');
|
||||||
|
|
||||||
|
#
|
||||||
|
# Bug#22823 gt and lt operators appear to be
|
||||||
|
# reversed in ExtractValue() command
|
||||||
|
#
|
||||||
|
set @xml= "<entry><id>pt10</id><pt>10</pt></entry><entry><id>pt50</id><pt>50</pt></entry>";
|
||||||
|
select ExtractValue(@xml, "/entry[(pt=10)]/id");
|
||||||
|
select ExtractValue(@xml, "/entry[(pt!=10)]/id");
|
||||||
|
select ExtractValue(@xml, "/entry[(pt<10)]/id");
|
||||||
|
select ExtractValue(@xml, "/entry[(pt<=10)]/id");
|
||||||
|
select ExtractValue(@xml, "/entry[(pt>10)]/id");
|
||||||
|
select ExtractValue(@xml, "/entry[(pt>=10)]/id");
|
||||||
|
select ExtractValue(@xml, "/entry[(pt=50)]/id");
|
||||||
|
select ExtractValue(@xml, "/entry[(pt!=50)]/id");
|
||||||
|
select ExtractValue(@xml, "/entry[(pt<50)]/id");
|
||||||
|
select ExtractValue(@xml, "/entry[(pt<=50)]/id");
|
||||||
|
select ExtractValue(@xml, "/entry[(pt>50)]/id");
|
||||||
|
select ExtractValue(@xml, "/entry[(pt>=50)]/id");
|
||||||
|
select ExtractValue(@xml, "/entry[(10=pt)]/id");
|
||||||
|
select ExtractValue(@xml, "/entry[(10!=pt)]/id");
|
||||||
|
select ExtractValue(@xml, "/entry[(10>pt)]/id");
|
||||||
|
select ExtractValue(@xml, "/entry[(10>=pt)]/id");
|
||||||
|
select ExtractValue(@xml, "/entry[(10<pt)]/id");
|
||||||
|
select ExtractValue(@xml, "/entry[(10<=pt)]/id");
|
||||||
|
select ExtractValue(@xml, "/entry[(50=pt)]/id");
|
||||||
|
select ExtractValue(@xml, "/entry[(50!=pt)]/id");
|
||||||
|
select ExtractValue(@xml, "/entry[(50>pt)]/id");
|
||||||
|
select ExtractValue(@xml, "/entry[(50>=pt)]/id");
|
||||||
|
select ExtractValue(@xml, "/entry[(50<pt)]/id");
|
||||||
|
select ExtractValue(@xml, "/entry[(50<=pt)]/id");
|
||||||
|
@ -532,7 +532,7 @@ public:
|
|||||||
longlong val_int()
|
longlong val_int()
|
||||||
{
|
{
|
||||||
Item_func *comp= (Item_func*)args[1];
|
Item_func *comp= (Item_func*)args[1];
|
||||||
Item_string *fake= (Item_string*)(comp->arguments()[1]);
|
Item_string *fake= (Item_string*)(comp->arguments()[0]);
|
||||||
String *res= args[0]->val_nodeset(&tmp_nodeset);
|
String *res= args[0]->val_nodeset(&tmp_nodeset);
|
||||||
MY_XPATH_FLT *fltbeg= (MY_XPATH_FLT*) res->ptr();
|
MY_XPATH_FLT *fltbeg= (MY_XPATH_FLT*) res->ptr();
|
||||||
MY_XPATH_FLT *fltend= (MY_XPATH_FLT*) (res->ptr() + res->length());
|
MY_XPATH_FLT *fltend= (MY_XPATH_FLT*) (res->ptr() + res->length());
|
||||||
@ -884,7 +884,7 @@ static Item *eq_func(int oper, Item *a, Item *b)
|
|||||||
Create a comparator function for scalar arguments,
|
Create a comparator function for scalar arguments,
|
||||||
for the given arguments and reverse operation, e.g.
|
for the given arguments and reverse operation, e.g.
|
||||||
|
|
||||||
A >= B is converted into A < B
|
A > B is converted into B < A
|
||||||
|
|
||||||
RETURN
|
RETURN
|
||||||
The newly created item.
|
The newly created item.
|
||||||
@ -895,10 +895,10 @@ static Item *eq_func_reverse(int oper, Item *a, Item *b)
|
|||||||
{
|
{
|
||||||
case '=': return new Item_func_eq(a, b);
|
case '=': return new Item_func_eq(a, b);
|
||||||
case '!': return new Item_func_ne(a, b);
|
case '!': return new Item_func_ne(a, b);
|
||||||
case MY_XPATH_LEX_GE: return new Item_func_lt(a, b);
|
case MY_XPATH_LEX_GE: return new Item_func_le(a, b);
|
||||||
case MY_XPATH_LEX_LE: return new Item_func_gt(a, b);
|
case MY_XPATH_LEX_LE: return new Item_func_ge(a, b);
|
||||||
case MY_XPATH_LEX_GREATER: return new Item_func_le(a, b);
|
case MY_XPATH_LEX_GREATER: return new Item_func_lt(a, b);
|
||||||
case MY_XPATH_LEX_LESS: return new Item_func_ge(a, b);
|
case MY_XPATH_LEX_LESS: return new Item_func_gt(a, b);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -951,13 +951,13 @@ static Item *create_comparator(MY_XPATH *xpath,
|
|||||||
{
|
{
|
||||||
nodeset= (Item_nodeset_func*) a;
|
nodeset= (Item_nodeset_func*) a;
|
||||||
scalar= b;
|
scalar= b;
|
||||||
comp= eq_func(oper, scalar, fake);
|
comp= eq_func(oper, fake, scalar);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
nodeset= (Item_nodeset_func*) b;
|
nodeset= (Item_nodeset_func*) b;
|
||||||
scalar= a;
|
scalar= a;
|
||||||
comp= eq_func_reverse(oper, scalar, fake);
|
comp= eq_func_reverse(oper, fake, scalar);
|
||||||
}
|
}
|
||||||
return new Item_nodeset_to_const_comparator(nodeset, comp, xpath->pxml);
|
return new Item_nodeset_to_const_comparator(nodeset, comp, xpath->pxml);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user