<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -149,6 +149,10 @@ module ActiveRecord
         &quot;INSERT INTO #{quote_table_name(table_name)} VALUES(DEFAULT)&quot;
       end
 
+      def case_sensitive_equality_operator
+        &quot;=&quot;
+      end
+
       protected
         # Returns an array of record hashes with the column names as keys and
         # column values as values.</diff>
      <filename>activerecord/lib/active_record/connection_adapters/abstract/database_statements.rb</filename>
    </modified>
    <modified>
      <diff>@@ -511,6 +511,10 @@ module ActiveRecord
         keys.length == 1 ? [keys.first, nil] : nil
       end
 
+      def case_sensitive_equality_operator
+        &quot;= BINARY&quot;
+      end
+
       private
         def connect
           @connection.reconnect = true if @connection.respond_to?(:reconnect=)</diff>
      <filename>activerecord/lib/active_record/connection_adapters/mysql_adapter.rb</filename>
    </modified>
    <modified>
      <diff>@@ -627,17 +627,23 @@ module ActiveRecord
 
           is_text_column = finder_class.columns_hash[attr_name.to_s].text?
 
-          if !value.nil? &amp;&amp; is_text_column
-            value = value.to_s
+          if value.nil?
+            comparison_operator = &quot;IS ?&quot;
+          else
+            comparison_operator = &quot;#{connection.case_sensitive_equality_operator} ?&quot;
+
+            if is_text_column
+              value = value.to_s
+            end
           end
 
+          sql_attribute = &quot;#{record.class.quoted_table_name}.#{connection.quote_column_name(attr_name)}&quot;
+
           if value.nil? || (configuration[:case_sensitive] || !is_text_column)
-            condition_sql = &quot;#{record.class.quoted_table_name}.#{attr_name} #{attribute_condition(value)}&quot;
+            condition_sql = &quot;#{sql_attribute} #{comparison_operator}&quot;
             condition_params = [value]
           else
-            # sqlite has case sensitive SELECT query, while MySQL/Postgresql don't.
-            # Hence, this is needed only for sqlite.
-            condition_sql = &quot;LOWER(#{record.class.quoted_table_name}.#{attr_name}) #{attribute_condition(value)}&quot;
+            condition_sql = &quot;LOWER(#{sql_attribute}) #{comparison_operator}&quot;
             condition_params = [value.downcase]
           end
 
@@ -654,28 +660,10 @@ module ActiveRecord
             condition_params &lt;&lt; record.send(:id)
           end
 
-          results = finder_class.with_exclusive_scope do
-            connection.select_all(
-              construct_finder_sql(
-                :select     =&gt; &quot;#{connection.quote_column_name(attr_name)}&quot;,
-                :from       =&gt; &quot;#{finder_class.quoted_table_name}&quot;,
-                :conditions =&gt; [condition_sql, *condition_params]
-              )
-            )
-          end
-
-          unless results.length.zero?
-            found = true
-
-            # As MySQL/Postgres don't have case sensitive SELECT queries, we try to find duplicate
-            # column in ruby when case sensitive option
-            if configuration[:case_sensitive] &amp;&amp; finder_class.columns_hash[attr_name.to_s].text?
-              found = results.any? { |a| a[attr_name.to_s] == value.to_s }
-            end
-            
-            if found
+          finder_class.with_exclusive_scope do
+            if finder_class.exists?([condition_sql, *condition_params])
               message = record.errors.generate_message(attr_name, :taken, :default =&gt; configuration[:message])
-              record.errors.add(attr_name, message) 
+              record.errors.add(attr_name, message)
             end
           end
         end</diff>
      <filename>activerecord/lib/active_record/validations.rb</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>f3da46effae9f23f6ea473f7296e9c0c9bb49fce</id>
    </parent>
  </parents>
  <author>
    <name>Tarmo T&#228;nav</name>
    <email>tarmo@itech.ee</email>
  </author>
  <url>http://github.com/rails/rails/commit/f7eaab96d332528253d14581f747dd4b1b378a06</url>
  <id>f7eaab96d332528253d14581f747dd4b1b378a06</id>
  <committed-date>2008-07-31T12:33:11-07:00</committed-date>
  <authored-date>2008-07-31T12:18:14-07:00</authored-date>
  <message>validates_uniqueness_of uses database case sensitivity support instead of using ruby

Signed-off-by: Michael Koziarski &lt;michael@koziarski.com&gt;</message>
  <tree>4b4b55a06722611bfcc939dca8944f8982562297</tree>
  <committer>
    <name>Michael Koziarski</name>
    <email>michael@koziarski.com</email>
  </committer>
</commit>
