From 4ef1d5939f1931fd86bb9018c89c2941d02b87ac Mon Sep 17 00:00:00 2001 From: Matias Grunberg Date: Sun, 18 Apr 2021 17:08:43 -0300 Subject: [PATCH 1/4] don't patch unprepared statements took the idea from https://github.com/rails/rails/commit/157f6a6efe5dba7e502140194baf1af62e618a8a#diff-39e2986a9d501a5ce3587a8d5944feb67c91e777f44270627850c219709d6510 and the fact that SubstituteCollector is only used for unprepared_statements (see https://github.com/rails/rails/blob/v6.1.0/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb#L729) --- lib/arel/visitors/sqlserver.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/arel/visitors/sqlserver.rb b/lib/arel/visitors/sqlserver.rb index f98fcabae..c7fa6705f 100644 --- a/lib/arel/visitors/sqlserver.rb +++ b/lib/arel/visitors/sqlserver.rb @@ -79,7 +79,7 @@ def visit_Arel_Nodes_HomogeneousIn(o, collector) if values.empty? collector << @connection.quote(nil) - else + elsif @connection.prepared_statements # Monkey-patch start. Add query attribute bindings rather than just values. column_name = o.column_name column_type = o.attribute.relation.type_for_attribute(o.column_name) @@ -87,6 +87,8 @@ def visit_Arel_Nodes_HomogeneousIn(o, collector) collector.add_binds(attrs, &bind_block) # Monkey-patch end. + else + collector.add_binds(values, &bind_block) end collector << ")" From 1fe4b8a118b430bc83dc54a02e9fe330a644e733 Mon Sep 17 00:00:00 2001 From: Matias Grunberg Date: Sun, 18 Apr 2021 17:25:28 -0300 Subject: [PATCH 2/4] handle explain with ::ActiveRecord::Relation::QueryAttribute binds Idea took from https://github.com/rails/rails/commit/157f6a6efe5dba7e502140194baf1af62e618a8a#diff-137c2c919e7860732301c49c60a700517455564bf463ff036756fb31c02a60e5 --- .../connection_adapters/sqlserver/core_ext/explain.rb | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/lib/active_record/connection_adapters/sqlserver/core_ext/explain.rb b/lib/active_record/connection_adapters/sqlserver/core_ext/explain.rb index bad3d8f12..ab05b8ded 100644 --- a/lib/active_record/connection_adapters/sqlserver/core_ext/explain.rb +++ b/lib/active_record/connection_adapters/sqlserver/core_ext/explain.rb @@ -27,7 +27,12 @@ def unprepare_sqlserver_statement(sql, binds) executesql = executesql.match(SQLSERVER_STATEMENT_REGEXP).to_a[1] binds.each_with_index do |bind, index| - value = connection.quote(bind) + + value = if ::ActiveModel::Attribute === bind then + connection.quote(bind.value_for_database) + else + connection.quote(bind) + end executesql = executesql.sub("@#{index}", value) end From 09c7ea1186531f853aa911feb68c0644adca7483 Mon Sep 17 00:00:00 2001 From: Matias Grunberg Date: Mon, 19 Apr 2021 10:41:33 -0300 Subject: [PATCH 3/4] add changelog entry --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b562aba3a..b54cdbf1e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ - [#879](https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/pull/879) Added visit method for HomogeneousIn - [#880](https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/pull/880) Handle any default column class when deduplicating - [#861](https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/pull/861) Fix Rails 6.1 database config +- [#883](https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/pull/885) Fix quoting of ActiveRecord::Relation::QueryAttribute and ActiveModel::Attributes #### Changed From 43438f3a7617b1fbce42450edd5ac47f5f006415 Mon Sep 17 00:00:00 2001 From: Matias Grunberg Date: Mon, 19 Apr 2021 10:41:37 -0300 Subject: [PATCH 4/4] apply suggestion --- .../connection_adapters/sqlserver/core_ext/explain.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/active_record/connection_adapters/sqlserver/core_ext/explain.rb b/lib/active_record/connection_adapters/sqlserver/core_ext/explain.rb index ab05b8ded..752350e4c 100644 --- a/lib/active_record/connection_adapters/sqlserver/core_ext/explain.rb +++ b/lib/active_record/connection_adapters/sqlserver/core_ext/explain.rb @@ -28,7 +28,7 @@ def unprepare_sqlserver_statement(sql, binds) binds.each_with_index do |bind, index| - value = if ::ActiveModel::Attribute === bind then + value = if bind.is_a?(::ActiveModel::Attribute) then connection.quote(bind.value_for_database) else connection.quote(bind)