From 818e50f697a65e1b25b0331c2207983866c33515 Mon Sep 17 00:00:00 2001 From: Andreas Sippl Date: Tue, 15 Oct 2024 15:39:15 +0200 Subject: [PATCH 1/2] Add check for `Date` to `#basic_attribute_type?` This should fix #1243. --- .../connection_adapters/sqlserver/database_statements.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/active_record/connection_adapters/sqlserver/database_statements.rb b/lib/active_record/connection_adapters/sqlserver/database_statements.rb index 2113057dc..f8342d625 100644 --- a/lib/active_record/connection_adapters/sqlserver/database_statements.rb +++ b/lib/active_record/connection_adapters/sqlserver/database_statements.rb @@ -359,6 +359,7 @@ def basic_attribute_type?(type) type.is_a?(String) || type.is_a?(Numeric) || type.is_a?(Time) || + type.is_a?(Date) || type.is_a?(TrueClass) || type.is_a?(FalseClass) || type.is_a?(NilClass) From f7c7714109a232548a69d31fb06e94dfd7933f70 Mon Sep 17 00:00:00 2001 From: Aidan Haran Date: Tue, 15 Oct 2024 17:11:36 +0100 Subject: [PATCH 2/2] Fix queries with date and date-time placeholder conditions --- CHANGELOG.md | 1 + .../sqlserver/database_statements.rb | 15 ++++----------- test/cases/adapter_test_sqlserver.rb | 14 ++++++++++++++ 3 files changed, 19 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 165989f36..cd6249da0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,5 +16,6 @@ - [#1215](https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/pull/1215) Fix mismatched foreign key errors - [#1228](https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/pull/1228) Enable identity insert on view's base table - [#1238](https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/pull/1238) Allow INSERT statements with SELECT notation +- [#1246](https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/pull/1246) Fix queries with date and date-time placeholder conditions Please check [7-1-stable](https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/blob/7-1-stable/CHANGELOG.md) for previous changes. diff --git a/lib/active_record/connection_adapters/sqlserver/database_statements.rb b/lib/active_record/connection_adapters/sqlserver/database_statements.rb index f8342d625..9e36d61aa 100644 --- a/lib/active_record/connection_adapters/sqlserver/database_statements.rb +++ b/lib/active_record/connection_adapters/sqlserver/database_statements.rb @@ -334,7 +334,7 @@ def sp_executesql_sql_type(attr) end end - value = basic_attribute_type?(attr) ? attr : attr.value_for_database + value = active_model_attribute?(attr) ? attr.value_for_database : attr if value.is_a?(Numeric) value > 2_147_483_647 ? "bigint".freeze : "int".freeze @@ -344,7 +344,7 @@ def sp_executesql_sql_type(attr) end def sp_executesql_sql_param(attr) - return quote(attr) if basic_attribute_type?(attr) + return quote(attr) unless active_model_attribute?(attr) case value = attr.value_for_database when Type::Binary::Data, ActiveRecord::Type::SQLServer::Data @@ -354,15 +354,8 @@ def sp_executesql_sql_param(attr) end end - def basic_attribute_type?(type) - type.is_a?(Symbol) || - type.is_a?(String) || - type.is_a?(Numeric) || - type.is_a?(Time) || - type.is_a?(Date) || - type.is_a?(TrueClass) || - type.is_a?(FalseClass) || - type.is_a?(NilClass) + def active_model_attribute?(type) + type.is_a?(::ActiveModel::Attribute) end def sp_executesql_sql(sql, types, params, name) diff --git a/test/cases/adapter_test_sqlserver.rb b/test/cases/adapter_test_sqlserver.rb index a968ab24c..48f09e6d6 100644 --- a/test/cases/adapter_test_sqlserver.rb +++ b/test/cases/adapter_test_sqlserver.rb @@ -602,4 +602,18 @@ def setup @conn.execute("ALTER TABLE engines DROP COLUMN old_car_id") rescue nil end end + + describe "placeholder conditions" do + it 'using time placeholder' do + assert_equal Task.where("starting < ?", Time.now).count, 1 + end + + it 'using date placeholder' do + assert_equal Task.where("starting < ?", Date.today).count, 1 + end + + it 'using date-time placeholder' do + assert_equal Task.where("starting < ?", DateTime.current).count, 1 + end + end end