diff --git a/lib/Doctrine/DBAL/Schema/PostgreSqlSchemaManager.php b/lib/Doctrine/DBAL/Schema/PostgreSqlSchemaManager.php index 6fc17583bd3..6e8da33c0c1 100644 --- a/lib/Doctrine/DBAL/Schema/PostgreSqlSchemaManager.php +++ b/lib/Doctrine/DBAL/Schema/PostgreSqlSchemaManager.php @@ -316,7 +316,7 @@ protected function _getPortableTableColumnDefinition($tableColumn) $autoincrement = true; } - if (preg_match("/^'(.*)'::.*$/", $tableColumn['default'], $matches)) { + if (preg_match("/^['(](.*)[')]::.*$/", $tableColumn['default'], $matches)) { $tableColumn['default'] = $matches[1]; } @@ -354,15 +354,18 @@ protected function _getPortableTableColumnDefinition($tableColumn) switch ($dbType) { case 'smallint': case 'int2': + $tableColumn['default'] = $this->fixVersion94NegativeNumericDefaultValue($tableColumn['default']); $length = null; break; case 'int': case 'int4': case 'integer': + $tableColumn['default'] = $this->fixVersion94NegativeNumericDefaultValue($tableColumn['default']); $length = null; break; case 'bigint': case 'int8': + $tableColumn['default'] = $this->fixVersion94NegativeNumericDefaultValue($tableColumn['default']); $length = null; break; case 'bool': @@ -398,6 +401,8 @@ protected function _getPortableTableColumnDefinition($tableColumn) case 'decimal': case 'money': case 'numeric': + $tableColumn['default'] = $this->fixVersion94NegativeNumericDefaultValue($tableColumn['default']); + if (preg_match('([A-Za-z]+\(([0-9]+)\,([0-9]+)\))', $tableColumn['complete_type'], $match)) { $precision = $match[1]; $scale = $match[2]; @@ -445,4 +450,20 @@ protected function _getPortableTableColumnDefinition($tableColumn) return $column; } + + /** + * PostgreSQL 9.4 puts parentheses around negative numeric default values that need to be stripped eventually. + * + * @param mixed $defaultValue + * + * @return mixed + */ + private function fixVersion94NegativeNumericDefaultValue($defaultValue) + { + if (strpos($defaultValue, '(') === 0) { + return trim($defaultValue, '()'); + } + + return $defaultValue; + } } diff --git a/tests/Doctrine/Tests/DBAL/Functional/Schema/PostgreSqlSchemaManagerTest.php b/tests/Doctrine/Tests/DBAL/Functional/Schema/PostgreSqlSchemaManagerTest.php index 76897ae77ff..45774b85e85 100644 --- a/tests/Doctrine/Tests/DBAL/Functional/Schema/PostgreSqlSchemaManagerTest.php +++ b/tests/Doctrine/Tests/DBAL/Functional/Schema/PostgreSqlSchemaManagerTest.php @@ -383,6 +383,31 @@ public function testJsonbColumn() $this->assertEquals('json_array', $columns['foo']->getType()->getName()); $this->assertEquals(true, $columns['foo']->getPlatformOption('jsonb')); } + + /** + * @group DBAL-2427 + */ + public function testListNegativeColumnDefaultValue() + { + $table = new Schema\Table('test_default_negative'); + $table->addColumn('col_smallint', 'smallint', array('default' => -1)); + $table->addColumn('col_integer', 'integer', array('default' => -1)); + $table->addColumn('col_bigint', 'bigint', array('default' => -1)); + $table->addColumn('col_float', 'float', array('default' => -1.1)); + $table->addColumn('col_decimal', 'decimal', array('default' => -1.1)); + $table->addColumn('col_string', 'string', array('default' => '(-1)')); + + $this->_sm->dropAndCreateTable($table); + + $columns = $this->_sm->listTableColumns('test_default_negative'); + + $this->assertEquals(-1, $columns['col_smallint']->getDefault()); + $this->assertEquals(-1, $columns['col_integer']->getDefault()); + $this->assertEquals(-1, $columns['col_bigint']->getDefault()); + $this->assertEquals(-1.1, $columns['col_float']->getDefault()); + $this->assertEquals(-1.1, $columns['col_decimal']->getDefault()); + $this->assertEquals('(-1)', $columns['col_string']->getDefault()); + } } class MoneyType extends Type