提交 bde898c1 编写于 作者: R Ryuta Kamizono

Prevent write queries for `exec_query`

Follow up #34505.
上级 bad1041b
......@@ -609,6 +609,10 @@ def load_additional_types(oids = nil)
FEATURE_NOT_SUPPORTED = "0A000" #:nodoc:
def execute_and_clear(sql, name, binds, prepare: false)
if preventing_writes? && write_query?(sql)
raise ActiveRecord::ReadOnlyError, "Write query attempted while in readonly mode: #{sql}"
end
if without_prepared_statement?(binds)
result = exec_no_cache(sql, name, [])
elsif !prepare
......
......@@ -209,7 +209,7 @@ def disable_referential_integrity # :nodoc:
# DATABASE STATEMENTS ======================================
#++
READ_QUERY = ActiveRecord::ConnectionAdapters::AbstractAdapter.build_read_query_regexp(:select) # :nodoc:
READ_QUERY = ActiveRecord::ConnectionAdapters::AbstractAdapter.build_read_query_regexp(:select, :pragma) # :nodoc:
private_constant :READ_QUERY
def write_query?(sql) # :nodoc:
......@@ -222,6 +222,10 @@ def explain(arel, binds = [])
end
def exec_query(sql, name = nil, binds = [], prepare: false)
if preventing_writes? && write_query?(sql)
raise ActiveRecord::ReadOnlyError, "Write query attempted while in readonly mode: #{sql}"
end
materialize_transactions
type_casted_binds = type_casted_binds(binds)
......
......@@ -165,6 +165,43 @@ class << @connection
end
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')")
end
end
end
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'")
end
end
end
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'")
end
end
end
def test_doesnt_error_when_a_select_query_is_called_while_preventing_writes
@connection.insert("INSERT INTO subscribers(nick) VALUES ('138853948594')")
@connection.while_preventing_writes do
result = @connection.select_all("SELECT subscribers.* FROM subscribers WHERE nick = '138853948594'")
assert_equal 1, result.length
end
end
def test_uniqueness_violations_are_translated_to_specific_exception
@connection.execute "INSERT INTO subscribers(nick) VALUES('me')"
error = assert_raises(ActiveRecord::RecordNotUnique) do
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册