diff --git a/system/Database/SQLSRV/Builder.php b/system/Database/SQLSRV/Builder.php index 96890bf45cb2..44af621658a6 100644 --- a/system/Database/SQLSRV/Builder.php +++ b/system/Database/SQLSRV/Builder.php @@ -269,7 +269,7 @@ public function decrement(string $column, int $value = 1) if ($this->castTextToInt) { $values = [$column => "CONVERT(VARCHAR(MAX),CONVERT(INT,CONVERT(VARCHAR(MAX), {$column})) - {$value})"]; } else { - $values = [$column => "{$column} + {$value}"]; + $values = [$column => "{$column} - {$value}"]; } $sql = $this->_update($this->QBFrom[0], $values); diff --git a/tests/system/Database/Live/SQLSRV/IncrementTest.php b/tests/system/Database/Live/SQLSRV/IncrementTest.php new file mode 100644 index 000000000000..0296f7d776f4 --- /dev/null +++ b/tests/system/Database/Live/SQLSRV/IncrementTest.php @@ -0,0 +1,71 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Database\Live\SQLSRV; + +use CodeIgniter\Database\SQLSRV\Builder; +use CodeIgniter\Test\CIUnitTestCase; +use CodeIgniter\Test\DatabaseTestTrait; +use PHPUnit\Framework\Attributes\Group; +use Tests\Support\Database\Seeds\CITestSeeder; + +/** + * @internal + */ +#[Group('DatabaseLive')] +final class IncrementTest extends CIUnitTestCase +{ + use DatabaseTestTrait; + + protected $refresh = true; + protected $seed = CITestSeeder::class; + + protected function setUp(): void + { + parent::setUp(); + + if ($this->db->DBDriver !== 'SQLSRV') { + $this->markTestSkipped('This test is only for SQLSRV.'); + } + } + + public function testIncrementWhenCastTextToIntFalse(): void + { + $this->hasInDatabase('job', ['name' => 'incremental', 'created_at' => 6]); + + $this->assertInstanceOf(Builder::class, $this->db->table('job')); + + $this->db->table('job')->castTextToInt = false; + + $this->db->table('job') + ->where('name', 'incremental') + ->increment('created_at'); + + $this->seeInDatabase('job', ['name' => 'incremental', 'created_at' => 7]); + } + + public function testDecrementWhenCastTextToIntFalse(): void + { + $this->hasInDatabase('job', ['name' => 'decremental', 'created_at' => 6]); + + $this->assertInstanceOf(Builder::class, $this->db->table('job')); + + $this->db->table('job')->castTextToInt = false; + + $this->db->table('job') + ->where('name', 'decremental') + ->decrement('created_at'); + + $this->seeInDatabase('job', ['name' => 'decremental', 'created_at' => 5]); + } +} diff --git a/user_guide_src/source/changelogs/v4.7.3.rst b/user_guide_src/source/changelogs/v4.7.3.rst index 677e1072500b..a71b7982051d 100644 --- a/user_guide_src/source/changelogs/v4.7.3.rst +++ b/user_guide_src/source/changelogs/v4.7.3.rst @@ -41,6 +41,7 @@ Bugs Fixed - **Commands:** Fixed a bug in the ``env`` command where passing options only would cause the command to throw a ``TypeError`` instead of showing the current environment. - **Common:** Fixed a bug where the ``command()`` helper function did not properly clean up output buffers, which could lead to risky tests when exceptions were thrown. - **Validation:** Fixed a bug where ``Validation::getValidated()`` dropped fields whose validated value was explicitly ``null``. +- **SQLSRV Database Driver:** Fixed a bug where the SQLSRV driver's decrement method was adding instead of subtracting the decrement value when ``$castTextToInt`` was false. See the repo's `CHANGELOG.md `_