aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib/active_record/core.rb
diff options
context:
space:
mode:
authorRyuta Kamizono <kamipo@gmail.com>2017-07-21 12:26:09 +0900
committerRyuta Kamizono <kamipo@gmail.com>2019-01-18 16:01:14 +0900
commitc196ca72a0dfbea5f1730f830ea20a9e02a3c737 (patch)
tree2017197758672519af2a2ef44eb674af35491a99 /activerecord/lib/active_record/core.rb
parent31ffbf8d5056137717da3f11d28c4fbd7fbc8f07 (diff)
downloadrails-c196ca72a0dfbea5f1730f830ea20a9e02a3c737.tar.gz
rails-c196ca72a0dfbea5f1730f830ea20a9e02a3c737.tar.bz2
rails-c196ca72a0dfbea5f1730f830ea20a9e02a3c737.zip
Ensure `StatementCache#execute` never raises `RangeError`
Since 31ffbf8d, finder methods no longer raise `RangeError`. So `StatementCache#execute` is the only place to raise the exception for finder queries. `StatementCache` is used for simple equality queries in the codebase. This means that if `StatementCache#execute` raises `RangeError`, the result could always be regarded as empty. So `StatementCache#execute` just return nil in that range error case, and treat that as empty in the caller side, then we can avoid catching the exception in much places.
Diffstat (limited to 'activerecord/lib/active_record/core.rb')
-rw-r--r--activerecord/lib/active_record/core.rb9
1 files changed, 2 insertions, 7 deletions
diff --git a/activerecord/lib/active_record/core.rb b/activerecord/lib/active_record/core.rb
index 600825659b..369d63e40a 100644
--- a/activerecord/lib/active_record/core.rb
+++ b/activerecord/lib/active_record/core.rb
@@ -169,15 +169,12 @@ module ActiveRecord
where(key => params.bind).limit(1)
}
- record = statement.execute([id], connection).first
+ record = statement.execute([id], connection)&.first
unless record
raise RecordNotFound.new("Couldn't find #{name} with '#{primary_key}'=#{id}",
name, primary_key, id)
end
record
- rescue ::RangeError
- raise RecordNotFound.new("Couldn't find #{name} with an out of range value for '#{primary_key}'",
- name, primary_key)
end
def find_by(*args) # :nodoc:
@@ -201,11 +198,9 @@ module ActiveRecord
where(wheres).limit(1)
}
begin
- statement.execute(hash.values, connection).first
+ statement.execute(hash.values, connection)&.first
rescue TypeError
raise ActiveRecord::StatementInvalid
- rescue ::RangeError
- nil
end
end