aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord
diff options
context:
space:
mode:
authorRyuta Kamizono <kamipo@gmail.com>2018-12-12 23:12:51 +0900
committerRyuta Kamizono <kamipo@gmail.com>2018-12-12 23:14:26 +0900
commit7d83ef4f7bd9e5766ebdb438370621a98be06a7c (patch)
treeaedab859c324176a5eef2b9cc9f6854734ff53bc /activerecord
parent4dd06452ef2745423c1643835483ef72cddfdaed (diff)
downloadrails-7d83ef4f7bd9e5766ebdb438370621a98be06a7c.tar.gz
rails-7d83ef4f7bd9e5766ebdb438370621a98be06a7c.tar.bz2
rails-7d83ef4f7bd9e5766ebdb438370621a98be06a7c.zip
Ensure that preventing writes is invoked before `materialize_transactions` consistently
Diffstat (limited to 'activerecord')
-rw-r--r--activerecord/lib/active_record/connection_adapters/mysql/database_statements.rb6
-rw-r--r--activerecord/test/cases/adapter_test.rb30
2 files changed, 23 insertions, 13 deletions
diff --git a/activerecord/lib/active_record/connection_adapters/mysql/database_statements.rb b/activerecord/lib/active_record/connection_adapters/mysql/database_statements.rb
index e1b791fe41..6adcc14545 100644
--- a/activerecord/lib/active_record/connection_adapters/mysql/database_statements.rb
+++ b/activerecord/lib/active_record/connection_adapters/mysql/database_statements.rb
@@ -40,8 +40,6 @@ module ActiveRecord
end
def exec_query(sql, name = "SQL", binds = [], prepare: false)
- materialize_transactions
-
if without_prepared_statement?(binds)
execute_and_free(sql, name) do |result|
if result
@@ -62,8 +60,6 @@ module ActiveRecord
end
def exec_delete(sql, name = nil, binds = [])
- materialize_transactions
-
if without_prepared_statement?(binds)
execute_and_free(sql, name) { @connection.affected_rows }
else
@@ -126,6 +122,8 @@ module ActiveRecord
raise ActiveRecord::ReadOnlyError, "Write query attempted while in readonly mode: #{sql}"
end
+ materialize_transactions
+
# make sure we carry over any changes to ActiveRecord::Base.default_timezone that have been
# made since we established the connection
@connection.query_options[:database_timezone] = ActiveRecord::Base.default_timezone
diff --git a/activerecord/test/cases/adapter_test.rb b/activerecord/test/cases/adapter_test.rb
index 79a431c7ee..3d31533ec8 100644
--- a/activerecord/test/cases/adapter_test.rb
+++ b/activerecord/test/cases/adapter_test.rb
@@ -166,9 +166,13 @@ module ActiveRecord
end
def test_errors_when_an_insert_query_is_called_while_preventing_writes
- assert_raises(ActiveRecord::ReadOnlyError) do
- @connection.while_preventing_writes do
- @connection.insert("INSERT INTO subscribers(nick) VALUES ('138853948594')")
+ assert_no_queries do
+ assert_raises(ActiveRecord::ReadOnlyError) do
+ @connection.while_preventing_writes do
+ @connection.transaction do
+ @connection.insert("INSERT INTO subscribers(nick) VALUES ('138853948594')", nil, false)
+ end
+ end
end
end
end
@@ -176,9 +180,13 @@ module ActiveRecord
def test_errors_when_an_update_query_is_called_while_preventing_writes
@connection.insert("INSERT INTO subscribers(nick) VALUES ('138853948594')")
- assert_raises(ActiveRecord::ReadOnlyError) do
- @connection.while_preventing_writes do
- @connection.update("UPDATE subscribers SET nick = '9989' WHERE nick = '138853948594'")
+ assert_no_queries do
+ assert_raises(ActiveRecord::ReadOnlyError) do
+ @connection.while_preventing_writes do
+ @connection.transaction do
+ @connection.update("UPDATE subscribers SET nick = '9989' WHERE nick = '138853948594'")
+ end
+ end
end
end
end
@@ -186,9 +194,13 @@ module ActiveRecord
def test_errors_when_a_delete_query_is_called_while_preventing_writes
@connection.insert("INSERT INTO subscribers(nick) VALUES ('138853948594')")
- assert_raises(ActiveRecord::ReadOnlyError) do
- @connection.while_preventing_writes do
- @connection.delete("DELETE FROM subscribers WHERE nick = '138853948594'")
+ assert_no_queries do
+ assert_raises(ActiveRecord::ReadOnlyError) do
+ @connection.while_preventing_writes do
+ @connection.transaction do
+ @connection.delete("DELETE FROM subscribers WHERE nick = '138853948594'")
+ end
+ end
end
end
end