From 6e8b38e29c9fed19e79c7e227fe31c07af324c73 Mon Sep 17 00:00:00 2001 From: Sean Date: Wed, 3 Aug 2022 19:51:55 -0700 Subject: [PATCH 1/2] feat: allow creating a Postgres DSN string with a different database name than is used for information_schema queries See https://github.com/laravel/framework/discussions/43536 --- .../Database/Connectors/PostgresConnector.php | 5 +++++ tests/Database/DatabaseConnectorTest.php | 16 ++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/src/Illuminate/Database/Connectors/PostgresConnector.php b/src/Illuminate/Database/Connectors/PostgresConnector.php index 6331bc2d786b..89f1174282ae 100755 --- a/src/Illuminate/Database/Connectors/PostgresConnector.php +++ b/src/Illuminate/Database/Connectors/PostgresConnector.php @@ -163,6 +163,11 @@ protected function getDsn(array $config) $host = isset($host) ? "host={$host};" : ''; + // User may need to connect using a different database name than is used + // during information_schema queries. This can occur when using connection + // pooling software with aliased database names. + $database = $database_connect ?? $database; + $dsn = "pgsql:{$host}dbname='{$database}'"; // If a port was specified, we will add it to this Postgres DSN connections diff --git a/tests/Database/DatabaseConnectorTest.php b/tests/Database/DatabaseConnectorTest.php index 221223619552..ca4d989da567 100755 --- a/tests/Database/DatabaseConnectorTest.php +++ b/tests/Database/DatabaseConnectorTest.php @@ -216,6 +216,22 @@ public function testPostgresApplicationNameIsSet() $this->assertSame($result, $connection); } + public function testPostgresApplicationUseAlternativeDatabaseName() + { + $dsn = 'pgsql:dbname=\'baz\''; + $config = ['database' => 'bar', 'database_connect' => 'baz']; + $connector = $this->getMockBuilder(PostgresConnector::class)->onlyMethods(['createConnection', 'getOptions'])->getMock(); + $connection = m::mock(stdClass::class); + $connector->expects($this->once())->method('getOptions')->with($this->equalTo($config))->willReturn(['options']); + $connector->expects($this->once())->method('createConnection')->with($this->equalTo($dsn), $this->equalTo($config), $this->equalTo(['options']))->willReturn($connection); + $statement = m::mock(PDOStatement::class); + $connection->shouldReceive('prepare')->zeroOrMoreTimes()->andReturn($statement); + $statement->shouldReceive('execute')->zeroOrMoreTimes(); + $result = $connector->connect($config); + + $this->assertSame($result, $connection); + } + public function testPostgresConnectorReadsIsolationLevelFromConfig() { $dsn = 'pgsql:host=foo;dbname=\'bar\';port=111'; From 15c80474d667c26054eda19669104c996f134c04 Mon Sep 17 00:00:00 2001 From: Taylor Otwell Date: Thu, 4 Aug 2022 08:43:36 -0500 Subject: [PATCH 2/2] formatting --- src/Illuminate/Database/Connectors/PostgresConnector.php | 8 ++++---- tests/Database/DatabaseConnectorTest.php | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Illuminate/Database/Connectors/PostgresConnector.php b/src/Illuminate/Database/Connectors/PostgresConnector.php index 89f1174282ae..c54163f9b89f 100755 --- a/src/Illuminate/Database/Connectors/PostgresConnector.php +++ b/src/Illuminate/Database/Connectors/PostgresConnector.php @@ -163,10 +163,10 @@ protected function getDsn(array $config) $host = isset($host) ? "host={$host};" : ''; - // User may need to connect using a different database name than is used - // during information_schema queries. This can occur when using connection - // pooling software with aliased database names. - $database = $database_connect ?? $database; + // Sometimes - users may need to connect to a database that has a different + // name than the database used for "information_schema" queries. This is + // typically the case if using "pgbouncer" type software when pooling. + $database = $connect_via_database ?? $database; $dsn = "pgsql:{$host}dbname='{$database}'"; diff --git a/tests/Database/DatabaseConnectorTest.php b/tests/Database/DatabaseConnectorTest.php index ca4d989da567..bda58cafb569 100755 --- a/tests/Database/DatabaseConnectorTest.php +++ b/tests/Database/DatabaseConnectorTest.php @@ -219,7 +219,7 @@ public function testPostgresApplicationNameIsSet() public function testPostgresApplicationUseAlternativeDatabaseName() { $dsn = 'pgsql:dbname=\'baz\''; - $config = ['database' => 'bar', 'database_connect' => 'baz']; + $config = ['database' => 'bar', 'connect_via_database' => 'baz']; $connector = $this->getMockBuilder(PostgresConnector::class)->onlyMethods(['createConnection', 'getOptions'])->getMock(); $connection = m::mock(stdClass::class); $connector->expects($this->once())->method('getOptions')->with($this->equalTo($config))->willReturn(['options']);