From 669af8f3aa308e4b8f6d001fc5fba629fb67fa1d Mon Sep 17 00:00:00 2001 From: rxu Date: Tue, 1 Jul 2025 23:32:36 +0700 Subject: [PATCH] [ticket/17525] Automatically handle index name prefixes PHPBB-17525 --- phpBB/phpbb/db/tools/doctrine.php | 3 ++- tests/dbal/db_tools_test.php | 39 +++++++++++++++++-------------- 2 files changed, 24 insertions(+), 18 deletions(-) diff --git a/phpBB/phpbb/db/tools/doctrine.php b/phpBB/phpbb/db/tools/doctrine.php index 2c52575651..b5497a81d6 100644 --- a/phpBB/phpbb/db/tools/doctrine.php +++ b/phpBB/phpbb/db/tools/doctrine.php @@ -424,7 +424,7 @@ class doctrine implements tools_interface } else if ($remove_prefix) { - $index_name = remove_prefix($index_name); + $index_name = self::remove_prefix($index_name); } return $index_name; @@ -697,6 +697,7 @@ class doctrine implements tools_interface foreach ($table_data['KEYS'] as $key_name => $key_data) { $columns = (is_array($key_data[1])) ? $key_data[1] : [$key_data[1]]; + $key_name = self::normalize_index_name($table_name, $key_name); // Supports key columns defined with there length $columns = array_map(function (string $column) diff --git a/tests/dbal/db_tools_test.php b/tests/dbal/db_tools_test.php index 73543ed97d..42ce4e924b 100644 --- a/tests/dbal/db_tools_test.php +++ b/tests/dbal/db_tools_test.php @@ -232,23 +232,25 @@ class phpbb_dbal_db_tools_test extends phpbb_database_test_case public function test_column_change_with_index() { + $short_table_name = \phpbb\db\doctrine\table_helper::generate_shortname('table_name'); + // Create column $this->assertFalse($this->tools->sql_column_exists('prefix_table_name', 'c_bug_12012')); $this->assertTrue($this->tools->sql_column_add('prefix_table_name', 'c_bug_12012', array('DECIMAL', 0))); $this->assertTrue($this->tools->sql_column_exists('prefix_table_name', 'c_bug_12012')); // Create index over the column - $this->assertFalse($this->tools->sql_index_exists('prefix_table_name', 'i_bug_12012')); + $this->assertFalse($this->tools->sql_index_exists('prefix_table_name', $short_table_name . '_i_bug_12012')); $this->assertTrue($this->tools->sql_create_index('prefix_table_name', 'i_bug_12012', array('c_bug_12012', 'c_bool'))); - $this->assertTrue($this->tools->sql_index_exists('prefix_table_name', 'i_bug_12012')); + $this->assertTrue($this->tools->sql_index_exists('prefix_table_name', $short_table_name . '_i_bug_12012')); // Change type from int to string $this->assertTrue($this->tools->sql_column_change('prefix_table_name', 'c_bug_12012', array('VCHAR:100', ''))); // Remove the index - $this->assertTrue($this->tools->sql_index_exists('prefix_table_name', 'i_bug_12012')); + $this->assertTrue($this->tools->sql_index_exists('prefix_table_name', $short_table_name . '_i_bug_12012')); $this->assertTrue($this->tools->sql_index_drop('prefix_table_name', 'i_bug_12012')); - $this->assertFalse($this->tools->sql_index_exists('prefix_table_name', 'i_bug_12012')); + $this->assertFalse($this->tools->sql_index_exists('prefix_table_name', $short_table_name . '_i_bug_12012')); // Remove the column $this->assertTrue($this->tools->sql_column_exists('prefix_table_name', 'c_bug_12012')); @@ -301,19 +303,21 @@ class phpbb_dbal_db_tools_test extends phpbb_database_test_case public function test_column_remove_with_index() { + $short_table_name = \phpbb\db\doctrine\table_helper::generate_shortname('table_name'); + // Create column $this->assertFalse($this->tools->sql_column_exists('prefix_table_name', 'c_bug_12012_2')); $this->assertTrue($this->tools->sql_column_add('prefix_table_name', 'c_bug_12012_2', array('UINT', 4))); $this->assertTrue($this->tools->sql_column_exists('prefix_table_name', 'c_bug_12012_2')); // Create index over the column - $this->assertFalse($this->tools->sql_index_exists('prefix_table_name', 'bug_12012_2')); + $this->assertFalse($this->tools->sql_index_exists('prefix_table_name', $short_table_name . '_bug_12012_2')); $this->assertTrue($this->tools->sql_create_index('prefix_table_name', 'bug_12012_2', array('c_bug_12012_2', 'c_bool'))); - $this->assertTrue($this->tools->sql_index_exists('prefix_table_name', 'bug_12012_2')); + $this->assertTrue($this->tools->sql_index_exists('prefix_table_name', $short_table_name . '_bug_12012_2')); - $this->assertFalse($this->tools->sql_index_exists('prefix_table_name', 'bug_12012_3')); + $this->assertFalse($this->tools->sql_index_exists('prefix_table_name', $short_table_name . '_bug_12012_3')); $this->assertTrue($this->tools->sql_create_index('prefix_table_name', 'bug_12012_3', array('c_bug_12012_2'))); - $this->assertTrue($this->tools->sql_index_exists('prefix_table_name', 'bug_12012_3')); + $this->assertTrue($this->tools->sql_index_exists('prefix_table_name', $short_table_name . '_bug_12012_3')); // Remove the column $this->assertTrue($this->tools->sql_column_exists('prefix_table_name', 'c_bug_12012_2')); @@ -443,24 +447,24 @@ class phpbb_dbal_db_tools_test extends phpbb_database_test_case public function test_index_exists() { - $this->assertTrue($this->tools->sql_index_exists('prefix_table_name', 'i_simple')); + $this->assertTrue($this->tools->sql_index_exists('prefix_table_name', \phpbb\db\doctrine\table_helper::generate_shortname('table_name') . '_i_simple')); } public function test_unique_index_exists() { - $this->assertTrue($this->tools->sql_unique_index_exists('prefix_table_name', 'i_uniq')); + $this->assertTrue($this->tools->sql_unique_index_exists('prefix_table_name', \phpbb\db\doctrine\table_helper::generate_shortname('table_name') . '_i_uniq')); } public function test_create_index_against_index_exists() { $this->tools->sql_create_index('prefix_table_name', 'fookey', array('c_timestamp', 'c_decimal')); - $this->assertTrue($this->tools->sql_index_exists('prefix_table_name', 'fookey')); + $this->assertTrue($this->tools->sql_index_exists('prefix_table_name', \phpbb\db\doctrine\table_helper::generate_shortname('table_name') . '_fookey')); } public function test_create_unique_index_against_unique_index_exists() { $this->tools->sql_create_unique_index('prefix_table_name', 'i_uniq_ts_id', array('c_timestamp', 'c_id')); - $this->assertTrue($this->tools->sql_unique_index_exists('prefix_table_name', 'i_uniq_ts_id')); + $this->assertTrue($this->tools->sql_unique_index_exists('prefix_table_name', \phpbb\db\doctrine\table_helper::generate_shortname('table_name') . '_i_uniq_ts_id')); } public function test_create_int_default_null() @@ -493,27 +497,28 @@ class phpbb_dbal_db_tools_test extends phpbb_database_test_case $table_suffix = str_repeat('a', 25 - strlen($table_prefix)); $table_name = $table_prefix . $table_suffix; + $short_table_name = \phpbb\db\doctrine\table_helper::generate_shortname($table_suffix); $this->tools->sql_create_table($table_name, $this->table_data); // Index name and table suffix and table prefix have > maximum index length chars in total. // Index name and table suffix have <= maximum index length chars in total. $long_index_name = str_repeat('i', $max_index_length - strlen($table_suffix)); - $this->assertFalse($this->tools->sql_index_exists($table_name, $long_index_name)); + $this->assertFalse($this->tools->sql_index_exists($table_name, $short_table_name . '_' . $long_index_name)); $this->assertTrue($this->tools->sql_create_index($table_name, $long_index_name, array('c_timestamp'))); - $this->assertTrue($this->tools->sql_index_exists($table_name, $long_index_name)); + $this->assertTrue($this->tools->sql_index_exists($table_name, $short_table_name . '_' . $long_index_name)); // Index name and table suffix have > maximum index length chars in total. $very_long_index_name = str_repeat('i', $max_index_length); - $this->assertFalse($this->tools->sql_index_exists($table_name, $very_long_index_name)); + $this->assertFalse($this->tools->sql_index_exists($table_name, $short_table_name . '_' . $very_long_index_name)); $this->assertTrue($this->tools->sql_create_index($table_name, $very_long_index_name, array('c_timestamp'))); - $this->assertTrue($this->tools->sql_index_exists($table_name, $very_long_index_name)); + $this->assertTrue($this->tools->sql_index_exists($table_name, $short_table_name . '_' . $very_long_index_name)); $this->tools->sql_table_drop($table_name); // Index name has > maximum index length chars - that should not be possible. $too_long_index_name = str_repeat('i', $max_index_length + 1); - $this->assertFalse($this->tools->sql_index_exists('prefix_table_name', $too_long_index_name)); + $this->assertFalse($this->tools->sql_index_exists('prefix_table_name', $short_table_name . '_' . $too_long_index_name)); $this->setExpectedTriggerError(E_USER_ERROR); // TODO: Do we want to keep this limitation, if yes reimplement the user check /* https://github.com/phpbb/phpbb/blob/aee5e373bca6cd20d44b99585d3b758276a2d7e6/phpBB/phpbb/db/tools/tools.php#L1488-L1517 */ $this->tools->sql_create_index('prefix_table_name', $too_long_index_name, array('c_timestamp'));