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());