Skip to content

Commit 55b2ee1

Browse files
committed
Improve precision and scale behavior across adapters
1 parent 16c2d26 commit 55b2ee1

5 files changed

Lines changed: 39 additions & 21 deletions

File tree

src/Phinx/Db/Adapter/MysqlAdapter.php

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -956,9 +956,10 @@ public function getSqlType(Literal|string $type, ?int $limit = null): array
956956
{
957957
$type = (string)$type;
958958
switch ($type) {
959+
case static::PHINX_TYPE_DECIMAL:
960+
return ['name' => $type, 'precision' => 10, 'scale' => 0];
959961
case static::PHINX_TYPE_FLOAT:
960962
case static::PHINX_TYPE_DOUBLE:
961-
case static::PHINX_TYPE_DECIMAL:
962963
case static::PHINX_TYPE_DATE:
963964
case static::PHINX_TYPE_ENUM:
964965
case static::PHINX_TYPE_SET:
@@ -1355,8 +1356,12 @@ protected function getColumnSqlDefinition(Column $column): string
13551356
$sqlType = $this->getSqlType($column->getType(), $column->getLimit());
13561357
$def = strtoupper($sqlType['name']);
13571358
}
1358-
if ($column->getPrecision() && $column->getScale() !== null) {
1359-
$def .= '(' . $column->getPrecision() . ',' . $column->getScale() . ')';
1359+
if ($column->getPrecision() || $column->getScale()) {
1360+
$def .= sprintf(
1361+
'(%s, %s)',
1362+
$column->getPrecision() ?: $sqlType['precision'],
1363+
$column->getScale() ?: $sqlType['scale'],
1364+
);
13601365
} elseif (isset($sqlType['limit'])) {
13611366
$def .= '(' . $sqlType['limit'] . ')';
13621367
}

src/Phinx/Db/Adapter/SqlServerAdapter.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1063,8 +1063,9 @@ public function getSqlType(Literal|string $type, ?int $limit = null): array
10631063
{
10641064
$type = (string)$type;
10651065
switch ($type) {
1066-
case static::PHINX_TYPE_FLOAT:
10671066
case static::PHINX_TYPE_DECIMAL:
1067+
return ['name' => $type, 'precision' => 18, 'scale' => 0];
1068+
case static::PHINX_TYPE_FLOAT:
10681069
case static::PHINX_TYPE_DATETIME:
10691070
case static::PHINX_TYPE_TIME:
10701071
case static::PHINX_TYPE_DATE:
@@ -1237,7 +1238,7 @@ protected function getColumnSqlDefinition(Column $column, bool $create = true):
12371238
'tinyint',
12381239
'smallint',
12391240
];
1240-
if ($sqlType['name'] === static::PHINX_TYPE_DECIMAL && $column->getPrecision() && $column->getScale()) {
1241+
if ($sqlType['name'] === static::PHINX_TYPE_DECIMAL && ($column->getPrecision() || $column->getScale())) {
12411242
$buffer[] = sprintf(
12421243
'(%s, %s)',
12431244
$column->getPrecision() ?: $sqlType['precision'],

tests/Phinx/Db/Adapter/MysqlAdapterTest.php

Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1389,8 +1389,9 @@ public function columnsProvider()
13891389
['column6', 'float', []],
13901390
['column7', 'decimal', []],
13911391
['decimal_precision_scale', 'decimal', ['precision' => 10, 'scale' => 2]],
1392+
['decimal_precision_zero_scale', 'decimal', ['precision' => 15, 'scale' => 0]],
13921393
['decimal_limit', 'decimal', ['limit' => 10]],
1393-
['decimal_precision', 'decimal', ['precision' => 10]],
1394+
['decimal_precision', 'decimal', ['precision' => 15]],
13941395
['column8', 'datetime', []],
13951396
['column9', 'time', []],
13961397
['column10', 'timestamp', []],
@@ -2727,21 +2728,6 @@ public function testCreateTableWithPrecisionCurrentTimestamp()
27272728
$this->assertEqualsIgnoringCase('CURRENT_TIMESTAMP(3)', $colDef['COLUMN_DEFAULT']);
27282729
}
27292730

2730-
public function testCreateTableWithZeroScale(): void
2731-
{
2732-
$this->adapter->connect();
2733-
$table = new Table('test_table', ['id' => false], $this->adapter);
2734-
$table
2735-
->addColumn('col_1', 'decimal', ['null' => false, 'precision' => 15, 'scale' => 0])
2736-
->create();
2737-
2738-
$columns = $table->getColumns();
2739-
$this->assertCount(1, $columns);
2740-
$this->assertSame('col_1', $columns[0]->getName());
2741-
$this->assertSame(15, $columns[0]->getPrecision());
2742-
$this->assertSame(0, $columns[0]->getScale());
2743-
}
2744-
27452731
public function pdoAttributeProvider()
27462732
{
27472733
return [

tests/Phinx/Db/Adapter/PostgresAdapterTest.php

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1258,6 +1258,7 @@ public function columnsProvider()
12581258
['column13', 'string', ['limit' => 10]],
12591259
['column16', 'interval', []],
12601260
['decimal_precision_scale', 'decimal', ['precision' => 10, 'scale' => 2]],
1261+
['decimal_precision_zero_scale', 'decimal', ['precision' => 12, 'scale' => 0]],
12611262
['decimal_limit', 'decimal', ['limit' => 10]],
12621263
['decimal_precision', 'decimal', ['precision' => 10]],
12631264
];
@@ -1284,6 +1285,18 @@ public function testGetColumns($colName, $type, $options, $actualType = null)
12841285
} else {
12851286
$this->assertEquals(['name' => $actualType] + $options, $columns[1]->getType());
12861287
}
1288+
1289+
if (isset($options['limit'])) {
1290+
$this->assertEquals($options['limit'], $columns[1]->getLimit());
1291+
}
1292+
1293+
if (isset($options['precision'])) {
1294+
$this->assertEquals($options['precision'], $columns[1]->getPrecision());
1295+
}
1296+
1297+
if (isset($options['scale'])) {
1298+
$this->assertEquals($options['scale'], $columns[1]->getScale());
1299+
}
12871300
}
12881301

12891302
/**

tests/Phinx/Db/Adapter/SqlServerAdapterTest.php

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -709,6 +709,7 @@ public function columnsProvider()
709709
['column13', 'tinyinteger', ['default' => 5]],
710710
['column14', 'smallinteger', ['default' => 5]],
711711
['decimal_precision_scale', 'decimal', ['precision' => 10, 'scale' => 2]],
712+
['decimal_precision_zero_scale', 'decimal', ['precision' => 10, 'scale' => 0]],
712713
['decimal_limit', 'decimal', ['limit' => 10]],
713714
['decimal_precision', 'decimal', ['precision' => 10]],
714715
];
@@ -728,6 +729,18 @@ public function testGetColumns($colName, $type, $options)
728729
$this->assertCount(2, $columns);
729730
$this->assertEquals($colName, $columns[$colName]->getName());
730731
$this->assertEquals($type, $columns[$colName]->getType());
732+
733+
if (isset($options['limit'])) {
734+
$this->assertEquals($options['limit'], $columns[1]->getLimit());
735+
}
736+
737+
if (isset($options['precision'])) {
738+
$this->assertEquals($options['precision'], $columns[1]->getPrecision());
739+
}
740+
741+
if (isset($options['scale'])) {
742+
$this->assertEquals($options['scale'], $columns[1]->getScale());
743+
}
731744
}
732745

733746
public function testAddIndex()

0 commit comments

Comments
 (0)