aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord
diff options
context:
space:
mode:
authorMatthew M. Boedicker <matthewm@boedicker.org>2013-03-08 08:22:33 -0800
committerMatthew M. Boedicker <matthewm@boedicker.org>2013-03-11 23:14:46 -0700
commitd3e5118e7d42a9425b843190380d12ed3ce1e5f9 (patch)
tree889736b79604b2cc90664d93dd1fa94d3a458ca1 /activerecord
parentf278deb712b16c7897d63a6565bea3431ec0d38a (diff)
downloadrails-d3e5118e7d42a9425b843190380d12ed3ce1e5f9.tar.gz
rails-d3e5118e7d42a9425b843190380d12ed3ce1e5f9.tar.bz2
rails-d3e5118e7d42a9425b843190380d12ed3ce1e5f9.zip
Pass column to quote when copying a sqlite table.
To make quote escape binary data correctly it needs the column passed in.
Diffstat (limited to 'activerecord')
-rw-r--r--activerecord/CHANGELOG.md9
-rw-r--r--activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb10
-rw-r--r--activerecord/test/cases/adapters/sqlite3/copy_table_test.rb6
3 files changed, 23 insertions, 2 deletions
diff --git a/activerecord/CHANGELOG.md b/activerecord/CHANGELOG.md
index 943c2dec16..930a28b752 100644
--- a/activerecord/CHANGELOG.md
+++ b/activerecord/CHANGELOG.md
@@ -1,5 +1,14 @@
## Rails 4.0.0 (unreleased) ##
+* Fix quoting for sqlite migrations using copy_table_contents() with binary
+ columns.
+
+ These would fail with "SQLite3::SQLException: unrecognized token" because
+ the column was not being passed to quote() so the data was not quoted
+ correctly.
+
+ *Matthew M. Boedicker*
+
* Promotes `change_column_null` to the migrations API. This macro sets/removes
`NOT NULL` constraints, and accepts an optional argument to replace existing
`NULL`s if needed. The adapters for SQLite, MySQL, PostgreSQL, and (at least)
diff --git a/activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb b/activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb
index 84fa1c7d5a..d3ffee3a8b 100644
--- a/activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb
+++ b/activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb
@@ -583,9 +583,17 @@ module ActiveRecord
quoted_columns = columns.map { |col| quote_column_name(col) } * ','
quoted_to = quote_table_name(to)
+
+ raw_column_mappings = Hash[columns(from).map { |c| [c.name, c] }]
+
exec_query("SELECT * FROM #{quote_table_name(from)}").each do |row|
sql = "INSERT INTO #{quoted_to} (#{quoted_columns}) VALUES ("
- sql << columns.map {|col| quote row[column_mappings[col]]} * ', '
+
+ column_values = columns.map do |col|
+ quote(row[column_mappings[col]], raw_column_mappings[col])
+ end
+
+ sql << column_values * ', '
sql << ')'
exec_query sql
end
diff --git a/activerecord/test/cases/adapters/sqlite3/copy_table_test.rb b/activerecord/test/cases/adapters/sqlite3/copy_table_test.rb
index d03d1dd94c..21fb111c91 100644
--- a/activerecord/test/cases/adapters/sqlite3/copy_table_test.rb
+++ b/activerecord/test/cases/adapters/sqlite3/copy_table_test.rb
@@ -1,7 +1,7 @@
require "cases/helper"
class CopyTableTest < ActiveRecord::TestCase
- fixtures :customers, :companies, :comments
+ fixtures :customers, :companies, :comments, :binaries
def setup
@connection = ActiveRecord::Base.connection
@@ -72,6 +72,10 @@ class CopyTableTest < ActiveRecord::TestCase
end
end
+ def test_copy_table_with_binary_column
+ test_copy_table 'binaries', 'binaries2'
+ end
+
protected
def copy_table(from, to, options = {})
@connection.copy_table(from, to, {:temporary => true}.merge(options))