Commit c8c5470e authored by Steve Müller's avatar Steve Müller

Merge pull request #826 from zeroedin-bill/fix-sqlserver-pk-column-order

fix incorrect ordering of columns in clustered indexes on sql server
parents 02c9d8c7 52adcde9
...@@ -893,7 +893,7 @@ class SQLServerPlatform extends AbstractPlatform ...@@ -893,7 +893,7 @@ class SQLServerPlatform extends AbstractPlatform
JOIN sys.index_columns AS idxcol ON idx.object_id = idxcol.object_id AND idx.index_id = idxcol.index_id JOIN sys.index_columns AS idxcol ON idx.object_id = idxcol.object_id AND idx.index_id = idxcol.index_id
JOIN sys.columns AS col ON idxcol.object_id = col.object_id AND idxcol.column_id = col.column_id JOIN sys.columns AS col ON idxcol.object_id = col.object_id AND idxcol.column_id = col.column_id
WHERE " . $this->getTableWhereClause($table, 'scm.name', 'tbl.name') . " WHERE " . $this->getTableWhereClause($table, 'scm.name', 'tbl.name') . "
ORDER BY idx.index_id ASC, idxcol.index_column_id ASC"; ORDER BY idx.index_id ASC, idxcol.key_ordinal ASC";
} }
/** /**
......
...@@ -329,4 +329,30 @@ class SQLServerSchemaManagerTest extends SchemaManagerFunctionalTestCase ...@@ -329,4 +329,30 @@ class SQLServerSchemaManagerTest extends SchemaManagerFunctionalTestCase
$this->assertNull($columns['added_commented_type']->getComment()); $this->assertNull($columns['added_commented_type']->getComment());
$this->assertEquals('666', $columns['added_commented_type_with_comment']->getComment()); $this->assertEquals('666', $columns['added_commented_type_with_comment']->getComment());
} }
public function testPkOrdering()
{
// SQL Server stores index column information in a system table with two
// columns that almost always have the same value: index_column_id and key_ordinal.
// The only situation when the two values doesn't match up is when a clustered index
// is declared that references columns in a different order from which they are
// declared in the table. In that case, key_ordinal != index_column_id.
// key_ordinal holds the index ordering. index_column_id is just a unique identifier
// for index columns within the given index.
$table = new Table('sqlsrv_pk_ordering');
$table->addColumn('colA', 'integer', array('notnull' => true));
$table->addColumn('colB', 'integer', array('notnull' => true));
$table->setPrimaryKey(array('colB', 'colA'));
$this->_sm->createTable($table);
$indexes = $this->_sm->listTableIndexes('sqlsrv_pk_ordering');
$this->assertCount(1, $indexes);
$firstIndex = current($indexes);
$columns = $firstIndex->getColumns();
$this->assertCount(2, $columns);
$this->assertEquals('colB', $columns[0]);
$this->assertEquals('colA', $columns[1]);
}
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment