From: "jeremyevans0 (Jeremy Evans) via ruby-core" Date: 2025-10-30T16:36:34+00:00 Subject: [ruby-core:123617] [Ruby Bug#21654] Set#new calls extra methods compared to previous versions Issue #21654 has been updated by jeremyevans0 (Jeremy Evans). tenderlovemaking (Aaron Patterson) wrote in #note-10: > mame (Yusuke Endoh) wrote in #note-9: > > Dan0042 (Daniel DeLorme) wrote in #note-7: > > > What that really what you meant by "checking if Range#end is nil is good enough" ? > > > > Yes. The original issue (#21513) was about the consistency between `(1..).to_a` and `(1..).to_set`. Since `(1..1/0.0).to_a` hangs, I think it's fine if `(1..1/0.0).to_set` also hangs. > > > > Admittedly, I'm biased: I generally feel that proactively raising exceptions for endless range operations is unnecessary. If an operation hangs, let it hang. > > I personally agree with this. If I write an infinite loop, I expect it to loop infinitely, even if I wrote the infinite loop by mistake. Calling `to_a` or `to_set` on an infinite range is iterating infinitely. I agree with @mame and @tenderlovemaking. Removing special handling of infinite ranges avoids the original issue (calling `size`), as well as avoiding the `nil` vs `Infinity` range end issue. I think we should just revert commit:d4020dd5faf28486123853e7f00c36139fc07793. ---------------------------------------- Bug #21654: Set#new calls extra methods compared to previous versions https://bugs.ruby-lang.org/issues/21654#change-115003 * Author: tenderlovemaking (Aaron Patterson) * Status: Open * ruby -v: ruby 3.5.0dev (2025-10-24T15:50:47Z master a9f24aaccb) +PRISM [arm64-darwin25] * Backport: 3.2: UNKNOWN, 3.3: UNKNOWN, 3.4: UNKNOWN ---------------------------------------- I'm trying to test Ruby 3.5.0 with our Rails application and we've found that `Set.new` is now causing extra database queries to happen. The changes in d4020dd5faf call "size" on enumerable objects that are passed to the `new` method, and this causes extra "COUNT" queries to happen with ActiveRecord associations. For example: ```ruby Set.new(some_activerecord_association) ``` Previously, the above code would only do one query by iterating over the association. Now it issues two queries, a count query, and then the normal query for results. Since d4020dd5faf is dealing with endless ranges, I would like to narrow the scope from all Enumerable objects to just Ranges. Unfortunately, I noticed we have a test like this: ```ruby assert_raise(ArgumentError) { Set.new(1.upto(Float::INFINITY)) } ``` I'm not sure how we can handle such a case without testing `size`. -- https://bugs.ruby-lang.org/ ______________________________________________ ruby-core mailing list -- ruby-core@ml.ruby-lang.org To unsubscribe send an email to ruby-core-leave@ml.ruby-lang.org ruby-core info -- https://ml.ruby-lang.org/mailman3/lists/ruby-core.ml.ruby-lang.org/