diff --git a/CHANGELOG.md b/CHANGELOG.md index 4704cbed..22f06f8f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -40,6 +40,7 @@ - New #353: Realize `Schema::loadResultColumn()` method (@Tigrov) - Enh #300: Remove realization of `Connection::createBatchQueryResult()` method (@Tigrov) - Bug #360: Fix columns order in composite primary key (@Tigrov) +- New #358: Use `DateTimeColumn` class for datetime column types (@Tigrov) ## 1.2.0 March 21, 2024 diff --git a/src/Column/ColumnBuilder.php b/src/Column/ColumnBuilder.php index 68027669..2378e7de 100644 --- a/src/Column/ColumnBuilder.php +++ b/src/Column/ColumnBuilder.php @@ -13,4 +13,34 @@ public static function binary(int|null $size = null): ColumnInterface { return new BinaryColumn(ColumnType::BINARY, size: $size); } + + public static function timestamp(int|null $size = 0): DateTimeColumn + { + return new DateTimeColumn(ColumnType::TIMESTAMP, size: $size); + } + + public static function datetime(int|null $size = 0): DateTimeColumn + { + return new DateTimeColumn(ColumnType::DATETIME, size: $size); + } + + public static function datetimeWithTimezone(int|null $size = 0): DateTimeColumn + { + return new DateTimeColumn(ColumnType::DATETIMETZ, size: $size); + } + + public static function time(int|null $size = 0): DateTimeColumn + { + return new DateTimeColumn(ColumnType::TIME, size: $size); + } + + public static function timeWithTimezone(int|null $size = 0): DateTimeColumn + { + return new DateTimeColumn(ColumnType::TIMETZ, size: $size); + } + + public static function date(): DateTimeColumn + { + return new DateTimeColumn(ColumnType::DATE); + } } diff --git a/src/Column/ColumnDefinitionBuilder.php b/src/Column/ColumnDefinitionBuilder.php index 0b9655a7..940e2808 100644 --- a/src/Column/ColumnDefinitionBuilder.php +++ b/src/Column/ColumnDefinitionBuilder.php @@ -20,9 +20,9 @@ final class ColumnDefinitionBuilder extends AbstractColumnDefinitionBuilder 'decimal', 'numeric', 'float', - 'time', 'datetime2', 'datetimeoffset', + 'time', 'char', 'varchar', 'nchar', @@ -124,10 +124,12 @@ protected function getDbType(ColumnInterface $column): string ColumnType::TEXT => 'nvarchar(max)', ColumnType::BINARY => 'varbinary(max)', ColumnType::UUID => 'uniqueidentifier', - ColumnType::DATETIME => 'datetime2', ColumnType::TIMESTAMP => 'datetime2', - ColumnType::DATE => 'date', + ColumnType::DATETIME => 'datetime2', + ColumnType::DATETIMETZ => 'datetimeoffset', ColumnType::TIME => 'time', + ColumnType::TIMETZ => 'time', + ColumnType::DATE => 'date', ColumnType::ARRAY => 'nvarchar(max)', ColumnType::STRUCTURED => 'nvarchar(max)', ColumnType::JSON => 'nvarchar(max)', diff --git a/src/Column/ColumnFactory.php b/src/Column/ColumnFactory.php index 67fda69c..9538329d 100644 --- a/src/Column/ColumnFactory.php +++ b/src/Column/ColumnFactory.php @@ -40,12 +40,12 @@ final class ColumnFactory extends AbstractColumnFactory 'double' => ColumnType::DOUBLE, /** Date and time */ - 'date' => ColumnType::DATE, - 'time' => ColumnType::TIME, 'smalldatetime' => ColumnType::DATETIME, 'datetime' => ColumnType::DATETIME, 'datetime2' => ColumnType::DATETIME, - 'datetimeoffset' => ColumnType::DATETIME, + 'datetimeoffset' => ColumnType::DATETIMETZ, + 'time' => ColumnType::TIME, + 'date' => ColumnType::DATE, /** Character strings */ 'char' => ColumnType::CHAR, @@ -84,11 +84,16 @@ public function fromPseudoType(string $pseudoType, array $info = []): ColumnInte protected function getColumnClass(string $type, array $info = []): string { - if ($type === ColumnType::BINARY) { - return BinaryColumn::class; - } - - return parent::getColumnClass($type, $info); + return match ($type) { + ColumnType::BINARY => BinaryColumn::class, + ColumnType::TIMESTAMP => DateTimeColumn::class, + ColumnType::DATETIME => DateTimeColumn::class, + ColumnType::DATETIMETZ => DateTimeColumn::class, + ColumnType::TIME => DateTimeColumn::class, + ColumnType::TIMETZ => DateTimeColumn::class, + ColumnType::DATE => DateTimeColumn::class, + default => parent::getColumnClass($type, $info), + }; } protected function getType(string $dbType, array $info = []): string diff --git a/src/Column/DateTimeColumn.php b/src/Column/DateTimeColumn.php new file mode 100644 index 00000000..9fe619b1 --- /dev/null +++ b/src/Column/DateTimeColumn.php @@ -0,0 +1,17 @@ +getDbType()) { + 'smalldatetime' => '', + 'datetime' => '.v', + default => parent::getMillisecondsFormat(), + }; + } +} diff --git a/tests/ColumnBuilderTest.php b/tests/ColumnBuilderTest.php index c95cf159..bd10f3de 100644 --- a/tests/ColumnBuilderTest.php +++ b/tests/ColumnBuilderTest.php @@ -4,7 +4,9 @@ namespace Yiisoft\Db\Mssql\Tests; +use PHPUnit\Framework\Attributes\DataProviderExternal; use Yiisoft\Db\Mssql\Column\ColumnBuilder; +use Yiisoft\Db\Mssql\Tests\Provider\ColumnBuilderProvider; use Yiisoft\Db\Mssql\Tests\Support\TestTrait; use Yiisoft\Db\Tests\AbstractColumnBuilderTest; @@ -20,9 +22,7 @@ public function getColumnBuilderClass(): string return ColumnBuilder::class; } - /** - * @dataProvider \Yiisoft\Db\Mssql\Tests\Provider\ColumnBuilderProvider::buildingMethods - */ + #[DataProviderExternal(ColumnBuilderProvider::class, 'buildingMethods')] public function testBuildingMethods( string $buildingMethod, array $args, diff --git a/tests/ColumnTest.php b/tests/ColumnTest.php index 8792e463..e8fd1402 100644 --- a/tests/ColumnTest.php +++ b/tests/ColumnTest.php @@ -4,11 +4,16 @@ namespace Yiisoft\Db\Mssql\Tests; +use DateTimeImmutable; +use DateTimeZone; use PDO; +use PHPUnit\Framework\Attributes\DataProviderExternal; use Yiisoft\Db\Command\Param; use Yiisoft\Db\Expression\Expression; use Yiisoft\Db\Mssql\Column\BinaryColumn; +use Yiisoft\Db\Mssql\Column\ColumnBuilder; use Yiisoft\Db\Mssql\Connection; +use Yiisoft\Db\Mssql\Tests\Provider\ColumnProvider; use Yiisoft\Db\Mssql\Tests\Support\TestTrait; use Yiisoft\Db\Query\Query; use Yiisoft\Db\Schema\Column\BooleanColumn; @@ -16,17 +21,19 @@ use Yiisoft\Db\Schema\Column\DoubleColumn; use Yiisoft\Db\Schema\Column\IntegerColumn; use Yiisoft\Db\Schema\Column\StringColumn; -use Yiisoft\Db\Tests\AbstractColumnTest; +use Yiisoft\Db\Tests\Common\CommonColumnTest; use function str_repeat; /** * @group mssql */ -final class ColumnTest extends AbstractColumnTest +final class ColumnTest extends CommonColumnTest { use TestTrait; + protected const COLUMN_BUILDER = ColumnBuilder::class; + private function insertTypeValues(Connection $db): void { $db->createCommand()->insert( @@ -44,16 +51,21 @@ private function insertTypeValues(Connection $db): void )->execute(); } - private function assertResultValues(array $result): void + private function assertTypecastedValues(array $result, bool $allTypecasted = false): void { $this->assertSame(1, $result['int_col']); $this->assertSame(str_repeat('x', 100), $result['char_col']); $this->assertNull($result['char_col3']); $this->assertSame(1.234, $result['float_col']); $this->assertSame("\x10\x11\x12", $result['blob_col']); - $this->assertSame('2023-07-11 14:50:00.123', $result['datetime_col']); + $this->assertEquals(new DateTimeImmutable('2023-07-11 14:50:00.123', new DateTimeZone('UTC')), $result['datetime_col']); $this->assertFalse($result['bool_col']); - $this->assertSame('[{"a":1,"b":null,"c":[1,3,5]}]', $result['json_col']); + + if ($allTypecasted) { + $this->assertSame([['a' => 1, 'b' => null, 'c' => [1, 3, 5]]], $result['json_col']); + } else { + $this->assertSame('[{"a":1,"b":null,"c":[1,3,5]}]', $result['json_col']); + } } public function testQueryWithTypecasting(): void @@ -66,11 +78,11 @@ public function testQueryWithTypecasting(): void $result = $query->one(); - $this->assertResultValues($result); + $this->assertTypecastedValues($result); $result = $query->all(); - $this->assertResultValues($result[0]); + $this->assertTypecastedValues($result[0]); $db->close(); } @@ -85,11 +97,11 @@ public function testCommandWithPhpTypecasting(): void $result = $command->queryOne(); - $this->assertResultValues($result); + $this->assertTypecastedValues($result); $result = $command->queryAll(); - $this->assertResultValues($result[0]); + $this->assertTypecastedValues($result[0]); $db->close(); } @@ -138,29 +150,19 @@ public function testPhpTypeCast(): void { $db = $this->getConnection(true); $schema = $db->getSchema(); - $tableSchema = $schema->getTableSchema('type'); + $columns = $schema->getTableSchema('type')->getColumns(); $this->insertTypeValues($db); $query = (new Query($db))->from('type')->one(); - $intColPhpType = $tableSchema->getColumn('int_col')?->phpTypecast($query['int_col']); - $charColPhpType = $tableSchema->getColumn('char_col')?->phpTypecast($query['char_col']); - $charCol3PhpType = $tableSchema->getColumn('char_col3')?->phpTypecast($query['char_col3']); - $floatColPhpType = $tableSchema->getColumn('float_col')?->phpTypecast($query['float_col']); - $blobColPhpType = $tableSchema->getColumn('blob_col')?->phpTypecast($query['blob_col']); - $datetimeColPhpType = $tableSchema->getColumn('datetime_col')?->phpTypecast($query['datetime_col']); - $boolColPhpType = $tableSchema->getColumn('bool_col')?->phpTypecast($query['bool_col']); - $jsonColPhpType = $tableSchema->getColumn('json_col')?->phpTypecast($query['json_col']); - - $this->assertSame(1, $intColPhpType); - $this->assertSame(str_repeat('x', 100), $charColPhpType); - $this->assertNull($charCol3PhpType); - $this->assertSame(1.234, $floatColPhpType); - $this->assertSame("\x10\x11\x12", $blobColPhpType); - $this->assertSame('2023-07-11 14:50:00.123', $datetimeColPhpType); - $this->assertFalse($boolColPhpType); - $this->assertSame([['a' => 1, 'b' => null, 'c' => [1, 3, 5]]], $jsonColPhpType); + $result = []; + + foreach ($columns as $columnName => $column) { + $result[$columnName] = $column->phpTypecast($query[$columnName]); + } + + $this->assertTypecastedValues($result, true); $db->close(); } @@ -178,18 +180,24 @@ public function testColumnInstance() $this->assertInstanceOf(BooleanColumn::class, $tableSchema->getColumn('bool_col')); } - /** @dataProvider \Yiisoft\Db\Mssql\Tests\Provider\ColumnProvider::predefinedTypes */ + #[DataProviderExternal(ColumnProvider::class, 'predefinedTypes')] public function testPredefinedType(string $className, string $type, string $phpType) { parent::testPredefinedType($className, $type, $phpType); } - /** @dataProvider \Yiisoft\Db\Mssql\Tests\Provider\ColumnProvider::dbTypecastColumns */ + #[DataProviderExternal(ColumnProvider::class, 'dbTypecastColumns')] public function testDbTypecastColumns(ColumnInterface $column, array $values) { parent::testDbTypecastColumns($column, $values); } + #[DataProviderExternal(ColumnProvider::class, 'phpTypecastColumns')] + public function testPhpTypecastColumns(ColumnInterface $column, array $values) + { + parent::testPhpTypecastColumns($column, $values); + } + public function testBinaryColumn() { $binaryCol = new BinaryColumn(); diff --git a/tests/Provider/ColumnBuilderProvider.php b/tests/Provider/ColumnBuilderProvider.php index 83308b53..7d5a38bd 100644 --- a/tests/Provider/ColumnBuilderProvider.php +++ b/tests/Provider/ColumnBuilderProvider.php @@ -5,6 +5,7 @@ namespace Yiisoft\Db\Mssql\Tests\Provider; use Yiisoft\Db\Mssql\Column\BinaryColumn; +use Yiisoft\Db\Mssql\Column\DateTimeColumn; class ColumnBuilderProvider extends \Yiisoft\Db\Tests\Provider\ColumnBuilderProvider { @@ -14,6 +15,17 @@ public static function buildingMethods(): array $values['binary()'][2] = BinaryColumn::class; $values['binary(8)'][2] = BinaryColumn::class; + $values['timestamp()'][2] = DateTimeColumn::class; + $values['timestamp(3)'][2] = DateTimeColumn::class; + $values['datetime()'][2] = DateTimeColumn::class; + $values['datetime(3)'][2] = DateTimeColumn::class; + $values['datetimeWithTimezone()'][2] = DateTimeColumn::class; + $values['datetimeWithTimezone(3)'][2] = DateTimeColumn::class; + $values['time()'][2] = DateTimeColumn::class; + $values['time(3)'][2] = DateTimeColumn::class; + $values['timeWithTimezone()'][2] = DateTimeColumn::class; + $values['timeWithTimezone(3)'][2] = DateTimeColumn::class; + $values['date()'][2] = DateTimeColumn::class; return $values; } diff --git a/tests/Provider/ColumnFactoryProvider.php b/tests/Provider/ColumnFactoryProvider.php index c46c3cbe..06ce2df5 100644 --- a/tests/Provider/ColumnFactoryProvider.php +++ b/tests/Provider/ColumnFactoryProvider.php @@ -7,6 +7,7 @@ use Yiisoft\Db\Constant\ColumnType; use Yiisoft\Db\Expression\Expression; use Yiisoft\Db\Mssql\Column\BinaryColumn; +use Yiisoft\Db\Mssql\Column\DateTimeColumn; use Yiisoft\Db\Schema\Column\ArrayColumn; use Yiisoft\Db\Schema\Column\BooleanColumn; use Yiisoft\Db\Schema\Column\DoubleColumn; @@ -40,12 +41,12 @@ public static function dbTypes(): array ['double', ColumnType::DOUBLE, DoubleColumn::class], ['smallmoney', ColumnType::MONEY, StringColumn::class], ['money', ColumnType::MONEY, StringColumn::class], - ['date', ColumnType::DATE, StringColumn::class], - ['time', ColumnType::TIME, StringColumn::class], - ['smalldatetime', ColumnType::DATETIME, StringColumn::class], - ['datetime', ColumnType::DATETIME, StringColumn::class], - ['datetime2', ColumnType::DATETIME, StringColumn::class], - ['datetimeoffset', ColumnType::DATETIME, StringColumn::class], + ['smalldatetime', ColumnType::DATETIME, DateTimeColumn::class], + ['datetime', ColumnType::DATETIME, DateTimeColumn::class], + ['datetime2', ColumnType::DATETIME, DateTimeColumn::class], + ['datetimeoffset', ColumnType::DATETIMETZ, DateTimeColumn::class], + ['time', ColumnType::TIME, DateTimeColumn::class], + ['date', ColumnType::DATE, DateTimeColumn::class], ['char', ColumnType::CHAR, StringColumn::class], ['varchar', ColumnType::STRING, StringColumn::class], ['text', ColumnType::TEXT, StringColumn::class], diff --git a/tests/Provider/ColumnProvider.php b/tests/Provider/ColumnProvider.php index f8e733d9..7c11616b 100644 --- a/tests/Provider/ColumnProvider.php +++ b/tests/Provider/ColumnProvider.php @@ -4,7 +4,9 @@ namespace Yiisoft\Db\Mssql\Tests\Provider; +use Yiisoft\Db\Constant\ColumnType; use Yiisoft\Db\Mssql\Column\BinaryColumn; +use Yiisoft\Db\Mssql\Column\DateTimeColumn; class ColumnProvider extends \Yiisoft\Db\Tests\Provider\ColumnProvider { @@ -12,6 +14,7 @@ public static function predefinedTypes(): array { $values = parent::predefinedTypes(); $values['binary'][0] = BinaryColumn::class; + $values['datetime'][0] = DateTimeColumn::class; return $values; } @@ -20,6 +23,31 @@ public static function dbTypecastColumns(): array { $values = parent::dbTypecastColumns(); $values['binary'][0] = new BinaryColumn(); + $values['timestamp'][0] = new DateTimeColumn(ColumnType::TIMESTAMP, size: 0); + $values['timestamp6'][0] = new DateTimeColumn(ColumnType::TIMESTAMP, size: 6); + $values['datetime'][0] = new DateTimeColumn(size: 0); + $values['datetime6'][0] = new DateTimeColumn(size: 6); + $values['datetimetz'][0] = new DateTimeColumn(ColumnType::DATETIMETZ, size: 0); + $values['datetimetz6'][0] = new DateTimeColumn(ColumnType::DATETIMETZ, size: 6); + $values['time'][0] = new DateTimeColumn(ColumnType::TIME, size: 0); + $values['time6'][0] = new DateTimeColumn(ColumnType::TIME, size: 6); + $values['timetz'][0] = new DateTimeColumn(ColumnType::TIMETZ, size: 0); + $values['timetz6'][0] = new DateTimeColumn(ColumnType::TIMETZ, size: 6); + $values['date'][0] = new DateTimeColumn(ColumnType::DATE); + + return $values; + } + + public static function phpTypecastColumns(): array + { + $values = parent::phpTypecastColumns(); + $values['binary'][0] = new BinaryColumn(); + $values['timestamp'][0] = new DateTimeColumn(ColumnType::TIMESTAMP); + $values['datetime'][0] = new DateTimeColumn(); + $values['datetimetz'][0] = new DateTimeColumn(ColumnType::DATETIMETZ); + $values['time'][0] = new DateTimeColumn(ColumnType::TIME); + $values['timetz'][0] = new DateTimeColumn(ColumnType::TIMETZ); + $values['date'][0] = new DateTimeColumn(ColumnType::DATE); return $values; } diff --git a/tests/Provider/QueryBuilderProvider.php b/tests/Provider/QueryBuilderProvider.php index 0fd74598..279ca81b 100644 --- a/tests/Provider/QueryBuilderProvider.php +++ b/tests/Provider/QueryBuilderProvider.php @@ -583,12 +583,18 @@ public static function buildColumnDefinition(): array $values['text(1000)'][0] = 'nvarchar(max)'; $values['binary()'][0] = 'varbinary(max)'; $values['binary(1000)'][0] = 'varbinary(max)'; - $values['datetime()'][0] = 'datetime2(0)'; - $values['datetime(6)'][0] = 'datetime2(6)'; - $values['datetime(null)'][0] = 'datetime2'; $values['timestamp()'][0] = 'datetime2(0)'; $values['timestamp(6)'][0] = 'datetime2(6)'; $values['timestamp(null)'][0] = 'datetime2'; + $values['datetime()'][0] = 'datetime2(0)'; + $values['datetime(6)'][0] = 'datetime2(6)'; + $values['datetime(null)'][0] = 'datetime2'; + $values['datetimeWithTimezone()'][0] = 'datetimeoffset(0)'; + $values['datetimeWithTimezone(6)'][0] = 'datetimeoffset(6)'; + $values['datetimeWithTimezone(null)'][0] = 'datetimeoffset'; + $values['timeWithTimezone()'][0] = 'time(0)'; + $values['timeWithTimezone(6)'][0] = 'time(6)'; + $values['timeWithTimezone(null)'][0] = 'time'; $values['uuid()'][0] = 'uniqueidentifier'; $values['array()'] = [ 'nvarchar(max) CHECK (isjson([array_col]) > 0)', diff --git a/tests/Provider/SchemaProvider.php b/tests/Provider/SchemaProvider.php index fad746f9..019d5923 100644 --- a/tests/Provider/SchemaProvider.php +++ b/tests/Provider/SchemaProvider.php @@ -4,9 +4,12 @@ namespace Yiisoft\Db\Mssql\Tests\Provider; +use DateTimeImmutable; +use DateTimeZone; use Yiisoft\Db\Constant\ColumnType; use Yiisoft\Db\Constraint\DefaultValueConstraint; use Yiisoft\Db\Mssql\Column\BinaryColumn; +use Yiisoft\Db\Mssql\Column\DateTimeColumn; use Yiisoft\Db\Schema\Column\BooleanColumn; use Yiisoft\Db\Schema\Column\DoubleColumn; use Yiisoft\Db\Schema\Column\IntegerColumn; @@ -86,12 +89,12 @@ public static function columns(): array scale: 2, defaultValue: 33.22, ), - 'datetime_col' => new StringColumn( - ColumnType::DATETIME, + 'datetime_col' => new DateTimeColumn( dbType: 'datetime', notNull: true, size: 3, - defaultValue: '2002-01-01 00:00:00', + defaultValue: new DateTimeImmutable('2002-01-01 00:00:00', new DateTimeZone('UTC')), + shouldConvertTimezone: true, ), 'bool_col' => new BooleanColumn( dbType: 'bit', @@ -246,7 +249,7 @@ public static function resultColumns(): array 'len' => 0, 'precision' => 0, ]], - [new StringColumn(ColumnType::DATETIME, dbType: 'datetime', name: 'datetime_col', size: 3), [ + [new DateTimeColumn(dbType: 'datetime', name: 'datetime_col', size: 3), [ 'flags' => 0, 'sqlsrv:decl_type' => 'datetime', 'native_type' => 'string', @@ -256,7 +259,7 @@ public static function resultColumns(): array 'len' => 23, 'precision' => 3, ]], - [new StringColumn(ColumnType::DATETIME, dbType: 'datetime2', name: 'datetime2_col', size: 7), [ + [new DateTimeColumn(dbType: 'datetime2', name: 'datetime2_col', size: 7), [ 'flags' => 0, 'sqlsrv:decl_type' => 'datetime2', 'native_type' => 'string', diff --git a/tests/Provider/Type/DateProvider.php b/tests/Provider/Type/DateProvider.php index 0774252b..e358ef21 100644 --- a/tests/Provider/Type/DateProvider.php +++ b/tests/Provider/Type/DateProvider.php @@ -4,16 +4,18 @@ namespace Yiisoft\Db\Mssql\Tests\Provider\Type; +use DateTimeImmutable; + final class DateProvider { public static function columns(): array { return [ - ['Mydate', 'date', 'string', '2007-05-08'], - ['Mydatetime', 'datetime', 'string', '2007-05-08 12:35:29.123'], - ['Mydatetime2', 'datetime2', 'string', '2007-05-08 12:35:29.1234567'], - ['Mydatetimeoffset', 'datetimeoffset', 'string', '2007-05-08 12:35:29.1234567 +12:15'], - ['Mytime', 'time', 'string', '12:35:29.1234567'], + ['Mydate', 'date', DateTimeImmutable::class, new DateTimeImmutable('2007-05-08')], + ['Mydatetime', 'datetime', DateTimeImmutable::class, new DateTimeImmutable('2007-05-08 12:35:29.123')], + ['Mydatetime2', 'datetime2', DateTimeImmutable::class, new DateTimeImmutable('2007-05-08 12:35:29.123456')], + ['Mydatetimeoffset', 'datetimeoffset', DateTimeImmutable::class, new DateTimeImmutable('2007-05-08 12:35:29.123456 +12:15')], + ['Mytime', 'time', DateTimeImmutable::class, new DateTimeImmutable('12:35:29.123456')], ]; } } diff --git a/tests/Type/DateTest.php b/tests/Type/DateTest.php index f8e9b9e8..d1f59499 100644 --- a/tests/Type/DateTest.php +++ b/tests/Type/DateTest.php @@ -4,6 +4,7 @@ namespace Yiisoft\Db\Mssql\Tests\Type; +use DateTimeImmutable; use PHPUnit\Framework\TestCase; use Throwable; use Yiisoft\Db\Connection\ConnectionInterface; @@ -11,6 +12,8 @@ use Yiisoft\Db\Exception\InvalidArgumentException; use Yiisoft\Db\Exception\InvalidConfigException; use Yiisoft\Db\Exception\NotSupportedException; +use Yiisoft\Db\Expression\Expression; +use Yiisoft\Db\Mssql\Column\ColumnBuilder; use Yiisoft\Db\Mssql\Tests\Support\TestTrait; /** @@ -37,7 +40,7 @@ public function testCreateTableWithDefaultValue( string $column, string $dbType, string $phpType, - string $defaultValue + DateTimeImmutable $defaultValue ): void { $db = $this->buildTable(); @@ -45,7 +48,7 @@ public function testCreateTableWithDefaultValue( $this->assertSame($dbType, $tableSchema?->getColumn($column)->getDbType()); $this->assertSame($phpType, $tableSchema?->getColumn($column)->getPhpType()); - $this->assertSame($defaultValue, $tableSchema?->getColumn($column)->getDefaultValue()); + $this->assertEquals($defaultValue, $tableSchema?->getColumn($column)->getDefaultValue()); $db->createCommand()->insert('date_default', [])->execute(); } @@ -89,7 +92,7 @@ public function testDefaultValue( string $column, string $dbType, string $phpType, - string $defaultValue + DateTimeImmutable $defaultValue ): void { $this->setFixture('Type/date.sql'); @@ -98,7 +101,7 @@ public function testDefaultValue( $this->assertSame($dbType, $tableSchema?->getColumn($column)->getDbType()); $this->assertSame($phpType, $tableSchema?->getColumn($column)->getPhpType()); - $this->assertSame($defaultValue, $tableSchema?->getColumn($column)->getDefaultValue()); + $this->assertEquals($defaultValue, $tableSchema?->getColumn($column)->getDefaultValue()); $db->createCommand()->dropTable('date_default')->execute(); } @@ -142,7 +145,7 @@ public function testValue(): void $this->setFixture('Type/date.sql'); $db = $this->getConnection(true); - $command = $db->createCommand(); + $command = $db->createCommand()->withDbTypecasting(false); $command->insert('date', [ 'Mydate1' => '2007-05-08', 'Mydate2' => null, @@ -213,9 +216,9 @@ private function buildTable(): ConnectionInterface 'id' => 'INT IDENTITY NOT NULL', 'Mydate' => 'DATE DEFAULT \'2007-05-08\'', 'Mydatetime' => 'DATETIME DEFAULT \'2007-05-08 12:35:29.123\'', - 'Mydatetime2' => 'DATETIME2 DEFAULT \'2007-05-08 12:35:29.1234567\'', - 'Mydatetimeoffset' => 'DATETIMEOFFSET DEFAULT \'2007-05-08 12:35:29.1234567 +12:15\'', - 'Mytime' => 'TIME DEFAULT \'12:35:29.1234567\'', + 'Mydatetime2' => ColumnBuilder::datetime(7)->defaultValue(new Expression("'2007-05-08 12:35:29.1234567'")), + 'Mydatetimeoffset' => ColumnBuilder::datetimeWithTimezone(7)->defaultValue(new Expression("'2007-05-08 12:35:29.1234567 +12:15'")), + 'Mytime' => ColumnBuilder::time(7)->defaultValue(new Expression("'12:35:29.1234567'")), ], )->execute();