Skip to content

Commit

Permalink
Merge pull request #2614 from deeky666/DBAL-2427
Browse files Browse the repository at this point in the history
[DBAL-2427] Fix negative default value introspection on PostgreSQL 9.4
  • Loading branch information
Ocramius authored Feb 4, 2017
2 parents 3f8c746 + 5eb1a93 commit d844203
Show file tree
Hide file tree
Showing 2 changed files with 47 additions and 1 deletion.
23 changes: 22 additions & 1 deletion lib/Doctrine/DBAL/Schema/PostgreSqlSchemaManager.php
Original file line number Diff line number Diff line change
Expand Up @@ -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];
}

Expand Down Expand Up @@ -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':
Expand Down Expand Up @@ -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];
Expand Down Expand Up @@ -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;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit d844203

Please sign in to comment.