Skip to content

Commit ac95da9

Browse files
authored
Set precision 6 by default for timestamps (#1057)
1 parent 506ee4b commit ac95da9

File tree

6 files changed

+152
-109
lines changed

6 files changed

+152
-109
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@
66
- [#1053](https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/pull/1053) Fix insertion of records to non-default schema table using raw SQL
77
- [#1059](https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/pull/1059) Fix enums defined on string columns
88

9+
#### Changed
10+
11+
- [#1057](https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/pull/1057) Set precision 6 by default for timestamps.
12+
913
## v7.0.2.0
1014

1115
[Full changelog](https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/compare/v7.0.1.0...v7.0.2.0)

lib/active_record/connection_adapters/sqlserver/schema_statements.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -346,7 +346,7 @@ def initialize_native_database_types
346346
datetime2: { name: "datetime2" },
347347
datetimeoffset: { name: "datetimeoffset" },
348348
smalldatetime: { name: "smalldatetime" },
349-
timestamp: { name: "datetime" },
349+
timestamp: { name: "datetime2(6)" },
350350
time: { name: "time" },
351351
char: { name: "char" },
352352
varchar: { name: "varchar", limit: 8000 },

lib/active_record/connection_adapters/sqlserver/table_definition.rb

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -101,11 +101,16 @@ class TableDefinition < ActiveRecord::ConnectionAdapters::TableDefinition
101101

102102
def new_column_definition(name, type, **options)
103103
case type
104-
when :datetime
105-
type = :datetime2 if options[:precision]
104+
when :datetime, :timestamp
105+
# If no precision then default it to 6.
106+
options[:precision] = 6 unless options.key?(:precision)
107+
108+
# If there is precision then column must be of type 'datetime2'.
109+
type = :datetime2 unless options[:precision].nil?
106110
when :primary_key
107111
options[:is_identity] = true
108112
end
113+
109114
super
110115
end
111116
end

test/cases/coerced_tests.rb

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -543,7 +543,7 @@ def test_create_table_with_defaults_coerce
543543
assert_equal "hello", five.default
544544
end
545545

546-
# Rails adds precision 6 by default, sql server uses datetime2 for datetimes with precision
546+
# Use precision 6 by default for datetime/timestamp columns. SQL Server uses `datetime2` for date-times with precision.
547547
coerce_tests! :test_add_column_with_postgresql_datetime_type
548548
def test_add_column_with_postgresql_datetime_type_coerced
549549
connection.create_table :testings do |t|
@@ -556,7 +556,7 @@ def test_add_column_with_postgresql_datetime_type_coerced
556556
assert_equal "datetime2(6)", column.sql_type
557557
end
558558

559-
# timestamp is datetime with default limit
559+
# Use precision 6 by default for datetime/timestamp columns. SQL Server uses `datetime2` for date-times with precision.
560560
coerce_tests! :test_change_column_with_timestamp_type
561561
def test_change_column_with_timestamp_type_coerced
562562
connection.create_table :testings do |t|
@@ -568,7 +568,20 @@ def test_change_column_with_timestamp_type_coerced
568568
column = connection.columns(:testings).find { |c| c.name == "foo" }
569569

570570
assert_equal :datetime, column.type
571-
assert_equal "datetime", column.sql_type
571+
assert_equal "datetime2(6)", column.sql_type
572+
end
573+
574+
# Use precision 6 by default for datetime/timestamp columns. SQL Server uses `datetime2` for date-times with precision.
575+
coerce_tests! :test_add_column_with_timestamp_type
576+
def test_add_column_with_timestamp_type_coerced
577+
connection.create_table :testings do |t|
578+
t.column :foo, :timestamp
579+
end
580+
581+
column = connection.columns(:testings).find { |c| c.name == "foo" }
582+
583+
assert_equal :datetime, column.type
584+
assert_equal "datetime2(6)", column.sql_type
572585
end
573586
end
574587
end

0 commit comments

Comments
 (0)