From 68359806638811a36ea94a8983ea50150919c6fb Mon Sep 17 00:00:00 2001 From: "Ben Sheldon [he/him]" Date: Mon, 16 Jan 2023 19:40:10 -0800 Subject: [PATCH] [Fix #46577] Fix inaccurate error message when connecting to `postgres` database --- .../connection_adapters/postgresql_adapter.rb | 4 +++- .../adapters/postgresql/postgresql_adapter_test.rb | 12 ++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb b/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb index 0a68a00e013c7..bfcbe06652b6c 100644 --- a/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb +++ b/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb @@ -66,7 +66,9 @@ class << self def new_client(conn_params) PG.connect(**conn_params) rescue ::PG::Error => error - if conn_params && conn_params[:dbname] && error.message.include?(conn_params[:dbname]) + if conn_params && conn_params[:dbname] == "postgres" + raise ActiveRecord::ConnectionNotEstablished, error.message + elsif conn_params && conn_params[:dbname] && error.message.include?(conn_params[:dbname]) raise ActiveRecord::NoDatabaseError.db_error(conn_params[:dbname]) elsif conn_params && conn_params[:user] && error.message.include?(conn_params[:user]) raise ActiveRecord::DatabaseConnectionError.username_error(conn_params[:user]) diff --git a/activerecord/test/cases/adapters/postgresql/postgresql_adapter_test.rb b/activerecord/test/cases/adapters/postgresql/postgresql_adapter_test.rb index c3ffdc80c6b7a..5322db3fbfea9 100644 --- a/activerecord/test/cases/adapters/postgresql/postgresql_adapter_test.rb +++ b/activerecord/test/cases/adapters/postgresql/postgresql_adapter_test.rb @@ -75,6 +75,18 @@ def test_bad_connection end end + def test_bad_connection_to_postgres_database + connect_raises_error = proc { |**_conn_params| raise(PG::ConnectionBad, 'FATAL: database "postgres" does not exist') } + PG.stub(:connect, connect_raises_error) do + assert_raises ActiveRecord::ConnectionNotEstablished do + db_config = ActiveRecord::Base.configurations.configs_for(env_name: "arunit", name: "primary") + configuration = db_config.configuration_hash.merge(database: "postgres") + connection = ActiveRecord::Base.postgresql_connection(configuration) + connection.exec_query("SELECT 1") + end + end + end + def test_database_exists_returns_false_when_the_database_does_not_exist config = { database: "non_extant_database", adapter: "postgresql" } assert_not ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.database_exists?(config),