mirror of
https://github.com/phpbb/phpbb.git
synced 2025-07-09 03:28:51 +00:00
[ticket/17525] Automatically handle index name prefixes
PHPBB-17525
This commit is contained in:
parent
8e0ec1edd2
commit
669af8f3aa
2 changed files with 24 additions and 18 deletions
|
@ -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)
|
||||
|
|
|
@ -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'));
|
||||
|
|
Loading…
Add table
Reference in a new issue