-
Notifications
You must be signed in to change notification settings - Fork 317
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[WIP] Support ActiveRecord::ReadOnlyError
#1898
Conversation
One of these failures are due to
$ ARCONN=oracle bin/test test/cases/adapter_test.rb -n test_errors_when_a_delete_query_is_called_while_preventing_writes
Using oracle
Run options: -n test_errors_when_a_delete_query_is_called_while_preventing_writes --seed 60387
# Running:
"=========================================="
"preventing_writes?: true"
"write_query?: false"
"sql: SAVEPOINT active_record_1"
"1111111111111111111111"
F
Failure:
ActiveRecord::AdapterTest#test_errors_when_a_delete_query_is_called_while_preventing_writes [/home/yahonda/git/rails/activerecord/test/cases/adapter_test.rb:206]:
ActiveRecord::ReadOnlyError expected but nothing was raised.
bin/test test/cases/adapter_test.rb:203
Finished in 0.228083s, 4.3844 runs/s, 4.3844 assertions/s.
1 runs, 1 assertions, 1 failures, 0 errors, 0 skips
$
$ git diff
diff --git a/lib/active_record/connection_adapters/oracle_enhanced/database_statements.rb b/lib/active_record/connection_adapters/oracle_enhanced/database_statements.rb
index 085b317b..09b5811b 100644
--- a/lib/active_record/connection_adapters/oracle_enhanced/database_statements.rb
+++ b/lib/active_record/connection_adapters/oracle_enhanced/database_statements.rb
@@ -17,6 +17,10 @@ module ActiveRecord
# Executes a SQL statement
def execute(sql, name = nil)
+ p '=========================================='
+ p "preventing_writes?: #{preventing_writes?}"
+ p "write_query?: #{write_query?(sql)}"
+ p "sql: #{sql}"
if preventing_writes? && write_query?(sql)
raise ActiveRecord::ReadOnlyError, "Write query attempted while in readonly mode: #{sql}"
end
$
+++ b/activerecord/test/cases/adapter_test.rb
@@ -207,6 +207,7 @@ def test_errors_when_a_delete_query_is_called_while_preventing_writes
assert_raises(ActiveRecord::ReadOnlyError) do
@connection_handler.while_preventing_writes do
@connection.transaction do
+ p '1111111111111111111111'
@connection.delete("DELETE FROM subscribers WHERE nick = '138853948594'")
end
end
$ |
Here the first statement is "=========================================="
"preventing_writes?: true"
"write_query?: true"
"sql: DELETE FROM subscribers WHERE nick = '138853948594'"
"==========================================" $ ARCONN=mysql2 bin/test test/cases/adapter_test.rb -n test_errors_when_a_delete_query_is_called_while_preventing_writes
Using mysql2
"=========================================="
"preventing_writes?: false"
"write_query?: false"
"sql: SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci, @@SESSION.sql_mode = CONCAT(CONCAT(@@sql_mode, ',STRICT_ALL_TABLES'), ',NO_AUTO_VALUE_ON_ZERO'), @@SESSION.sql_auto_is_null = 0, @@SESSION.wait_timeout = 2147483"
Run options: -n test_errors_when_a_delete_query_is_called_while_preventing_writes --seed 65422
# Running:
"=========================================="
"preventing_writes?: false"
"write_query?: false"
"sql: BEGIN"
"=========================================="
"preventing_writes?: false"
"write_query?: false"
"sql: BEGIN"
"=========================================="
"preventing_writes?: false"
"write_query?: true"
"sql: INSERT INTO subscribers(nick) VALUES ('138853948594')"
"1111111111111111111111"
"=========================================="
"preventing_writes?: true"
"write_query?: true"
"sql: DELETE FROM subscribers WHERE nick = '138853948594'"
"=========================================="
"preventing_writes?: false"
"write_query?: false"
"sql: ROLLBACK"
"=========================================="
"preventing_writes?: false"
"write_query?: false"
"sql: ROLLBACK"
.
Finished in 0.010384s, 96.3020 runs/s, 192.6040 assertions/s.
1 runs, 2 assertions, 0 failures, 0 errors, 0 skips
$ $ git diff
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 bbcdc96cdc..4b4a24c68a 100644
--- a/activerecord/lib/active_record/connection_adapters/mysql/database_statements.rb
+++ b/activerecord/lib/active_record/connection_adapters/mysql/database_statements.rb
@@ -37,6 +37,10 @@ def explain(arel, binds = [])
# Executes the SQL statement in the context of this connection.
def execute(sql, name = nil)
+ p '=========================================='
+ p "preventing_writes?: #{preventing_writes?}"
+ p "write_query?: #{write_query?(sql)}"
+ p "sql: #{sql}"
if preventing_writes? && write_query?(sql)
raise ActiveRecord::ReadOnlyError, "Write query attempted while in readonly mode: #{sql}"
end
diff --git a/activerecord/test/cases/adapter_test.rb b/activerecord/test/cases/adapter_test.rb
index 0bc617edbe..885c32be7b 100644
--- a/activerecord/test/cases/adapter_test.rb
+++ b/activerecord/test/cases/adapter_test.rb
@@ -207,6 +207,7 @@ def test_errors_when_a_delete_query_is_called_while_preventing_writes
assert_raises(ActiveRecord::ReadOnlyError) do
@connection_handler.while_preventing_writes do
@connection.transaction do
+ p '1111111111111111111111'
@connection.delete("DELETE FROM subscribers WHERE nick = '138853948594'")
end
end
$ |
Looks like Oracle enhanced adapter needs rails/rails#32647 support first. Because Oracle database itself does not need |
This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions. |
Let me just ping this issue. |
This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions. |
Refer rails/rails#34505 rails/rails#34632