Commit Graph

18877 Commits

Author SHA1 Message Date
eileencodes
1d83ab9366 Make sure AR can load without Rails
In #36560 I accidentally re-introduced a bug where ActiveRecord can't be
used without Rails. This returns an empty hash if we're outside the
context of Rails since we can't create the database tasks without
loading and reading the database yaml which is something only Railties
can do.
2019-07-25 11:35:44 -04: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
Rafael França
01a28f3e6b
Merge pull request #36580 from Shopify/schema-cache-deuplication-from-database
Also deduplicate schema cache structure when they are read from the database
2019-07-24 15:31:17 -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
Eileen M. Uchitelle
6cd364cfe5
Merge pull request #36744 from freeletics/fix-db-prepare
Fixed db:prepare task to not touch schema when it is disabled
2019-07-24 08:10:54 -04:00
Wojciech Wnętrzak
5c1f6d1ff6
Fixed db:prepare task to not touch schema when dump_schema_after_migration is false. 2019-07-24 09:19:13 +02: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
Ryuta Kamizono
2caddbf8ae
Merge pull request #36706 from kirs/dedup-optimizer-hints
[ActiveRecord] Deduplicate optimizer hints
2019-07-19 23:01:44 +09:00
Tekin Suleyman
773248b3f8
Include common commands in rails help output
With their descriptions commented out these commands were not included
in the rails help command's output, which is a shame as they are useful,
particularly during the development of more complex migrations.
2019-07-19 12:42:26 +01: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
Rafael Mendonça França
d473561071
Add missing period [ci skip] 2019-07-16 21:01:32 +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
Ryuta Kamizono
bcbe3dc610 active_support/core_ext/object/duplicable is not in use here 2019-07-16 05:05:28 +09: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
Akira Matsuda
356857a122 active_support/deprecation has to be already required via active_support/rails.rb 2019-07-12 18:34:07 +09:00
Akira Matsuda
00c3f3fca2 No Woman, No try 2019-07-12 18:32:45 +09: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
Yuji Yaginuma
3fd5bf81c0
Merge pull request #36653 from y-yagi/check_error_number_instead_of_message
MySQL: Check error number instead of a message
2019-07-11 07:52:49 +09:00
yuuji.yaginuma
ac41b73d97 MySQL: Check error number instead of a message
To be able to check regardless of locale.
2019-07-11 07:18:11 +09:00
Ryuta Kamizono
2fa21fe736
Merge pull request #36645 from Shopify/arel-dispatch-cache
Share the Arel dispatch cache between connections
2019-07-11 05:55:25 +09:00
Ryuta Kamizono
15748f6a05
Merge pull request #36637 from Shopify/share-quote-cache
Share the column and table name quote cache between connections
2019-07-11 05:31:23 +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
Jean Boussier
50bb22da54 Share the Arel dispatch cache between connections 2019-07-10 11:54:32 +02:00
Jean Boussier
0d8dfd86a6 Share the column and table name quote cache between connections 2019-07-09 12:43:13 +02:00
Yuji Yaginuma
60809e0e1f
Merge pull request #36612 from y-yagi/make_setup_works_when_using_with_locales_other_than_en
Make "bin/setup" works when using PostgreSQL with locales other than en locale
2019-07-09 07:24:54 +09:00
Roberto Miranda
3d636bf5f6
Fix indentation 💇‍♀️
Ref https://github.com/rails/rails/pull/36621#discussion_r301208961
2019-07-08 20:53:55 +01: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
yuuji.yaginuma
aec52c0d1e Make "bin/setup" works when using PostgreSQL with locales other than en locale
The PostgreSQL adapter uses an error message to determine if a database
exists or not.
74ef67b16d/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb (L49)

However, this message is properly converted according to the locale.
So this check does not work correctly for non-en locales.

As a result, `db:prepare` cannot correctly determine if a database exists, and
`bin/setup`, which depends on the task, does not work correctly if the database
does not exist.

It checks to exist if the "does not exist" exists, but that message is also
used in other error messages(e.g. "role does not exist"). So cannot check
correctly also in en locale.
https://github.com/postgres/postgres/blob/master/src/backend/po/ja.po#L10542

It would be fine could check the status, but in my understanding, when a connecting
fails, only the status `CONNECTION_BAD` be used, and it seems that details cannot
be checked.
https://www.postgresql.org/docs/11/libpq-status.html#LIBPQ-PQSTATUS

