From 5e2ab5f4a0b3523ebedcfea19cc389c0197b2299 Mon Sep 17 00:00:00 2001
From: "bar@mysql.com" <>
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.
---
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());