From c76459aca9beae24b3c2d1e9fea7c3a9c386328c Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 2 Mar 2006 14:05:38 +0400 Subject: [PATCH] Bug#16316: XML: extractvalue() is case-sensitive with contains() xml.result, xml.test: Adding test case. item_xmlfunc.cc: Fixed that Item_nodeset_func derived classes didn't take into account charset of the XML value and always worked using "binary" charset. sql/item_xmlfunc.cc: Bug#16316: XML: extractvalue() is case-sensitive with contains() Fixed that Item_nodeset_func derived classes didn't take into account charset of the XML value and always worked using "binary" charset. mysql-test/t/xml.test: Adding test case. mysql-test/r/xml.result: Adding test case. --- mysql-test/r/xml.result | 12 ++++++++++++ mysql-test/t/xml.test | 8 ++++++++ sql/item_xmlfunc.cc | 7 ++++++- 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/mysql-test/r/xml.result b/mysql-test/r/xml.result index 0b75b50f754..18516277c3c 100644 --- a/mysql-test/r/xml.result +++ b/mysql-test/r/xml.result @@ -561,3 +561,15 @@ A B C select extractvalue('A','/A_B'); extractvalue('A','/A_B') A +select extractvalue('Jack','/a[contains(../a,"J")]'); +extractvalue('Jack','/a[contains(../a,"J")]') +Jack +select extractvalue('Jack','/a[contains(../a,"j")]'); +extractvalue('Jack','/a[contains(../a,"j")]') +Jack +select extractvalue('Jack','/a[contains(../a,"j")]' collate latin1_bin); +extractvalue('Jack','/a[contains(../a,"j")]' collate latin1_bin) + +select extractvalue('Jack' collate latin1_bin,'/a[contains(../a,"j")]'); +extractvalue('Jack' collate latin1_bin,'/a[contains(../a,"j")]') + diff --git a/mysql-test/t/xml.test b/mysql-test/t/xml.test index 6a91d785d4e..f7ce987f29d 100644 --- a/mysql-test/t/xml.test +++ b/mysql-test/t/xml.test @@ -254,3 +254,11 @@ select extractvalue('ABC','/a/descendant-or-self::*'); # Bug #16320 XML: extractvalue() won't accept names containing underscores # select extractvalue('A','/A_B'); + +# +# Bug#16316: XML: extractvalue() is case-sensitive with contains() +# +select extractvalue('Jack','/a[contains(../a,"J")]'); +select extractvalue('Jack','/a[contains(../a,"j")]'); +select extractvalue('Jack','/a[contains(../a,"j")]' collate latin1_bin); +select extractvalue('Jack' collate latin1_bin,'/a[contains(../a,"j")]'); diff --git a/sql/item_xmlfunc.cc b/sql/item_xmlfunc.cc index 26c2e84f8dd..8ad7e2f9661 100644 --- a/sql/item_xmlfunc.cc +++ b/sql/item_xmlfunc.cc @@ -206,7 +206,11 @@ public: return str; } enum Item_result result_type () const { return STRING_RESULT; } - void fix_length_and_dec() { max_length= MAX_BLOB_WIDTH; } + void fix_length_and_dec() + { + max_length= MAX_BLOB_WIDTH; + collation.collation= pxml->charset(); + } const char *func_name() const { return "nodeset"; } }; @@ -2373,6 +2377,7 @@ void Item_xml_str_func::fix_length_and_dec() xpath.cs= collation.collation; xpath.debug= 0; xpath.pxml= &pxml; + pxml.set_charset(collation.collation); rc= my_xpath_parse(&xpath, xp->ptr(), xp->ptr() + xp->length());