Skip to content

Commit

Permalink
Merge pull request #462 from deeky666/respect-sqlserver-schemaname
Browse files Browse the repository at this point in the history
Fix full qualified table name schema introspection
  • Loading branch information
beberlei committed Dec 29, 2013
2 parents 84ac8d9 + 803b326 commit fba268b
Show file tree
Hide file tree
Showing 3 changed files with 102 additions and 5 deletions.
36 changes: 34 additions & 2 deletions lib/Doctrine/DBAL/Platforms/SQLAnywherePlatform.php
Expand Up @@ -752,6 +752,13 @@ public function getListDatabasesSQL()
*/
public function getListTableColumnsSQL($table, $database = null)
{
$user = 'USER_NAME()';

if (strpos($table, '.') !== false) {
list($user, $table) = explode('.', $table);
$user = "'" . $user . "'";
}

return "SELECT col.column_name,
COALESCE(def.user_type_name, def.domain_name) AS 'type',
def.declared_width AS 'length',
Expand All @@ -766,6 +773,7 @@ public function getListTableColumnsSQL($table, $database = null)
ON col.table_id = def.base_table_id AND col.column_id = def.base_column_id
LEFT JOIN SYS.SYSREMARK AS rem
ON col.object_id = rem.object_id
WHERE def.base_owner_name = $user
ORDER BY def.base_column_id ASC";
}

Expand All @@ -776,17 +784,32 @@ public function getListTableColumnsSQL($table, $database = null)
*/
public function getListTableConstraintsSQL($table)
{
$user = '';

if (strpos($table, '.') !== false) {
list($user, $table) = explode('.', $table);
$user = "'" . $user . "'";
}

return "SELECT con.*
FROM SYS.SYSCONSTRAINT AS con
JOIN SYS.SYSTABLE AS tab ON con.table_object_id = tab.object_id
WHERE tab.table_name = '$table'";
JOIN SYS.SYSTAB AS tab ON con.table_object_id = tab.object_id
WHERE tab.table_name = '$table'
AND tab.creator = USER_ID($user)";
}

/**
* {@inheritdoc}
*/
public function getListTableForeignKeysSQL($table)
{
$user = '';

if (strpos($table, '.') !== false) {
list($user, $table) = explode('.', $table);
$user = "'" . $user . "'";
}

return "SELECT fcol.column_name AS local_column,
ptbl.table_name AS foreign_table,
pcol.column_name AS foreign_column,
Expand Down Expand Up @@ -854,6 +877,7 @@ public function getListTableForeignKeysSQL($table)
AND fk.foreign_index_id = dt.foreign_key_id
AND dt.event = 'D'
WHERE ftbl.table_name = '$table'
AND ftbl.creator = USER_ID($user)
ORDER BY fk.foreign_index_id ASC, idxcol.sequence ASC";
}

Expand All @@ -862,6 +886,13 @@ public function getListTableForeignKeysSQL($table)
*/
public function getListTableIndexesSQL($table, $currentDatabase = null)
{
$user = '';

if (strpos($table, '.') !== false) {
list($user, $table) = explode('.', $table);
$user = "'" . $user . "'";
}

return "SELECT idx.index_name AS key_name,
IF idx.index_category = 1
THEN 1
Expand Down Expand Up @@ -895,6 +926,7 @@ public function getListTableIndexesSQL($table, $currentDatabase = null)
JOIN SYS.SYSTAB AS tbl
ON idx.table_id = tbl.table_id
WHERE tbl.table_name = '$table'
AND tbl.creator = USER_ID($user)
ORDER BY idx.index_id ASC, idxcol.sequence ASC";
}

Expand Down
31 changes: 28 additions & 3 deletions lib/Doctrine/DBAL/Platforms/SQLServerPlatform.php
Expand Up @@ -793,6 +793,8 @@ public function getListTableColumnsSQL($table, $database = null)
ON col.user_type_id = type.user_type_id
JOIN sys.objects AS obj
ON col.object_id = obj.object_id
JOIN sys.schemas AS scm
ON obj.schema_id = scm.schema_id
LEFT JOIN sys.default_constraints def
ON col.default_object_id = def.object_id
AND col.object_id = def.parent_object_id
Expand All @@ -801,7 +803,7 @@ public function getListTableColumnsSQL($table, $database = null)
AND col.column_id = prop.minor_id
AND prop.name = 'MS_Description'
WHERE obj.type = 'U'
AND obj.name = '$table'";
AND " . $this->getTableWhereClause($table, 'scm.name', 'obj.name');
}

