diff --git a/.github/workflows/continuous-integration.yml b/.github/workflows/continuous-integration.yml index 5963083840a..96d254e90ae 100644 --- a/.github/workflows/continuous-integration.yml +++ b/.github/workflows/continuous-integration.yml @@ -283,19 +283,19 @@ jobs: - "10.4" # Oldest version supported by DBAL, LTS (Jun 2024) - "10.5" # LTS (Jun 2025) - "10.6" # LTS (Jul 2026) - - "10.10" # STS (Nov 2023) - "10.11" # LTS (Feb 2028) - "11.0" # STS (Jun 2024) - "11.1" # STS (Aug 2024) + - "11.2" # STS (Nov 2024) extension: - "mysqli" - "pdo_mysql" include: - php-version: "8.2" - mariadb-version: "11.1" + mariadb-version: "11.2" extension: "mysqli" - php-version: "8.3" - mariadb-version: "11.1" + mariadb-version: "11.2" extension: "pdo_mysql" services: diff --git a/src/Platforms/SQLitePlatform.php b/src/Platforms/SQLitePlatform.php index 2f91c277328..18a84480793 100644 --- a/src/Platforms/SQLitePlatform.php +++ b/src/Platforms/SQLitePlatform.php @@ -21,6 +21,7 @@ use Doctrine\DBAL\SQL\Builder\SelectSQLBuilder; use Doctrine\DBAL\TransactionIsolationLevel; use Doctrine\DBAL\Types; +use InvalidArgumentException; use function array_combine; use function array_keys; @@ -29,9 +30,11 @@ use function array_unique; use function array_values; use function count; +use function explode; use function implode; use function sprintf; use function str_replace; +use function strpos; use function strtolower; use function trim; @@ -538,6 +541,35 @@ public function getCreateTablesSQL(array $tables): array return $sql; } + /** {@inheritDoc} */ + public function getCreateIndexSQL(Index $index, string $table): string + { + $name = $index->getQuotedName($this); + $columns = $index->getColumns(); + + if (strpos($table, '.') !== false) { + [$schema, $table] = explode('.', $table); + $name = $schema . '.' . $name; + } + + if (count($columns) === 0) { + throw new InvalidArgumentException(sprintf( + 'Incomplete or invalid index definition %s on table %s', + $name, + $table, + )); + } + + if ($index->isPrimary()) { + return $this->getCreatePrimaryKeySQL($index, $table); + } + + $query = 'CREATE ' . $this->getCreateIndexSQLFlags($index) . 'INDEX ' . $name . ' ON ' . $table; + $query .= ' (' . implode(', ', $index->getQuotedColumns($this)) . ')' . $this->getPartialIndexSQL($index); + + return $query; + } + /** * {@inheritDoc} */ diff --git a/tests/Functional/Platform/OtherSchemaTest.php b/tests/Functional/Platform/OtherSchemaTest.php new file mode 100644 index 00000000000..38dbe6b2763 --- /dev/null +++ b/tests/Functional/Platform/OtherSchemaTest.php @@ -0,0 +1,40 @@ +connection->getDatabasePlatform(); + if (! ($databasePlatform instanceof SQLitePlatform)) { + self::markTestSkipped('This test requires SQLite'); + } + + $this->connection->executeStatement("ATTACH DATABASE '/tmp/test_other_schema.sqlite' AS other"); + + $table = new Table('other.test_other_schema'); + $table->addColumn('id', Types::INTEGER); + $table->addIndex(['id']); + + $this->dropAndCreateTable($table); + $this->connection->insert('other.test_other_schema', ['id' => 1]); + + self::assertEquals(1, $this->connection->fetchOne('SELECT COUNT(*) FROM other.test_other_schema')); + $dsnParser = new DsnParser(); + $connection = DriverManager::getConnection( + $dsnParser->parse('sqlite3:////tmp/test_other_schema.sqlite'), + ); + $onlineTable = $connection->createSchemaManager()->introspectTable('test_other_schema'); + self::assertCount(1, $onlineTable->getIndexes()); + } +}