Skip to content

Commit fc84c5f

Browse files
committed
Fix LONGTEXT columns becoming TEXT in generated migrations
The issue was a mismatch between CakePHP's LENGTH_LONG constant (4294967295) and migrations' TEXT_LONG constant (2147483647). When using `bake migration_diff`, CakePHP's schema reflection returns LENGTH_LONG for LONGTEXT columns, but MysqlAdapter expected TEXT_LONG. This fix: 1. MigrationHelper: Convert LENGTH_LONG to TEXT_LONG when generating migrations 2. MysqlAdapter: Accept both constants for backward compatibility with existing migrations that have the wrong value Fixes #1029
1 parent 6f57c07 commit fc84c5f

File tree

2 files changed

+12
-1
lines changed

2 files changed

+12
-1
lines changed

src/Db/Adapter/MysqlAdapter.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -374,8 +374,10 @@ public function createTable(TableMetadata $table, array $columns = [], array $in
374374
protected function mapColumnData(array $data): array
375375
{
376376
if ($data['type'] == self::TYPE_TEXT && $data['length'] !== null) {
377+
// Accept both migrations TEXT_LONG and CakePHP LENGTH_LONG for backward compatibility
378+
// with migrations generated before the fix (LENGTH_TINY/MEDIUM are already equal to TEXT_TINY/MEDIUM)
377379
$data['length'] = match ($data['length']) {
378-
self::TEXT_LONG => TableSchema::LENGTH_LONG,
380+
self::TEXT_LONG, TableSchema::LENGTH_LONG => TableSchema::LENGTH_LONG,
379381
self::TEXT_MEDIUM => TableSchema::LENGTH_MEDIUM,
380382
self::TEXT_REGULAR => null,
381383
self::TEXT_TINY => TableSchema::LENGTH_TINY,

src/View/Helper/MigrationHelper.php

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,13 @@
1818
use Cake\Database\Connection;
1919
use Cake\Database\Driver\Mysql;
2020
use Cake\Database\Schema\CollectionInterface;
21+
use Cake\Database\Schema\TableSchema;
2122
use Cake\Database\Schema\TableSchemaInterface;
2223
use Cake\Utility\Hash;
2324
use Cake\Utility\Inflector;
2425
use Cake\View\Helper;
2526
use Cake\View\View;
27+
use Migrations\Db\Adapter\MysqlAdapter;
2628
use Migrations\Db\Table\ForeignKey;
2729

2830
/**
@@ -445,6 +447,13 @@ public function getColumnOption(array $options): array
445447
}
446448
}
447449

450+
// Convert CakePHP's LENGTH_LONG to migrations TEXT_LONG for text columns
451+
// CakePHP uses LENGTH_LONG = 4294967295, but migrations expects TEXT_LONG = 2147483647
452+
// (LENGTH_TINY and LENGTH_MEDIUM have the same values as TEXT_TINY and TEXT_MEDIUM)
453+
if (isset($columnOptions['limit']) && $columnOptions['limit'] === TableSchema::LENGTH_LONG) {
454+
$columnOptions['limit'] = MysqlAdapter::TEXT_LONG;
455+
}
456+
448457
return $columnOptions;
449458
}
450459

0 commit comments

Comments
 (0)