PostgreSqlSchemaManagerTest.php 6.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. <?php
  2. namespace Doctrine\Tests\DBAL\Functional\Schema;
  3. use Doctrine\DBAL\Schema;
  4. use Doctrine\DBAL\Types\Type;
  5. use Doctrine\DBAL\Platforms\AbstractPlatform;
  6. require_once __DIR__ . '/../../../TestInit.php';
  7. class PostgreSqlSchemaManagerTest extends SchemaManagerFunctionalTestCase
  8. {
  9. /**
  10. * @group DBAL-21
  11. */
  12. public function testSupportDomainTypeFallback()
  13. {
  14. $createDomainTypeSQL = "CREATE DOMAIN MyMoney AS DECIMAL(18,2)";
  15. $this->_conn->exec($createDomainTypeSQL);
  16. $createTableSQL = "CREATE TABLE domain_type_test (id INT PRIMARY KEY, value MyMoney)";
  17. $this->_conn->exec($createTableSQL);
  18. $table = $this->_conn->getSchemaManager()->listTableDetails('domain_type_test');
  19. $this->assertInstanceOf('Doctrine\DBAL\Types\DecimalType', $table->getColumn('value')->getType());
  20. Type::addType('MyMoney', 'Doctrine\Tests\DBAL\Functional\Schema\MoneyType');
  21. $this->_conn->getDatabasePlatform()->registerDoctrineTypeMapping('MyMoney', 'MyMoney');
  22. $table = $this->_conn->getSchemaManager()->listTableDetails('domain_type_test');
  23. $this->assertInstanceOf('Doctrine\Tests\DBAL\Functional\Schema\MoneyType', $table->getColumn('value')->getType());
  24. }
  25. /**
  26. * @group DBAL-37
  27. */
  28. public function testDetectsAutoIncrement()
  29. {
  30. $autoincTable = new \Doctrine\DBAL\Schema\Table('autoinc_table');
  31. $column = $autoincTable->addColumn('id', 'integer');
  32. $column->setAutoincrement(true);
  33. $this->_sm->createTable($autoincTable);
  34. $autoincTable = $this->_sm->listTableDetails('autoinc_table');
  35. $this->assertTrue($autoincTable->getColumn('id')->getAutoincrement());
  36. }
  37. /**
  38. * @group DBAL-37
  39. */
  40. public function testAlterTableAutoIncrementAdd()
  41. {
  42. $tableFrom = new \Doctrine\DBAL\Schema\Table('autoinc_table_add');
  43. $column = $tableFrom->addColumn('id', 'integer');
  44. $this->_sm->createTable($tableFrom);
  45. $tableFrom = $this->_sm->listTableDetails('autoinc_table_add');
  46. $this->assertFalse($tableFrom->getColumn('id')->getAutoincrement());
  47. $tableTo = new \Doctrine\DBAL\Schema\Table('autoinc_table_add');
  48. $column = $tableTo->addColumn('id', 'integer');
  49. $column->setAutoincrement(true);
  50. $c = new \Doctrine\DBAL\Schema\Comparator();
  51. $diff = $c->diffTable($tableFrom, $tableTo);
  52. $sql = $this->_conn->getDatabasePlatform()->getAlterTableSQL($diff);
  53. $this->assertEquals(array(
  54. "CREATE SEQUENCE autoinc_table_add_id_seq",
  55. "SELECT setval('autoinc_table_add_id_seq', (SELECT MAX(id) FROM autoinc_table_add))",
  56. "ALTER TABLE autoinc_table_add ALTER id SET DEFAULT nextval('autoinc_table_add_id_seq')",
  57. ), $sql);
  58. $this->_sm->alterTable($diff);
  59. $tableFinal = $this->_sm->listTableDetails('autoinc_table_add');
  60. $this->assertTrue($tableFinal->getColumn('id')->getAutoincrement());
  61. }
  62. /**
  63. * @group DBAL-37
  64. */
  65. public function testAlterTableAutoIncrementDrop()
  66. {
  67. $tableFrom = new \Doctrine\DBAL\Schema\Table('autoinc_table_drop');
  68. $column = $tableFrom->addColumn('id', 'integer');
  69. $column->setAutoincrement(true);
  70. $this->_sm->createTable($tableFrom);
  71. $tableFrom = $this->_sm->listTableDetails('autoinc_table_drop');
  72. $this->assertTrue($tableFrom->getColumn('id')->getAutoincrement());
  73. $tableTo = new \Doctrine\DBAL\Schema\Table('autoinc_table_drop');
  74. $column = $tableTo->addColumn('id', 'integer');
  75. $c = new \Doctrine\DBAL\Schema\Comparator();
  76. $diff = $c->diffTable($tableFrom, $tableTo);
  77. $this->assertInstanceOf('Doctrine\DBAL\Schema\TableDiff', $diff, "There should be a difference and not false being returned from the table comparison");
  78. $this->assertEquals(array("ALTER TABLE autoinc_table_drop ALTER id DROP DEFAULT"), $this->_conn->getDatabasePlatform()->getAlterTableSQL($diff));
  79. $this->_sm->alterTable($diff);
  80. $tableFinal = $this->_sm->listTableDetails('autoinc_table_drop');
  81. $this->assertFalse($tableFinal->getColumn('id')->getAutoincrement());
  82. }
  83. /**
  84. * @group DBAL-75
  85. */
  86. public function testTableWithSchema()
  87. {
  88. $this->_conn->exec('CREATE SCHEMA nested');
  89. $nestedRelatedTable = new \Doctrine\DBAL\Schema\Table('nested.schemarelated');
  90. $column = $nestedRelatedTable->addColumn('id', 'integer');
  91. $column->setAutoincrement(true);
  92. $nestedRelatedTable->setPrimaryKey(array('id'));
  93. $nestedSchemaTable = new \Doctrine\DBAL\Schema\Table('nested.schematable');
  94. $column = $nestedSchemaTable->addColumn('id', 'integer');
  95. $column->setAutoincrement(true);
  96. $nestedSchemaTable->setPrimaryKey(array('id'));
  97. $nestedSchemaTable->addUnnamedForeignKeyConstraint($nestedRelatedTable, array('id'), array('id'));
  98. $this->_sm->createTable($nestedRelatedTable);
  99. $this->_sm->createTable($nestedSchemaTable);
  100. $tables = $this->_sm->listTableNames();
  101. $this->assertContains('nested.schematable', $tables, "The table should be detected with its non-public schema.");
  102. $nestedSchemaTable = $this->_sm->listTableDetails('nested.schematable');
  103. $this->assertTrue($nestedSchemaTable->hasColumn('id'));
  104. $this->assertEquals(array('id'), $nestedSchemaTable->getPrimaryKey()->getColumns());
  105. $relatedFks = $nestedSchemaTable->getForeignKeys();
  106. $this->assertEquals(1, count($relatedFks));
  107. $relatedFk = array_pop($relatedFks);
  108. $this->assertEquals("nested.schemarelated", $relatedFk->getForeignTableName());
  109. }
  110. /**
  111. * @group DBAL-91
  112. * @group DBAL-88
  113. */
  114. public function testReturnQuotedAssets()
  115. {
  116. $sql = 'create table dbal91_something ( id integer CONSTRAINT id_something PRIMARY KEY NOT NULL ,"table" integer );';
  117. $this->_conn->exec($sql);
  118. $sql = 'ALTER TABLE dbal91_something ADD CONSTRAINT something_input FOREIGN KEY( "table" ) REFERENCES dbal91_something ON UPDATE CASCADE;';
  119. $this->_conn->exec($sql);
  120. $table = $this->_sm->listTableDetails('dbal91_something');
  121. $this->assertEquals(
  122. array(
  123. "CREATE TABLE dbal91_something (id INT NOT NULL, table INT DEFAULT NULL, PRIMARY KEY(id))",
  124. "CREATE INDEX IDX_A9401304ECA7352B ON dbal91_something (\"table\")",
  125. ),
  126. $this->_conn->getDatabasePlatform()->getCreateTableSQL($table)
  127. );
  128. }
  129. }
  130. class MoneyType extends Type
  131. {
  132. public function getName()
  133. {
  134. return "MyMoney";
  135. }
  136. public function getSqlDeclaration(array $fieldDeclaration, AbstractPlatform $platform)
  137. {
  138. return 'MyMoney';
  139. }
  140. }