1. 07 6月, 2018 3 次提交
    • R
      Fix GROUP BY queries to apply LIMIT/OFFSET after aggregations · 63e35a13
      Ryuta Kamizono 提交于
      If `eager_loading` is true, `apply_join_dependency` force applies
      LIMIT/OFFSET before JOINs by `limited_ids_for` to keep parent records
      count. But for aggregation queries, LIMIT/OFFSET should be applied after
      aggregations the same as SQL semantics.
      
      And also, we could not replace SELECT list by `limited_ids_for` when a
      query has a GROUP BY clause. It had never been worked since it will
      causes generating invalid SQL for MySQL, PostgreSQL, and probably most
      backends.
      
      ```
      % ARCONN=postgresql be ruby -w -Itest test/cases/calculations_test.rb -n test_group_by_with_limit
      Using postgresql
      Run options: -n test_group_by_with_limit --seed 20925
      
      # Running:
      
      E
      
      Error:
      CalculationsTest#test_group_by_with_limit:
      ActiveRecord::StatementInvalid: PG::GroupingError: ERROR:  column "posts.id" must appear in the GROUP BY clause or be used in an aggregate function
      LINE 1: SELECT  DISTINCT "posts"."id", "posts"."type" AS alias_0 FRO...                         ^
      : SELECT  DISTINCT "posts"."id", "posts"."type" AS alias_0 FROM "posts" LEFT OUTER JOIN "comments" ON "comments"."post_id" = "posts"."id" GROUP BY "posts"."type" ORDER BY "posts"."type" ASC LIMIT $1
      ```
      
      Fixes #8103.
      Closes #27249.
      63e35a13
    • R
      Fix `collection.create` to could be rolled back by `after_save` · 5dc72378
      Ryuta Kamizono 提交于
      In `_create_record`, explicit `transaction` block requires rollback
      handling manually when `insert_record` is failed.
      
      We need to handle it in `_create_record`, not in `insert_record`, since
      our test cases expect a record added to target and returned even if
      `insert_record` is failed,
      
      Closes #31488.
      5dc72378
    • R
      Reuse existing model for testing duplicated children records · 48c95cf7
      Ryuta Kamizono 提交于
      Follow up of #32952.
      48c95cf7
  2. 06 6月, 2018 2 次提交
  3. 04 6月, 2018 2 次提交
  4. 03 6月, 2018 1 次提交
  5. 02 6月, 2018 1 次提交
  6. 01 6月, 2018 1 次提交
    • Y
      CI against MariaDB 10.3 · 4d652936
      Yasuo Honda 提交于
      - MariaDB 10.3.7 is the first GA release
      https://mariadb.com/kb/en/library/mariadb-1037-release-notes/
      
      - MariaDB 10.3 translates `LENGTH()` to `OCTET_LENGTH()` function
      
      https://mariadb.com/kb/en/library/sql_modeoracle-from-mariadb-103/
      > MariaDB translates LENGTH() to OCTET_LENGTH()
      
      - MySQL does NOT translate `LENGTH()` to `OCTET_LENGTH()`
      However, it translates `OCTET_LENGTH()` to `LENGTH()`
      
      Here are generated schema dumps of this test to show the differences
      between MySQL and MariaDB:
      
      * MySQL 8.0 (Server version: 8.0.11 MySQL Community Server - GPL)
      ```ruby
        create_table \"virtual_columns\", options: \"ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci\", force: :cascade do |t|
          t.string \"name\"
          t.virtual \"upper_name\", type: :string, as: \"upper(`name`)\"
          t.virtual \"name_length\", type: :integer, as: \"length(`name`)\", stored: true
          t.virtual \"name_octet_length\", type: :integer, as: \"length(`name`)\", stored: true
        end
      ```
      
      * Maria DB 10.3 (Server version: 10.3.7-MariaDB-1:10.3.7+maria~bionic-log mariadb.org binary distribution)
      
      ```ruby
        create_table \"virtual_columns\", options: \"ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci\", force: :cascade do |t|
          t.string \"name\"
          t.virtual \"upper_name\", type: :string, as: \"ucase(`name`)\"
          t.virtual \"name_length\", type: :integer, as: \"octet_length(`name`)\", stored: true
          t.virtual \"name_octet_length\", type: :integer, as: \"octet_length(`name`)\", stored: true
        end
      ```
      4d652936
  7. 29 5月, 2018 1 次提交
    • R
      Ensure casting by boolean attribute when querying · 34cc301f
      Ryuta Kamizono 提交于
      `QueryAttribute#value_for_database` calls only `type.serialize`, and
      `Boolean#serialize` is a no-op unlike other attribute types.
      
      It caused the issue #32624. Whether or not `serialize` will invoke
      `cast` is undefined in our test cases, but it actually does not work
      properly unless it does so for now.
      
      Fixes #32624.
      34cc301f
  8. 28 5月, 2018 3 次提交
  9. 27 5月, 2018 3 次提交
  10. 26 5月, 2018 2 次提交
  11. 25 5月, 2018 2 次提交
    • R
      Eager loading won't mutate owner record · 6edf354b
      Ryuta Kamizono 提交于
      Since #31575, `BelongsToAssociation#target=` replaces owner record's
      foreign key to fix an inverse association bug.
      
      But the method is not only used for inverse association but also used
      for eager loading/preloading, it caused some public behavior changes
      (#32338, #32375).
      
      To avoid any side-effect in loading associations, I reverted the
      overriding `#target=`, then introduced `#inversed_from` to replace
      foreign key in `set_inverse_instance`.
      
      Closes #32375.
      6edf354b
    • R
      Make force equality checking more strictly not to allow serialized attribute · 8a600183
      Ryuta Kamizono 提交于
      Since #26074, introduced force equality checking to build a predicate
      consistently for both `find` and `create` (fixes #27313).
      
      But the assumption that only array/range attribute have subtype was
      wrong. We need to make force equality checking more strictly not to
      allow serialized attribute.
      
      Fixes #32761.
      8a600183
  12. 23 5月, 2018 1 次提交
    • G
      Rollback parent transaction when children fails to update (#32796) · 976ef40a
      Guillaume Malette 提交于
      * Rollback parent transaction when children fails to update
      
      Rails supports autosave associations on the owner of a `has_many`
      relationship. In certain situation, if the children of the association
      fail to save, the parent is not rolled back.
      
      ```ruby
      class Employee < ActiveRecord::Base
      end
      
      class Company < ActiveRecord::Base
        has_many(:employees)
      end
      
      company = Company.new
      employee = company.employees.new
      company.save
      ```
      
      In the previous example, if the Employee failed to save, the Company
      will not be rolled back. It will remain in the database with no
      associated Employee.
      
      I expect the `company.save` call to be atomic, and either create all or
      none of the records.
      
      The persistance of the Company already starts a transaction that nests
      it's children. However, it didn't track the success or failure of it's
      children in this very situation, and the outermost transaction is not
      rolled back.
      
      This PR makes the change to track the success of the child insertion and
      rollback the parent if any of the children fail.
      
      * Change the test to reflect what we expect
      
      Once #32862 is merged, rolling back a record will rollback it's state to match
      the state before the database changes were applied
      
      * Use only the public API to express the tests
      
      * Refactor to avoid reassigning saved for nested reflections
      
      [Guillaume Malette + Rafael Mendonça França]
      976ef40a
  13. 22 5月, 2018 1 次提交
    • Y
      Disable foreign keys during `alter_table` for sqlite3 adapter · 45881b0a
      Yasuo Honda 提交于
      Unlike other databases, changing SQLite3 table definitions need to create a temporary table.
      While changing table operations, the original table needs dropped which caused
      `SQLite3::ConstraintException: FOREIGN KEY constraint failed` if the table is referenced by foreign keys.
      This pull request disables foreign keys by `disable_referential_integrity`.
      
      Also `disable_referential_integrity` method needs to execute `defer_foreign_keys = ON`
      to defer re-enabling foreign keys until the transaction is committed.
      
      https://www.sqlite.org/pragma.html#pragma_defer_foreign_keys
      
      Fixes #31988
      
      - This `defer_foreign_keys = ON` has been supported since SQLite 3.8.0
      https://www.sqlite.org/releaselog/3_8_0.html and Rails 6 requires SQLite 3.8 #32923 now
      
      - <Models>.reset_column_information added to address `ActiveModel::UnknownAttributeError`
      
      ```
      Error:
      ActiveRecord::Migration::ForeignKeyChangeColumnTest#test_change_column_of_parent_table:
      ActiveModel::UnknownAttributeError: unknown attribute 'name' for ActiveRecord::Migration::ForeignKeyChangeColumnTest::Post.
      ```
      45881b0a
  14. 21 5月, 2018 2 次提交
  15. 19 5月, 2018 2 次提交
    • R
      5f8115a1
    • E
      Finalize transaction record state after real transaction · 5359428a
      Eugene Kenny 提交于
      After a real (non-savepoint) transaction has committed or rolled back,
      the original persistence-related state for all records modified in that
      transaction is discarded or restored, respectively.
      
      When the model has transactional callbacks, this happens synchronously
      in the `committed!` or `rolled_back!` methods; otherwise, it happens
      lazily the next time the record's persistence-related state is accessed.
      
      The synchronous code path always finalizes the state of the record, but
      the lazy code path only pops one "level" from the transaction counter,
      assuming it will always reach zero immediately after a real transaction.
      As the test cases included here demonstrate, that isn't always the case.
      
      By using the same logic as the synchronous code path, we ensure that the
      record's state is always updated after a real transaction has finished.
      5359428a
  16. 17 5月, 2018 1 次提交
  17. 15 5月, 2018 1 次提交
    • N
      Add math tests · 2beafedd
      Nikolai B 提交于
      After #449 was merged math can be done on these
      nodes, adding a test file to unit test all the
      math operators.
      2beafedd
  18. 13 5月, 2018 1 次提交
  19. 11 5月, 2018 1 次提交
    • R
      `becomes` should clear the mutation tracker which is created in `after_initialize` · ab3ad6a9
      Ryuta Kamizono 提交于
      `becomes` creates new object and copies attributes from the receiver. If
      new object has mutation tracker which is created in `after_initialize`,
      it should be cleared since it is for discarded attributes.
      
      But if the receiver doesn't have mutation tracker yet, it will not be
      cleared properly.
      
      It should be cleared regardless of whether the receiver has mutation
      tracker or not.
      
      Fixes #32867.
      ab3ad6a9
  20. 10 5月, 2018 1 次提交
    • E
      Don't clear transaction state after manual rollback · 2f29380c
      Eugene Kenny 提交于
      If an `ActiveRecord::Rollback` error was raised by a persistence method
      (e.g. in an `after_save` callback), this logic would potentially discard
      the original state of the record from before the transaction, preventing
      it from being restored later when the transaction was rolled back.
      2f29380c
  21. 06 5月, 2018 1 次提交
  22. 05 5月, 2018 1 次提交
    • B
      Fix logic on disabling commit callbacks · a779b1a0
      Brian Durand 提交于
      Commit callbacks are intentionally disabled when errors occur when calling the callback chain in order to reset the internal record state. However, the implicit order of operations on the logic for checking if callbacks are disabled is wrong. The result is that callbacks can be unexpectedly when errors occur in transactions.
      a779b1a0
  23. 02 5月, 2018 6 次提交