Commit Graph

7394 Commits

Author SHA1 Message Date
Ryuta Kamizono
681a0a0299 Fix calculate with a string value in from and eager loading
`construct_relation_for_association_calculations` pass a string value to
`construct_join_dependency` when setting a string value in `from`.
It should not pass a string value, but always `joins_values`.

Related #14834, #19452.

Fixes #24193.
2016-06-13 01:13:54 +09:00
Eileen M. Uchitelle
8a39123d5d Merge pull request #25362 from maclover7/jm-rm-ar-require
Remove unnecessary model requires
2016-06-12 09:22:17 -04:00
Ryuta Kamizono
5deb44d6ea Remove outdated comments [ci skip]
These comments were added at dd257a3ccb30ab181cd48d3d81bc7f23bb45f36f
but outdated since #2086.
2016-06-12 20:30:10 +09:00
Jon Moss
b1a00fbc75
Remove unnecessary model requires 2016-06-10 22:20:19 -04:00
Sean Griffin
d65320714e Remove dead code from tests
This code was added in 81286f858770e0b95e15af37f19156b044ec6a95, but was
not used by that commit and does not appear to have ever been used.
2016-06-09 11:19:41 -04:00
Sean Griffin
6990fd3e2a Merge pull request #25329 from yahonda/allow_oracle_bind_value_syntax_in_loj_test
Allow Oracle bind parameter syntax `:a1` in test_join_conditions_added_to_join_clause
2016-06-09 09:30:53 -04:00
Abhishek Jain
a3ac43f4d2 Fix typo 2016-06-09 10:45:38 +05:30
Yasuo Honda
d207023f83 Allow Oracle bind parameter syntax :a1 2016-06-08 17:17:22 +00:00
Ryuta Kamizono
faed011acc Fix sqlite3 test failure
Sqlite3 test failure is due to 66ebbc4952f6cfb37d719f63036441ef98149418.
2016-06-04 16:03:44 +09:00
Arthur Neves
66ebbc4952
Dont re-define class SQLite3Adapter on test
We were declaring  in a few tests, which depending of
the order load will cause an error, as the super class could change.

see ac1c4e141b (commitcomment-17731383)
2016-06-03 17:17:53 -04:00
Yves Senn
082a515825 Merge pull request #25243 from sukesan1984/add_i18n_validation_test
Add i18n_validation_test
2016-06-03 11:30:19 +02:00
Sean Griffin
c587b63664 Ensure that records with unselected fields can be updated
As part of refactoring mutation detection to be more performant, we
introduced the concept of `original_value` to `Attribute`. This was not
overridden in `Attribute::Uninitialized` however, so assigning ot an
uninitialized value and calling `.changed?` would raise
`NotImplementedError`.

We are using a sentinel value rather than checking the result of
`original_attribute.initialized?` in `changed?` because `original_value`
might go through more than one node in the tree.

Fixes #25228
2016-06-02 11:34:48 -04:00
Sean Griffin
1b8a7b8293 Fix failing tests
Currently CI is broken due to 56a61e0 and c4cb686. This occurred because
the failures are not present on SQLite which is what I normally run
locally before pushing.

The optimizations to our YAML size were dropping mutations, as
`with_type` didn't set the previous value if it'd already been read
(that method was never really designed to be used with values on
individual objects, it was previously only used for defaults). I'm
questioning whether there's a better place to be handling the exclusion
of the type, but this will fix the failing build.

Additionally, there was a bug in `remove_foreign_key` if you passed it
an options hash containing `to_table`. This now occurs whenever removing
a reference, as we always normalize to a hash.

[Sean Griffin & Ryuta Kamizono]
2016-06-02 11:06:01 -04:00
sukesan1984
3bd30d9824 Add i18n_validation_test
add active record uniqueness validation test for { on: [:create, :update] } condition.
2016-06-02 04:17:15 +00:00
Sean Griffin
c4cb6862ba Make Active Record emit significantly smaller YAML
This reduces the size of a YAML encoded Active Record object by ~80%
depending on the number of columns. There were a number of wasteful
things that occurred when we encoded the objects before that have
resulted in numerous wins

- We were emitting the result of `attributes_before_type_cast` as a hack
  to work around some laziness issues
