Compare commits

..

2 commits

Author SHA1 Message Date
rxu
83e760596a
Merge 3f4be7e3af into d3bb7e5bd3 2025-06-12 02:12:24 +00:00
rxu
3f4be7e3af
[ticket/17524] Try not to hit MSSQL index key length limitations
900 bytes for a clustered index. 1,700 bytes for a nonclustered index.
For SQL Server 2014 (12.x) and earlier, all versions supported 900 bytes
for all index types.

PHPBB-17524
2025-06-12 09:12:08 +07:00

View file

@ -415,14 +415,16 @@ class phpbb_dbal_migrator_test extends phpbb_database_test_case
$this->assertTrue(isset($index_data_row['i_auth'])); $this->assertTrue(isset($index_data_row['i_auth']));
$is_mysql = $this->db->get_sql_layer() === 'mysqli'; // Key 'lengths' option only applies to MySQL indexes $is_mysql = $this->db->get_sql_layer() === 'mysqli'; // Key 'lengths' option only applies to MySQL indexes
$is_mssql = in_array($this->db->get_sql_layer(), ['mssqlnative', 'mssql_odbc']); // MSSQL primary index key has 'clustered' flag // MSSQL primary index key has 'clustered' flag, 'nonclustered' otherwise
// See https://learn.microsoft.com/en-us/sql/relational-databases/indexes/clustered-and-nonclustered-indexes-described?view=sql-server-ver17#indexes-and-constraints
$is_mssql = in_array($this->db->get_sql_layer(), ['mssqlnative', 'mssql_odbc']);
foreach ($index_data_row as $index_name => $index_data) foreach ($index_data_row as $index_name => $index_data)
{ {
switch ($index_name) switch ($index_name)
{ {
case 'i_simple': case 'i_simple':
$this->assertEquals(['user_id', 'endpoint'], $index_data['columns']); $this->assertEquals(['user_id', 'endpoint'], $index_data['columns']);
$this->assertEquals($is_mssql ? ['clustered'] : [], $index_data['flags']); $this->assertEquals($is_mssql ? ['nonclustered'] : [], $index_data['flags']);
$this->assertFalse($index_data['is_primary']); $this->assertFalse($index_data['is_primary']);
$this->assertFalse($index_data['is_unique']); $this->assertFalse($index_data['is_unique']);
$this->assertTrue($index_data['is_simple']); $this->assertTrue($index_data['is_simple']);
@ -432,7 +434,7 @@ class phpbb_dbal_migrator_test extends phpbb_database_test_case
break; break;
case 'i_uniq': case 'i_uniq':
$this->assertEquals(['expiration_time', 'p256dh'], $index_data['columns']); $this->assertEquals(['expiration_time', 'p256dh'], $index_data['columns']);
$this->assertEquals($is_mssql ? ['clustered'] : [], $index_data['flags']); $this->assertEquals($is_mssql ? ['nonclustered'] : [], $index_data['flags']);
$this->assertFalse($index_data['is_primary']); $this->assertFalse($index_data['is_primary']);
$this->assertTrue($index_data['is_unique']); $this->assertTrue($index_data['is_unique']);
$this->assertFalse($index_data['is_simple']); $this->assertFalse($index_data['is_simple']);
@ -442,7 +444,7 @@ class phpbb_dbal_migrator_test extends phpbb_database_test_case
break; break;
case 'i_auth': case 'i_auth':
$this->assertEquals(['auth'], $index_data['columns']); $this->assertEquals(['auth'], $index_data['columns']);
$this->assertEquals($is_mssql ? ['clustered'] : [], $index_data['flags']); $this->assertEquals($is_mssql ? ['nonclustered'] : [], $index_data['flags']);
$this->assertFalse($index_data['is_primary']); $this->assertFalse($index_data['is_primary']);
$this->assertFalse($index_data['is_unique']); $this->assertFalse($index_data['is_unique']);
$this->assertTrue($index_data['is_simple']); $this->assertTrue($index_data['is_simple']);