Commit Graph

9535 Commits

Author SHA1 Message Date
John Hawthorn
ec7aa03c98
Merge pull request #36766 from jhawthorn/call_connection_error_number
Use connection.error_number in MySQLDatabaseTasks
2019-07-25 14:54:44 -07:00
Rafael Mendonça França
579864f79c
Merge pull request #36380 from edudepetris/ed/36272-better-negative-scope-warning
Add a warning for enum elements with 'not_' prefix.
2019-07-25 17:18:41 -04:00
John Hawthorn
15c81c8ed4 Use connection.error_number in MySQLDatabaseTasks
MySQLDatabaseTasks, like AbstractMysqlAdapter, should be able to operate
on any mysql adapter, not just mysql2. Errors having a .error_number
attribute is a mysql2 specific API, which we (Rails) don't control, so
we should instead use connection.error_number(err), which we do.

This also updates tests to better test how this really works, previously
it stubbed create_database to raise Tasks::DatabaseAlreadyExists, which
can never happen.
2019-07-25 14:15:39 -07:00
Rafael França
4ee88df6a0
Merge pull request #36740 from stanhu/sh-fix-index-exists-postgresql-partial-index
Fix index_exists? for PostgreSQL expression indexes
2019-07-25 10:19:04 -04:00
Ryuta Kamizono
3ecaf0aafa
Merge pull request #36492 from kamipo/remove_depth_first_visitor
Remove unused `DepthFirst` visitor
2019-07-25 14:52:18 +09:00
Stan Hu
ec0dc76c06 Fix index_exists? for PostgreSQL expression indexes
Previously Rails expected indexes to be an array of columns, but for
PostgreSQL a expression index can just be a string of text. Handle this
by forcing `Index#columns` to be an Array inside `index_exists?`.

Closes #36739
2019-07-24 20:21:35 -07:00
Eileen M. Uchitelle
49b531ba58
Merge pull request #36756 from seejohnrun/env-urls-with-multiple-databases
Fix multiple database support for DATABASE_URL env variable
2019-07-24 19:49:14 -04:00
John Crepezzi
396dba0874 Fix multiple database support for DATABASE_URL env variable
This commit fixes an issue where multi-database configurations were
incompatible with setting a `DATABASE_URL` environment variable.

As part of this work, this commit also includes a light refactor
to make both multi and single database configurations lead into the same
code path so they behave the same.

As mentioned in #36736, this regression was introduced as part of
f2ad69fe7a605b01bb7c37eeac6a9b4e7deb488e
2019-07-24 16:31:24 -04:00
Eileen M. Uchitelle
0206d9cb7c
Merge pull request #36671 from wjessop/do_not_validate_non_dirty_association_targets
Don't validate non dirty association targets
2019-07-24 14:44:53 -04:00
Rafael Mendonça França
0354b0d6c6
Merge pull request #36665 from jmschneider/master
Make currency symbols optional for money column type in PostgreSQL
2019-07-23 11:04:03 -04:00
Kir Shatrov
77931f4f52 [ActiveRecord] Deduplicate optimizer hints 2019-07-19 11:52:39 +01:00
Josh Goodall
b19150448b Support beginless ranges in hash conditions.
Ruby 2.7 introduces beginless ranges (..value and ...value) and as with
endless ranges we can turn these into inequalities, enabling expressions
such as

    Order.where(created_at: ..1.year.ago)
    User.where(karma: ...0)
2019-07-17 16:11:57 +10:00
Kir Shatrov
730d810b0d [ActiveRecord] Superclass for aborted queries 2019-07-16 22:39:21 +01:00
Kir Shatrov
080939c987 Raise specific exception on Mysql2::Error::TimeoutError 2019-07-16 20:24:27 +01:00
Edouard CHIN
b677adede0 Move the ActiveModel:Errors#full_message method to the Error class:
- One regression introduced by the "AM errors as object" features is
  about the `full_messages` method.

  It's currently impossible to call that method if the `base` object
  passed in the constructor of `AM::Errors` doesn't respond to the
  `errors` method.
  That's because `full_messages` now makes a weird back and forth trip

  `AM::Errors#full_messages` -> `AM::Error#full_message` -> `AM::Errors#full_message`

  Since `full_message` (singular) isn't needed by AM::Errors, I moved
  it to the `AM::Error` (singular) class. This way we don't need to
  grab the `AM::Errors` object from the base.
