diff --git a/lib/activerecord-import/import.rb b/lib/activerecord-import/import.rb index be994d2e..ef2629e1 100644 --- a/lib/activerecord-import/import.rb +++ b/lib/activerecord-import/import.rb @@ -772,7 +772,9 @@ def values_sql_for_columns_and_attributes(columns, array_of_attributes) # :nodoc if serialized_attributes.include?(column.name) val = serialized_attributes[column.name].dump(val) end - connection_memo.quote(column.type_cast(val), column) + # Fixes #443 to support binary (i.e. bytea) columns on PG + val = column.type_cast(val) unless column.type.to_sym == :binary + connection_memo.quote(val, column) end end end diff --git a/test/schema/postgresql_schema.rb b/test/schema/postgresql_schema.rb index 53dc7874..43b004ab 100644 --- a/test/schema/postgresql_schema.rb +++ b/test/schema/postgresql_schema.rb @@ -36,6 +36,7 @@ t.column :alarm_type, :integer, null: false t.column :status, :integer, null: false t.column :metadata, :text + t.column :secret_key, :binary t.datetime :created_at t.datetime :updated_at end diff --git a/test/support/postgresql/import_examples.rb b/test/support/postgresql/import_examples.rb index 7c8a2c73..d1a20a8f 100644 --- a/test/support/postgresql/import_examples.rb +++ b/test/support/postgresql/import_examples.rb @@ -231,6 +231,17 @@ def should_support_postgresql_import_functionality end end +describe "with binary field" do + let(:binary_value) { "\xE0'c\xB2\xB0\xB3Bh\\\xC2M\xB1m\\I\xC4r".force_encoding('ASCII-8BIT') } + it "imports the correct values for binary fields" do + alarms = [Alarm.new(device_id: 1, alarm_type: 1, status: 1, secret_key: binary_value)] + assert_difference "Alarm.count", +1 do + Alarm.import alarms + end + assert_equal(binary_value, Alarm.first.secret_key) + end +end + def should_support_postgresql_upsert_functionality should_support_basic_on_duplicate_key_update should_support_on_duplicate_key_ignore