<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array">
    <added>
      <filename>activerecord/test/cases/sanitize_test.rb</filename>
    </added>
    <added>
      <filename>activesupport/lib/active_support/core_ext/string/behavior.rb</filename>
    </added>
  </added>
  <modified type="array">
    <modified>
      <diff>@@ -2152,7 +2152,7 @@ module ActiveRecord #:nodoc:
         end
 
         def quote_bound_value(value) #:nodoc:
-          if value.respond_to?(:map) &amp;&amp; !value.is_a?(String)
+          if value.respond_to?(:map) &amp;&amp; !value.acts_like?(:string)
             if value.respond_to?(:empty?) &amp;&amp; value.empty?
               connection.quote(nil)
             else</diff>
      <filename>activerecord/lib/active_record/base.rb</filename>
    </modified>
    <modified>
      <diff>@@ -297,7 +297,6 @@ class FinderTest &lt; ActiveRecord::TestCase
     assert_raises(ActiveRecord::RecordNotFound) { Topic.find(1, :conditions =&gt; { :author_name =&gt; &quot;David&quot;, :title =&gt; &quot;The First Topic&quot;, :replies_count =&gt; 1, :approved =&gt; true }) }
   end
 
-
   def test_condition_interpolation
     assert_kind_of Firm, Company.find(:first, :conditions =&gt; [&quot;name = '%s'&quot;, &quot;37signals&quot;])
     assert_nil Company.find(:first, :conditions =&gt; [&quot;name = '%s'&quot;, &quot;37signals!&quot;])
@@ -392,7 +391,7 @@ class FinderTest &lt; ActiveRecord::TestCase
       Company.find(:first, :conditions =&gt; [&quot;id=? AND name = ?&quot;, 2])
     }
     assert_raises(ActiveRecord::PreparedStatementInvalid) {
-	   Company.find(:first, :conditions =&gt; [&quot;id=?&quot;, 2, 3, 4])
+     Company.find(:first, :conditions =&gt; [&quot;id=?&quot;, 2, 3, 4])
     }
   end
 
@@ -455,6 +454,15 @@ class FinderTest &lt; ActiveRecord::TestCase
     assert_equal ActiveRecord::Base.connection.quote(''), bind('?', '')
   end
 
+  def test_bind_chars
+    quoted_bambi = ActiveRecord::Base.connection.quote(&quot;Bambi&quot;)
+    quoted_bambi_and_thumper = ActiveRecord::Base.connection.quote(&quot;Bambi\nand\nThumper&quot;)
+    assert_equal &quot;name=#{quoted_bambi}&quot;, bind('name=?', &quot;Bambi&quot;)
+    assert_equal &quot;name=#{quoted_bambi_and_thumper}&quot;, bind('name=?', &quot;Bambi\nand\nThumper&quot;)
+    assert_equal &quot;name=#{quoted_bambi}&quot;, bind('name=?', &quot;Bambi&quot;.chars)
+    assert_equal &quot;name=#{quoted_bambi_and_thumper}&quot;, bind('name=?', &quot;Bambi\nand\nThumper&quot;.chars)
+  end
+
   def test_bind_record
     o = Struct.new(:quoted_id).new(1)
     assert_equal '1', bind('?', o)</diff>
      <filename>activerecord/test/cases/finder_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -6,6 +6,7 @@ require 'active_support/core_ext/string/iterators'
 require 'active_support/core_ext/string/unicode'
 require 'active_support/core_ext/string/xchar'
 require 'active_support/core_ext/string/filters'
+require 'active_support/core_ext/string/behavior'
 
 class String #:nodoc:
   include ActiveSupport::CoreExtensions::String::Access
@@ -15,4 +16,5 @@ class String #:nodoc:
   include ActiveSupport::CoreExtensions::String::StartsEndsWith
   include ActiveSupport::CoreExtensions::String::Iterators
   include ActiveSupport::CoreExtensions::String::Unicode
+  include ActiveSupport::CoreExtensions::String::Behavior
 end</diff>
      <filename>activesupport/lib/active_support/core_ext/string.rb</filename>
    </modified>
    <modified>
      <diff>@@ -49,6 +49,11 @@ module ActiveSupport::Multibyte #:nodoc:
         false
     end
 
+    # Enable more predictable duck-typing on String-like classes. See Object#acts_like?.
+    def acts_like_string?
+      true
+    end
+
     # Create a new Chars instance.
     def initialize(str)
       @string = str.respond_to?(:string) ? str.string : str</diff>
      <filename>activesupport/lib/active_support/multibyte/chars.rb</filename>
    </modified>
    <modified>
      <diff>@@ -201,3 +201,9 @@ class StringInflectionsTest &lt; Test::Unit::TestCase
     end
   end
 end
+
+class StringBehaviourTest &lt; Test::Unit::TestCase
+  def test_acts_like_string
+    assert 'Bambi'.acts_like_string?
+  end
+end
\ No newline at end of file</diff>
      <filename>activesupport/test/core_ext/string_ext_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -167,6 +167,10 @@ class CharsTest &lt; Test::Unit::TestCase
     assert_equal false, 'test'.chars.respond_to?(:a_method_that_doesnt_exist)
   end
   
+  def test_acts_like_string
+    assert 'Bambi'.chars.acts_like_string?
+  end
+
   protected
 
   def with_kcode(kcode)</diff>
      <filename>activesupport/test/multibyte_chars_test.rb</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>923f4ecad202e45ef117d592053c8b86549eb9d7</id>
    </parent>
  </parents>
  <author>
    <name>Manfred Stienstra</name>
    <email>manfred@fngtps.com</email>
  </author>
  <url>http://github.com/rails/rails/commit/babbc1580da9e4a23921ab68d47c7c0d2e8447da</url>
  <id>babbc1580da9e4a23921ab68d47c7c0d2e8447da</id>
  <committed-date>2008-09-11T13:51:26-07:00</committed-date>
  <authored-date>2008-09-11T13:38:20-07:00</authored-date>
  <message>Fix ActiveRecord::Base.quote_bound_value for ActiveSupper::Multibyte::Chars values.

- Adds String#acts_like_string?
- Adds Chars#acts_like_string?

Signed-off-by: Michael Koziarski &lt;michael@koziarski.com&gt;
[#1029 state:committed]</message>
  <tree>5f84cc282530fc8510812c9ca2b75f32e93f348f</tree>
  <committer>
    <name>Michael Koziarski</name>
    <email>michael@koziarski.com</email>
  </committer>
</commit>