2019-07-16 14:28:38 +02:00
Rafael França
69cb9eb7ad
Merge pull request #36640 from Edouard-chin/ec-uniq-validation-fix
Fix errors getting duplicated when passed validations options:
2019-07-15 20:35:05 +01:00
Will Jessop
6ea80b6103
Don't validate non dirty association targets
Fixes #36581.

This fixes an issue where validations would return differently when a previously saved invalid association was loaded between calls:

    assert_equal true, squeak.valid?
    assert_equal true, squeak.mouse.present?
    assert_equal true, squeak.valid?

Here the second assert would return

    Expected: true
    Actual: false

Limiting validations to associations that would be normally saved (using autosave: true) due to changes means that loading invalid associated relations will not change the return value of the parent relations's `valid?` method.
2019-07-15 18:21:20 +01:00
Joel Schneider
ddd0e9b026 Make currency symbols optional for money column type in PostgreSQL 2019-07-12 14:49:03 -04:00
Ryuta Kamizono
ba7634d304 Merge pull request #36647 from giraffate/fix_exists_with_distinct_and_offset_and_order_in_postgresql
Fix `relation.exists?` with giving `distinct`, `offset` and `order` for joined table
2019-07-11 09:11:01 +09:00
Eileen M. Uchitelle
f4a094af8a
Merge pull request #36618 from engwan/fix-query-cache-with-shared-ar-connection
Fix query cache when using shared connections
2019-07-10 14:05:22 -05:00
Edouard CHIN
07ff343857 Fix errors getting duplicated when passed validations options:
- In 86620cc3aa8e2630bc8d934b1a86453276b9eee9, a change was made
  on how we remove error duplication on a record for autosave
  association

  This fix has one caveat where validation having a `if` / `unless`
  options passed as a proc would be considered different.
  Example:

  ```ruby
  class Book < ApplicationRecord
    has_one :author

    validates :title, presence: true, if -> { true }
    validates :title, presence: true, if -> { true }
  end

  Book.new.valid? # false
  Book.errors.full_messages # ["title can't be blank", "title can't be blank"]
  ```

  While this example might sound strange, I think it's better to
  ignore `AM::Validations` options (if, unless ...) when making the
  comparison.
2019-07-10 18:40:12 +02:00
Takayuki Nakata
d9587feb5f Fix relation.exists? with giving distinct, offset and order for joined table
The error happens in PostgreSQL when using `relation.exists?` with
`distinct`, `offset` and `order` for joined table.
However, the error does not happen if either `distinct` or `offset` is
removed. This behavior is confusing.

Fixes #36632
2019-07-10 22:53:52 +09:00
Guillermo Iguaran
c00cd7b446
Merge branch 'master' into add_database_exist_method 2019-07-08 10:20:45 -05:00
Heinrich Lee Yu
10ed7f580e Fix query cache when using shared connections
Enables the query cache on the correct connection when
shared connections across threads are enabled
2019-07-08 15:43:49 +08:00
Will Jessop
ff42b21915
When DATABASE_URL is specified don't trample envs that use a url: key
fixes #36610
2019-07-08 06:00:30 +01:00
Ryuta Kamizono
7729dfc6ef
Merge pull request #36616 from kamipo/dont_use_alias_for_grouped_field
Do not use aliases in GROUP BY clause
2019-07-08 11:38:34 +09:00
Ryuta Kamizono
7d699dad33 Should Regexp.escape quoted table name in regex
It is for agnostic test case, since quoted table name may include `.`
for all adapters, and `[` / `]` for sqlserver adapter.
2019-07-08 09:32:30 +09:00
Ryuta Kamizono
dddb331bd2 Do not use aliases in GROUP BY clause
It appears that Oracle does not allow using aliases in GROUP BY clause
unlike ORDER BY clause.

