From dedcc1950613b4c756ca7fdc449d0d9315bb39aa Mon Sep 17 00:00:00 2001
From: Eileen Uchitelle <eileencodes@gmail.com>
Date: Wed, 30 Jan 2019 09:31:35 -0500
Subject: Fix case when we want a UrlConfig but the URL is nil

Previously if the `url` key in a config hash was nil we'd ignore the
configuration as invalid. This can happen when you're relying on a
`DATABASE_URL` in the env and that is not set in the environment.

```
production:
  <<: *default
  url: ENV['DATABASE_URL']
```

This PR fixes that case by checking if there is a `url` key in the
config instead of checking if the `url` is not nil in the config.

In addition to changing the conditional we then need to build a url hash
to merge with the original hash in the `UrlConfig` object.

Fixes #35091
---
 activerecord/lib/active_record/database_configurations.rb   |  4 +++-
 .../lib/active_record/database_configurations/url_config.rb | 13 +++++++++----
 2 files changed, 12 insertions(+), 5 deletions(-)

(limited to 'activerecord/lib')

diff --git a/activerecord/lib/active_record/database_configurations.rb b/activerecord/lib/active_record/database_configurations.rb
index 11aed6c002..73adf66684 100644
--- a/activerecord/lib/active_record/database_configurations.rb
+++ b/activerecord/lib/active_record/database_configurations.rb
@@ -134,9 +134,11 @@ module ActiveRecord
       end
 
       def build_db_config_from_hash(env_name, spec_name, config)
-        if url = config["url"]
+        if config.has_key?("url")
+          url = config["url"]
           config_without_url = config.dup
           config_without_url.delete "url"
+
           ActiveRecord::DatabaseConfigurations::UrlConfig.new(env_name, spec_name, url, config_without_url)
         elsif config["database"] || (config.size == 1 && config.values.all? { |v| v.is_a? String })
           ActiveRecord::DatabaseConfigurations::HashConfig.new(env_name, spec_name, config)
diff --git a/activerecord/lib/active_record/database_configurations/url_config.rb b/activerecord/lib/active_record/database_configurations/url_config.rb
index 81917fc4c1..8e8aa69478 100644
--- a/activerecord/lib/active_record/database_configurations/url_config.rb
+++ b/activerecord/lib/active_record/database_configurations/url_config.rb
@@ -56,12 +56,17 @@ module ActiveRecord
       end
 
       private
-        def build_config(original_config, url)
-          if /^jdbc:/.match?(url)
-            hash = { "url" => url }
+
+        def build_url_hash(url)
+          if url.nil? || /^jdbc:/.match?(url)
+            { "url" => url }
           else
-            hash = ActiveRecord::ConnectionAdapters::ConnectionSpecification::ConnectionUrlResolver.new(url).to_hash
+            ActiveRecord::ConnectionAdapters::ConnectionSpecification::ConnectionUrlResolver.new(url).to_hash
           end
+        end
+
+        def build_config(original_config, url)
+          hash = build_url_hash(url)
 
           if original_config[env_name]
             original_config[env_name].merge(hash)
-- 
cgit v1.2.3