doctrine / migrations

Doctrine Database Migrations Library
https://www.doctrine-project.org/projects/migrations.html
MIT License
4.65k stars 386 forks source link

TypeError - migrations fail after upgrade to 3.7.0 #1373

Closed BigMichi1 closed 8 months ago

BigMichi1 commented 8 months ago

BC Break Report

Q A
BC Break yes
Version 3.7.0

Summary

when running my set of migrations against an empty database with 3.6.0 everything works, with 3.7.0 it fails

Previous behavior

migrations should run

Current behavior

[error] Migration Migrations\Version20180326141405 failed during Execution. Error: "Doctrine\Migrations\InlineParameterFormatter::formatParameter(): Return value must be of type string|int|null, float returned"
PHP Fatal error:  Uncaught TypeError: Doctrine\Migrations\InlineParameterFormatter::formatParameter(): Return value must be of type string|int|null, float returned in /project/vendor/doctrine/migrations/lib/Doctrine/Migrations/InlineParameterFormatter.php:65
Stack trace:
#0 /project/vendor/doctrine/migrations/lib/Doctrine/Migrations/InlineParameterFormatter.php(45): Doctrine\Migrations\InlineParameterFormatter->formatParameter()
#1 /project/vendor/doctrine/migrations/lib/Doctrine/Migrations/Version/DbalExecutor.php(288): Doctrine\Migrations\InlineParameterFormatter->formatParameters()
#2 /project/vendor/doctrine/migrations/lib/Doctrine/Migrations/Version/DbalExecutor.php(269): Doctrine\Migrations\Version\DbalExecutor->outputSqlQuery()
#3 /project/vendor/doctrine/migrations/lib/Doctrine/Migrations/Version/DbalExecutor.php(150): Doctrine\Migrations\Version\DbalExecutor->executeResult()
#4 /project/vendor/doctrine/migrations/lib/Doctrine/Migrations/Version/DbalExecutor.php(72): Doctrine\Migrations\Version\DbalExecutor->executeMigration()
#5 /project/vendor/doctrine/migrations/lib/Doctrine/Migrations/DbalMigrator.php(88): Doctrine\Migrations\Version\DbalExecutor->execute()
#6 /project/vendor/doctrine/migrations/lib/Doctrine/Migrations/DbalMigrator.php(54): Doctrine\Migrations\DbalMigrator->executePlan()
#7 /project/vendor/doctrine/migrations/lib/Doctrine/Migrations/DbalMigrator.php(136): Doctrine\Migrations\DbalMigrator->executeMigrations()
#8 /project/vendor/doctrine/migrations/lib/Doctrine/Migrations/Tools/Console/Command/MigrateCommand.php(212): Doctrine\Migrations\DbalMigrator->migrate()
#9 /project/vendor/symfony/console/Command/Command.php(326): Doctrine\Migrations\Tools\Console\Command\MigrateCommand->execute()
#10 /project/vendor/symfony/console/Application.php(1063): Symfony\Component\Console\Command\Command->run()
#11 /project/vendor/symfony/console/Application.php(320): Symfony\Component\Console\Application->doRunCommand()
#12 /project/vendor/symfony/console/Application.php(174): Symfony\Component\Console\Application->doRun()
#13 /project/vendor/doctrine/doctrine-module/bin/doctrine-module.php(45): Symfony\Component\Console\Application->run()
#14 /project/vendor/doctrine/doctrine-module/bin/doctrine-module(4): include('...')
#15 /project/vendor/bin/doctrine-module(119): include('...')
#16 {main}
  thrown in /project/vendor/doctrine/migrations/lib/Doctrine/Migrations/InlineParameterFormatter.php on line 65

Fatal error: Uncaught TypeError: Doctrine\Migrations\InlineParameterFormatter::formatParameter(): Return value must be of type string|int|null, float returned in /project/vendor/doctrine/migrations/lib/Doctrine/Migrations/InlineParameterFormatter.php on line 65

TypeError: Doctrine\Migrations\InlineParameterFormatter::formatParameter(): Return value must be of type string|int|null, float returned in /project/vendor/doctrine/migrations/lib/Doctrine/Migrations/InlineParameterFormatter.php on line 65

How to reproduce

 private function formatParameter(mixed $value, string|int $type): string|int|null
    {
        if (is_string($type) && Type::hasType($type)) {
            $convertToDatabaseValue = Type::getType($type)->convertToDatabaseValue(
                $value,
                $this->connection->getDatabasePlatform(),
            );
            return $convertToDatabaseValue;
        }

        return $this->parameterToString($value);
    }

$value is a double of 0.5 $type is a string with string and database platform is "SQLite" on PHP 8.2.10

maMykola commented 8 months ago

we have the same issue but with bool values with MySQL

derrabus commented 8 months ago

@BigMichi1 Does #1374 fix the issue for you?

nl404 commented 8 months ago

we have the same problem with Symfony\Component\Uid\Uuid values

use Symfony\Component\Uid\Uuid;
...
$this->addSql('INSERT IGNORE INTO pay_gateways (id, method) VALUES (:id, :method)', [
    'id'       => Uuid::v4(),
    'method'   => 'credit_card',
]);
...

In InlineParameterFormatter.php line 61:

[TypeError]                                                                                                                                                                                                         
Doctrine\Migrations\InlineParameterFormatter::formatParameter(): Return value must be of type array|string|int|float|null, Symfony\Component\Uid\UuidV1 returned   
maMykola commented 8 months ago

probably this method should return mixed to not cover all possible types?