Skip to content

Commit cd9e82d

Browse files
committed
SqlsrvDriver: converts BIT to boolean (BC break)
1 parent 4b69d7e commit cd9e82d

4 files changed

Lines changed: 39 additions & 2 deletions

File tree

src/Database/Drivers/Engines/SQLServerEngine.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,7 @@ public function resolveColumnConverter(array $meta, TypeConverter $converter): ?
226226
{
227227
return match ($meta['nativeType']) {
228228
'timestamp' => null, // timestamp does not mean time in sqlsrv
229+
'bit' => $converter->convertBoolean ? $converter->toBool(...) : $converter->toInt(...),
229230
'decimal', 'numeric',
230231
'double', 'double precision', 'float', 'real', 'money', 'smallmoney' => fn($value): float => (float) (is_string($value) && str_starts_with($value, '.') ? '0' . $value : $value),
231232
default => $converter->resolve($meta['nativeType']),

src/Database/Drivers/PDO/SQLSrv/Driver.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414

1515
/**
1616
* PDO SQL Server database driver.
17+
* Options:
18+
* - convertBoolean => converts BIT to boolean
1719
*/
1820
class Driver implements Drivers\Driver
1921
{
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
<?php
2+
3+
/**
4+
* Test: Nette\Database\Connection sqlsrv options.
5+
* @dataProvider? databases.ini sqlsrv
6+
*/
7+
8+
declare(strict_types=1);
9+
10+
use Tester\Assert;
11+
12+
require __DIR__ . '/../bootstrap.php';
13+
14+
15+
test('default convertBoolean', function () {
16+
$connection = connectToDB(['convertBoolean' => null])->getConnection();
17+
Nette\Database\Helpers::loadFromFile($connection, __DIR__ . '/files/sqlsrv-nette_test3.sql');
18+
$row = $connection->fetch('SELECT * FROM types');
19+
Assert::equal(true, $row->bit);
20+
});
21+
22+
test('convertBoolean = true', function () {
23+
$connection = connectToDB(['convertBoolean' => true])->getConnection();
24+
Nette\Database\Helpers::loadFromFile($connection, __DIR__ . '/files/sqlsrv-nette_test3.sql');
25+
$row = $connection->fetch('SELECT * FROM types');
26+
Assert::equal(true, $row->bit);
27+
});
28+
29+
test('convertBoolean = false', function () {
30+
$connection = connectToDB(['convertBoolean' => false])->getConnection();
31+
Nette\Database\Helpers::loadFromFile($connection, __DIR__ . '/files/sqlsrv-nette_test3.sql');
32+
$row = $connection->fetch('SELECT * FROM types');
33+
Assert::equal(1, $row->bit);
34+
});

tests/Database/ResultSet.normalizeRow.sqlsrv.phpt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ $res = $connection->query('SELECT * FROM types');
2121
Assert::equal([
2222
'bigint' => 1,
2323
'binary_3' => "\x00\x00\xFF",
24-
'bit' => '1',
24+
'bit' => true,
2525
'char_5' => 'a ',
2626
'date' => new DateTime('2012-10-13 00:00:00'),
2727
'datetime' => new DateTime('2012-10-13 10:10:10'),
@@ -54,7 +54,7 @@ Assert::equal([
5454
Assert::equal([
5555
'bigint' => 0,
5656
'binary_3' => "\x00\x00\x00",
57-
'bit' => '0',
57+
'bit' => false,
5858
'char_5' => ' ',
5959
'date' => new DateTime('0001-01-01 00:00:00'),
6060
'datetime' => new DateTime('1753-01-01 00:00:00'),

0 commit comments

Comments
 (0)