Fixes #36613.
2019-07-08 08:46:07 +09:00
Ryuta Kamizono
52729fb5f2 MySQL: Fix schema dumping enum and set columns correctly
`enum` and `set` are typed cast as `:string`, but currently the
`:string` type is incorrectly reused for schema dumping.

A cast type on columns is not always the same with `sql_type`, this
fixes schema dumping `enum` and `set` columns to use `sql_type` instead
of `type` correctly.
2019-07-05 18:42:41 +09:00
Edu Depetris
77daacf94d Add a warning for enum elements with 'not_' prefix.
When a enum element contains the prefix 'not_'. I warns to users
to be aware of this new feature.

Example code:
    class Foo < ActiveRecord::Base
      enum status: [:sent, :not_sent]
    end
2019-06-30 15:21:30 -03:00
Eileen M. Uchitelle
04d2fda1f8
Merge pull request #36565 from rails/fix-url-configs
Fix broken url configs
2019-06-27 13:37:32 -04:00
eileencodes
f2ad69fe7a Fix broken url configs
This PR is to fix #36559 but I also found other issues that haven't been
reported.

The check for `(config.size == 1 && config.values.all? { |v| v.is_a?
String })` was naive. The only reason this passed was because we had
tests that had single hash size configs, but that doesn't mean we don't
want to create a hash config in other cases. So this now checks for
`config["database"] || config["adapter"] || ENV["DATABASE_URL"]`. In the
end for url configs we still get a UrlConfig but we need to pass through
the HashConfig to create the right kind of UrlConfig. The UrlConfig's
are really complex and I don't necessarily understand everything that's
needed in order to act the same as Rails 5.2.

I edited the connection handler test to demonstrate how the previous
implementation was broken when checking config size. Now old and new
tests pass so I think this is closer to 5.2.

Fixes #36559
2019-06-27 13:07:23 -04:00
Ryuta Kamizono
7e08b6d2b2 Address to "DEPRECATION WARNING: Uniqueness validator will no longer enforce case sensitive comparison in Rails 6.1"
Caused by #36210.
2019-06-28 00:28:47 +09:00
Ryuta Kamizono
f6db8b8d82 length(title) is a safe SQL string since #36448 2019-06-26 08:56:00 +09:00
Rafael França
b65f88652f
Merge pull request #36210 from vishaltelangre/raise-record-invalid-when-associations-fail-to-save-due-to-uniqueness-failure
Fix: ActiveRecord::RecordInvalid is not raised when an associated record fails to #save! due to uniqueness validation failure
2019-06-24 13:59:15 -04:00
Ryuta Kamizono
3218459c28
Merge pull request #36526 from yahonda/test_statement_cache_with_in_clause_pg
Address test_statement_cache_with_in_clause failure
2019-06-21 06:40:02 +09:00
Yasuo Honda
688da62a4c Address test_statement_cache_with_in_clause failure due to nondeterministic sort order
This failure is occasional, does not always reproduce.

```ruby
$ cd activerecord
$ bundle exec rake test_postgresql
... snip ...

....F

Failure:
ActiveRecord::BindParameterTest#test_statement_cache_with_in_clause [/home/yahonda/git/rails/activerecord/test/cases/bind_parameter_test.rb:97]:
Expected: [1, 3]
  Actual: [3, 1]

rails test home/yahonda/git/rails/activerecord/test/cases/bind_parameter_test.rb:93

```
2019-06-20 15:07:58 +00:00
eileencodes
4feeee2abe Revert schema dumper to use strings rather than integers
I think we should change this, but not in 6-0-stable since that's
already in RC and I was trying to only make changes that won't require
any app changes.

This reverts a portion of https://github.com/rails/rails/pull/36439 that
made all schema migration version numbers get dumped as an integer.
While it doesn't _really_ matter it did change behavior. We should bring
this back in 6.1 with a deprecation.
2019-06-20 14:00:42 +02:00
Ryuta Kamizono
e14f3f3c11
Merge pull request #36520 from kamipo/test_case_for_deterministic_order
Add test cases to ensure deterministic order for ordinal methods
2019-06-20 18:07:40 +09:00
Guilherme Mansur
fd3532204c Better error message for calling columns_hash
When a record does not have a table name, as in the case for a record
with `self.abstract_class = true` and no `self.table_name` set the error
message raises a cryptic:
"ActiveRecord::StatementInvalid: Could not find table ''" this patch now
raises a new `TableNotSpecified Error`

