2007-02-23 Nagappan A <anagappan@novell.com>
authorNagappan Alagappan <nagappan@gmail.com>
Fri, 23 Feb 2007 06:59:13 +0000 (06:59 -0000)
committerNagappan Alagappan <nagappan@gmail.com>
Fri, 23 Feb 2007 06:59:13 +0000 (06:59 -0000)
* Comparison.cs (Compare): Extra space characters issue when using
System.Data.DataTable.Select. Fixes bug # 79695.

svn path=/trunk/mcs/; revision=73353

mcs/class/System.Data/Mono.Data.SqlExpressions/ChangeLog
mcs/class/System.Data/Mono.Data.SqlExpressions/Comparison.cs

index 572a926dd09189f9ed83f6311648356df39d4ad5..bb9767209120e11fa834bf066019d9f6b4689ced 100644 (file)
@@ -1,3 +1,8 @@
+2007-02-23  Nagappan A  <anagappan@novell.com>
+
+       * Comparison.cs (Compare): Extra space characters issue when using
+       System.Data.DataTable.Select. Fixes bug # 79695.
+
 2006-12-07  Nagappan A  <anagappan@novell.com>
 
        * Parser.jay (ColumnName): Fix Invalid DataColumn Expression, bug
index e2ddfc6400259bacf07b1f507a5eb6722a1fdc67..f77710098a27210231d67b7b3de1d61021e13f88 100644 (file)
@@ -66,6 +66,9 @@ namespace Mono.Data.SqlExpressions {
                        
                }
                        
+               // certain trailing whitespace chars (including space) are ignored by .NET when comparing strings. See bug #79695.  
+               private static readonly char[] IgnoredTrailingChars = { (char) 0x20, (char) 0x3000, (char) 0xFEFF };
+
                internal static int Compare (IComparable o1, IComparable o2, bool caseSensitive)
                {
                        //TODO: turn this "conversion pipeline" into something nicer
@@ -83,9 +86,13 @@ namespace Mono.Data.SqlExpressions {
                                throw new EvaluateException (String.Format ("Cannot perform compare operation on {0} and {1}.", o1.GetType(), o2.GetType()));
                        }
 
-                       if (o1 is string && o2 is string && !caseSensitive) {
-                               o1 = ((string)o1).ToLower();
-                               o2 = ((string)o2).ToLower();
+                       if (o1 is string && o2 is string) {
+                               o1 = ((string) o1).TrimEnd (IgnoredTrailingChars);
+                               o2 = ((string) o2).TrimEnd (IgnoredTrailingChars);
+                               if (!caseSensitive) {
+                                       o1 = ((string) o1).ToLower ();
+                                       o2 = ((string) o2).ToLower ();
+                               }
                        }
                        
                        if (o1.GetType () != o2.GetType ())