I fixed to check whether the error message contains a database
name. This is probably not accurate but can check it better now.
2019-07-07 14:49:48 +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
Jean Boussier
fc41373e24 Also deduplicate schema cache structure when they are read from the database 2019-07-01 14:01:25 +02:00
Ryuta Kamizono
1eb5cc13a2 Add "SCHEMA" to the query in configure_connection like as other adapters
This makes to be able to ignore the query in `assert_queries` even if
accidentally reconnected a connection.

https://buildkite.com/rails/rails/builds/61917#4c49187a-3173-4d5c-8a8d-d65768f5bfc9/1000-1799
2019-06-28 13:07:39 +09:00
utilum
12bc759325 warning: instance variable @serial not initialized (#36556)
Introduced in bba7c63a663b073034f4c73f0d59655751694e5a

Before:

```
$ TESTOPTS="-n=/test_yaml_dump_and_load/" bundle exec rake
test:postgresql

:scisors: ... :scisors:

Using postgresql
Run options: -n=/test_yaml_dump_and_load/ --seed 36896

/home/u/code/rails/activerecord/lib/active_record/connection_adapters/postgresql/column.rb:15:
warning: instance variable @serial not initialized
/home/u/code/rails/activerecord/lib/active_record/connection_adapters/postgresql/column.rb:15:
warning: instance variable @serial not initialized
/home/u/code/rails/activerecord/lib/active_record/connection_adapters/postgresql/column.rb:15:
warning: instance variable @serial not initialized
/home/u/code/rails/activerecord/lib/active_record/connection_adapters/postgresql/column.rb:15:
warning: instance variable @serial not initialized
/home/u/code/rails/activerecord/lib/active_record/connection_adapters/postgresql/column.rb:15:
warning: instance variable @serial not initialized
/home/u/code/rails/activerecord/lib/active_record/connection_adapters/postgresql/column.rb:15:
warning: instance variable @serial not initialized
/home/u/code/rails/activerecord/lib/active_record/connection_adapters/postgresql/column.rb:15:
warning: instance variable @serial not initialized
/home/u/code/rails/activerecord/lib/active_record/connection_adapters/postgresql/column.rb:15:
warning: instance variable @serial not initialized
/home/u/code/rails/activerecord/lib/active_record/connection_adapters/postgresql/column.rb:15:
warning: instance variable @serial not initialized
/home/u/code/rails/activerecord/lib/active_record/connection_adapters/postgresql/column.rb:15:
warning: instance variable @serial not initialized
/home/u/code/rails/activerecord/lib/active_record/connection_adapters/postgresql/column.rb:15:
warning: instance variable @serial not initialized
/home/u/code/rails/activerecord/lib/active_record/connection_adapters/postgresql/column.rb:15:
warning: instance variable @serial not initialized
/home/u/code/rails/activerecord/lib/active_record/connection_adapters/postgresql/column.rb:15:
warning: instance variable @serial not initialized
/home/u/code/rails/activerecord/lib/active_record/connection_adapters/postgresql/column.rb:15:
warning: instance variable @serial not initialized
/home/u/code/rails/activerecord/lib/active_record/connection_adapters/postgresql/column.rb:15:
warning: instance variable @serial not initialized
/home/u/code/rails/activerecord/lib/active_record/connection_adapters/postgresql/column.rb:15:
warning: instance variable @serial not initialized
/home/u/code/rails/activerecord/lib/active_record/connection_adapters/postgresql/column.rb:15:
warning: instance variable @serial not initialized
/home/u/code/rails/activerecord/lib/active_record/connection_adapters/postgresql/column.rb:15:
warning: instance variable @serial not initialized
/home/u/code/rails/activerecord/lib/active_record/connection_adapters/postgresql/column.rb:15:
warning: instance variable @serial not initialized
/home/u/code/rails/activerecord/lib/active_record/connection_adapters/postgresql/column.rb:15:
warning: instance variable @serial not initialized
/home/u/code/rails/activerecord/lib/active_record/connection_adapters/postgresql/column.rb:15:
warning: instance variable @serial not initialized
/home/u/code/rails/activerecord/lib/active_record/connection_adapters/postgresql/column.rb:15:
warning: instance variable @serial not initialized
/home/u/code/rails/activerecord/lib/active_record/connection_adapters/postgresql/column.rb:15:
warning: instance variable @serial not initialized
/home/u/code/rails/activerecord/lib/active_record/connection_adapters/postgresql/column.rb:15:
warning: instance variable @serial not initialized
.

Finished in 0.195325s, 5.1197 runs/s, 35.8376 assertions/s.
1 runs, 7 assertions, 0 failures, 0 errors, 0 skips

```

Co-authored-by: Ryuta Kamizono <kamipo@gmail.com>
2019-06-28 07:02:38 +09: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