- 01 5月, 2020 4 次提交
-
-
由 Ryuta Kamizono 提交于
`column_types` is empty except PostgreSQL adapter, and `attribute_types.each_key { |k| column_types.delete k }` is also empty even if PostgreSQL adapter almost all case, so that code is quite useless. This improves performance for `find_by_sql` to avoid that useless loop as much as possible. ```ruby ActiveRecord::Schema.define do create_table :active_storage_blobs do |t| t.string :key, null: false t.string :filename, null: false t.string :content_type t.text :metadata t.string :service_name, null: false t.bigint :byte_size, null: false t.string :checksum, null: false t.datetime :created_at, null: false t.index [ :key ], unique: true end end class ActiveStorageBlob < ActiveRecord::Base end Benchmark.ips do |x| x.report("find_by") { ActiveStorageBlob.find_by(id: 1) } end ``` Before: ``` Warming up -------------------------------------- find_by 1.256k i/100ms Calculating ------------------------------------- find_by 12.595k (± 3.4%) i/s - 64.056k in 5.091599s ``` After: ``` Warming up -------------------------------------- find_by 1.341k i/100ms Calculating ------------------------------------- find_by 13.170k (± 3.5%) i/s - 67.050k in 5.097439s ``` To avoid column types loop for PostgreSQL adapter, this skips returning additional column types if a column has already been type casted by pg decoders. Fortunately this fixes #36186 partly for common types.
-
由 Ryuta Kamizono 提交于
-
由 Ryuta Kamizono 提交于
Relying on the `Arel::Table.engine` is convenient if an app have only a single kind of database, but if not so, the global state is not always the same with the current connection.
-
- 30 4月, 2020 1 次提交
-
-
由 Ryuta Kamizono 提交于
`allowed_index_name_length` was used for internal temporary operations in SQLite3, since index name in SQLite3 must be globally unique and SQLite3 doesn't have ALTER TABLE feature (so it is emulated by creating temporary table with prefix). `allowed_index_name_length` was to reserve the margin for the prefix, but actually SQLite3 doesn't have a limitation for identifier name length, so the margin has removed at 36901e6e. Now `allowed_index_name_length` is no longer relied on by any adapter, so I'd like to remove the internal specific method which is no longer used.
-
- 28 4月, 2020 1 次提交
-
-
由 Ryuta Kamizono 提交于
Define `value_for_database` and `value_before_type_cast` methods, and use those.
-
- 27 4月, 2020 2 次提交
-
-
由 Ryuta Kamizono 提交于
-
由 Ryuta Kamizono 提交于
`in_clause_length` was added at c5a284f8 to address to Oracle IN clause length limitation. Now `in_clause_length` is entirely integrated in Arel visitor since #35838 and #36074. Since Oracle visitors are the only code that rely on `in_clause_length`. so I'd like to remove that from Rails code base, like has removed Oracle visitors (#38946).
-
- 25 4月, 2020 5 次提交
-
-
由 Abhay Nikam 提交于
Skip test cases for upsert_all on relation if database adapter doesn't support update on duplicate records
-
由 Ryuta Kamizono 提交于
If only one Arel node exist, wrapping a node by `And` node is obviously redundant, make concise Arel ast will improve performance for visiting the ast (about 20% faster for complex ast case). ```ruby class Post < ActiveRecord::Base end posts = (0..500).map { |i| Post.where(id: i) } Benchmark.ips do |x| x.report("inject scopes") { posts.inject { |res, scope| res.or(scope) }.to_sql } end ``` Before: ``` Warming up -------------------------------------- where with ids 8.000 i/100ms Calculating ------------------------------------- where with ids 80.416 (± 2.5%) i/s - 408.000 in 5.078118s ``` After: ``` Warming up -------------------------------------- where with ids 9.000 i/100ms Calculating ------------------------------------- where with ids 96.126 (± 2.1%) i/s - 486.000 in 5.058960s ```
-
由 Ryuta Kamizono 提交于
Currently, `count` and `average` always returns numeric value, but `sum`, `maximum`, and `minimum` not always return numeric value if aggregated on custom attribute type. I think that inconsistent behavior is surprising: ```ruby # All adapters except postgresql adapter are affected # by custom type casting. Book.group(:status).sum(:status) # => { "proposed" => "proposed", "published" => nil } ``` That is caused by fallback looking up cast type to `type_for(column)`. Now all supported adapters can return numeric value without that fallback, so I think we can remove that, it will also fix aggregate functions to return numeric value consistently.
-
由 Ryuta Kamizono 提交于
-
由 Ryuta Kamizono 提交于
This allows to work `author.books.insert_all` as expected. Co-authored-by: NJosef Šimánek <josef.simanek@gmail.com>
-
- 24 4月, 2020 1 次提交
-
-
由 Ryuta Kamizono 提交于
mysql2 gem have type casting mechanism from raw payload to Ruby primitive object.
-
- 23 4月, 2020 2 次提交
-
-
由 Ryuta Kamizono 提交于
There is no worth to keep those unused aliases and tests which are private API.
-
由 Flavio Wuensche 提交于
reload column_names after ignored_columns assignment code review: remove unnecessary setup and move up reload_schema_from_cache
-
- 21 4月, 2020 1 次提交
-
-
由 Marla Brizel Zeschin 提交于
Co-authored-by: NRyuta Kamizono <kamipo@gmail.com>
-
- 20 4月, 2020 2 次提交
-
-
由 Islam Taha 提交于
Update activerecord changelog Specify DB name in changelog and fix typo
-
由 Eugene Kenny 提交于
While not a particularly good idea, it's possible to use `object_id` as an attribute name, typically by defining a polymorphic association named `object`. Since 718a32ca, transactional callbacks deduplicate records by their `object_id`, but this causes incorrect behaviour when the record has an attribute with that name. Using `__id__` instead makes a naming collision much less likely.
-
- 17 4月, 2020 2 次提交
-
-
由 Ryuta Kamizono 提交于
Follow up to 404e1a0a.
-
由 Nick Burns 提交于
Co-Authored-By: NEileen M. Uchitelle <eileencodes@users.noreply.github.com>
-
- 16 4月, 2020 1 次提交
-
-
由 eileencodes 提交于
This PR allows for passing `if_exists` options to the `remove_index` method so that we can ignore already removed indexes. This work follows column `if/if_not_exists` from #38352 and `:if_not_exists` on `add_index` from #38555. We've found this useful at GitHub, there are migrations where we don't want to raise if an index was already removed. This will allow us to remove a monkey patch on `remove_index`. I considered raising after the `index_name_for_remove` method is called but that method will raise if the index doesn't exist before we get to execute. I have a commit that refactors this but after much consideration this change is cleaner and more straightforward than other ways of implementing this. This change also adds a little extra validation to the `add_index` test. Fix `nodoc` on edited methods.
-
- 15 4月, 2020 2 次提交
-
-
由 Ryuta Kamizono 提交于
#29589 changed merging scope order to allow to unscope default scopes on association scope (#29611), but that caused a regression #38811 that accidentally allow join constraint which is required. ``` % bin/test test/cases/associations/has_many_associations_test.rb -n test_unscopes_the_default_scope_of_associated_model_when_used_with_include Run options: -n test_unscopes_the_default_scope_of_associated_model_when_used_with_include --seed 32978 # Running: E Error: HasManyAssociationsTest#test_unscopes_the_default_scope_of_associated_model_when_used_with_include: NoMethodError: undefined method `children' for nil:NilClass ~/rails/activerecord/lib/active_record/associations/join_dependency/join_association.rb:39:in `block in join_constraints' ~/rails/activerecord/lib/active_record/associations/join_dependency/join_association.rb:30:in `reverse_each' ~/rails/activerecord/lib/active_record/associations/join_dependency/join_association.rb:30:in `with_index' ~/rails/activerecord/lib/active_record/associations/join_dependency/join_association.rb:30:in `join_constraints' ~/rails/activerecord/lib/active_record/associations/join_dependency.rb:171:in `make_constraints' ~/rails/activerecord/lib/active_record/associations/join_dependency.rb:196:in `block in walk' ~/rails/activerecord/lib/active_record/associations/join_dependency.rb:196:in `each' ~/rails/activerecord/lib/active_record/associations/join_dependency.rb:196:in `flat_map' ~/rails/activerecord/lib/active_record/associations/join_dependency.rb:196:in `walk' ~/rails/activerecord/lib/active_record/associations/join_dependency.rb:90:in `block in join_constraints' ~/rails/activerecord/lib/active_record/associations/join_dependency.rb:87:in `each' ~/rails/activerecord/lib/active_record/associations/join_dependency.rb:87:in `flat_map' ~/rails/activerecord/lib/active_record/associations/join_dependency.rb:87:in `join_constraints' ~/rails/activerecord/lib/active_record/relation/query_methods.rb:1226:in `build_join_query' ~/rails/activerecord/lib/active_record/relation/query_methods.rb:1211:in `build_joins' ~/rails/activerecord/lib/active_record/relation/query_methods.rb:1091:in `build_arel' ~/rails/activerecord/lib/active_record/relation/query_methods.rb:1063:in `arel' ~/rails/activerecord/lib/active_record/relation/finder_methods.rb:419:in `block in limited_ids_for' ~/rails/activerecord/lib/active_record/relation.rb:867:in `skip_query_cache_if_necessary' ~/rails/activerecord/lib/active_record/relation/finder_methods.rb:419:in `limited_ids_for' ~/rails/activerecord/lib/active_record/relation/finder_methods.rb:398:in `apply_join_dependency' ~/rails/activerecord/lib/active_record/relation.rb:839:in `block in exec_queries' ~/rails/activerecord/lib/active_record/relation.rb:867:in `skip_query_cache_if_necessary' ~/rails/activerecord/lib/active_record/relation.rb:834:in `exec_queries' ~/rails/activerecord/lib/active_record/relation.rb:639:in `load' ~/rails/activerecord/lib/active_record/relation.rb:250:in `records' ~/rails/activerecord/lib/active_record/relation/finder_methods.rb:508:in `find_take' ~/rails/activerecord/lib/active_record/relation/finder_methods.rb:98:in `take' ~/rails/activerecord/lib/active_record/relation/finder_methods.rb:458:in `find_one' ~/rails/activerecord/lib/active_record/relation/finder_methods.rb:442:in `find_with_ids' ~/rails/activerecord/lib/active_record/relation/finder_methods.rb:69:in `find' ~/rails/activerecord/test/cases/associations/has_many_associations_test.rb:2689:in `block in <class:HasManyAssociationsTest>' bin/test test/cases/associations/has_many_associations_test.rb:2683 ``` Required join constraint should not be allowed to unscoping. Fixes #38811.
-
由 Ryuta Kamizono 提交于
This removes ibm_db, informix, mssql, oracle, and oracle12 Arel visitors which are not used in the code base. Actually oracle and oracle12 visitors are used at oracle-enhanced adapter, but now I think that those visitors should be in the adapter's repo like sqlserver adapter and the dedicated Arel visitor (https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/blob/master/lib/arel/visitors/sqlserver.rb), otherwise it is hard to find a bug and review PRs for the oracle visitors (e.g. #35838, #37646), since we don't have knowledge and environment enough for Oracle.
-
- 14 4月, 2020 2 次提交
-
-
由 Ali Ibrahim 提交于
* Use ASSETS_ROOT (defined in activerecord/test/config.rb) to guarantee a valid path to schema_dump_5_1.yml.
-
由 Josh 提交于
Previously, if `build_association` was called multiple times for a `has_one` association but never committed to the database, the first newly-associated record would trigger `touch` during the attempted removal of the record. For example: class Post < ActiveRecord::Base has_one :comment, inverse_of: :post, dependent: :destroy end class Comment < ActiveRecord::Base belongs_to :post, inverse_of: :comment, touch: true end post = Post.create! comment_1 = post.build_comment comment_2 = post.build_comment When `comment_2` is initialized, the `has_one` would attempt to destroy `comment_1`, triggering a `touch` on `post` from an association record that hasn't been committed to the database. This removes the attempt to delete an associated `has_one` unless it’s persisted.
-
- 13 4月, 2020 1 次提交
-
-
由 Eugene Kenny 提交于
Followup to b94efe9f.
-
- 12 4月, 2020 4 次提交
-
-
由 Jonathan Hefner 提交于
Example failure: https://buildkite.com/rails/rails/builds/68187#333e3624-ac0d-4b23-95b9-f068d9901093/1016-1028 These tests expect the 2nd Account fixture (with a NULL `firm_id`) to be in the first four rows of the result set, but that behavior is not guaranteed without an `order`.
-
由 Ryuta Kamizono 提交于
FrontBase and IBM_DB adapters do not work for Rails 5.2. https://rubygems.org/gems/ruby-frontbase https://rubygems.org/gems/ibm_db
-
由 Ryuta Kamizono 提交于
Related #15137. Firebird related code is already removed in #15137. We have two `current_adapter?(:DB2Adapter)` in tests, but the adapter is no longer maintained (last release is November 15, 2012). https://rubygems.org/gems/db2 Yet another (latest) DB2 adapter (`IBM_DBAdapter`) might support Rails 5.0.7, but apparently do not work for Rails 5.2. https://rubygems.org/gems/ibm_db We have few lines mention about DB2 in the doc, but now there is no worth for almost all current users.
-
由 Kir Shatrov 提交于
-
- 10 4月, 2020 2 次提交
-
-
由 Ryuta Kamizono 提交于
#37523 has a regression that ignore extra scoping in callbacks when create on association relation. It should respect `klass.current_scope` even when create on association relation to allow extra scoping in callbacks. Fixes #38741.
-
由 Eugene Kenny 提交于
This module was added in 16ae3db5 to allow `ActiveRecord::AttributeMethods::Dirty` to define callbacks and still have its `_update_record` method wrapped by the version defined in `ActiveRecord::Callbacks`, so that updates in `before_update` callbacks are taken into account for partial writes. The callbacks that created this circular dependency were removed in 34f075fe, so we can move the callback definitions back to the `Callbacks` module.
-
- 08 4月, 2020 1 次提交
-
-
由 eileencodes 提交于
Testing that when you set a symbol for an enum type, you get a string back and that when you set a string you also get a string back.
-
- 07 4月, 2020 1 次提交
-
-
由 alimi 提交于
* Fix EagerLoadPolyAssocsTest setup * EagerLoadPolyAssocsTest includes a Remembered module in multiple test ActiveRecord classes. The module is supposed to keep track of records created for each of the included classes individually, but it collects all records for every class. This happens because @@remembered is defined on the Remembered module and shared between the ActiveRecord classes. This only becomes an issue for databases (like CockroachDB) that use random primary keys instead of sequential ones by default. * To fix the bug, we can make the remembered collection name unique per ActiveRecord class. * Update EagerLoadPolyAssocsTest test setup * Instead of defining remembered as a class variable, we can define it as an instance variable that will be unique to every class that includes the Remembered module.
-
- 04 4月, 2020 1 次提交
-
-
由 Nick Burns 提交于
- adds the option `metadata_table` to a database connection
-
- 29 3月, 2020 2 次提交
-
-
由 Prathamesh Sonpatki 提交于
When we try to create a table which already exists which also adds indexes, then the `if_not_exists` option passed to `create_table` is not extended to indexes. So the migration results into an error if the table and indexes already exist. This change extends the `if_not_exists` support to `add_index` so that if the migration tries to create a table which also has existing indexes, error won't be raised. Also as a side-effect individual `add_index` calls will also accept `if_not_exists` option and respect it henceforth. [Prathamesh Sonpatki, Justin George]
-
- 27 3月, 2020 1 次提交
-
-
由 eileencodes 提交于
This reverts commit f265e0dd, reversing changes made to 08dfa921. Reverted due to surprising behavior for applications. We need to deprecate this behavior first instead of raising by default.
-
- 25 3月, 2020 1 次提交
-
-
由 Alexey Vasiliev 提交于
-