mysql2 0.4.0-x86-mingw32 → 0.4.1-x86-mingw32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
 - data/examples/eventmachine.rb +1 -1
 - data/ext/mysql2/client.c +45 -44
 - data/ext/mysql2/client.h +1 -2
 - data/ext/mysql2/extconf.rb +59 -37
 - data/ext/mysql2/infile.c +2 -2
 - data/ext/mysql2/mysql2_ext.h +4 -6
 - data/ext/mysql2/mysql_enc_name_to_ruby.h +8 -8
 - data/ext/mysql2/mysql_enc_to_ruby.h +25 -22
 - data/ext/mysql2/result.c +4 -16
 - data/ext/mysql2/result.h +3 -3
 - data/ext/mysql2/statement.c +79 -42
 - data/ext/mysql2/statement.h +2 -6
 - data/lib/mysql2.rb +36 -18
 - data/lib/mysql2/1.8/mysql2.so +0 -0
 - data/lib/mysql2/1.9/mysql2.so +0 -0
 - data/lib/mysql2/2.0/mysql2.so +0 -0
 - data/lib/mysql2/2.1/mysql2.so +0 -0
 - data/lib/mysql2/2.2/mysql2.so +0 -0
 - data/lib/mysql2/client.rb +28 -27
 - data/lib/mysql2/console.rb +1 -1
 - data/lib/mysql2/em.rb +5 -6
 - data/lib/mysql2/error.rb +10 -7
 - data/lib/mysql2/field.rb +1 -2
 - data/lib/mysql2/statement.rb +12 -0
 - data/lib/mysql2/version.rb +1 -1
 - data/spec/em/em_spec.rb +8 -8
 - data/spec/mysql2/client_spec.rb +62 -37
 - data/spec/mysql2/result_spec.rb +48 -48
 - data/spec/mysql2/statement_spec.rb +143 -57
 - data/spec/ssl/ca-cert.pem +17 -0
 - data/spec/ssl/ca-key.pem +27 -0
 - data/spec/ssl/ca.cnf +22 -0
 - data/spec/ssl/cert.cnf +22 -0
 - data/spec/ssl/client-cert.pem +17 -0
 - data/spec/ssl/client-key.pem +27 -0
 - data/spec/ssl/client-req.pem +15 -0
 - data/spec/ssl/gen_certs.sh +48 -0
 - data/spec/ssl/pkcs8-client-key.pem +28 -0
 - data/spec/ssl/pkcs8-server-key.pem +28 -0
 - data/spec/ssl/server-cert.pem +17 -0
 - data/spec/ssl/server-key.pem +27 -0
 - data/spec/ssl/server-req.pem +15 -0
 - data/support/mysql_enc_to_ruby.rb +7 -8
 - data/support/ruby_enc_to_mysql.rb +1 -1
 - metadata +28 -2
 
    
        data/spec/mysql2/result_spec.rb
    CHANGED
    
    | 
         @@ -53,19 +53,19 @@ RSpec.describe Mysql2::Result do 
     | 
|
| 
       53 
53 
     | 
    
         
             
              context "#each" do
         
     | 
| 
       54 
54 
     | 
    
         
             
                it "should yield rows as hash's" do
         
     | 
| 
       55 
55 
     | 
    
         
             
                  @result.each do |row|
         
     | 
| 
       56 
     | 
    
         
            -
                    expect(row 
     | 
| 
      
 56 
     | 
    
         
            +
                    expect(row).to be_an_instance_of(Hash)
         
     | 
| 
       57 
57 
     | 
    
         
             
                  end
         
     | 
| 
       58 
58 
     | 
    
         
             
                end
         
     | 
| 
       59 
59 
     | 
    
         | 
| 
       60 
60 
     | 
    
         
             
                it "should yield rows as hash's with symbol keys if :symbolize_keys was set to true" do
         
     | 
| 
       61 
61 
     | 
    
         
             
                  @result.each(:symbolize_keys => true) do |row|
         
     | 
| 
       62 
     | 
    
         
            -
                    expect(row.keys.first 
     | 
| 
      
 62 
     | 
    
         
            +
                    expect(row.keys.first).to be_an_instance_of(Symbol)
         
     | 
| 
       63 
63 
     | 
    
         
             
                  end
         
     | 
| 
       64 
64 
     | 
    
         
             
                end
         
     | 
| 
       65 
65 
     | 
    
         | 
| 
       66 
66 
     | 
    
         
             
                it "should be able to return results as an array" do
         
     | 
| 
       67 
67 
     | 
    
         
             
                  @result.each(:as => :array) do |row|
         
     | 
| 
       68 
     | 
    
         
            -
                    expect(row 
     | 
| 
      
 68 
     | 
    
         
            +
                    expect(row).to be_an_instance_of(Array)
         
     | 
| 
       69 
69 
     | 
    
         
             
                  end
         
     | 
| 
       70 
70 
     | 
    
         
             
                end
         
     | 
| 
       71 
71 
     | 
    
         | 
| 
         @@ -109,7 +109,7 @@ RSpec.describe Mysql2::Result do 
     | 
|
| 
       109 
109 
     | 
    
         | 
| 
       110 
110 
     | 
    
         
             
                it "should return an array of field names in proper order" do
         
     | 
| 
       111 
111 
     | 
    
         
             
                  result = @client.query "SELECT 'a', 'b', 'c'"
         
     | 
| 
       112 
     | 
    
         
            -
                  expect(result.fields).to eql( 
     | 
| 
      
 112 
     | 
    
         
            +
                  expect(result.fields).to eql(%w(a b c))
         
     | 
| 
       113 
113 
     | 
    
         
             
                end
         
     | 
| 
       114 
114 
     | 
    
         
             
              end
         
     | 
| 
       115 
115 
     | 
    
         | 
| 
         @@ -132,7 +132,7 @@ RSpec.describe Mysql2::Result do 
     | 
|
| 
       132 
132 
     | 
    
         | 
| 
       133 
133 
     | 
    
         
             
                it "should not yield nil at the end of streaming" do
         
     | 
| 
       134 
134 
     | 
    
         
             
                  result = @client.query('SELECT * FROM mysql2_test', :stream => true, :cache_rows => false)
         
     | 
| 
       135 
     | 
    
         
            -
                  result.each { |r| expect(r).not_to be_nil}
         
     | 
| 
      
 135 
     | 
    
         
            +
                  result.each { |r| expect(r).not_to be_nil }
         
     | 
| 
       136 
136 
     | 
    
         
             
                end
         
     | 
| 
       137 
137 
     | 
    
         | 
| 
       138 
138 
     | 
    
         
             
                it "#count should be zero for rows after streaming when there were no results" do
         
     | 
| 
         @@ -158,7 +158,7 @@ RSpec.describe Mysql2::Result do 
     | 
|
| 
       158 
158 
     | 
    
         
             
                  res = client.query "SELECT * FROM streamingTest", :stream => true, :cache_rows => false
         
     | 
| 
       159 
159 
     | 
    
         | 
| 
       160 
160 
     | 
    
         
             
                  expect {
         
     | 
| 
       161 
     | 
    
         
            -
                    res.each_with_index do | 
     | 
| 
      
 161 
     | 
    
         
            +
                    res.each_with_index do |_, i|
         
     | 
| 
       162 
162 
     | 
    
         
             
                      # Exhaust the first result packet then trigger a timeout
         
     | 
| 
       163 
163 
     | 
    
         
             
                      sleep 2 if i > 0 && i % 1000 == 0
         
     | 
| 
       164 
164 
     | 
    
         
             
                    end
         
     | 
| 
         @@ -174,25 +174,25 @@ RSpec.describe Mysql2::Result do 
     | 
|
| 
       174 
174 
     | 
    
         
             
                it "should return nil values for NULL and strings for everything else when :cast is false" do
         
     | 
| 
       175 
175 
     | 
    
         
             
                  result = @client.query('SELECT null_test, tiny_int_test, bool_cast_test, int_test, date_test, enum_test FROM mysql2_test WHERE bool_cast_test = 1 LIMIT 1', :cast => false).first
         
     | 
| 
       176 
176 
     | 
    
         
             
                  expect(result["null_test"]).to be_nil
         
     | 
| 
       177 
     | 
    
         
            -
                  expect(result["tiny_int_test"]).to 
     | 
| 
      
 177 
     | 
    
         
            +
                  expect(result["tiny_int_test"]).to eql("1")
         
     | 
| 
       178 
178 
     | 
    
         
             
                  expect(result["bool_cast_test"]).to eql("1")
         
     | 
| 
       179 
     | 
    
         
            -
                  expect(result["int_test"]).to 
     | 
| 
       180 
     | 
    
         
            -
                  expect(result["date_test"]).to 
     | 
| 
       181 
     | 
    
         
            -
                  expect(result["enum_test"]).to 
     | 
| 
      
 179 
     | 
    
         
            +
                  expect(result["int_test"]).to eql("10")
         
     | 
| 
      
 180 
     | 
    
         
            +
                  expect(result["date_test"]).to eql("2010-04-04")
         
     | 
| 
      
 181 
     | 
    
         
            +
                  expect(result["enum_test"]).to eql("val1")
         
     | 
| 
       182 
182 
     | 
    
         
             
                end
         
     | 
| 
       183 
183 
     | 
    
         | 
| 
       184 
184 
     | 
    
         
             
                it "should return nil for a NULL value" do
         
     | 
| 
       185 
     | 
    
         
            -
                  expect(@test_result['null_test'] 
     | 
| 
      
 185 
     | 
    
         
            +
                  expect(@test_result['null_test']).to be_an_instance_of(NilClass)
         
     | 
| 
       186 
186 
     | 
    
         
             
                  expect(@test_result['null_test']).to eql(nil)
         
     | 
| 
       187 
187 
     | 
    
         
             
                end
         
     | 
| 
       188 
188 
     | 
    
         | 
| 
       189 
189 
     | 
    
         
             
                it "should return String for a BIT(64) value" do
         
     | 
| 
       190 
     | 
    
         
            -
                  expect(@test_result['bit_test'] 
     | 
| 
      
 190 
     | 
    
         
            +
                  expect(@test_result['bit_test']).to be_an_instance_of(String)
         
     | 
| 
       191 
191 
     | 
    
         
             
                  expect(@test_result['bit_test']).to eql("\000\000\000\000\000\000\000\005")
         
     | 
| 
       192 
192 
     | 
    
         
             
                end
         
     | 
| 
       193 
193 
     | 
    
         | 
| 
       194 
194 
     | 
    
         
             
                it "should return String for a BIT(1) value" do
         
     | 
| 
       195 
     | 
    
         
            -
                  expect(@test_result['single_bit_test'] 
     | 
| 
      
 195 
     | 
    
         
            +
                  expect(@test_result['single_bit_test']).to be_an_instance_of(String)
         
     | 
| 
       196 
196 
     | 
    
         
             
                  expect(@test_result['single_bit_test']).to eql("\001")
         
     | 
| 
       197 
197 
     | 
    
         
             
                end
         
     | 
| 
       198 
198 
     | 
    
         | 
| 
         @@ -259,89 +259,89 @@ RSpec.describe Mysql2::Result do 
     | 
|
| 
       259 
259 
     | 
    
         
             
                end
         
     | 
| 
       260 
260 
     | 
    
         | 
| 
       261 
261 
     | 
    
         
             
                it "should return BigDecimal for a DECIMAL value" do
         
     | 
| 
       262 
     | 
    
         
            -
                  expect(@test_result['decimal_test'] 
     | 
| 
      
 262 
     | 
    
         
            +
                  expect(@test_result['decimal_test']).to be_an_instance_of(BigDecimal)
         
     | 
| 
       263 
263 
     | 
    
         
             
                  expect(@test_result['decimal_test']).to eql(10.3)
         
     | 
| 
       264 
264 
     | 
    
         
             
                end
         
     | 
| 
       265 
265 
     | 
    
         | 
| 
       266 
266 
     | 
    
         
             
                it "should return Float for a FLOAT value" do
         
     | 
| 
       267 
     | 
    
         
            -
                  expect(@test_result['float_test'] 
     | 
| 
      
 267 
     | 
    
         
            +
                  expect(@test_result['float_test']).to be_an_instance_of(Float)
         
     | 
| 
       268 
268 
     | 
    
         
             
                  expect(@test_result['float_test']).to eql(10.3)
         
     | 
| 
       269 
269 
     | 
    
         
             
                end
         
     | 
| 
       270 
270 
     | 
    
         | 
| 
       271 
271 
     | 
    
         
             
                it "should return Float for a DOUBLE value" do
         
     | 
| 
       272 
     | 
    
         
            -
                  expect(@test_result['double_test'] 
     | 
| 
      
 272 
     | 
    
         
            +
                  expect(@test_result['double_test']).to be_an_instance_of(Float)
         
     | 
| 
       273 
273 
     | 
    
         
             
                  expect(@test_result['double_test']).to eql(10.3)
         
     | 
| 
       274 
274 
     | 
    
         
             
                end
         
     | 
| 
       275 
275 
     | 
    
         | 
| 
       276 
276 
     | 
    
         
             
                it "should return Time for a DATETIME value when within the supported range" do
         
     | 
| 
       277 
     | 
    
         
            -
                  expect(@test_result['date_time_test'] 
     | 
| 
      
 277 
     | 
    
         
            +
                  expect(@test_result['date_time_test']).to be_an_instance_of(Time)
         
     | 
| 
       278 
278 
     | 
    
         
             
                  expect(@test_result['date_time_test'].strftime("%Y-%m-%d %H:%M:%S")).to eql('2010-04-04 11:44:00')
         
     | 
| 
       279 
279 
     | 
    
         
             
                end
         
     | 
| 
       280 
280 
     | 
    
         | 
| 
       281 
281 
     | 
    
         
             
                if 1.size == 4 # 32bit
         
     | 
| 
       282 
     | 
    
         
            -
                   
     | 
| 
       283 
     | 
    
         
            -
                     
     | 
| 
      
 282 
     | 
    
         
            +
                  klass = if RUBY_VERSION =~ /1.8/
         
     | 
| 
      
 283 
     | 
    
         
            +
                    DateTime
         
     | 
| 
       284 
284 
     | 
    
         
             
                  else
         
     | 
| 
       285 
     | 
    
         
            -
                     
     | 
| 
      
 285 
     | 
    
         
            +
                    Time
         
     | 
| 
       286 
286 
     | 
    
         
             
                  end
         
     | 
| 
       287 
287 
     | 
    
         | 
| 
       288 
288 
     | 
    
         
             
                  it "should return DateTime when timestamp is < 1901-12-13 20:45:52" do
         
     | 
| 
       289 
     | 
    
         
            -
             
     | 
| 
      
 289 
     | 
    
         
            +
                    # 1901-12-13T20:45:52 is the min for 32bit Ruby 1.8
         
     | 
| 
       290 
290 
     | 
    
         
             
                    r = @client.query("SELECT CAST('1901-12-13 20:45:51' AS DATETIME) as test")
         
     | 
| 
       291 
     | 
    
         
            -
                    expect(r.first['test'] 
     | 
| 
      
 291 
     | 
    
         
            +
                    expect(r.first['test']).to be_an_instance_of(klass)
         
     | 
| 
       292 
292 
     | 
    
         
             
                  end
         
     | 
| 
       293 
293 
     | 
    
         | 
| 
       294 
294 
     | 
    
         
             
                  it "should return DateTime when timestamp is > 2038-01-19T03:14:07" do
         
     | 
| 
       295 
     | 
    
         
            -
             
     | 
| 
      
 295 
     | 
    
         
            +
                    # 2038-01-19T03:14:07 is the max for 32bit Ruby 1.8
         
     | 
| 
       296 
296 
     | 
    
         
             
                    r = @client.query("SELECT CAST('2038-01-19 03:14:08' AS DATETIME) as test")
         
     | 
| 
       297 
     | 
    
         
            -
                    expect(r.first['test'] 
     | 
| 
      
 297 
     | 
    
         
            +
                    expect(r.first['test']).to be_an_instance_of(klass)
         
     | 
| 
       298 
298 
     | 
    
         
             
                  end
         
     | 
| 
       299 
299 
     | 
    
         
             
                elsif 1.size == 8 # 64bit
         
     | 
| 
       300 
     | 
    
         
            -
                   
     | 
| 
       301 
     | 
    
         
            -
                    it "should return Time when timestamp is < 1901-12-13 20:45:52" do
         
     | 
| 
       302 
     | 
    
         
            -
                      r = @client.query("SELECT CAST('1901-12-13 20:45:51' AS DATETIME) as test")
         
     | 
| 
       303 
     | 
    
         
            -
                      expect(r.first['test'].class).to eql(Time)
         
     | 
| 
       304 
     | 
    
         
            -
                    end
         
     | 
| 
       305 
     | 
    
         
            -
             
     | 
| 
       306 
     | 
    
         
            -
                    it "should return Time when timestamp is > 2038-01-19T03:14:07" do
         
     | 
| 
       307 
     | 
    
         
            -
                      r = @client.query("SELECT CAST('2038-01-19 03:14:08' AS DATETIME) as test")
         
     | 
| 
       308 
     | 
    
         
            -
                      expect(r.first['test'].class).to eql(Time)
         
     | 
| 
       309 
     | 
    
         
            -
                    end
         
     | 
| 
       310 
     | 
    
         
            -
                  else
         
     | 
| 
      
 300 
     | 
    
         
            +
                  if RUBY_VERSION =~ /1.8/
         
     | 
| 
       311 
301 
     | 
    
         
             
                    it "should return Time when timestamp is > 0138-12-31 11:59:59" do
         
     | 
| 
       312 
302 
     | 
    
         
             
                      r = @client.query("SELECT CAST('0139-1-1 00:00:00' AS DATETIME) as test")
         
     | 
| 
       313 
     | 
    
         
            -
                      expect(r.first['test'] 
     | 
| 
      
 303 
     | 
    
         
            +
                      expect(r.first['test']).to be_an_instance_of(Time)
         
     | 
| 
       314 
304 
     | 
    
         
             
                    end
         
     | 
| 
       315 
305 
     | 
    
         | 
| 
       316 
306 
     | 
    
         
             
                    it "should return DateTime when timestamp is < 0139-1-1T00:00:00" do
         
     | 
| 
       317 
307 
     | 
    
         
             
                      r = @client.query("SELECT CAST('0138-12-31 11:59:59' AS DATETIME) as test")
         
     | 
| 
       318 
     | 
    
         
            -
                      expect(r.first['test'] 
     | 
| 
      
 308 
     | 
    
         
            +
                      expect(r.first['test']).to be_an_instance_of(DateTime)
         
     | 
| 
      
 309 
     | 
    
         
            +
                    end
         
     | 
| 
      
 310 
     | 
    
         
            +
             
     | 
| 
      
 311 
     | 
    
         
            +
                    it "should return Time when timestamp is > 2038-01-19T03:14:07" do
         
     | 
| 
      
 312 
     | 
    
         
            +
                      r = @client.query("SELECT CAST('2038-01-19 03:14:08' AS DATETIME) as test")
         
     | 
| 
      
 313 
     | 
    
         
            +
                      expect(r.first['test']).to be_an_instance_of(Time)
         
     | 
| 
      
 314 
     | 
    
         
            +
                    end
         
     | 
| 
      
 315 
     | 
    
         
            +
                  else
         
     | 
| 
      
 316 
     | 
    
         
            +
                    it "should return Time when timestamp is < 1901-12-13 20:45:52" do
         
     | 
| 
      
 317 
     | 
    
         
            +
                      r = @client.query("SELECT CAST('1901-12-13 20:45:51' AS DATETIME) as test")
         
     | 
| 
      
 318 
     | 
    
         
            +
                      expect(r.first['test']).to be_an_instance_of(Time)
         
     | 
| 
       319 
319 
     | 
    
         
             
                    end
         
     | 
| 
       320 
320 
     | 
    
         | 
| 
       321 
321 
     | 
    
         
             
                    it "should return Time when timestamp is > 2038-01-19T03:14:07" do
         
     | 
| 
       322 
322 
     | 
    
         
             
                      r = @client.query("SELECT CAST('2038-01-19 03:14:08' AS DATETIME) as test")
         
     | 
| 
       323 
     | 
    
         
            -
                      expect(r.first['test'] 
     | 
| 
      
 323 
     | 
    
         
            +
                      expect(r.first['test']).to be_an_instance_of(Time)
         
     | 
| 
       324 
324 
     | 
    
         
             
                    end
         
     | 
| 
       325 
325 
     | 
    
         
             
                  end
         
     | 
| 
       326 
326 
     | 
    
         
             
                end
         
     | 
| 
       327 
327 
     | 
    
         | 
| 
       328 
328 
     | 
    
         
             
                it "should return Time for a TIMESTAMP value when within the supported range" do
         
     | 
| 
       329 
     | 
    
         
            -
                  expect(@test_result['timestamp_test'] 
     | 
| 
      
 329 
     | 
    
         
            +
                  expect(@test_result['timestamp_test']).to be_an_instance_of(Time)
         
     | 
| 
       330 
330 
     | 
    
         
             
                  expect(@test_result['timestamp_test'].strftime("%Y-%m-%d %H:%M:%S")).to eql('2010-04-04 11:44:00')
         
     | 
| 
       331 
331 
     | 
    
         
             
                end
         
     | 
| 
       332 
332 
     | 
    
         | 
| 
       333 
333 
     | 
    
         
             
                it "should return Time for a TIME value" do
         
     | 
| 
       334 
     | 
    
         
            -
                  expect(@test_result['time_test'] 
     | 
| 
      
 334 
     | 
    
         
            +
                  expect(@test_result['time_test']).to be_an_instance_of(Time)
         
     | 
| 
       335 
335 
     | 
    
         
             
                  expect(@test_result['time_test'].strftime("%Y-%m-%d %H:%M:%S")).to eql('2000-01-01 11:44:00')
         
     | 
| 
       336 
336 
     | 
    
         
             
                end
         
     | 
| 
       337 
337 
     | 
    
         | 
| 
       338 
338 
     | 
    
         
             
                it "should return Date for a DATE value" do
         
     | 
| 
       339 
     | 
    
         
            -
                  expect(@test_result['date_test'] 
     | 
| 
      
 339 
     | 
    
         
            +
                  expect(@test_result['date_test']).to be_an_instance_of(Date)
         
     | 
| 
       340 
340 
     | 
    
         
             
                  expect(@test_result['date_test'].strftime("%Y-%m-%d")).to eql('2010-04-04')
         
     | 
| 
       341 
341 
     | 
    
         
             
                end
         
     | 
| 
       342 
342 
     | 
    
         | 
| 
       343 
343 
     | 
    
         
             
                it "should return String for an ENUM value" do
         
     | 
| 
       344 
     | 
    
         
            -
                  expect(@test_result['enum_test'] 
     | 
| 
      
 344 
     | 
    
         
            +
                  expect(@test_result['enum_test']).to be_an_instance_of(String)
         
     | 
| 
       345 
345 
     | 
    
         
             
                  expect(@test_result['enum_test']).to eql('val1')
         
     | 
| 
       346 
346 
     | 
    
         
             
                end
         
     | 
| 
       347 
347 
     | 
    
         | 
| 
         @@ -379,7 +379,7 @@ RSpec.describe Mysql2::Result do 
     | 
|
| 
       379 
379 
     | 
    
         
             
                end
         
     | 
| 
       380 
380 
     | 
    
         | 
| 
       381 
381 
     | 
    
         
             
                it "should return String for a SET value" do
         
     | 
| 
       382 
     | 
    
         
            -
                  expect(@test_result['set_test'] 
     | 
| 
      
 382 
     | 
    
         
            +
                  expect(@test_result['set_test']).to be_an_instance_of(String)
         
     | 
| 
       383 
383 
     | 
    
         
             
                  expect(@test_result['set_test']).to eql('val1,val2')
         
     | 
| 
       384 
384 
     | 
    
         
             
                end
         
     | 
| 
       385 
385 
     | 
    
         | 
| 
         @@ -412,8 +412,8 @@ RSpec.describe Mysql2::Result do 
     | 
|
| 
       412 
412 
     | 
    
         
             
                end
         
     | 
| 
       413 
413 
     | 
    
         | 
| 
       414 
414 
     | 
    
         
             
                it "should return String for a BINARY value" do
         
     | 
| 
       415 
     | 
    
         
            -
                  expect(@test_result['binary_test'] 
     | 
| 
       416 
     | 
    
         
            -
                  expect(@test_result['binary_test']).to eql("test#{"\000"*6}")
         
     | 
| 
      
 415 
     | 
    
         
            +
                  expect(@test_result['binary_test']).to be_an_instance_of(String)
         
     | 
| 
      
 416 
     | 
    
         
            +
                  expect(@test_result['binary_test']).to eql("test#{"\000" * 6}")
         
     | 
| 
       417 
417 
     | 
    
         
             
                end
         
     | 
| 
       418 
418 
     | 
    
         | 
| 
       419 
419 
     | 
    
         
             
                context "string encoding for BINARY values" do
         
     | 
| 
         @@ -450,17 +450,17 @@ RSpec.describe Mysql2::Result do 
     | 
|
| 
       450 
450 
     | 
    
         
             
                  'medium_blob_test' => 'MEDIUMBLOB',
         
     | 
| 
       451 
451 
     | 
    
         
             
                  'medium_text_test' => 'MEDIUMTEXT',
         
     | 
| 
       452 
452 
     | 
    
         
             
                  'long_blob_test' => 'LONGBLOB',
         
     | 
| 
       453 
     | 
    
         
            -
                  'long_text_test' => 'LONGTEXT'
         
     | 
| 
      
 453 
     | 
    
         
            +
                  'long_text_test' => 'LONGTEXT',
         
     | 
| 
       454 
454 
     | 
    
         
             
                }.each do |field, type|
         
     | 
| 
       455 
455 
     | 
    
         
             
                  it "should return a String for #{type}" do
         
     | 
| 
       456 
     | 
    
         
            -
                    expect(@test_result[field] 
     | 
| 
      
 456 
     | 
    
         
            +
                    expect(@test_result[field]).to be_an_instance_of(String)
         
     | 
| 
       457 
457 
     | 
    
         
             
                    expect(@test_result[field]).to eql("test")
         
     | 
| 
       458 
458 
     | 
    
         
             
                  end
         
     | 
| 
       459 
459 
     | 
    
         | 
| 
       460 
460 
     | 
    
         
             
                  context "string encoding for #{type} values" do
         
     | 
| 
       461 
461 
     | 
    
         
             
                    before { pending('Encoding is undefined') unless defined?(Encoding) }
         
     | 
| 
       462 
462 
     | 
    
         | 
| 
       463 
     | 
    
         
            -
                    if  
     | 
| 
      
 463 
     | 
    
         
            +
                    if %w(VARBINARY TINYBLOB BLOB MEDIUMBLOB LONGBLOB).include?(type)
         
     | 
| 
       464 
464 
     | 
    
         
             
                      it "should default to binary if Encoding.default_internal is nil" do
         
     | 
| 
       465 
465 
     | 
    
         
             
                        with_internal_encoding nil do
         
     | 
| 
       466 
466 
     | 
    
         
             
                          result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
         
     | 
| 
         @@ -8,8 +8,10 @@ RSpec.describe Mysql2::Statement do 
     | 
|
| 
       8 
8 
     | 
    
         | 
| 
       9 
9 
     | 
    
         
             
              it "should create a statement" do
         
     | 
| 
       10 
10 
     | 
    
         
             
                statement = nil
         
     | 
| 
       11 
     | 
    
         
            -
                expect { statement = @client.prepare 'SELECT 1' }. 
     | 
| 
       12 
     | 
    
         
            -
             
     | 
| 
      
 11 
     | 
    
         
            +
                expect { statement = @client.prepare 'SELECT 1' }.to change {
         
     | 
| 
      
 12 
     | 
    
         
            +
                  @client.query("SHOW STATUS LIKE 'Prepared_stmt_count'").first['Value'].to_i
         
     | 
| 
      
 13 
     | 
    
         
            +
                }.by(1)
         
     | 
| 
      
 14 
     | 
    
         
            +
                expect(statement).to be_an_instance_of(Mysql2::Statement)
         
     | 
| 
       13 
15 
     | 
    
         
             
              end
         
     | 
| 
       14 
16 
     | 
    
         | 
| 
       15 
17 
     | 
    
         
             
              it "should raise an exception when server disconnects" do
         
     | 
| 
         @@ -53,8 +55,8 @@ RSpec.describe Mysql2::Statement do 
     | 
|
| 
       53 
55 
     | 
    
         
             
                statement = @client.prepare 'SELECT 1'
         
     | 
| 
       54 
56 
     | 
    
         
             
                result = statement.execute
         
     | 
| 
       55 
57 
     | 
    
         
             
                rows = []
         
     | 
| 
       56 
     | 
    
         
            -
                result.each {|r| rows << r}
         
     | 
| 
       57 
     | 
    
         
            -
                expect(rows).to eq([{"1"=>1}])
         
     | 
| 
      
 58 
     | 
    
         
            +
                result.each { |r| rows << r }
         
     | 
| 
      
 59 
     | 
    
         
            +
                expect(rows).to eq([{ "1" => 1 }])
         
     | 
| 
       58 
60 
     | 
    
         
             
              end
         
     | 
| 
       59 
61 
     | 
    
         | 
| 
       60 
62 
     | 
    
         
             
              it "should keep its result after other query" do
         
     | 
| 
         @@ -64,8 +66,8 @@ RSpec.describe Mysql2::Statement do 
     | 
|
| 
       64 
66 
     | 
    
         
             
                stmt = @client.prepare('SELECT a FROM mysql2_stmt_q WHERE a = ?')
         
     | 
| 
       65 
67 
     | 
    
         
             
                result1 = stmt.execute(1)
         
     | 
| 
       66 
68 
     | 
    
         
             
                result2 = stmt.execute(2)
         
     | 
| 
       67 
     | 
    
         
            -
                expect(result2.first).to eq( 
     | 
| 
       68 
     | 
    
         
            -
                expect(result1.first).to eq( 
     | 
| 
      
 69 
     | 
    
         
            +
                expect(result2.first).to eq("a" => 2)
         
     | 
| 
      
 70 
     | 
    
         
            +
                expect(result1.first).to eq("a" => 1)
         
     | 
| 
       69 
71 
     | 
    
         
             
                @client.query 'DROP TABLE IF EXISTS mysql2_stmt_q'
         
     | 
| 
       70 
72 
     | 
    
         
             
              end
         
     | 
| 
       71 
73 
     | 
    
         | 
| 
         @@ -91,11 +93,11 @@ RSpec.describe Mysql2::Statement do 
     | 
|
| 
       91 
93 
     | 
    
         
             
                @client.query 'INSERT INTO mysql2_stmt_q (a, b) VALUES (1, "Hello"), (2, "World")'
         
     | 
| 
       92 
94 
     | 
    
         
             
                statement = @client.prepare 'SELECT * FROM mysql2_stmt_q WHERE a < ?'
         
     | 
| 
       93 
95 
     | 
    
         
             
                results = statement.execute(2)
         
     | 
| 
       94 
     | 
    
         
            -
                expect(results.first).to eq( 
     | 
| 
      
 96 
     | 
    
         
            +
                expect(results.first).to eq("a" => 1, "b" => "Hello")
         
     | 
| 
       95 
97 
     | 
    
         | 
| 
       96 
98 
     | 
    
         
             
                statement = @client.prepare 'SELECT * FROM mysql2_stmt_q WHERE b LIKE ?'
         
     | 
| 
       97 
99 
     | 
    
         
             
                results = statement.execute('%orld')
         
     | 
| 
       98 
     | 
    
         
            -
                expect(results.first).to eq( 
     | 
| 
      
 100 
     | 
    
         
            +
                expect(results.first).to eq("a" => 2, "b" => "World")
         
     | 
| 
       99 
101 
     | 
    
         | 
| 
       100 
102 
     | 
    
         
             
                @client.query 'DROP TABLE IF EXISTS mysql2_stmt_q'
         
     | 
| 
       101 
103 
     | 
    
         
             
              end
         
     | 
| 
         @@ -103,7 +105,7 @@ RSpec.describe Mysql2::Statement do 
     | 
|
| 
       103 
105 
     | 
    
         
             
              it "should select dates" do
         
     | 
| 
       104 
106 
     | 
    
         
             
                statement = @client.prepare 'SELECT NOW()'
         
     | 
| 
       105 
107 
     | 
    
         
             
                result = statement.execute
         
     | 
| 
       106 
     | 
    
         
            -
                expect(result.first.first[1]).to  
     | 
| 
      
 108 
     | 
    
         
            +
                expect(result.first.first[1]).to be_an_instance_of(Time)
         
     | 
| 
       107 
109 
     | 
    
         
             
              end
         
     | 
| 
       108 
110 
     | 
    
         | 
| 
       109 
111 
     | 
    
         
             
              it "should tell us about the fields" do
         
     | 
| 
         @@ -130,10 +132,10 @@ RSpec.describe Mysql2::Statement do 
     | 
|
| 
       130 
132 
     | 
    
         | 
| 
       131 
133 
     | 
    
         
             
                it "should be able to retrieve utf8 field names correctly" do
         
     | 
| 
       132 
134 
     | 
    
         
             
                  stmt = @client.prepare 'SELECT * FROM `テーブル`'
         
     | 
| 
       133 
     | 
    
         
            -
                  expect(stmt.fields).to eq( 
     | 
| 
      
 135 
     | 
    
         
            +
                  expect(stmt.fields).to eq(%w(整数 文字列))
         
     | 
| 
       134 
136 
     | 
    
         
             
                  result = stmt.execute
         
     | 
| 
       135 
137 
     | 
    
         | 
| 
       136 
     | 
    
         
            -
                  expect(result.to_a).to eq([{"整数"=>1, "文字列"=>"イチ"}, {"整数"=>2, "文字列"=>"弐"}, {"整数"=>3, "文字列"=>"さん"}])
         
     | 
| 
      
 138 
     | 
    
         
            +
                  expect(result.to_a).to eq([{ "整数" => 1, "文字列" => "イチ" }, { "整数" => 2, "文字列" => "弐" }, { "整数" => 3, "文字列" => "さん" }])
         
     | 
| 
       137 
139 
     | 
    
         
             
                end
         
     | 
| 
       138 
140 
     | 
    
         | 
| 
       139 
141 
     | 
    
         
             
                it "should be able to retrieve utf8 param query correctly" do
         
     | 
| 
         @@ -142,7 +144,7 @@ RSpec.describe Mysql2::Statement do 
     | 
|
| 
       142 
144 
     | 
    
         | 
| 
       143 
145 
     | 
    
         
             
                  result = stmt.execute 'イチ'
         
     | 
| 
       144 
146 
     | 
    
         | 
| 
       145 
     | 
    
         
            -
                  expect(result.to_a).to eq([{"整数"=>1}])
         
     | 
| 
      
 147 
     | 
    
         
            +
                  expect(result.to_a).to eq([{ "整数" => 1 }])
         
     | 
| 
       146 
148 
     | 
    
         
             
                end
         
     | 
| 
       147 
149 
     | 
    
         | 
| 
       148 
150 
     | 
    
         
             
                it "should be able to retrieve query with param in different encoding correctly" do
         
     | 
| 
         @@ -152,9 +154,8 @@ RSpec.describe Mysql2::Statement do 
     | 
|
| 
       152 
154 
     | 
    
         
             
                  param = 'イチ'.encode("EUC-JP")
         
     | 
| 
       153 
155 
     | 
    
         
             
                  result = stmt.execute param
         
     | 
| 
       154 
156 
     | 
    
         | 
| 
       155 
     | 
    
         
            -
                  expect(result.to_a).to eq([{"整数"=>1}])
         
     | 
| 
      
 157 
     | 
    
         
            +
                  expect(result.to_a).to eq([{ "整数" => 1 }])
         
     | 
| 
       156 
158 
     | 
    
         
             
                end
         
     | 
| 
       157 
     | 
    
         
            -
             
     | 
| 
       158 
159 
     | 
    
         
             
              end if defined? Encoding
         
     | 
| 
       159 
160 
     | 
    
         | 
| 
       160 
161 
     | 
    
         
             
              context "streaming result" do
         
     | 
| 
         @@ -162,7 +163,7 @@ RSpec.describe Mysql2::Statement do 
     | 
|
| 
       162 
163 
     | 
    
         
             
                  n = 1
         
     | 
| 
       163 
164 
     | 
    
         
             
                  stmt = @client.prepare("SELECT 1 UNION SELECT 2")
         
     | 
| 
       164 
165 
     | 
    
         | 
| 
       165 
     | 
    
         
            -
                  @client.query_options.merge!( 
     | 
| 
      
 166 
     | 
    
         
            +
                  @client.query_options.merge!(:stream => true, :cache_rows => false, :as => :array)
         
     | 
| 
       166 
167 
     | 
    
         | 
| 
       167 
168 
     | 
    
         
             
                  stmt.execute.each do |r|
         
     | 
| 
       168 
169 
     | 
    
         
             
                    case n
         
     | 
| 
         @@ -185,7 +186,7 @@ RSpec.describe Mysql2::Statement do 
     | 
|
| 
       185 
186 
     | 
    
         
             
                it "should yield rows as hash's" do
         
     | 
| 
       186 
187 
     | 
    
         
             
                  @result = @client.prepare("SELECT 1").execute
         
     | 
| 
       187 
188 
     | 
    
         
             
                  @result.each do |row|
         
     | 
| 
       188 
     | 
    
         
            -
                    expect(row 
     | 
| 
      
 189 
     | 
    
         
            +
                    expect(row).to be_an_instance_of(Hash)
         
     | 
| 
       189 
190 
     | 
    
         
             
                  end
         
     | 
| 
       190 
191 
     | 
    
         
             
                end
         
     | 
| 
       191 
192 
     | 
    
         | 
| 
         @@ -193,7 +194,7 @@ RSpec.describe Mysql2::Statement do 
     | 
|
| 
       193 
194 
     | 
    
         
             
                  @client.query_options[:symbolize_keys] = true
         
     | 
| 
       194 
195 
     | 
    
         
             
                  @result = @client.prepare("SELECT 1").execute
         
     | 
| 
       195 
196 
     | 
    
         
             
                  @result.each do |row|
         
     | 
| 
       196 
     | 
    
         
            -
                    expect(row.keys.first 
     | 
| 
      
 197 
     | 
    
         
            +
                    expect(row.keys.first).to be_an_instance_of(Symbol)
         
     | 
| 
       197 
198 
     | 
    
         
             
                  end
         
     | 
| 
       198 
199 
     | 
    
         
             
                  @client.query_options[:symbolize_keys] = false
         
     | 
| 
       199 
200 
     | 
    
         
             
                end
         
     | 
| 
         @@ -203,7 +204,7 @@ RSpec.describe Mysql2::Statement do 
     | 
|
| 
       203 
204 
     | 
    
         | 
| 
       204 
205 
     | 
    
         
             
                  @result = @client.prepare("SELECT 1").execute
         
     | 
| 
       205 
206 
     | 
    
         
             
                  @result.each do |row|
         
     | 
| 
       206 
     | 
    
         
            -
                    expect(row 
     | 
| 
      
 207 
     | 
    
         
            +
                    expect(row).to be_an_instance_of(Array)
         
     | 
| 
       207 
208 
     | 
    
         
             
                  end
         
     | 
| 
       208 
209 
     | 
    
         | 
| 
       209 
210 
     | 
    
         
             
                  @client.query_options[:as] = :hash
         
     | 
| 
         @@ -259,7 +260,7 @@ RSpec.describe Mysql2::Statement do 
     | 
|
| 
       259 
260 
     | 
    
         | 
| 
       260 
261 
     | 
    
         
             
                it "should return an array of field names in proper order" do
         
     | 
| 
       261 
262 
     | 
    
         
             
                  result = @client.prepare("SELECT 'a', 'b', 'c'").execute
         
     | 
| 
       262 
     | 
    
         
            -
                  expect(result.fields).to eql( 
     | 
| 
      
 263 
     | 
    
         
            +
                  expect(result.fields).to eql(%w(a b c))
         
     | 
| 
       263 
264 
     | 
    
         
             
                end
         
     | 
| 
       264 
265 
     | 
    
         
             
              end
         
     | 
| 
       265 
266 
     | 
    
         | 
| 
         @@ -270,17 +271,17 @@ RSpec.describe Mysql2::Statement do 
     | 
|
| 
       270 
271 
     | 
    
         
             
                end
         
     | 
| 
       271 
272 
     | 
    
         | 
| 
       272 
273 
     | 
    
         
             
                it "should return nil for a NULL value" do
         
     | 
| 
       273 
     | 
    
         
            -
                  expect(@test_result['null_test'] 
     | 
| 
      
 274 
     | 
    
         
            +
                  expect(@test_result['null_test']).to be_an_instance_of(NilClass)
         
     | 
| 
       274 
275 
     | 
    
         
             
                  expect(@test_result['null_test']).to eql(nil)
         
     | 
| 
       275 
276 
     | 
    
         
             
                end
         
     | 
| 
       276 
277 
     | 
    
         | 
| 
       277 
278 
     | 
    
         
             
                it "should return String for a BIT(64) value" do
         
     | 
| 
       278 
     | 
    
         
            -
                  expect(@test_result['bit_test'] 
     | 
| 
      
 279 
     | 
    
         
            +
                  expect(@test_result['bit_test']).to be_an_instance_of(String)
         
     | 
| 
       279 
280 
     | 
    
         
             
                  expect(@test_result['bit_test']).to eql("\000\000\000\000\000\000\000\005")
         
     | 
| 
       280 
281 
     | 
    
         
             
                end
         
     | 
| 
       281 
282 
     | 
    
         | 
| 
       282 
283 
     | 
    
         
             
                it "should return String for a BIT(1) value" do
         
     | 
| 
       283 
     | 
    
         
            -
                  expect(@test_result['single_bit_test'] 
     | 
| 
      
 284 
     | 
    
         
            +
                  expect(@test_result['single_bit_test']).to be_an_instance_of(String)
         
     | 
| 
       284 
285 
     | 
    
         
             
                  expect(@test_result['single_bit_test']).to eql("\001")
         
     | 
| 
       285 
286 
     | 
    
         
             
                end
         
     | 
| 
       286 
287 
     | 
    
         | 
| 
         @@ -347,89 +348,89 @@ RSpec.describe Mysql2::Statement do 
     | 
|
| 
       347 
348 
     | 
    
         
             
                end
         
     | 
| 
       348 
349 
     | 
    
         | 
| 
       349 
350 
     | 
    
         
             
                it "should return BigDecimal for a DECIMAL value" do
         
     | 
| 
       350 
     | 
    
         
            -
                  expect(@test_result['decimal_test'] 
     | 
| 
      
 351 
     | 
    
         
            +
                  expect(@test_result['decimal_test']).to be_an_instance_of(BigDecimal)
         
     | 
| 
       351 
352 
     | 
    
         
             
                  expect(@test_result['decimal_test']).to eql(10.3)
         
     | 
| 
       352 
353 
     | 
    
         
             
                end
         
     | 
| 
       353 
354 
     | 
    
         | 
| 
       354 
355 
     | 
    
         
             
                it "should return Float for a FLOAT value" do
         
     | 
| 
       355 
     | 
    
         
            -
                  expect(@test_result['float_test'] 
     | 
| 
      
 356 
     | 
    
         
            +
                  expect(@test_result['float_test']).to be_an_instance_of(Float)
         
     | 
| 
       356 
357 
     | 
    
         
             
                  expect(@test_result['float_test']).to be_within(1e-5).of(10.3)
         
     | 
| 
       357 
358 
     | 
    
         
             
                end
         
     | 
| 
       358 
359 
     | 
    
         | 
| 
       359 
360 
     | 
    
         
             
                it "should return Float for a DOUBLE value" do
         
     | 
| 
       360 
     | 
    
         
            -
                  expect(@test_result['double_test'] 
     | 
| 
      
 361 
     | 
    
         
            +
                  expect(@test_result['double_test']).to be_an_instance_of(Float)
         
     | 
| 
       361 
362 
     | 
    
         
             
                  expect(@test_result['double_test']).to eql(10.3)
         
     | 
| 
       362 
363 
     | 
    
         
             
                end
         
     | 
| 
       363 
364 
     | 
    
         | 
| 
       364 
365 
     | 
    
         
             
                it "should return Time for a DATETIME value when within the supported range" do
         
     | 
| 
       365 
     | 
    
         
            -
                  expect(@test_result['date_time_test'] 
     | 
| 
      
 366 
     | 
    
         
            +
                  expect(@test_result['date_time_test']).to be_an_instance_of(Time)
         
     | 
| 
       366 
367 
     | 
    
         
             
                  expect(@test_result['date_time_test'].strftime("%Y-%m-%d %H:%M:%S")).to eql('2010-04-04 11:44:00')
         
     | 
| 
       367 
368 
     | 
    
         
             
                end
         
     | 
| 
       368 
369 
     | 
    
         | 
| 
       369 
370 
     | 
    
         
             
                if 1.size == 4 # 32bit
         
     | 
| 
       370 
     | 
    
         
            -
                   
     | 
| 
       371 
     | 
    
         
            -
                     
     | 
| 
      
 371 
     | 
    
         
            +
                  klass = if RUBY_VERSION =~ /1.8/
         
     | 
| 
      
 372 
     | 
    
         
            +
                    DateTime
         
     | 
| 
       372 
373 
     | 
    
         
             
                  else
         
     | 
| 
       373 
     | 
    
         
            -
                     
     | 
| 
      
 374 
     | 
    
         
            +
                    Time
         
     | 
| 
       374 
375 
     | 
    
         
             
                  end
         
     | 
| 
       375 
376 
     | 
    
         | 
| 
       376 
377 
     | 
    
         
             
                  it "should return DateTime when timestamp is < 1901-12-13 20:45:52" do
         
     | 
| 
       377 
     | 
    
         
            -
             
     | 
| 
      
 378 
     | 
    
         
            +
                    # 1901-12-13T20:45:52 is the min for 32bit Ruby 1.8
         
     | 
| 
       378 
379 
     | 
    
         
             
                    r = @client.query("SELECT CAST('1901-12-13 20:45:51' AS DATETIME) as test")
         
     | 
| 
       379 
     | 
    
         
            -
                    expect(r.first['test'] 
     | 
| 
      
 380 
     | 
    
         
            +
                    expect(r.first['test']).to be_an_instance_of(klass)
         
     | 
| 
       380 
381 
     | 
    
         
             
                  end
         
     | 
| 
       381 
382 
     | 
    
         | 
| 
       382 
383 
     | 
    
         
             
                  it "should return DateTime when timestamp is > 2038-01-19T03:14:07" do
         
     | 
| 
       383 
     | 
    
         
            -
             
     | 
| 
      
 384 
     | 
    
         
            +
                    # 2038-01-19T03:14:07 is the max for 32bit Ruby 1.8
         
     | 
| 
       384 
385 
     | 
    
         
             
                    r = @client.query("SELECT CAST('2038-01-19 03:14:08' AS DATETIME) as test")
         
     | 
| 
       385 
     | 
    
         
            -
                    expect(r.first['test'] 
     | 
| 
      
 386 
     | 
    
         
            +
                    expect(r.first['test']).to be_an_instance_of(klass)
         
     | 
| 
       386 
387 
     | 
    
         
             
                  end
         
     | 
| 
       387 
388 
     | 
    
         
             
                elsif 1.size == 8 # 64bit
         
     | 
| 
       388 
     | 
    
         
            -
                   
     | 
| 
       389 
     | 
    
         
            -
                    it "should return Time when timestamp is < 1901-12-13 20:45:52" do
         
     | 
| 
       390 
     | 
    
         
            -
                      r = @client.query("SELECT CAST('1901-12-13 20:45:51' AS DATETIME) as test")
         
     | 
| 
       391 
     | 
    
         
            -
                      expect(r.first['test'].class).to eql(Time)
         
     | 
| 
       392 
     | 
    
         
            -
                    end
         
     | 
| 
       393 
     | 
    
         
            -
             
     | 
| 
       394 
     | 
    
         
            -
                    it "should return Time when timestamp is > 2038-01-19T03:14:07" do
         
     | 
| 
       395 
     | 
    
         
            -
                      r = @client.query("SELECT CAST('2038-01-19 03:14:08' AS DATETIME) as test")
         
     | 
| 
       396 
     | 
    
         
            -
                      expect(r.first['test'].class).to eql(Time)
         
     | 
| 
       397 
     | 
    
         
            -
                    end
         
     | 
| 
       398 
     | 
    
         
            -
                  else
         
     | 
| 
      
 389 
     | 
    
         
            +
                  if RUBY_VERSION =~ /1.8/
         
     | 
| 
       399 
390 
     | 
    
         
             
                    it "should return Time when timestamp is > 0138-12-31 11:59:59" do
         
     | 
| 
       400 
391 
     | 
    
         
             
                      r = @client.query("SELECT CAST('0139-1-1 00:00:00' AS DATETIME) as test")
         
     | 
| 
       401 
     | 
    
         
            -
                      expect(r.first['test'] 
     | 
| 
      
 392 
     | 
    
         
            +
                      expect(r.first['test']).to be_an_instance_of(Time)
         
     | 
| 
       402 
393 
     | 
    
         
             
                    end
         
     | 
| 
       403 
394 
     | 
    
         | 
| 
       404 
395 
     | 
    
         
             
                    it "should return DateTime when timestamp is < 0139-1-1T00:00:00" do
         
     | 
| 
       405 
396 
     | 
    
         
             
                      r = @client.query("SELECT CAST('0138-12-31 11:59:59' AS DATETIME) as test")
         
     | 
| 
       406 
     | 
    
         
            -
                      expect(r.first['test'] 
     | 
| 
      
 397 
     | 
    
         
            +
                      expect(r.first['test']).to be_an_instance_of(DateTime)
         
     | 
| 
      
 398 
     | 
    
         
            +
                    end
         
     | 
| 
      
 399 
     | 
    
         
            +
             
     | 
| 
      
 400 
     | 
    
         
            +
                    it "should return Time when timestamp is > 2038-01-19T03:14:07" do
         
     | 
| 
      
 401 
     | 
    
         
            +
                      r = @client.query("SELECT CAST('2038-01-19 03:14:08' AS DATETIME) as test")
         
     | 
| 
      
 402 
     | 
    
         
            +
                      expect(r.first['test']).to be_an_instance_of(Time)
         
     | 
| 
      
 403 
     | 
    
         
            +
                    end
         
     | 
| 
      
 404 
     | 
    
         
            +
                  else
         
     | 
| 
      
 405 
     | 
    
         
            +
                    it "should return Time when timestamp is < 1901-12-13 20:45:52" do
         
     | 
| 
      
 406 
     | 
    
         
            +
                      r = @client.query("SELECT CAST('1901-12-13 20:45:51' AS DATETIME) as test")
         
     | 
| 
      
 407 
     | 
    
         
            +
                      expect(r.first['test']).to be_an_instance_of(Time)
         
     | 
| 
       407 
408 
     | 
    
         
             
                    end
         
     | 
| 
       408 
409 
     | 
    
         | 
| 
       409 
410 
     | 
    
         
             
                    it "should return Time when timestamp is > 2038-01-19T03:14:07" do
         
     | 
| 
       410 
411 
     | 
    
         
             
                      r = @client.query("SELECT CAST('2038-01-19 03:14:08' AS DATETIME) as test")
         
     | 
| 
       411 
     | 
    
         
            -
                      expect(r.first['test'] 
     | 
| 
      
 412 
     | 
    
         
            +
                      expect(r.first['test']).to be_an_instance_of(Time)
         
     | 
| 
       412 
413 
     | 
    
         
             
                    end
         
     | 
| 
       413 
414 
     | 
    
         
             
                  end
         
     | 
| 
       414 
415 
     | 
    
         
             
                end
         
     | 
| 
       415 
416 
     | 
    
         | 
| 
       416 
417 
     | 
    
         
             
                it "should return Time for a TIMESTAMP value when within the supported range" do
         
     | 
| 
       417 
     | 
    
         
            -
                  expect(@test_result['timestamp_test'] 
     | 
| 
      
 418 
     | 
    
         
            +
                  expect(@test_result['timestamp_test']).to be_an_instance_of(Time)
         
     | 
| 
       418 
419 
     | 
    
         
             
                  expect(@test_result['timestamp_test'].strftime("%Y-%m-%d %H:%M:%S")).to eql('2010-04-04 11:44:00')
         
     | 
| 
       419 
420 
     | 
    
         
             
                end
         
     | 
| 
       420 
421 
     | 
    
         | 
| 
       421 
422 
     | 
    
         
             
                it "should return Time for a TIME value" do
         
     | 
| 
       422 
     | 
    
         
            -
                  expect(@test_result['time_test'] 
     | 
| 
      
 423 
     | 
    
         
            +
                  expect(@test_result['time_test']).to be_an_instance_of(Time)
         
     | 
| 
       423 
424 
     | 
    
         
             
                  expect(@test_result['time_test'].strftime("%Y-%m-%d %H:%M:%S")).to eql('2000-01-01 11:44:00')
         
     | 
| 
       424 
425 
     | 
    
         
             
                end
         
     | 
| 
       425 
426 
     | 
    
         | 
| 
       426 
427 
     | 
    
         
             
                it "should return Date for a DATE value" do
         
     | 
| 
       427 
     | 
    
         
            -
                  expect(@test_result['date_test'] 
     | 
| 
      
 428 
     | 
    
         
            +
                  expect(@test_result['date_test']).to be_an_instance_of(Date)
         
     | 
| 
       428 
429 
     | 
    
         
             
                  expect(@test_result['date_test'].strftime("%Y-%m-%d")).to eql('2010-04-04')
         
     | 
| 
       429 
430 
     | 
    
         
             
                end
         
     | 
| 
       430 
431 
     | 
    
         | 
| 
       431 
432 
     | 
    
         
             
                it "should return String for an ENUM value" do
         
     | 
| 
       432 
     | 
    
         
            -
                  expect(@test_result['enum_test'] 
     | 
| 
      
 433 
     | 
    
         
            +
                  expect(@test_result['enum_test']).to be_an_instance_of(String)
         
     | 
| 
       433 
434 
     | 
    
         
             
                  expect(@test_result['enum_test']).to eql('val1')
         
     | 
| 
       434 
435 
     | 
    
         
             
                end
         
     | 
| 
       435 
436 
     | 
    
         | 
| 
         @@ -467,7 +468,7 @@ RSpec.describe Mysql2::Statement do 
     | 
|
| 
       467 
468 
     | 
    
         
             
                end
         
     | 
| 
       468 
469 
     | 
    
         | 
| 
       469 
470 
     | 
    
         
             
                it "should return String for a SET value" do
         
     | 
| 
       470 
     | 
    
         
            -
                  expect(@test_result['set_test'] 
     | 
| 
      
 471 
     | 
    
         
            +
                  expect(@test_result['set_test']).to be_an_instance_of(String)
         
     | 
| 
       471 
472 
     | 
    
         
             
                  expect(@test_result['set_test']).to eql('val1,val2')
         
     | 
| 
       472 
473 
     | 
    
         
             
                end
         
     | 
| 
       473 
474 
     | 
    
         | 
| 
         @@ -500,8 +501,8 @@ RSpec.describe Mysql2::Statement do 
     | 
|
| 
       500 
501 
     | 
    
         
             
                end
         
     | 
| 
       501 
502 
     | 
    
         | 
| 
       502 
503 
     | 
    
         
             
                it "should return String for a BINARY value" do
         
     | 
| 
       503 
     | 
    
         
            -
                  expect(@test_result['binary_test'] 
     | 
| 
       504 
     | 
    
         
            -
                  expect(@test_result['binary_test']).to eql("test#{"\000"*6}")
         
     | 
| 
      
 504 
     | 
    
         
            +
                  expect(@test_result['binary_test']).to be_an_instance_of(String)
         
     | 
| 
      
 505 
     | 
    
         
            +
                  expect(@test_result['binary_test']).to eql("test#{"\000" * 6}")
         
     | 
| 
       505 
506 
     | 
    
         
             
                end
         
     | 
| 
       506 
507 
     | 
    
         | 
| 
       507 
508 
     | 
    
         
             
                context "string encoding for BINARY values" do
         
     | 
| 
         @@ -538,17 +539,17 @@ RSpec.describe Mysql2::Statement do 
     | 
|
| 
       538 
539 
     | 
    
         
             
                  'medium_blob_test' => 'MEDIUMBLOB',
         
     | 
| 
       539 
540 
     | 
    
         
             
                  'medium_text_test' => 'MEDIUMTEXT',
         
     | 
| 
       540 
541 
     | 
    
         
             
                  'long_blob_test' => 'LONGBLOB',
         
     | 
| 
       541 
     | 
    
         
            -
                  'long_text_test' => 'LONGTEXT'
         
     | 
| 
      
 542 
     | 
    
         
            +
                  'long_text_test' => 'LONGTEXT',
         
     | 
| 
       542 
543 
     | 
    
         
             
                }.each do |field, type|
         
     | 
| 
       543 
544 
     | 
    
         
             
                  it "should return a String for #{type}" do
         
     | 
| 
       544 
     | 
    
         
            -
                    expect(@test_result[field] 
     | 
| 
      
 545 
     | 
    
         
            +
                    expect(@test_result[field]).to be_an_instance_of(String)
         
     | 
| 
       545 
546 
     | 
    
         
             
                    expect(@test_result[field]).to eql("test")
         
     | 
| 
       546 
547 
     | 
    
         
             
                  end
         
     | 
| 
       547 
548 
     | 
    
         | 
| 
       548 
549 
     | 
    
         
             
                  context "string encoding for #{type} values" do
         
     | 
| 
       549 
550 
     | 
    
         
             
                    before { pending('Encoding is undefined') unless defined?(Encoding) }
         
     | 
| 
       550 
551 
     | 
    
         | 
| 
       551 
     | 
    
         
            -
                    if  
     | 
| 
      
 552 
     | 
    
         
            +
                    if %w(VARBINARY TINYBLOB BLOB MEDIUMBLOB LONGBLOB).include?(type)
         
     | 
| 
       552 
553 
     | 
    
         
             
                      it "should default to binary if Encoding.default_internal is nil" do
         
     | 
| 
       553 
554 
     | 
    
         
             
                        with_internal_encoding nil do
         
     | 
| 
       554 
555 
     | 
    
         
             
                          result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
         
     | 
| 
         @@ -595,4 +596,89 @@ RSpec.describe Mysql2::Statement do 
     | 
|
| 
       595 
596 
     | 
    
         
             
                  end
         
     | 
| 
       596 
597 
     | 
    
         
             
                end
         
     | 
| 
       597 
598 
     | 
    
         
             
              end
         
     | 
| 
      
 599 
     | 
    
         
            +
             
     | 
| 
      
 600 
     | 
    
         
            +
              context 'last_id' do
         
     | 
| 
      
 601 
     | 
    
         
            +
                before(:each) do
         
     | 
| 
      
 602 
     | 
    
         
            +
                  @client.query 'USE test'
         
     | 
| 
      
 603 
     | 
    
         
            +
                  @client.query 'CREATE TABLE IF NOT EXISTS lastIdTest (`id` BIGINT NOT NULL AUTO_INCREMENT, blah INT(11), PRIMARY KEY (`id`))'
         
     | 
| 
      
 604 
     | 
    
         
            +
                end
         
     | 
| 
      
 605 
     | 
    
         
            +
             
     | 
| 
      
 606 
     | 
    
         
            +
                after(:each) do
         
     | 
| 
      
 607 
     | 
    
         
            +
                  @client.query 'DROP TABLE lastIdTest'
         
     | 
| 
      
 608 
     | 
    
         
            +
                end
         
     | 
| 
      
 609 
     | 
    
         
            +
             
     | 
| 
      
 610 
     | 
    
         
            +
                it 'should return last insert id' do
         
     | 
| 
      
 611 
     | 
    
         
            +
                  stmt = @client.prepare 'INSERT INTO lastIdTest (blah) VALUES (?)'
         
     | 
| 
      
 612 
     | 
    
         
            +
                  expect(stmt.last_id).to eq 0
         
     | 
| 
      
 613 
     | 
    
         
            +
                  stmt.execute 1
         
     | 
| 
      
 614 
     | 
    
         
            +
                  expect(stmt.last_id).to eq 1
         
     | 
| 
      
 615 
     | 
    
         
            +
                end
         
     | 
| 
      
 616 
     | 
    
         
            +
             
     | 
| 
      
 617 
     | 
    
         
            +
                it 'should handle bigint ids' do
         
     | 
| 
      
 618 
     | 
    
         
            +
                  stmt = @client.prepare 'INSERT INTO lastIdTest (id, blah) VALUES (?, ?)'
         
     | 
| 
      
 619 
     | 
    
         
            +
                  stmt.execute 5000000000, 5000
         
     | 
| 
      
 620 
     | 
    
         
            +
                  expect(stmt.last_id).to eql(5000000000)
         
     | 
| 
      
 621 
     | 
    
         
            +
             
     | 
| 
      
 622 
     | 
    
         
            +
                  stmt = @client.prepare 'INSERT INTO lastIdTest (blah) VALUES (?)'
         
     | 
| 
      
 623 
     | 
    
         
            +
                  stmt.execute 5001
         
     | 
| 
      
 624 
     | 
    
         
            +
                  expect(stmt.last_id).to eql(5000000001)
         
     | 
| 
      
 625 
     | 
    
         
            +
                end
         
     | 
| 
      
 626 
     | 
    
         
            +
              end
         
     | 
| 
      
 627 
     | 
    
         
            +
             
     | 
| 
      
 628 
     | 
    
         
            +
              context 'affected_rows' do
         
     | 
| 
      
 629 
     | 
    
         
            +
                before :each do
         
     | 
| 
      
 630 
     | 
    
         
            +
                  @client.query 'USE test'
         
     | 
| 
      
 631 
     | 
    
         
            +
                  @client.query 'CREATE TABLE IF NOT EXISTS lastIdTest (`id` BIGINT NOT NULL AUTO_INCREMENT, blah INT(11), PRIMARY KEY (`id`))'
         
     | 
| 
      
 632 
     | 
    
         
            +
                end
         
     | 
| 
      
 633 
     | 
    
         
            +
             
     | 
| 
      
 634 
     | 
    
         
            +
                after :each do
         
     | 
| 
      
 635 
     | 
    
         
            +
                  @client.query 'DROP TABLE lastIdTest'
         
     | 
| 
      
 636 
     | 
    
         
            +
                end
         
     | 
| 
      
 637 
     | 
    
         
            +
             
     | 
| 
      
 638 
     | 
    
         
            +
                it 'should return number of rows affected by an insert' do
         
     | 
| 
      
 639 
     | 
    
         
            +
                  stmt = @client.prepare 'INSERT INTO lastIdTest (blah) VALUES (?)'
         
     | 
| 
      
 640 
     | 
    
         
            +
                  expect(stmt.affected_rows).to eq 0
         
     | 
| 
      
 641 
     | 
    
         
            +
                  stmt.execute 1
         
     | 
| 
      
 642 
     | 
    
         
            +
                  expect(stmt.affected_rows).to eq 1
         
     | 
| 
      
 643 
     | 
    
         
            +
                end
         
     | 
| 
      
 644 
     | 
    
         
            +
             
     | 
| 
      
 645 
     | 
    
         
            +
                it 'should return number of rows affected by an update' do
         
     | 
| 
      
 646 
     | 
    
         
            +
                  stmt = @client.prepare 'INSERT INTO lastIdTest (blah) VALUES (?)'
         
     | 
| 
      
 647 
     | 
    
         
            +
                  stmt.execute 1
         
     | 
| 
      
 648 
     | 
    
         
            +
                  expect(stmt.affected_rows).to eq 1
         
     | 
| 
      
 649 
     | 
    
         
            +
                  stmt.execute 2
         
     | 
| 
      
 650 
     | 
    
         
            +
                  expect(stmt.affected_rows).to eq 1
         
     | 
| 
      
 651 
     | 
    
         
            +
             
     | 
| 
      
 652 
     | 
    
         
            +
                  stmt = @client.prepare 'UPDATE lastIdTest SET blah=? WHERE blah=?'
         
     | 
| 
      
 653 
     | 
    
         
            +
                  stmt.execute 0, 1
         
     | 
| 
      
 654 
     | 
    
         
            +
                  expect(stmt.affected_rows).to eq 1
         
     | 
| 
      
 655 
     | 
    
         
            +
                end
         
     | 
| 
      
 656 
     | 
    
         
            +
             
     | 
| 
      
 657 
     | 
    
         
            +
                it 'should return number of rows affected by a delete' do
         
     | 
| 
      
 658 
     | 
    
         
            +
                  stmt = @client.prepare 'INSERT INTO lastIdTest (blah) VALUES (?)'
         
     | 
| 
      
 659 
     | 
    
         
            +
                  stmt.execute 1
         
     | 
| 
      
 660 
     | 
    
         
            +
                  expect(stmt.affected_rows).to eq 1
         
     | 
| 
      
 661 
     | 
    
         
            +
                  stmt.execute 2
         
     | 
| 
      
 662 
     | 
    
         
            +
                  expect(stmt.affected_rows).to eq 1
         
     | 
| 
      
 663 
     | 
    
         
            +
             
     | 
| 
      
 664 
     | 
    
         
            +
                  stmt = @client.prepare 'DELETE FROM lastIdTest WHERE blah=?'
         
     | 
| 
      
 665 
     | 
    
         
            +
                  stmt.execute 1
         
     | 
| 
      
 666 
     | 
    
         
            +
                  expect(stmt.affected_rows).to eq 1
         
     | 
| 
      
 667 
     | 
    
         
            +
                end
         
     | 
| 
      
 668 
     | 
    
         
            +
              end
         
     | 
| 
      
 669 
     | 
    
         
            +
             
     | 
| 
      
 670 
     | 
    
         
            +
              context 'close' do
         
     | 
| 
      
 671 
     | 
    
         
            +
                it 'should free server resources' do
         
     | 
| 
      
 672 
     | 
    
         
            +
                  stmt = @client.prepare 'SELECT 1'
         
     | 
| 
      
 673 
     | 
    
         
            +
                  expect { stmt.close }.to change {
         
     | 
| 
      
 674 
     | 
    
         
            +
                    @client.query("SHOW STATUS LIKE 'Prepared_stmt_count'").first['Value'].to_i
         
     | 
| 
      
 675 
     | 
    
         
            +
                  }.by(-1)
         
     | 
| 
      
 676 
     | 
    
         
            +
                end
         
     | 
| 
      
 677 
     | 
    
         
            +
             
     | 
| 
      
 678 
     | 
    
         
            +
                it 'should raise an error on subsequent execution' do
         
     | 
| 
      
 679 
     | 
    
         
            +
                  stmt = @client.prepare 'SELECT 1'
         
     | 
| 
      
 680 
     | 
    
         
            +
                  stmt.close
         
     | 
| 
      
 681 
     | 
    
         
            +
                  expect { stmt.execute }.to raise_error(Mysql2::Error, /Invalid statement handle/)
         
     | 
| 
      
 682 
     | 
    
         
            +
                end
         
     | 
| 
      
 683 
     | 
    
         
            +
              end
         
     | 
| 
       598 
684 
     | 
    
         
             
            end
         
     |