From cbfd48e0a76f905ead470e5398e6f1da4ffbd356 Mon Sep 17 00:00:00 2001 From: catch <6915-catch@users.noreply.drupalcode.org> Date: Mon, 10 Mar 2025 17:28:49 +0000 Subject: [PATCH] Issue #3494471 by tgauges, smustgrave: Renaming a table containing "drupal_" in the name with multiple indexes fails on PostreSQL --- .../src/Driver/Database/pgsql/Schema.php | 2 +- .../tests/src/Kernel/pgsql/SchemaTest.php | 29 +++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/core/modules/pgsql/src/Driver/Database/pgsql/Schema.php b/core/modules/pgsql/src/Driver/Database/pgsql/Schema.php index b6f669d24ba6..a4585e15da7a 100644 --- a/core/modules/pgsql/src/Driver/Database/pgsql/Schema.php +++ b/core/modules/pgsql/src/Driver/Database/pgsql/Schema.php @@ -580,7 +580,7 @@ public function renameTable($table, $new_name) { // exceed the 63 chars limit of PostgreSQL, we need to take care of that. // cSpell:disable-next-line // Example (drupal_Gk7Su_T1jcBHVuvSPeP22_I3Ni4GrVEgTYlIYnBJkro_idx). - if (str_contains($index->indexname, 'drupal_')) { + if (str_starts_with($index->indexname, 'drupal_')) { preg_match('/^drupal_(.*)_' . preg_quote($index_type, NULL) . '/', $index->indexname, $matches); $index_name = $matches[1]; } diff --git a/core/modules/pgsql/tests/src/Kernel/pgsql/SchemaTest.php b/core/modules/pgsql/tests/src/Kernel/pgsql/SchemaTest.php index 6894968a9552..e10ed33d1903 100644 --- a/core/modules/pgsql/tests/src/Kernel/pgsql/SchemaTest.php +++ b/core/modules/pgsql/tests/src/Kernel/pgsql/SchemaTest.php @@ -365,6 +365,35 @@ public function testRenameTableWithNewIndexNameEqualsTableName(): void { $this->assertTrue($this->schema->tableExists($table_name_new)); } + /** + * Tests renaming a table which name contains drupal_ with multiple indexes. + */ + public function testRenameTableWithNameContainingDrupalUnderscoreAndMultipleIndexes(): void { + $table_name_old = 'field_drupal_foo'; + $table_name_new = 'field_drupal_bar'; + $table_specification = [ + 'fields' => [ + 'one' => [ + 'type' => 'int', + 'default' => NULL, + ], + 'two' => [ + 'type' => 'int', + 'default' => NULL, + ], + ], + 'indexes' => [ + 'one' => ['one'], + 'two' => ['two'], + ], + ]; + $this->schema->createTable($table_name_old, $table_specification); + + $this->schema->renameTable($table_name_old, $table_name_new); + + $this->assertTrue($this->schema->tableExists($table_name_new)); + } + /** * Tests column name escaping in field constraints. */ -- GitLab