mirror of
https://github.com/phpbb/phpbb.git
synced 2025-06-08 04:18:52 +00:00
[ticket/15055] Properly support index length check on mssql
PHPBB3-15055
This commit is contained in:
parent
d99ef03446
commit
ee8b72d733
3 changed files with 46 additions and 13 deletions
|
@ -545,10 +545,7 @@ class mssql extends tools
|
||||||
{
|
{
|
||||||
$statements = array();
|
$statements = array();
|
||||||
|
|
||||||
if ($this->mssql_is_sql_server_2000())
|
|
||||||
{
|
|
||||||
$this->check_index_name_length($table_name, $index_name);
|
$this->check_index_name_length($table_name, $index_name);
|
||||||
}
|
|
||||||
|
|
||||||
// remove index length
|
// remove index length
|
||||||
$column = preg_replace('#:.*$#', '', $column);
|
$column = preg_replace('#:.*$#', '', $column);
|
||||||
|
@ -558,6 +555,21 @@ class mssql extends tools
|
||||||
return $this->_sql_run_sql($statements);
|
return $this->_sql_run_sql($statements);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
protected function get_max_index_name_length()
|
||||||
|
{
|
||||||
|
if ($this->mssql_is_sql_server_2000())
|
||||||
|
{
|
||||||
|
return parent::get_max_index_name_length();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return 128;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* {@inheritDoc}
|
* {@inheritDoc}
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -1561,7 +1561,8 @@ class tools implements tools_interface
|
||||||
*/
|
*/
|
||||||
protected function check_index_name_length($table_name, $index_name, $throw_error = true)
|
protected function check_index_name_length($table_name, $index_name, $throw_error = true)
|
||||||
{
|
{
|
||||||
if (strlen($index_name) > 30)
|
$max_index_name_length = $this->get_max_index_name_length();
|
||||||
|
if (strlen($index_name) > $max_index_name_length)
|
||||||
{
|
{
|
||||||
// Try removing the table prefix if it's at the beginning
|
// Try removing the table prefix if it's at the beginning
|
||||||
$table_prefix = substr(CONFIG_TABLE, 0, -6); // strlen(config)
|
$table_prefix = substr(CONFIG_TABLE, 0, -6); // strlen(config)
|
||||||
|
@ -1582,13 +1583,23 @@ class tools implements tools_interface
|
||||||
|
|
||||||
if ($throw_error)
|
if ($throw_error)
|
||||||
{
|
{
|
||||||
trigger_error("Index name '$index_name' on table '$table_name' is too long. The maximum is 30 characters.", E_USER_ERROR);
|
trigger_error("Index name '$index_name' on table '$table_name' is too long. The maximum is $max_index_name_length characters.", E_USER_ERROR);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return $index_name;
|
return $index_name;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get maximum index name length. Might vary depending on db type
|
||||||
|
*
|
||||||
|
* @return int Maximum index name length
|
||||||
|
*/
|
||||||
|
protected function get_max_index_name_length()
|
||||||
|
{
|
||||||
|
return 30;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* {@inheritDoc}
|
* {@inheritDoc}
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -439,29 +439,39 @@ class phpbb_dbal_db_tools_test extends phpbb_database_test_case
|
||||||
$this->markTestIncomplete('The table prefix length is too long for proper testing of index shortening function.');
|
$this->markTestIncomplete('The table prefix length is too long for proper testing of index shortening function.');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$max_index_length = 30;
|
||||||
|
|
||||||
|
if ($this->tools instanceof \phpbb\db\tools\mssql)
|
||||||
|
{
|
||||||
|
$max_length_method = new ReflectionMethod('\phpbb\db\tools\mssql', 'get_max_index_name_length');
|
||||||
|
$max_length_method->setAccessible(true);
|
||||||
|
$max_index_length = $max_length_method->invoke($this->tools);
|
||||||
|
}
|
||||||
|
|
||||||
$table_suffix = str_repeat('a', 25 - strlen($table_prefix));
|
$table_suffix = str_repeat('a', 25 - strlen($table_prefix));
|
||||||
$table_name = $table_prefix . $table_suffix;
|
$table_name = $table_prefix . $table_suffix;
|
||||||
|
|
||||||
$this->tools->sql_create_table($table_name, $this->table_data);
|
$this->tools->sql_create_table($table_name, $this->table_data);
|
||||||
|
|
||||||
// Index name and table suffix and table prefix have > 30 chars in total.
|
// Index name and table suffix and table prefix have > maximum index length chars in total.
|
||||||
// Index name and table suffix have <= 30 chars in total.
|
// Index name and table suffix have <= maximum index length chars in total.
|
||||||
$long_index_name = str_repeat('i', 30 - strlen($table_suffix));
|
$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, $long_index_name));
|
||||||
$this->assertTrue($this->tools->sql_create_index($table_name, $long_index_name, array('c_timestamp')));
|
$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, $long_index_name));
|
||||||
|
|
||||||
// Index name and table suffix have > 30 chars in total.
|
// Index name and table suffix have > maximum index length chars in total.
|
||||||
$very_long_index_name = str_repeat('i', 30);
|
$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, $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_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, $very_long_index_name));
|
||||||
|
|
||||||
$this->tools->sql_table_drop($table_name);
|
$this->tools->sql_table_drop($table_name);
|
||||||
|
|
||||||
// Index name has > 30 chars - that should not be possible.
|
// Index name has > maximum index length chars - that should not be possible.
|
||||||
$too_long_index_name = str_repeat('i', 31);
|
$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', $too_long_index_name));
|
||||||
|
$this->setExpectedTriggerError(E_USER_ERROR);
|
||||||
$this->tools->sql_create_index('prefix_table_name', $too_long_index_name, array('c_timestamp'));
|
$this->tools->sql_create_index('prefix_table_name', $too_long_index_name, array('c_timestamp'));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue