From efb191431ab4862c16fd3e7985dff57d9c4f5c8d Mon Sep 17 00:00:00 2001 From: Daniel Black Date: Sun, 9 Jun 2024 11:06:19 +1000 Subject: [PATCH 1/2] Add MariaDb1010Platform for fetchTableOptionsByTable The diverging MariaDB-10.10.1+ implementation of retrieving table options split the implementation so that its now in the AbstractMySQLPlatform and the MariaDB specific implementation in MariaDBPlatform. Fixes #6361. --- docs/en/reference/platforms.rst | 1 + src/Driver/AbstractMySQLDriver.php | 5 ++ src/Platforms/AbstractMySQLPlatform.php | 26 ++++++++++ src/Platforms/MariaDb1010Platform.php | 47 +++++++++++++++++++ src/Schema/MySQLSchemaManager.php | 30 ++---------- .../Driver/VersionAwarePlatformDriverTest.php | 3 +- tests/Functional/Query/QueryBuilderTest.php | 3 +- 7 files changed, 86 insertions(+), 29 deletions(-) create mode 100644 src/Platforms/MariaDb1010Platform.php diff --git a/docs/en/reference/platforms.rst b/docs/en/reference/platforms.rst index 54a9dc97dbd..760894e40ca 100644 --- a/docs/en/reference/platforms.rst +++ b/docs/en/reference/platforms.rst @@ -45,6 +45,7 @@ MariaDB - ``MariaDb1043Platform`` for version 10.4.3 and above. - ``MariaDb1052Platform`` for version 10.5.2 and above. - ``MariaDb1060Platform`` for version 10.6 and above. +- ``MariaDb1010Platform`` for version 10.10 and above. Oracle ^^^^^^ diff --git a/src/Driver/AbstractMySQLDriver.php b/src/Driver/AbstractMySQLDriver.php index 8942795d8fa..93c418d1eae 100644 --- a/src/Driver/AbstractMySQLDriver.php +++ b/src/Driver/AbstractMySQLDriver.php @@ -8,6 +8,7 @@ use Doctrine\DBAL\Exception; use Doctrine\DBAL\Platforms\AbstractMySQLPlatform; use Doctrine\DBAL\Platforms\AbstractPlatform; +use Doctrine\DBAL\Platforms\MariaDb1010Platform; use Doctrine\DBAL\Platforms\MariaDb1027Platform; use Doctrine\DBAL\Platforms\MariaDb1043Platform; use Doctrine\DBAL\Platforms\MariaDb1052Platform; @@ -41,6 +42,10 @@ public function createDatabasePlatformForVersion($version) if ($mariadb) { $mariaDbVersion = $this->getMariaDbMysqlVersionNumber($version); + if (version_compare($mariaDbVersion, '10.10.0', '>=')) { + return new MariaDb1010Platform(); + } + if (version_compare($mariaDbVersion, '10.6.0', '>=')) { return new MariaDb1060Platform(); } diff --git a/src/Platforms/AbstractMySQLPlatform.php b/src/Platforms/AbstractMySQLPlatform.php index 8651b82783d..ba3b6b6c94f 100644 --- a/src/Platforms/AbstractMySQLPlatform.php +++ b/src/Platforms/AbstractMySQLPlatform.php @@ -1468,4 +1468,30 @@ private function indexAssetsByLowerCaseName(array $assets): array return $result; } + + public function fetchTableOptionsByTable(string $databaseName, ?string $tableName = null): string + { + $sql = <<<'SQL' + SELECT t.TABLE_NAME, + t.ENGINE, + t.AUTO_INCREMENT, + t.TABLE_COMMENT, + t.CREATE_OPTIONS, + t.TABLE_COLLATION, + ccsa.CHARACTER_SET_NAME + FROM information_schema.TABLES t + INNER JOIN information_schema.COLLATION_CHARACTER_SET_APPLICABILITY ccsa + ON ccsa.COLLATION_NAME = t.TABLE_COLLATION +SQL; + + $conditions = ['t.TABLE_SCHEMA = ?']; + + if ($tableName !== null) { + $conditions[] = 't.TABLE_NAME = ?'; + } + + $conditions[] = "t.TABLE_TYPE = 'BASE TABLE'"; + + return $sql . ' WHERE ' . implode(' AND ', $conditions); + } } diff --git a/src/Platforms/MariaDb1010Platform.php b/src/Platforms/MariaDb1010Platform.php new file mode 100644 index 00000000000..a35a3204570 --- /dev/null +++ b/src/Platforms/MariaDb1010Platform.php @@ -0,0 +1,47 @@ +_platform->fetchTableOptionsByTable($databaseName, $tableName); + $params = [$databaseName]; if ($tableName !== null) { - $conditions[] = 't.TABLE_NAME = ?'; - $params[] = $tableName; + $params[] = $tableName; } - $conditions[] = "t.TABLE_TYPE = 'BASE TABLE'"; - - $sql .= ' WHERE ' . implode(' AND ', $conditions); - /** @var array> $metadata */ $metadata = $this->_conn->executeQuery($sql, $params) ->fetchAllAssociativeIndexed(); diff --git a/tests/Driver/VersionAwarePlatformDriverTest.php b/tests/Driver/VersionAwarePlatformDriverTest.php index 897dd9ba19e..b567e00c177 100644 --- a/tests/Driver/VersionAwarePlatformDriverTest.php +++ b/tests/Driver/VersionAwarePlatformDriverTest.php @@ -8,6 +8,7 @@ use Doctrine\DBAL\Platforms\AbstractPlatform; use Doctrine\DBAL\Platforms\DB2111Platform; use Doctrine\DBAL\Platforms\DB2Platform; +use Doctrine\DBAL\Platforms\MariaDb1010Platform; use Doctrine\DBAL\Platforms\MariaDb1027Platform; use Doctrine\DBAL\Platforms\MariaDb1052Platform; use Doctrine\DBAL\Platforms\MariaDb1060Platform; @@ -65,7 +66,7 @@ public static function mySQLVersionProvider(): array ['10.5.2-MariaDB-1~lenny-log', MariaDB1052Platform::class], ['mariadb-10.6.0', MariaDb1060Platform::class], ['mariadb-10.9.3', MariaDb1060Platform::class], - ['11.0.2-MariaDB-1:11.0.2+maria~ubu2204', MariaDb1060Platform::class], + ['11.0.2-MariaDB-1:11.0.2+maria~ubu2204', MariaDb1010Platform::class], ]; } diff --git a/tests/Functional/Query/QueryBuilderTest.php b/tests/Functional/Query/QueryBuilderTest.php index 16cc0f20dd2..afd16139960 100644 --- a/tests/Functional/Query/QueryBuilderTest.php +++ b/tests/Functional/Query/QueryBuilderTest.php @@ -7,6 +7,7 @@ use Doctrine\DBAL\DriverManager; use Doctrine\DBAL\Exception; use Doctrine\DBAL\Platforms\DB2Platform; +use Doctrine\DBAL\Platforms\MariaDb1010Platform; use Doctrine\DBAL\Platforms\MariaDb1060Platform; use Doctrine\DBAL\Platforms\MariaDBPlatform; use Doctrine\DBAL\Platforms\MySQL80Platform; @@ -117,7 +118,7 @@ private function platformSupportsSkipLocked(): bool if ($platform instanceof MySQLPlatform) { if ($platform instanceof MariaDBPlatform) { - if (! $platform instanceof MariaDb1060Platform) { + if (! ($platform instanceof MariaDb1060Platform || $platform instanceof MariaDb1010Platform)) { return false; } } elseif (! $platform instanceof MySQL80Platform) { From beb9db44e9f6d756061070aa6ee7e43d953329f0 Mon Sep 17 00:00:00 2001 From: "Alexander M. Turek" Date: Tue, 18 Jun 2024 15:51:27 +0200 Subject: [PATCH 2/2] Simplify signature of fetchTableOptionsByTable --- src/Platforms/AbstractMySQLPlatform.php | 4 ++-- src/Platforms/MariaDb1010Platform.php | 4 ++-- src/Schema/MySQLSchemaManager.php | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Platforms/AbstractMySQLPlatform.php b/src/Platforms/AbstractMySQLPlatform.php index ba3b6b6c94f..88b45ab29d1 100644 --- a/src/Platforms/AbstractMySQLPlatform.php +++ b/src/Platforms/AbstractMySQLPlatform.php @@ -1469,7 +1469,7 @@ private function indexAssetsByLowerCaseName(array $assets): array return $result; } - public function fetchTableOptionsByTable(string $databaseName, ?string $tableName = null): string + public function fetchTableOptionsByTable(bool $includeTableName): string { $sql = <<<'SQL' SELECT t.TABLE_NAME, @@ -1486,7 +1486,7 @@ public function fetchTableOptionsByTable(string $databaseName, ?string $tableNam $conditions = ['t.TABLE_SCHEMA = ?']; - if ($tableName !== null) { + if ($includeTableName) { $conditions[] = 't.TABLE_NAME = ?'; } diff --git a/src/Platforms/MariaDb1010Platform.php b/src/Platforms/MariaDb1010Platform.php index a35a3204570..6cddbdd48ab 100644 --- a/src/Platforms/MariaDb1010Platform.php +++ b/src/Platforms/MariaDb1010Platform.php @@ -16,7 +16,7 @@ public function createSelectSQLBuilder(): SelectSQLBuilder return AbstractPlatform::createSelectSQLBuilder(); } - public function fetchTableOptionsByTable(string $databaseName, ?string $tableName = null): string + public function fetchTableOptionsByTable(bool $includeTableName): string { // MariaDB-10.10.1 added FULL_COLLATION_NAME to the information_schema.COLLATION_CHARACTER_SET_APPLICABILITY. // A base collation like uca1400_ai_ci can refer to multiple character sets. The value in the @@ -36,7 +36,7 @@ public function fetchTableOptionsByTable(string $databaseName, ?string $tableNam $conditions = ['t.TABLE_SCHEMA = ?']; - if ($tableName !== null) { + if ($includeTableName) { $conditions[] = 't.TABLE_NAME = ?'; } diff --git a/src/Schema/MySQLSchemaManager.php b/src/Schema/MySQLSchemaManager.php index fc227d6387a..6e444d21364 100644 --- a/src/Schema/MySQLSchemaManager.php +++ b/src/Schema/MySQLSchemaManager.php @@ -557,7 +557,7 @@ protected function selectForeignKeyColumns(string $databaseName, ?string $tableN */ protected function fetchTableOptionsByTable(string $databaseName, ?string $tableName = null): array { - $sql = $this->_platform->fetchTableOptionsByTable($databaseName, $tableName); + $sql = $this->_platform->fetchTableOptionsByTable($tableName !== null); $params = [$databaseName]; if ($tableName !== null) {