1. 26 1月, 2015 2 次提交
  2. 25 1月, 2015 5 次提交
    • R
      Fix a typo "devleopment" => "development" · cb18c07f
      Rémy Coutable 提交于
      [ci skip]
      cb18c07f
    • S
      Expand the number of types which can use prepared statements · 3327cd3f
      Sean Griffin 提交于
      This will allow all types which require no additional handling to use
      prepared statements. Specifically, this will allow for `true`, `false`,
      `Date`, `Time`, and any custom PG type to use prepared statements. This
      also revealed another source of nil columns in bind params, and an
      inconsistency in their use.
      
      The specific inconsistency comes from a nested query coming from a
      through association, where one of the inversed associations is not
      bi-directional.
      
      The stop-gap is to simply construct the column at the site it is being
      used. This should simply go away on its own once we use `Attribute` to
      represent them instead, since we already have all of the information we
      need.
      3327cd3f
    • S
      Don't mutate `where_values` · ae8cd56c
      Sean Griffin 提交于
      This is to help facilitate future refactorings, as the internal
      representation is changed. I'm planning on having `where_values` return
      an array that's computed on call, which means that mutation will have no
      affect. This is the only remaining place that was mutating (tested by
      replacing the method with calling `dup`)
      ae8cd56c
    • S
      Don't rely on relation mutability when building through associations · c80487eb
      Sean Griffin 提交于
      Specifically, the issue is relying on `where_unscoping` mutating the
      where values. It does not, however, mutate the bind values, which could
      cause an error under certain circumstances. This was not exposed by the
      tests, since the only place which would have been affected is unscoping
      a boolean, which doesn't go through prepared statements. I had a hard
      time getting better test coverage to demonstrate the issue.
      
      This in turn, caused `merge` to go through proper logic, and try to
      clear out the binds associated with the unscoped relation, which then
      exposed a source of `nil` for the columns, as binds weren't expanding
      `{ "posts.id" => 1 }` to `{ "posts" => { "id" => 1 } }`. This has been
      fixed.
      
      The bulk of `create_binds` needed to be moved to a separate method,
      since the dot notation should not be expanded recursively.
      
      I'm pretty sure this removes a subtle quirk that a ton of code in
      `Relation::Merger` is working around, and I suspect that code can be
      greatly simplified. However, unraveling that rats nest is no small task.
      c80487eb
    • S
      4c0a9922
  3. 24 1月, 2015 5 次提交
  4. 23 1月, 2015 1 次提交
  5. 22 1月, 2015 1 次提交
  6. 21 1月, 2015 3 次提交
    • S
      797f78d0
    • S
      Introduce `ActiveRecord::Base#accessed_fields` · be9b6803
      Sean Griffin 提交于
      This method can be used to see all of the fields on a model which have
      been read. This can be useful during development mode to quickly find
      out which fields need to be selected. For performance critical pages, if
      you are not using all of the fields of a database, an easy performance
      win is only selecting the fields which you need. By calling this method
      at the end of a controller action, it's easy to determine which fields
      need to be selected.
      
      While writing this, I also noticed a place for an easy performance win
      internally which I had been wanting to introduce. You cannot mutate a
      field which you have not read. Therefore, we can skip the calculation of
      in place changes if we have never read from the field. This can
      significantly speed up methods like `#changed?` if any of the fields
      have an expensive mutable type (like `serialize`)
      
      ```
      Calculating -------------------------------------
       #changed? with serialized column (before)
                             391.000  i/100ms
       #changed? with serialized column (after)
                               1.514k i/100ms
      -------------------------------------------------
       #changed? with serialized column (before)
                                4.243k (± 3.7%) i/s -     21.505k
       #changed? with serialized column (after)
                               16.789k (± 3.2%) i/s -     84.784k
      ```
      be9b6803
    • A
      TransactionManager should call rollback records · 2e85224f
      Arthur Neves 提交于
      2e85224f
  7. 20 1月, 2015 4 次提交
    • S
      Fix bind value copying from subqueried relations · 04d1c371
      Sean Griffin 提交于
      With the old implementation, the bind values were created, and then we
      search the attributes for `Relation` objects, and merge them. This
      completely ignores the order that the actual `where` clause will use. If
      all non-relation where parameters are before the relations, it will
      work. However, if we query on both a relation and a value, with the
      value coming second, it breaks. The order of the hash should not affect
      the final query (especially since hashes being ordered is an
      implementation detail)
      04d1c371
    • S
      Move `create_binds` over to the `PredicateBuilder` · 50a8cdf0
      Sean Griffin 提交于
      I'm looking to introduce a `WhereClause` class to handle most of this
      logic, and this method will eventually move over to there. However, this
      intermediate refactoring should make that easier to do.
      50a8cdf0
    • S
      Whether a column exists or not doesn't affect whether we can use binds · 40887135
      Sean Griffin 提交于
      Looking through the blame, this logic used to be when we actually
      created the bind tuple. My guess is that `nil` couldn't be handled there
      at that time. It can, now.
      40887135
    • S
      Don't mutate bind values in `Relation` · 76d7d957
      Sean Griffin 提交于
      In order to better facilitate refactoring, most places that mutated
      `bind_values` have already been removed. One last spot snuck through.
      Since we're no longer mutating the array, it also does not need to be
      duped in `initialize_copy`.
      76d7d957
  8. 19 1月, 2015 2 次提交
    • S
      Add an `:if_exists` option to `drop_table` · 48e99a45
      Stefan Kanev 提交于
      If set to `if_exists: true`, it generates a statement like:
      
          DROP TABLE IF EXISTS posts
      
      This syntax is supported in the popular SQL servers, that is (at least)
      SQLite, PostgreSQL, MySQL, Oracle and MS SQL Sever.
      
      Closes #16366.
      48e99a45
    • S
      Don't calculate in-place changes on attribute assignment · ea721d70
      Sean Griffin 提交于
      When an attribute is assigned, we determine if it was already marked as
      changed so we can determine if we need to clear the changes, or mark it
      as changed. Since this only affects the `attributes_changed_by_setter`
      hash, in-place changes are irrelevant to this process. Since calculating
      in-place changes can be expensive, we can just skip it here.
      
      I also added a test for the only edge case I could think of that would
      be affected by this change.
      ea721d70
  9. 18 1月, 2015 1 次提交
  10. 16 1月, 2015 4 次提交
  11. 15 1月, 2015 6 次提交
  12. 13 1月, 2015 2 次提交
  13. 12 1月, 2015 1 次提交
  14. 11 1月, 2015 3 次提交