Skip to content

Commit

Permalink
Merge branch '4.2.x' into 5.0.x
Browse files Browse the repository at this point in the history
* 4.2.x:
  Passive support for partitioned tables on Postgres (#6516)
  fix typo
  • Loading branch information
derrabus committed Sep 4, 2024
2 parents 8592ef6 + 0e81fa2 commit 1873264
Show file tree
Hide file tree
Showing 3 changed files with 66 additions and 2 deletions.
2 changes: 1 addition & 1 deletion docs/en/reference/configuration.rst
Original file line number Diff line number Diff line change
Expand Up @@ -409,7 +409,7 @@ Connect to your Postgres server and run the ``SHOW server_version`` query::
(1 row)

In the example above, ``15.2 (Debian 15.2-1.pgdg110+1)`` is the correct value for
``server Version``.
``serverVersion``.

Other Platforms
^^^^^^^^^^^^^^^
Expand Down
15 changes: 14 additions & 1 deletion src/Schema/PostgreSQLSchemaManager.php
Original file line number Diff line number Diff line change
Expand Up @@ -460,8 +460,21 @@ protected function selectTableColumns(string $databaseName, ?string $tableName =

$conditions = array_merge([
'a.attnum > 0',
"c.relkind = 'r'",
'd.refobjid IS NULL',

// 'r' for regular tables - 'p' for partitioned tables
"c.relkind IN('r', 'p')",

// exclude partitions (tables that inherit from partitioned tables)
<<<'SQL'
NOT EXISTS (
SELECT 1
FROM pg_inherits
INNER JOIN pg_class parent on pg_inherits.inhparent = parent.oid
AND parent.relkind = 'p'
WHERE inhrelid = c.oid
)
SQL,
], $this->buildQueryConditions($tableName));

$sql .= ' WHERE ' . implode(' AND ', $conditions) . ' ORDER BY a.attnum';
Expand Down
51 changes: 51 additions & 0 deletions tests/Functional/Schema/PostgreSQLSchemaManagerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

use Doctrine\DBAL\Platforms\AbstractPlatform;
use Doctrine\DBAL\Platforms\PostgreSQLPlatform;
use Doctrine\DBAL\Schema\Exception\TableDoesNotExist;
use Doctrine\DBAL\Schema\ForeignKeyConstraint;
use Doctrine\DBAL\Schema\Schema;
use Doctrine\DBAL\Schema\Table;
Expand Down Expand Up @@ -593,6 +594,56 @@ public static function autoIncrementTypeMigrations(): iterable
'bigint->int' => ['bigint', 'integer', 'INT'],
];
}

public function testPartitionTable(): void
{
$this->connection->executeStatement('DROP TABLE IF EXISTS partitioned_table');
$this->connection->executeStatement(
'CREATE TABLE partitioned_table (id INT) PARTITION BY LIST (id);',
);
$this->connection->executeStatement('CREATE TABLE partition PARTITION OF partitioned_table FOR VALUES IN (1);');
try {
$this->schemaManager->introspectTable('partition');
} catch (TableDoesNotExist $e) {
}

self::assertNotNull($e ?? null, 'Partition table should not be introspected');

$tableFrom = $this->schemaManager->introspectTable('partitioned_table');

$tableTo = $this->schemaManager->introspectTable('partitioned_table');
$tableTo->addColumn('foo', Types::INTEGER);

$platform = $this->connection->getDatabasePlatform();
$diff = $this->schemaManager->createComparator()->compareTables($tableFrom, $tableTo);

$sql = $platform->getAlterTableSQL($diff);
self::assertSame(['ALTER TABLE partitioned_table ADD foo INT NOT NULL'], $sql);

$this->schemaManager->alterTable($diff);

$tableFinal = $this->schemaManager->introspectTable('partitioned_table');
self::assertTrue($tableFinal->hasColumn('id'));
self::assertTrue($tableFinal->hasColumn('foo'));

$partitionedTableCount = (int) ($this->connection->fetchOne(
"select count(*) as count from pg_class where relname = 'partitioned_table' and relkind = 'p'",
));
self::assertSame(1, $partitionedTableCount);

$partitionsCount = (int) ($this->connection->fetchOne(
<<<'SQL'
select count(*) as count
from pg_class parent
inner join pg_inherits on pg_inherits.inhparent = parent.oid
inner join pg_class child on pg_inherits.inhrelid = child.oid
and child.relkind = 'r'
and child.relname = 'partition'
where parent.relname = 'partitioned_table' and parent.relkind = 'p';
SQL,
));
self::assertSame(1, $partitionsCount);
}
}

class MoneyType extends Type
Expand Down

0 comments on commit 1873264

Please sign in to comment.