diff --git a/.github/ISSUE_TEMPLATE/Bug.md b/.github/ISSUE_TEMPLATE/Bug.md deleted file mode 100644 index 127743902f1..00000000000 --- a/.github/ISSUE_TEMPLATE/Bug.md +++ /dev/null @@ -1,33 +0,0 @@ ---- -name: 🐞 Bug Report -about: Something is broken? 🔨 ---- - -### Bug Report - - - -| Q | A -|------------ | ------ -| Version | x.y.z - -#### Summary - - - -#### Current behaviour - - - -#### How to reproduce - - - -#### Expected behaviour - - - diff --git a/.github/ISSUE_TEMPLATE/Feature_Request.md b/.github/ISSUE_TEMPLATE/Feature_Request.md deleted file mode 100644 index 777fce18607..00000000000 --- a/.github/ISSUE_TEMPLATE/Feature_Request.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -name: 🎉 Feature Request -about: You have a neat idea that should be implemented? 🎩 ---- - -### Feature Request - - - -| Q | A -|------------ | ------ -| New Feature | yes -| RFC | yes/no - -#### Summary - - diff --git a/.github/ISSUE_TEMPLATE/Support_Question.md b/.github/ISSUE_TEMPLATE/Support_Question.md deleted file mode 100644 index d5bccbd15fa..00000000000 --- a/.github/ISSUE_TEMPLATE/Support_Question.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -name: ❓ Support Question -about: Have a problem that you can't figure out? 🤔 ---- - - - -| Q | A -|------------ | ----- -| Version | x.y.z - - - -### Support Question - - diff --git a/.github/workflows/continuous-integration.yml b/.github/workflows/continuous-integration.yml index ce3b57a5e81..5a3629db00a 100644 --- a/.github/workflows/continuous-integration.yml +++ b/.github/workflows/continuous-integration.yml @@ -224,23 +224,23 @@ jobs: - "8.1" postgres-version: - "10" - - "15" - "16" + - "17" extension: - "pgsql" - "pdo_pgsql" include: - php-version: "8.2" - postgres-version: "16" + postgres-version: "17" extension: "pgsql" - php-version: "8.3" - postgres-version: "16" + postgres-version: "17" extension: "pgsql" - php-version: "8.4" - postgres-version: "16" + postgres-version: "17" extension: "pgsql" - php-version: "8.4" - postgres-version: "16" + postgres-version: "17" extension: "pdo_pgsql" services: @@ -372,7 +372,7 @@ jobs: mysql-version: - "5.7" - "8.0" - - "9.0" + - "9.1" extension: - "mysqli" - "pdo_mysql" @@ -401,10 +401,10 @@ jobs: custom-entrypoint: >- --entrypoint sh mysql:8.4 -c "exec docker-entrypoint.sh mysqld --mysql-native-password=ON" - php-version: "8.4" - mysql-version: "9.0" + mysql-version: "9.1" extension: "mysqli" - php-version: "8.4" - mysql-version: "9.0" + mysql-version: "9.1" extension: "pdo_mysql" services: diff --git a/docs/en/reference/configuration.rst b/docs/en/reference/configuration.rst index eb236b22634..495a38a8aba 100644 --- a/docs/en/reference/configuration.rst +++ b/docs/en/reference/configuration.rst @@ -249,7 +249,7 @@ mysqli - ``ssl_ca`` (string): The path name to the certificate authority file to use for SSL encryption. - ``ssl_capath`` (string): The pathname to a directory that contains trusted SSL CA certificates in PEM format. - ``ssl_cipher`` (string): A list of allowable ciphers to use for SSL encryption. -- ``driverOptions`` Any supported flags for mysqli found on `http://www.php.net/manual/en/mysqli.real-connect.php` +- ``driverOptions`` Any supported flags for mysqli found on `www.php.net/manual/en/mysqli.real-connect.php `_ pdo_pgsql / pgsql ^^^^^^^^^^^^^^^^^ @@ -266,22 +266,22 @@ pdo_pgsql / pgsql - ``sslmode`` (string): Determines whether or with what priority a SSL TCP/IP connection will be negotiated with the server. See the list of available modes: - `https://www.postgresql.org/docs/9.4/static/libpq-connect.html#LIBPQ-CONNECT-SSLMODE` + `www.postgresql.org/docs/9.4/libpq-connect.html#LIBPQ-CONNECT-SSLMODE `_ - ``sslrootcert`` (string): specifies the name of a file containing SSL certificate authority (CA) certificate(s). If the file exists, the server's certificate will be verified to be signed by one of these authorities. - See https://www.postgresql.org/docs/9.4/static/libpq-connect.html#LIBPQ-CONNECT-SSLROOTCERT + See `www.postgresql.org/docs/9.4/static/libpq-connect.html#LIBPQ-CONNECT-SSLROOTCERT `_ - ``sslcert`` (string): specifies the filename of the client SSL certificate. - See `https://www.postgresql.org/docs/9.4/static/libpq-connect.html#LIBPQ-CONNECT-SSLCERT` + See `www.postgresql.org/docs/9.4/static/libpq-connect.html#LIBPQ-CONNECT-SSLCERT `_ - ``sslkey`` (string): specifies the location for the secret key used for the client certificate. - See `https://www.postgresql.org/docs/9.4/static/libpq-connect.html#LIBPQ-CONNECT-SSLKEY` + See `www.postgresql.org/docs/9.4/static/libpq-connect.html#LIBPQ-CONNECT-SSLKEY `_ - ``sslcrl`` (string): specifies the filename of the SSL certificate revocation list (CRL). - See `https://www.postgresql.org/docs/9.4/static/libpq-connect.html#LIBPQ-CONNECT-SSLCRL` + See `www.postgresql.org/docs/9.4/static/libpq-connect.html#LIBPQ-CONNECT-SSLCRL `_ - ``gssencmode`` (string): Optional GSS-encrypted channel/GSSEncMode configuration. - See `https://www.postgresql.org/docs/current/libpq-connect.html#LIBPQ-CONNECT-GSSENCMODE` + See `www.postgresql.org/docs/current/libpq-connect.html#LIBPQ-CONNECT-GSSENCMODE `_ - ``application_name`` (string): Name of the application that is connecting to database. Optional. It will be displayed at ``pg_stat_activity``. @@ -316,7 +316,7 @@ pdo_oci / oci8 add the INSTANCE_NAME parameter in the connection. It is generally used to connect to an Oracle RAC server to select the name of a particular instance. - ``connectstring`` (string): Complete Easy Connect connection descriptor, - see https://docs.oracle.com/database/121/NETAG/naming.htm. When using this option, + see `docs.oracle.com/en/database/oracle/oracle-database/23/netag/configuring-naming-methods.html `_. When using this option, you will still need to provide the ``user`` and ``password`` parameters, but the other parameters will no longer be used. Note that when using this parameter, the ``getHost`` and ``getPort`` methods from ``Doctrine\DBAL\Connection`` will no longer function as expected. @@ -335,7 +335,7 @@ pdo_sqlsrv / sqlsrv - ``host`` (string): Hostname of the database to connect to. - ``port`` (integer): Port of the database to connect to. - ``dbname`` (string): Name of the database/schema to connect to. -- ``driverOptions`` (array): Any supported options found on `https://learn.microsoft.com/en-us/sql/connect/php/connection-options` +- ``driverOptions`` (array): Any supported options found on `learn.microsoft.com/en-us/sql/connect/php/connection-options `_ ibm_db2 ^^^^^^^ @@ -347,7 +347,7 @@ ibm_db2 - ``host`` (string): Hostname of the database to connect to. - ``port`` (integer): Port of the database to connect to. - ``persistent`` (boolean): Whether to establish a persistent connection. -- ``driverOptions`` (array): Any supported options found on `https://www.php.net/manual/en/function.db2-connect.php#refsect1-function.db2-connect-parameters` +- ``driverOptions`` (array): Any supported options found on `www.php.net/manual/en/function.db2-connect.php#refsect1-function.db2-connect-parameters `_ Automatic platform version detection ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/psalm.xml.dist b/psalm.xml.dist index 3144f63e274..1cf30cf29f9 100644 --- a/psalm.xml.dist +++ b/psalm.xml.dist @@ -138,6 +138,12 @@ + + + + + + @@ -192,6 +198,8 @@ + + @@ -298,6 +306,8 @@ + + diff --git a/src/Schema/Table.php b/src/Schema/Table.php index 1ce8ac2baac..b6deec7348d 100644 --- a/src/Schema/Table.php +++ b/src/Schema/Table.php @@ -284,10 +284,7 @@ final public function getRenamedColumns(): array return $this->renamedColumns; } - /** - * @throws LogicException - * @throws SchemaException - */ + /** @throws LogicException */ final public function renameColumn(string $oldName, string $newName): Column { $oldName = $this->normalizeIdentifier($oldName); diff --git a/src/Types/BigIntType.php b/src/Types/BigIntType.php index 0cb14c5b44c..a9b096785cb 100644 --- a/src/Types/BigIntType.php +++ b/src/Types/BigIntType.php @@ -47,15 +47,18 @@ public function convertToPHPValue(mixed $value, AbstractPlatform $platform): int return $value; } - if ($value > PHP_INT_MIN && $value < PHP_INT_MAX) { - return (int) $value; - } - assert( is_string($value), 'DBAL assumes values outside of the integer range to be returned as string by the database driver.', ); + if ( + ($value > PHP_INT_MIN && $value < PHP_INT_MAX) + || $value === (string) (int) $value + ) { + return (int) $value; + } + return $value; } } diff --git a/tests/ConnectionTest.php b/tests/ConnectionTest.php index 3d085ca9314..f9702ba303f 100644 --- a/tests/ConnectionTest.php +++ b/tests/ConnectionTest.php @@ -25,6 +25,7 @@ use PHPUnit\Framework\TestCase; use Psr\Cache\CacheItemInterface; use Psr\Cache\CacheItemPoolInterface; +use RuntimeException; /** @psalm-import-type Params from DriverManager */ #[RequiresPhpExtension('pdo_mysql')] @@ -172,6 +173,36 @@ public function testCommitStartsTransactionInNoAutoCommitMode(): void self::assertTrue($conn->isTransactionActive()); } + public function testBeginTransactionFailureAfterCommitInNoAutoCommitMode(): void + { + $driverConnectionMock = $this->createMock(DriverConnection::class); + $driverConnectionMock->expects(self::exactly(2)) + ->method('beginTransaction') + ->willReturnOnConsecutiveCalls( + true, + self::throwException(new RuntimeException()), + ); + + $driver = self::createStub(Driver::class); + $driver + ->method('connect') + ->willReturn( + $driverConnectionMock, + ); + $conn = new Connection([], $driver); + + $conn->setAutoCommit(false); + + /** Invoke protected {@see Connection::connect()} */ + $conn->getServerVersion(); + try { + $conn->commit(); + } catch (RuntimeException) { + } + + self::assertTrue($conn->isTransactionActive()); + } + /** @return bool[][] */ public static function resultProvider(): array { diff --git a/tests/Functional/Types/BigIntTypeTest.php b/tests/Functional/Types/BigIntTypeTest.php index 65dbdcfcdb9..386a8e91eec 100644 --- a/tests/Functional/Types/BigIntTypeTest.php +++ b/tests/Functional/Types/BigIntTypeTest.php @@ -10,8 +10,6 @@ use Doctrine\DBAL\Types\Types; use Generator; use PHPUnit\Framework\Attributes\DataProvider; -use PHPUnit\Framework\Constraint\IsIdentical; -use PHPUnit\Framework\Constraint\LogicalOr; use const PHP_INT_MAX; use const PHP_INT_MIN; @@ -49,44 +47,10 @@ public static function provideBigIntLiterals(): Generator yield 'null' => ['null', null]; yield 'positive number' => ['42', 42]; yield 'negative number' => ['-42', -42]; - - if (PHP_INT_SIZE < 8) { - // The following tests only work on 64bit systems. - return; - } - - yield 'large positive number' => ['9223372036854775806', PHP_INT_MAX - 1]; - yield 'large negative number' => ['-9223372036854775807', PHP_INT_MIN + 1]; - } - - #[DataProvider('provideBigIntEdgeLiterals')] - public function testSelectBigIntEdge(int $value): void - { - $table = new Table('bigint_type_test'); - $table->addColumn('id', Types::SMALLINT, ['notnull' => true]); - $table->addColumn('my_integer', Types::BIGINT, ['notnull' => false]); - $table->setPrimaryKey(['id']); - $this->dropAndCreateTable($table); - - $this->connection->executeStatement(<<connection->convertToPHPValue( - $this->connection->fetchOne('SELECT my_integer from bigint_type_test WHERE id = 42'), - Types::BIGINT, - ), - LogicalOr::fromConstraints(new IsIdentical($value), new IsIdentical((string) $value)), - ); - } - - /** @return Generator */ - public static function provideBigIntEdgeLiterals(): Generator - { - yield 'max int' => [PHP_INT_MAX]; - yield 'min int' => [PHP_INT_MIN]; + yield 'large positive number' => [PHP_INT_SIZE === 4 ? '2147483646' : '9223372036854775806', PHP_INT_MAX - 1]; + yield 'large negative number' => [PHP_INT_SIZE === 4 ? '-2147483647' : '-9223372036854775807', PHP_INT_MIN + 1]; + yield 'largest positive number' => [PHP_INT_SIZE === 4 ? '2147483647' : '9223372036854775807', PHP_INT_MAX]; + yield 'largest negative number' => [PHP_INT_SIZE === 4 ? '-2147483648' : '-9223372036854775808', PHP_INT_MIN]; } public function testUnsignedBigIntOnMySQL(): void