/**
Expand All @@ -822,7 +824,8 @@ public function getListTableForeignKeysSQL($table, $database = null)
INNER JOIN sys.foreign_key_columns AS fc
INNER JOIN sys.objects AS o ON o.OBJECT_ID = fc.referenced_object_id
ON f.OBJECT_ID = fc.constraint_object_id
WHERE OBJECT_NAME (f.parent_object_id) = '" . $table . "'";
WHERE " .
$this->getTableWhereClause($table, 'SCHEMA_NAME (f.schema_id)', 'OBJECT_NAME (f.parent_object_id)');
}

/**
Expand All @@ -840,10 +843,11 @@ public function getListTableIndexesSQL($table, $currentDatabase = null)
ELSE NULL
END AS flags
FROM sys.tables AS tbl
JOIN sys.schemas AS scm ON tbl.schema_id = scm.schema_id
JOIN sys.indexes AS idx ON tbl.object_id = idx.object_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
WHERE tbl.name = '$table'
WHERE " . $this->getTableWhereClause($table, 'scm.name', 'tbl.name') . "
ORDER BY idx.index_id ASC, idxcol.index_column_id ASC";
}

Expand All @@ -863,6 +867,27 @@ public function getListViewsSQL($database)
return "SELECT name FROM sysobjects WHERE type = 'V' ORDER BY name";
}

/**
* Returns the where clause to filter schema and table name in a query.
*
* @param string $table The full qualified name of the table.
* @param string $tableColumn The name of the column to compare the schema to in the where clause.
* @param string $schemaColumn The name of the column to compare the table to in the where clause.
*
* @return string
*/
private function getTableWhereClause($table, $schemaColumn, $tableColumn)
{
if (strpos($table, ".") !== false) {
list($schema, $table) = explode(".", $table);
$schema = "'" . $schema . "'";
} else {
$schema = "SCHEMA_NAME()";
}

return "({$tableColumn} = '{$table}' AND {$schemaColumn} = {$schema})";
}

/**
* {@inheritDoc}
*/
Expand Down
Expand Up @@ -743,4 +743,44 @@ public function testListTableWithBinary()
$this->assertInstanceOf('Doctrine\DBAL\Types\BinaryType', $table->getColumn('column_binary')->getType());
$this->assertTrue($table->getColumn('column_binary')->getFixed());
}

public function testListTableDetailsWithFullQualifiedTableName()
{
if ( ! $this->_sm->getDatabasePlatform()->supportsSchemas()) {
$this->markTestSkipped('Test only works on platforms that support schemas.');
}

$defaultSchemaName = $this->_sm->getDatabasePlatform()->getDefaultSchemaName();
$primaryTableName = 'primary_table';
$foreignTableName = 'foreign_table';

$table = new Table($foreignTableName);
$table->addColumn('id', 'integer', array('autoincrement' => true));
$table->setPrimaryKey(array('id'));

$this->_sm->dropAndCreateTable($table);

$table = new Table($primaryTableName);
$table->addColumn('id', 'integer', array('autoincrement' => true));
$table->addColumn('foo', 'integer');
$table->addColumn('bar', 'string');
$table->addForeignKeyConstraint($foreignTableName, array('foo'), array('id'));
$table->addIndex(array('bar'));
$table->setPrimaryKey(array('id'));

$this->_sm->dropAndCreateTable($table);

$this->assertEquals(
$this->_sm->listTableColumns($primaryTableName),
$this->_sm->listTableColumns($defaultSchemaName . '.' . $primaryTableName)
);
$this->assertEquals(
$this->_sm->listTableIndexes($primaryTableName),
$this->_sm->listTableIndexes($defaultSchemaName . '.' . $primaryTableName)
);
$this->assertEquals(
$this->_sm->listTableForeignKeys($primaryTableName),
$this->_sm->listTableForeignKeys($defaultSchemaName . '.' . $primaryTableName)
);
}
}

0 comments on commit fba268b

Please sign in to comment.