ranguba/rroonga — pull request #27 by rutice (2014-10-17 16:19:27+00:00)
Title: Fix assigning column value by Integer after String

最初、再現手順が分からず、たまに起きる現象で数週間はまりました。。。

### 問題
IntegerのカラムにStringで代入した後、Integerで代入すると例外`Groonga::InvalidArgument`が発生する。
```
record.rb:100:in `[]=': invalid argument: : failed to cast to : <"\u0010'">: #, name: , path: , domain:

, range: , flags: > (Groonga::InvalidArgument)
```

`rb_grn_fix_size_column_array_set`から呼ばれる`RVAL2GRNVALUE`で、
入力が`String`だと、保存する値を格納する`value`の`domain`が`GRN_DB_TEXT`になり、
その次の呼び出しで`Fixnum`で呼ばれたとしてもそのままになってしまい、
バイナリの整数にもかかわらず、`grn_obj_cast`で文字列としてキャストを試みた末に失敗する。

これが正しいっていう直し方はよく分かりませんが、
`rb_grn_bulk_from_ruby_object_with_type()`で`bulk`のタイプが期待と違ったときに、
`grn_obj_reinit`するようにしました。

（最初は https://github.com/rutice/rroonga/commit/caa53a6ad9321bed3eb08a6bc4d409ff344be73e のようにカラムのタイプと`value`のタイプが違うときに直すようにしたが、
Referenceカラムに整数でセットするときとか毎回行ったり来たりになるのでやめました）

テストはとりあえず問題になったケースで例外投げないことを確認する程度のを付けました。
ご確認いただき、マージの検討よろしくお願いします。

### 再現コード
```ruby
require 'groonga'

PATH = 'tmp_test_database'

begin
db = Groonga::Database.create(:path => PATH)
rescue
Groonga::Database.open(PATH).remove
puts 'old database removed. try again!'
exit
end

Groonga::Schema.define do |schema|
schema.create_table('Table') do |table|
table.integer32('column')
end
end

Groonga[:Table].add(:column => "1000")
Groonga[:Table].add(:column => 10000) # raise Groonga::InvalidArgument

db.remove
```