- The name of an attribute was emitted multiple times, since the
  attribute objects were in a hash keyed by the name. We now store them
  in an array instead, and reconstruct the hash using the name
- The types were included for every attribute. This would use backrefs
  if multiple objects were encoded, but really we don't need to include
  it at all unless it differs from the type at the class level. (The
  only time that will occur is if the field is the result of a custom
  select clause)
- `original_attribute:` was included over and over and over again since
  the ivar is almost always `nil`. We've added a custom implementation
  of `encode_with` on the attribute objects to ensure we don't write the
  key when the field is `nil`.

This isn't without a cost though. Since we're no longer including the
types, an object can find itself in an invalid state if the type changes
on the class after serialization. This is the same as 4.1 and earlier,
but I think it's worth noting.

I was worried that I'd introduce some new state bugs as a result of
doing this, so I've added an additional test that asserts mutation not
being lost as the result of YAML round tripping.

Fixes #25145
2016-05-31 14:58:43 -04:00
Sean Griffin
56a61e0c43 Respect options passed to foreign_key when reverting add_reference
The code incorrectly assumes that the option was written as
`foreign_key: true`, but that is not always the case. This now mirrors
the behavior of reverting `add_foreign_key`. The code was changed to use
kwargs while I was touching it, as well.

This could really use a refactoring to go through the same code paths as
`add_refernce` in the future, so we don't duplicate default values.

Fixes #25169
2016-05-31 12:55:02 -04:00
Sean Griffin
fc3bfdbdf5 Merge pull request #25213 from kamipo/do_not_include_default_column_limit
Do not include default column limit in schema.rb
2016-05-31 11:51:13 -04:00
Sean Griffin
c8be4574a2 ActiveRecord::Base#hash should differ between classes
Prior to this change, we would get collisions if Active Record objects
of different classes with the same ID were used as keys of the same
hash. It bothers me slightly that we have to allocate inside of this
method, but Ruby doesn't provide any way to hash multiple values without
allocation
2016-05-31 11:38:10 -04:00
Ryuta Kamizono
706f7e9c3e Do not include default column limit in schema.rb
Follow up of #20815.

```ruby
class CreatePeople < ActiveRecord::Migration[5.0]
  def change
    create_table :people do |t|
      t.integer :int
      t.bigint :bint
      t.text :txt
      t.binary :bin
    end
  end
end
```

Result.

In postgresql and sqlite3 adapters:

```ruby
ActiveRecord::Schema.define(version: 20160531141018) do

  create_table "people", force: :cascade do |t|
    t.integer "int"
    t.bigint  "bint"
    t.text    "txt"
    t.binary  "bin"
  end

end
```

In mysql2 adapter:

```ruby
ActiveRecord::Schema.define(version: 20160531141018) do

  create_table "people", force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4" do |t|
    t.integer "int"
    t.bigint  "bint"
    t.text    "txt",  limit: 65535
    t.binary  "bin",  limit: 65535
  end

end
```

After this patch:

```ruby
ActiveRecord::Schema.define(version: 20160531141018) do

  create_table "people", force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4" do |t|
    t.integer "int"
    t.bigint  "bint"
    t.text    "txt"
    t.binary  "bin"
  end

end
```
2016-05-31 23:22:07 +09:00
Sean Griffin
ff4986b917 Ensure hashes can be passed to attributes using composed_of
This behavior was broken by 36e9be85. When the value is assigned
directly, either through mass assignment or directly assigning a hash,
the hash gets passed through to this writer method directly. While this
is intended to handle certain cases, when an explicit converter has been
provided, we should continue to use that instead. The positioning of the
added guard caused the new behavior to override that case.

Fixes #25210
2016-05-31 10:03:26 -04:00
Sean Griffin
02da8aea83 Exists shouldn't error when used with includes
Currently `exists?` does some hackery where it assumes that we can join
onto anything that we passed to `eager_load` or `includes`, which
doesn't work if we are joining onto a polymorphic association.

Actually figuring out if we want to include something would require
knowledge deep within the join dependency module, which is hard to pull
up. The simplest solution is just to pass a flag down that says we're
not actually going to try to eager load any of the data. It's not the
solution I'd like, but that code really needs to be untangled before we
can do much with it.