Fixes: #36274

Co-Authored-By: Eugene Kenny <elkenny@gmail.com>
2019-06-19 14:23:03 -04:00
Ryuta Kamizono
2c96b046ec Add test cases to ensure deterministic order for ordinal methods
Before 1340498d2, `order` with no-op value (e.g. `nil`, `""`) had broken
the contract of ordinal methods, which returns a result deterministic
ordered.
2019-06-19 23:18:22 +09:00
Kasper Timm Hansen
aae270de9e
Merge pull request #35891 from Shopify/schema-cache-deduplication
Deduplicate various Active Record schema cache structures
2019-06-19 13:04:32 +02:00
Guilherme Mansur
fe30211574 Add database_exists? method to connection adapters
When SQLite connects it will silently create a database if the database does not
exist. This behaviour causes different issues because of inconsistent behaviour
between adapters: #36383, #32914. This commit adds a `database_exists?` method
as a way to check the database without creating it. This is a stepping stone to
fully resolving the above issues.
2019-06-17 14:00:53 -04:00
Ryuta Kamizono
cb0299c9eb PostgreSQL: Fix GROUP BY with ORDER BY virtual count attribute
GROUP BY with virtual count attribute is invalid for almost all
databases, but it is valid for PostgreSQL, and it had worked until Rails
5.2.2, so it is a regression for Rails 5.2.3 (caused by 311f001).

I can't find perfectly solution for fixing this for now, but I would not
like to break existing apps, so I decided to allow referencing virtual
count attribute in ORDER BY clause when GROUP BY aggrigation (it partly
revert the effect of 311f001) to fix the regression #36022.

Fixes #36022.
2019-06-17 22:14:29 +09:00
Ryuta Kamizono
b57b23a37b Remove unused Arel::Attributes.for
`Arel::Attributes.for` is no longer used since https://github.com/rails/arel/pull/196.
2019-06-15 23:59:41 +09:00
Ryuta Kamizono
fc38ff6e44 Remove unused DepthFirst visitor
We only use `ToSQL` visitors in the our codebase, do not use
`DepthFirst` and `Dot` visitors.

The `DepthFirst` visitor (which was introduced at c86c37e5f) is used to
traverse an Arel (partial) ast with depth first.

Is there any worth to keep that undocumented feature with much code and
test cases.

This removes that unused `DepthFirst` code and test cases.
2019-06-15 23:20:16 +09:00
Ryuta Kamizono
e919a00848 Should find last created record
Tables in tests are not always empty so `klass.first` does not always
find last created record.

Fixes #36479.
2019-06-15 08:19:31 +09:00
Ryuta Kamizono
74174d786b Ensure to reset actually used @connection.schema_migration's table name
https://buildkite.com/rails/rails/builds/61744#f12cc6cf-7458-4131-917a-9735615f6259/999-1010
2019-06-15 08:04:18 +09:00
Ryuta Kamizono
ce7ccd8168 Fix test_schema_names to include "hint_plan" schema 2019-06-15 07:29:33 +09:00
eileencodes
cd881ab169 Move while_preventing_writes from conn to handler
If we put the `while_preventing_writes` on the connection then the
middleware that sends reads to the primary and ensures they can't write
will not work. The `while_preventing_writes` will only be applied to the
connection which it's called on - which in the case of the middleware is
Ar::Base.

This worked fine if you called it directly like
`OtherDbConn.connection.while_preventing_writes` but Rails didn't have a
way of knowing you wanted to call it on all the connections.

The change here moves the `while_preventing_writes` method from the
connection to the handler so that it can block writes to all queries for
that handler. This will apply to all the connections associated with
that handler.
2019-06-14 16:11:36 -04:00