提交 0c7c6286 编写于 作者: Y Yves Senn

pg, `disable_referential_integrity` only catches AR errors.

This change was prompted by 598b8418.
上级 598b8418
......@@ -14,7 +14,7 @@ def disable_referential_integrity # :nodoc:
transaction(requires_new: true) do
execute(tables.collect { |name| "ALTER TABLE #{quote_table_name(name)} DISABLE TRIGGER ALL" }.join(";"))
end
rescue => e
rescue ActiveRecord::ActiveRecordError => e
original_exception = e
end
......@@ -37,7 +37,7 @@ def disable_referential_integrity # :nodoc:
transaction(requires_new: true) do
execute(tables.collect { |name| "ALTER TABLE #{quote_table_name(name)} ENABLE TRIGGER ALL" }.join(";"))
end
rescue
rescue ActiveRecord::ActiveRecordError
end
else
yield
......
......@@ -6,9 +6,13 @@ class PostgreSQLReferentialIntegrityTest < ActiveRecord::TestCase
include ConnectionHelper
IS_REFERENTIAL_INTEGRITY_SQL = lambda do |sql|
sql.match(/DISABLE TRIGGER ALL/) || sql.match(/ENABLE TRIGGER ALL/)
end
module MissingSuperuserPrivileges
def execute(sql)
if sql.match(/DISABLE TRIGGER ALL/) || sql.match(/ENABLE TRIGGER ALL/)
if IS_REFERENTIAL_INTEGRITY_SQL.call(sql)
super "BROKEN;" rescue nil # put transaction in broken state
raise ActiveRecord::StatementInvalid, 'PG::InsufficientPrivilege'
else
......@@ -17,6 +21,16 @@ def execute(sql)
end
end
module ProgrammerMistake
def execute(sql)
if IS_REFERENTIAL_INTEGRITY_SQL.call(sql)
raise ArgumentError, 'something is not right.'
else
super
end
end
end
def setup
@connection = ActiveRecord::Base.connection
end
......@@ -81,6 +95,14 @@ def test_does_not_break_nested_transactions
end
end
def test_only_catch_active_record_errors_others_bubble_up
@connection.extend ProgrammerMistake
assert_raises ArgumentError do
@connection.disable_referential_integrity {}
end
end
private
def assert_transaction_is_not_broken
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册