This is another attempt at 6d5b1fd which should address the concerns
that led to reverting it in 4ecabed.
2016-05-30 15:58:03 -04:00
Kasper Timm Hansen
88f763b047 Merge pull request #25175 from kamipo/fix_migration_class_names_in_tests
Fix migration class names in tests
2016-05-30 19:58:43 +02:00
Arthur Nogueira Neves
ff63bb8231 Merge pull request #24965 from arthurnn/arthurnn/conn_api
Change some establish_connection logic
2016-05-29 12:48:36 -04:00
Ryuta Kamizono
6cbd96aa14 Fix migration class names in tests 2016-05-28 14:16:43 +09:00
Jon Moss
8e2e5f9e3d Fix has_one enum where queries
Fixes #25128
2016-05-26 18:00:51 -04:00
Arthur Neves
028748945b
Add to_hash to specification 2016-05-25 00:14:39 -04:00
Arthur Neves
779ccf8a0e
Remove name from establish_connection
Instead of passing a separete name variable, we can make the resolver
merge a name on the config, and use that before creating the Specification.
2016-05-24 23:57:43 -04:00
Rafael França
c0d4aa2293 Merge pull request #25093 from Erol/activerecord-transaction-serialization-error
Introduce AR::TransactionSerializationError for transaction serialization failures or deadlocks
2016-05-21 12:36:20 -03:00
Erol Fornoles
4d525a6f75 Add AR::TransactionSerializationError for transaction serialization failures or deadlocks 2016-05-21 21:51:52 +08:00
Rafael França
91421984b7 Merge pull request #24732 from y-yagi/update_record_specified_in_the_key
update record specified in key
2016-05-21 09:01:36 -03:00
Rafael França
3e54c1c40e Merge pull request #24958 from maclover7/fix-24955
Fix ActiveRecord::LogSubscriber edge case
2016-05-20 23:34:48 -03:00
Rafael França
d0c257f5da Merge pull request #24984 from kamipo/remove_magic_comment_in_schema.rb
Remove magic comment in generated `schema.rb`
2016-05-20 23:26:04 -03:00
Jeremy Daer
89e2f7e722
Support for unified Integer class in Ruby 2.4+
Ruby 2.4 unifies Fixnum and Bignum into Integer: https://bugs.ruby-lang.org/issues/12005

* Forward compat with new unified Integer class in Ruby 2.4+.
* Backward compat with separate Fixnum/Bignum in Ruby 2.2 & 2.3.
* Drops needless Fixnum distinction in docs, preferring Integer.
2016-05-18 21:58:51 -07:00
Kasper Timm Hansen
8fffee4b1c Merge pull request #24203 from sferik/count_with_block
Forward ActiveRecord::Relation#count to Enumerable#count if block given
2016-05-16 20:39:28 +02:00
Sean Griffin
a7ecc63679 Merge pull request #25009 from jahfer/suppressor-keep-state
Keep previous state around for nested calls to #suppress
2016-05-16 14:11:32 -04:00
Jahfer Husain
25801cfe78 Keep state around for nested calls to #suppress
If a call to #suppress from the same class occurred inside another #suppress
block, the suppression state would be set to false before the outer block
completes.

