diff --git a/src/Tools/DsnParser.php b/src/Tools/DsnParser.php index 52f5c26af99..9a8fb0fe22e 100644 --- a/src/Tools/DsnParser.php +++ b/src/Tools/DsnParser.php @@ -109,7 +109,11 @@ private function parseDatabaseUrlPath(array $url, array $params): array return $params; } - $url['path'] = $this->normalizeDatabaseUrlPath($url['path']); + if (isset($params['host'])) { + // Only normalize the path if a host is also available. Otherwise we might trim leading slashes + // from a pure dbname. + $url['path'] = $this->normalizeDatabaseUrlPath($url['path']); + } // If we do not have a known DBAL driver, we do not know any connection URL path semantics to evaluate // and therefore treat the path as a regular DBAL connection URL path. @@ -131,6 +135,8 @@ private function parseDatabaseUrlPath(array $url, array $params): array */ private function normalizeDatabaseUrlPath(string $urlPath): string { + assert($urlPath[0] === '/'); + // Trim leading slash from URL path. return substr($urlPath, 1); } diff --git a/tests/Tools/DsnParserTest.php b/tests/Tools/DsnParserTest.php index 98da8c566fa..d76c84c1fa2 100644 --- a/tests/Tools/DsnParserTest.php +++ b/tests/Tools/DsnParserTest.php @@ -172,6 +172,14 @@ public static function databaseUrls(): iterable 'dbname' => 'baz', ], ], + 'quoted URL' => [ + '"sqlite:////tmp/dbname.sqlite"', + ['dbname' => '"sqlite:////tmp/dbname.sqlite"'], + ], + 'absolute path' => [ + '/tmp/dbname.sqlite', + ['dbname' => '/tmp/dbname.sqlite'], + ], ]; }