This change keeps the previous state around in memory and unwinds it
as the blocks exit.
2016-05-16 14:07:32 -04:00
Sean Griffin
aa7ded6a36 Merge pull request #23810 from xijo/fix_json_coder_when_mysql_strict_is_disabled
Fix bug in JSON deserialization when column default is an empty string
2016-05-16 10:44:58 -04:00
bUg
e3cd321d4b Rails 5.1 point type should not raise exception if empty string is provided as value 2016-05-15 16:14:57 +03:00
Sean Griffin
0991c4c6fc Give more context from AssociationMismatchError
The error message that we give today makes this error difficult to debug
if you receive it. I have no clue why we're printing the object ID of
the class (the commit doesn't give context), but I've left it as it was
deliberate.
2016-05-12 22:20:45 -04:00
Molchanov Andrey
37f2674d64 Rename test method 2016-05-12 22:45:18 +03:00
Sean Griffin
6007e584d8 Fix false positive mutation detection when JSON is used with serialize
When looking for mutation, we compare the serialized version of the
value to the before_type_cast form. `Type::Serialized` was breaking this
contract by passing the already serialized attribute to the subtype's
mutation detection. This never manifested previously, as all mutable
subtypes either didn't do anything in their `serialize` method, or had a
way to detect double serialization (e.g. `is_a?(String)`). However, now
that JSON types can handle string primitives, we need to avoid double
serialization.

Fixes #24993.
2016-05-12 09:09:47 -04:00
Sean Griffin
d1794cd88c Merge pull request #24980 from merhard/virtual-attribute-default
Define ActiveRecord::Attribute::Null#type_cast
2016-05-11 22:00:37 -04:00
Ryuta Kamizono
2a71885a3f Remove magic comment in generated schema.rb
Rails 5.0 has been dropped Ruby 1.9 support.
I think no need magic comment anymore.
2016-05-12 05:43:08 +09:00
Arthur Neves
537a342a83
remove_connection should not remove parent connection
When calling remove_connection in a subclass, that should not fallback
to the parent, otherwise it will remove the parent connection from the
handler.
2016-05-11 13:39:26 -04:00
Matthew Erhard
556e530da4 Define ActiveRecord::Attribute::Null#type_cast
Using ActiveRecord::Base.attribute to declare an attribute with a default value on a model where the attribute is not backed by the database would raise a NotImplementedError when model.save is called.

The error originates from 59d252196b/activerecord/lib/active_record/attribute.rb (L84).
This is called from 59d252196b/activerecord/lib/active_record/attribute.rb (L46) on an ActiveRecord::Attribute::Null object.

This commit corrects the behavior by implementing ActiveRecord::Attribute::Null#type_cast.

With ActiveRecord::Attribute::Null#type_cast defined, ActiveRecord::Attribute::Null#value (59d252196b/activerecord/lib/active_record/attribute.rb (L173..L175)) can be replaced with its super method (59d252196b/activerecord/lib/active_record/attribute.rb (L36..L40)).

fixes #24979
2016-05-11 13:21:01 -04:00
Arthur Neves
f1030fd897
Dont cache the conn_spec_name when empty
We cannot cache the connection_specification_name when it doesnt
exist. Thats because the parent value could change, and we should keep
failling back to the parent. If we cache that in a children as an ivar,
we would not fallback anymore in the next call, so the children would
not get the new parent spec_name.
2016-05-11 08:04:26 -04:00
Arthur Neves
d6f3ad7ce7
Make sure we reset the connection_specification_name on
remove_connection

When calling `remove_connection` on a model, we delete the pool so we also
need to reset the `connection_specification_name` so it will fallback to
the parent.
This was the current behavior before rails 5, which will fallback to the
parent connection pool.

[fixes #24959]

Special thanks to @jrafanie for working with me on this fix.
2016-05-10 23:42:26 -04:00
Jon Moss
c650341573 Fix ActiveRecord::LogSubscriber edge case
If an attribute was of the binary type, and also was a Hash, it would
previously not be logged, and instead raise an error saying that
`bytesize` was not defined for the `attribute.value` (a `Hash`).

Now, as is done on 4-2-stable, the attribute's database value is
`bytesize`d, and then logged out to the terminal.

Reproduction script:

```ruby
require 'active_record'
require 'minitest/autorun'
require 'logger'

ActiveRecord::Base.establish_connection(adapter: 'sqlite3', database: ':memory:')
ActiveRecord::Base.logger = Logger.new(STDOUT)

ActiveRecord::Schema.define do
  create_table :posts, force: true do |t|
    t.binary :preferences
  end
end

class Post < ActiveRecord::Base
  serialize :preferences
end

class BugTest < Minitest::Test
  def test_24955
    Post.create!(preferences: {a: 1})

    assert_equal 1, Post.count
  end
end
```
2016-05-10 15:42:07 -04:00
Ryuta Kamizono
54772667ee Should quote lock_name to pass to get_advisory_lock 2016-05-10 16:14:45 +09:00
Arthur Nogueira Neves
fcb223dd53 Merge pull request #24844 from arthurnn/arthurnn/conn
Refactor connection handler
2016-05-06 15:50:50 -05:00