From 9ff57a91a8ef1a25162d6f04352176003e58f72b Mon Sep 17 00:00:00 2001 From: Anna Carey Date: Fri, 17 Jan 2014 00:05:57 -0500 Subject: [PATCH 01/17] The tests now run with rails 4.1.0 removing duplicate standard_dump --- Gemfile | 3 ++- VERSION | 2 +- activerecord-sqlserver-adapter.gemspec | 29 +++++++++++----------- test/cases/schema_dumper_test_sqlserver.rb | 11 ++------ test/cases/sqlserver_helper.rb | 1 + test/cases/sqlserver_test_case.rb | 2 +- 6 files changed, 22 insertions(+), 26 deletions(-) diff --git a/Gemfile b/Gemfile index a09e59a13..5b68644a0 100644 --- a/Gemfile +++ b/Gemfile @@ -41,7 +41,8 @@ group :development do gem 'bcrypt-ruby', '~> 3.0.0' gem 'bench_press' gem 'mocha' - gem 'minitest-spec-rails' + # TODO: Change back when it's ready + gem 'minitest-spec-rails', git: "https://github.com/metaskills/minitest-spec-rails.git" gem 'nokogiri' gem 'rake', '~> 0.9.2' gem 'rubocop' diff --git a/VERSION b/VERSION index fcdb2e109..c721eebf0 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -4.0.0 +4.1.0.pre diff --git a/activerecord-sqlserver-adapter.gemspec b/activerecord-sqlserver-adapter.gemspec index 203eabe0f..4f39d3c21 100644 --- a/activerecord-sqlserver-adapter.gemspec +++ b/activerecord-sqlserver-adapter.gemspec @@ -1,20 +1,21 @@ -$LOAD_PATH.push File.expand_path('../lib', __FILE__) +$:.push File.expand_path("../lib", __FILE__) Gem::Specification.new do |s| s.platform = Gem::Platform::RUBY - s.name = 'activerecord-sqlserver-adapter' - s.version = File.read(File.expand_path('../VERSION', __FILE__)).strip - s.summary = 'ActiveRecord SQL Server Adapter. For SQL Server 2005 And Higher.' - s.description = 'ActiveRecord SQL Server Adapter. For SQL Server 2005 And Higher.' - - s.authors = ['Ken Collins', 'Anna Carey', 'Murray Steele', 'Shawn Balestracci', 'Joe Rafaniello', 'Tom Ward'] - s.email = 'ken@metaskills.net' - s.homepage = 'http://github.com/rails-sqlserver/activerecord-sqlserver-adapter' - - s.files = Dir['CHANGELOG', 'MIT-LICENSE', 'README.rdoc', 'VERSION', 'lib/**/*'] + s.name = "activerecord-sqlserver-adapter" + s.version = File.read(File.expand_path("../VERSION",__FILE__)).strip + s.summary = "ActiveRecord SQL Server Adapter. For SQL Server 2005 And Higher." + s.description = "ActiveRecord SQL Server Adapter. For SQL Server 2005 And Higher." + + s.authors = ['Ken Collins', 'Murray Steele', 'Shawn Balestracci', 'Joe Rafaniello', 'Tom Ward'] + s.email = "ken@metaskills.net" + s.homepage = "http://github.com/rails-sqlserver/activerecord-sqlserver-adapter" + + s.files = Dir['CHANGELOG', 'MIT-LICENSE', 'README.rdoc', 'VERSION', 'lib/**/*' ] s.require_path = 'lib' s.rubyforge_project = 'activerecord-sqlserver-adapter' - - s.add_dependency('activerecord', '~> 4.0.0') - s.add_dependency('arel', '~> 4.0.1') + + s.add_dependency('activerecord', '~> 4.1.0') + s.add_dependency('arel') end + diff --git a/test/cases/schema_dumper_test_sqlserver.rb b/test/cases/schema_dumper_test_sqlserver.rb index 602a8654b..892a45d96 100644 --- a/test/cases/schema_dumper_test_sqlserver.rb +++ b/test/cases/schema_dumper_test_sqlserver.rb @@ -1,6 +1,8 @@ require 'cases/sqlserver_helper' +require 'cases/schema_dumper_test' require 'stringio' + class SchemaDumperTestSqlserver < ActiveRecord::TestCase setup :find_all_tables @@ -96,15 +98,6 @@ def test_coerced_types_line_up end end - private - - def standard_dump - stream = StringIO.new - ActiveRecord::SchemaDumper.ignore_tables = [] - ActiveRecord::SchemaDumper.dump(ActiveRecord::Base.connection, stream) - stream.string - end - end diff --git a/test/cases/sqlserver_helper.rb b/test/cases/sqlserver_helper.rb index bfcc1f8c0..a46fa0cfd 100644 --- a/test/cases/sqlserver_helper.rb +++ b/test/cases/sqlserver_helper.rb @@ -24,6 +24,7 @@ require 'active_record/version' require 'active_record/connection_adapters/abstract_adapter' require 'minitest-spec-rails' +require 'minitest-spec-rails/init/active_support' require 'minitest-spec-rails/init/mini_shoulda' require 'cases/helper' require 'models/topic' diff --git a/test/cases/sqlserver_test_case.rb b/test/cases/sqlserver_test_case.rb index 726da4c3e..02d6f1c24 100644 --- a/test/cases/sqlserver_test_case.rb +++ b/test/cases/sqlserver_test_case.rb @@ -1,4 +1,4 @@ -require 'active_record/test_case.rb' +require 'cases/test_case.rb' # TODO: I'm struggling to figure out how to unsubscribe from only one 'sql.active_record' # This is a temporary hack until we can just get the sqlserver_ignored regex in rails From 444b0f9ec928b088ce7c1ed4db607a3e7063315f Mon Sep 17 00:00:00 2001 From: wbond Date: Thu, 15 May 2014 09:22:13 -0400 Subject: [PATCH 02/17] Fixed bind type casting to re-set the casted value back to the bind, fixed bind parameter tests to work with SQL server --- .../sqlserver/database_statements.rb | 6 +- test/cases/bind_parameter_test_sqlserver.rb | 57 +++++++++++++++---- 2 files changed, 52 insertions(+), 11 deletions(-) diff --git a/lib/active_record/connection_adapters/sqlserver/database_statements.rb b/lib/active_record/connection_adapters/sqlserver/database_statements.rb index bfa9ddbdf..142174c5d 100644 --- a/lib/active_record/connection_adapters/sqlserver/database_statements.rb +++ b/lib/active_record/connection_adapters/sqlserver/database_statements.rb @@ -334,7 +334,11 @@ def do_exec_query(sql, name, binds, options = {}) next if ar_column && column.sql_type == 'timestamp' v = value names_and_types << if ar_column - v = value.to_i if column.is_integer? && value.present? + if column.is_integer? && value.present? + v = value.to_i + # Reset the casted value to the bind as required by Rails 4.1 + binds[index] = [column, v] + end "@#{index} #{column.sql_type_for_statement}" elsif column.acts_like?(:string) "@#{index} nvarchar(max)" diff --git a/test/cases/bind_parameter_test_sqlserver.rb b/test/cases/bind_parameter_test_sqlserver.rb index 08fad1641..4a3c9b0e1 100644 --- a/test/cases/bind_parameter_test_sqlserver.rb +++ b/test/cases/bind_parameter_test_sqlserver.rb @@ -1,25 +1,62 @@ require 'cases/sqlserver_helper' require 'models/topic' +require 'models_sqlserver/topic' -class BindParameterTestSqlserver < ActiveRecord::TestCase -end - -class ActiveRecord::BindParameterTest < ActiveRecord::TestCase - - fixtures :topics +class BindParameterTestSqlServer < ActiveRecord::TestCase COERCED_TESTS = [ - :test_binds_are_logged + :test_binds_are_logged, + :test_binds_are_logged_after_type_cast ] include SqlserverCoercedTest - # TODO: put a real test here + fixtures :topics + + class LogListener + attr_accessor :calls + + def initialize + @calls = [] + end + + def call(*args) + calls << args + end + end + + def setup + super + @connection = ActiveRecord::Base.connection + @listener = LogListener.new + @pk = Topic.columns.find { |c| c.primary } + ActiveSupport::Notifications.subscribe('sql.active_record', @listener) + end + + def teardown + ActiveSupport::Notifications.unsubscribe(@listener) + end + def test_coerced_binds_are_logged - assert true, 'they are!' + sub = @connection.substitute_at(@pk, 0) + binds = [[@pk, 1]] + sql = "select * from topics where id = #{sub}" + + @connection.exec_query(sql, 'SQL', binds) + + message = @listener.calls.find { |args| args[4][:sql].include? sql } + assert_equal binds, message[4][:binds] end + def test_coerced_binds_are_logged_after_type_cast + sub = @connection.substitute_at(@pk, 0) + binds = [[@pk, "3"]] + sql = "select * from topics where id = #{sub}" -end + @connection.exec_query(sql, 'SQL', binds) + message = @listener.calls.find { |args| args[4][:sql].include? sql } + assert_equal [[@pk, 3]], message[4][:binds] + end +end From 01011a62c34dd768012959daeec9d623537bc69e Mon Sep 17 00:00:00 2001 From: wbond Date: Thu, 15 May 2014 11:23:26 -0400 Subject: [PATCH 03/17] Added the :authors fixture to AdapterTest to fix a failure in test_select_methods_passing_a_association_relation --- test/cases/adapter_test_sqlserver.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/cases/adapter_test_sqlserver.rb b/test/cases/adapter_test_sqlserver.rb index 3a109343d..ba85a141c 100644 --- a/test/cases/adapter_test_sqlserver.rb +++ b/test/cases/adapter_test_sqlserver.rb @@ -812,5 +812,7 @@ class AdapterTest < ActiveRecord::TestCase # This is not run for PostgreSQL at the rails level and the same should happen for SQL Server # Until that patch is made to rails we are preventing this test from running in this gem. include SqlserverCoercedTest + + fixtures :authors end end From c1469b0a87fef36af6deca990f9fd9b7013ce73f Mon Sep 17 00:00:00 2001 From: wbond Date: Thu, 15 May 2014 11:55:48 -0400 Subject: [PATCH 04/17] Type casting is now happening, so the test regex needs to be updated --- test/cases/inheritance_test_sqlserver.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/cases/inheritance_test_sqlserver.rb b/test/cases/inheritance_test_sqlserver.rb index a283c6a50..219af0f17 100644 --- a/test/cases/inheritance_test_sqlserver.rb +++ b/test/cases/inheritance_test_sqlserver.rb @@ -26,7 +26,7 @@ def test_coerced_a_bad_type_column def test_coerced_eager_load_belongs_to_primary_key_quoting con = Account.connection - assert_sql(/\[companies\]\.\[id\] IN \(N''1''\)/) do + assert_sql(/\[companies\]\.\[id\] IN \(1\)/) do Account.includes(:firm).find(1) end end From dbf384b88bf3a383e4cb04a510a810d8ea265218 Mon Sep 17 00:00:00 2001 From: wbond Date: Thu, 15 May 2014 12:49:14 -0400 Subject: [PATCH 05/17] The test test_to_sql_on_eager_join was seeing slightly different result in that the SQL was embedded in a call to sp_executesql, which seems ok to me --- test/cases/relations_test_sqlserver.rb | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/test/cases/relations_test_sqlserver.rb b/test/cases/relations_test_sqlserver.rb index fe6c4558a..33c305bfc 100644 --- a/test/cases/relations_test_sqlserver.rb +++ b/test/cases/relations_test_sqlserver.rb @@ -3,7 +3,10 @@ class RelationTest < ActiveRecord::TestCase - COERCED_TESTS = [:test_merging_reorders_bind_params] + COERCED_TESTS = [ + :test_merging_reorders_bind_params, + :test_to_sql_on_eager_join + ] # Until that patch is made to rails we are preventing this test from running in this gem. include SqlserverCoercedTest fixtures :posts @@ -24,4 +27,12 @@ def test_coerced_merging_reorders_bind_params merged = left.merge(right) assert_equal post, merged.first end -end \ No newline at end of file + + def test_coerced_to_sql_on_eager_join + expected = assert_sql { + Post.eager_load(:last_comment).order('comments.id DESC').to_a + }.first + actual = Post.eager_load(:last_comment).order('comments.id DESC').to_sql + assert_equal expected.include?(actual), true + end +end From 8035c190a1b16963e6cb602c5b5737db0a8712ad Mon Sep 17 00:00:00 2001 From: wbond Date: Thu, 15 May 2014 12:54:18 -0400 Subject: [PATCH 06/17] Rails 4.1 seems to use strings for database config keys nows --- test/cases/resolver_test_sqlserver.rb | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/test/cases/resolver_test_sqlserver.rb b/test/cases/resolver_test_sqlserver.rb index 2f9eabb55..5718a3f11 100644 --- a/test/cases/resolver_test_sqlserver.rb +++ b/test/cases/resolver_test_sqlserver.rb @@ -17,27 +17,27 @@ class ResolverTest < ActiveRecord::TestCase def test_coerced_test_url_host_no_db spec = resolve 'sqlserver://foo?encoding=utf8' assert_equal({ - adapter: "sqlserver", - host: "foo", - encoding: "utf8" }, spec) + "adapter" => "sqlserver", + "host" => "foo", + "encoding" => "utf8" }, spec) end def test_coerced_test_url_host_db spec = resolve 'sqlserver://foo/bar?encoding=utf8' assert_equal({ - adapter: "sqlserver", - database: "bar", - host: "foo", - encoding: "utf8" }, spec) + "adapter" => "sqlserver", + "database" => "bar", + "host" => "foo", + "encoding" => "utf8" }, spec) end def test_coerced_test_url_port spec = resolve 'sqlserver://foo:123?encoding=utf8' assert_equal({ - adapter: "sqlserver", - port: 123, - host: "foo", - encoding: "utf8" }, spec) + "adapter" => "sqlserver", + "port" => 123, + "host" => "foo", + "encoding" => "utf8" }, spec) end end From e439d8385e8421bd9570fc9d47b41a8b9ee2f8d2 Mon Sep 17 00:00:00 2001 From: wbond Date: Thu, 15 May 2014 13:41:42 -0400 Subject: [PATCH 07/17] Fix how we are checking bind tests, can't use coerce since the test methods are defined in an if block --- test/cases/bind_parameter_test_sqlserver.rb | 77 +++++++-------------- 1 file changed, 24 insertions(+), 53 deletions(-) diff --git a/test/cases/bind_parameter_test_sqlserver.rb b/test/cases/bind_parameter_test_sqlserver.rb index 4a3c9b0e1..4a033e715 100644 --- a/test/cases/bind_parameter_test_sqlserver.rb +++ b/test/cases/bind_parameter_test_sqlserver.rb @@ -1,62 +1,33 @@ require 'cases/sqlserver_helper' require 'models/topic' require 'models_sqlserver/topic' - -class BindParameterTestSqlServer < ActiveRecord::TestCase - - COERCED_TESTS = [ - :test_binds_are_logged, - :test_binds_are_logged_after_type_cast - ] - - include SqlserverCoercedTest - - fixtures :topics - - class LogListener - attr_accessor :calls - - def initialize - @calls = [] +require 'cases/bind_parameter_test' + +# We don't coerce here because these tests are located inside of an if block +# and don't seem to be able to be properly overriden with the coerce +# functionality +module ActiveRecord + class BindParameterTest + def test_binds_are_logged + sub = @connection.substitute_at(@pk, 0) + binds = [[@pk, 1]] + sql = "select * from topics where id = #{sub}" + + @connection.exec_query(sql, 'SQL', binds) + + message = @listener.calls.find { |args| args[4][:sql].include? sql } + assert_equal binds, message[4][:binds] end - def call(*args) - calls << args - end - end + def test_binds_are_logged_after_type_cast + sub = @connection.substitute_at(@pk, 0) + binds = [[@pk, "3"]] + sql = "select * from topics where id = #{sub}" - def setup - super - @connection = ActiveRecord::Base.connection - @listener = LogListener.new - @pk = Topic.columns.find { |c| c.primary } - ActiveSupport::Notifications.subscribe('sql.active_record', @listener) - end + @connection.exec_query(sql, 'SQL', binds) - def teardown - ActiveSupport::Notifications.unsubscribe(@listener) - end - - def test_coerced_binds_are_logged - sub = @connection.substitute_at(@pk, 0) - binds = [[@pk, 1]] - sql = "select * from topics where id = #{sub}" - - @connection.exec_query(sql, 'SQL', binds) - - message = @listener.calls.find { |args| args[4][:sql].include? sql } - assert_equal binds, message[4][:binds] - end - - def test_coerced_binds_are_logged_after_type_cast - sub = @connection.substitute_at(@pk, 0) - binds = [[@pk, "3"]] - sql = "select * from topics where id = #{sub}" - - @connection.exec_query(sql, 'SQL', binds) - - message = @listener.calls.find { |args| args[4][:sql].include? sql } - assert_equal [[@pk, 3]], message[4][:binds] + message = @listener.calls.find { |args| args[4][:sql].include? sql } + assert_equal [[@pk, 3]], message[4][:binds] + end end - end From a451b28bc1c2ded9a780254e9827e222e0df5524 Mon Sep 17 00:00:00 2001 From: wbond Date: Thu, 15 May 2014 14:18:39 -0400 Subject: [PATCH 08/17] Fixed tests in rails/activerecord/test/cases/connection_adapters/connection_handler_test.rb by setting the RAILS_ENV to 'default_env' --- Rakefile | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Rakefile b/Rakefile index 7edb4253c..c750dec89 100644 --- a/Rakefile +++ b/Rakefile @@ -6,6 +6,11 @@ AREL_PATH = Gem.loaded_specs['arel'].full_gem_path # Notes for cross compile: # $ gcla ; bundle install ; rake compile ; rake cross compile ; rake cross native gem +# Since the Gemfile for this project requires, rails, it ends up causing +# Rails.env to be defined, which affects some of the unit tests. We fix this +# by setting the RAILS_ENV to "default_env" +ENV['RAILS_ENV'] = 'default_env' + def test_libs ['lib', 'test', From efbead12684e8bca119858b09813649c31a086a3 Mon Sep 17 00:00:00 2001 From: wbond Date: Thu, 15 May 2014 14:37:58 -0400 Subject: [PATCH 09/17] Unescape quotes from default values --- .../connection_adapters/sqlserver/schema_statements.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/active_record/connection_adapters/sqlserver/schema_statements.rb b/lib/active_record/connection_adapters/sqlserver/schema_statements.rb index baad33152..b0a19f95b 100644 --- a/lib/active_record/connection_adapters/sqlserver/schema_statements.rb +++ b/lib/active_record/connection_adapters/sqlserver/schema_statements.rb @@ -256,7 +256,7 @@ def column_definitions(table_name) nil else match_data = ci[:default_value].match(/\A\(+N?'?(.*?)'?\)+\Z/m) - match_data ? match_data[1] : nil + match_data ? match_data[1].gsub("''", "'") : nil end ci[:null] = ci[:is_nullable].to_i == 1 ci.delete(:is_nullable) From be71de1908592f8f189497258225e1870a2797bc Mon Sep 17 00:00:00 2001 From: wbond Date: Thu, 15 May 2014 16:11:19 -0400 Subject: [PATCH 10/17] Added support for create_table :as, which fixes tests MigrationTest#test_create_table_with_query and MigrationTest#test_create_table_with_query_from_relation --- .../sqlserver/schema_creation.rb | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/lib/active_record/connection_adapters/sqlserver/schema_creation.rb b/lib/active_record/connection_adapters/sqlserver/schema_creation.rb index c30ff063b..1e97cf69e 100644 --- a/lib/active_record/connection_adapters/sqlserver/schema_creation.rb +++ b/lib/active_record/connection_adapters/sqlserver/schema_creation.rb @@ -22,6 +22,34 @@ def add_column_options!(sql, options) super end end + + def visit_TableDefinition(o) + quoted_name = "#{quote_table_name((o.temporary ? '#' : '') + o.name.to_s)} " + + if o.as + if o.as.is_a?(ActiveRecord::Relation) + select = o.as.to_sql + elsif o.as.is_a?(String) + select = o.as + else + raise "Only able to generate a table from a SELECT statement passed as a String or ActiveRecord::Relation" + end + + create_sql = 'SELECT * INTO ' + create_sql << quoted_name + create_sql << 'FROM (' + create_sql << select + create_sql << ') AS __sq' + + else + create_sql = "CREATE TABLE " + create_sql << quoted_name + create_sql << "(#{o.columns.map { |c| accept c }.join(', ')}) " + create_sql << "#{o.options}" + end + + create_sql + end end end end From c1e1db14d6458db3f98f1bedf522c38ba551ed96 Mon Sep 17 00:00:00 2001 From: wbond Date: Thu, 15 May 2014 16:27:59 -0400 Subject: [PATCH 11/17] Clear the schema cache for a table after creating it to prevent a cached negative response - fixes test ActiveRecord::Migration::ChangeSchemaTest#test_change_column_null --- .../connection_adapters/sqlserver/schema_statements.rb | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lib/active_record/connection_adapters/sqlserver/schema_statements.rb b/lib/active_record/connection_adapters/sqlserver/schema_statements.rb index b0a19f95b..6a8863bfc 100644 --- a/lib/active_record/connection_adapters/sqlserver/schema_statements.rb +++ b/lib/active_record/connection_adapters/sqlserver/schema_statements.rb @@ -16,6 +16,12 @@ def table_exists?(table_name) super || tables.include?(unquoted_table_name) || views.include?(unquoted_table_name) end + def create_table(table_name, options = {}) + res = super + schema_cache.clear_table_cache!(table_name) + res + end + def indexes(table_name, name = nil) data = select("EXEC sp_helpindex #{quote(table_name)}", name) rescue [] data.reduce([]) do |indexes, index| From a9b715a16792bdf053e821bfdb8682bbb430e4c7 Mon Sep 17 00:00:00 2001 From: wbond Date: Fri, 16 May 2014 10:58:09 -0400 Subject: [PATCH 12/17] PersistencesTest was renamed to PersistenceTest in rails 4.1, so we have to do it in our codebase also --- test/cases/persistence_test_sqlserver.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/cases/persistence_test_sqlserver.rb b/test/cases/persistence_test_sqlserver.rb index 510c9949b..42b5d7aef 100644 --- a/test/cases/persistence_test_sqlserver.rb +++ b/test/cases/persistence_test_sqlserver.rb @@ -16,10 +16,10 @@ require 'models_sqlserver/topic' require 'rexml/document' -class PersistencesTestSqlserver < ActiveRecord::TestCase +class PersistenceTestSqlserver < ActiveRecord::TestCase end -class PersistencesTest < ActiveRecord::TestCase +class PersistenceTest < ActiveRecord::TestCase fixtures :topics, :companies, :developers, :projects, :computers, :accounts, :minimalistics, 'warehouse-things', :authors, :categorizations, :categories, :posts, :minivans From 2f509a6715302d9b0b1f604b95427519ea139e9f Mon Sep 17 00:00:00 2001 From: wbond Date: Fri, 16 May 2014 11:38:54 -0400 Subject: [PATCH 13/17] Use Arel::Nodes::BindParam instead of Arel.sql for substitute_at so that ActiveRecord::Relation merging works properly - tests RelationMergingTest#test_merging_reorders_bind_params and RelationMergingTest#test_relation_to_sql --- lib/active_record/connection_adapters/sqlserver/quoting.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/active_record/connection_adapters/sqlserver/quoting.rb b/lib/active_record/connection_adapters/sqlserver/quoting.rb index bac830173..609a71b95 100644 --- a/lib/active_record/connection_adapters/sqlserver/quoting.rb +++ b/lib/active_record/connection_adapters/sqlserver/quoting.rb @@ -67,7 +67,7 @@ def substitute_at(column, index) if column.respond_to?(:sql_type) && column.sql_type == 'timestamp' nil else - Arel.sql "@#{index}" + Arel::Nodes::BindParam.new "@#{index}" end end From fa2443ef7ef0e2abec0a577d69b1fcfd00ae208b Mon Sep 17 00:00:00 2001 From: wbond Date: Fri, 16 May 2014 12:03:32 -0400 Subject: [PATCH 14/17] Coerced test for ActiveRecord::PredicateBuilderTest#test_registering_new_handlers since the regex doesn't work for T-SQL --- .../cases/predicate_builder_test_sqlserver.rb | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 test/cases/predicate_builder_test_sqlserver.rb diff --git a/test/cases/predicate_builder_test_sqlserver.rb b/test/cases/predicate_builder_test_sqlserver.rb new file mode 100644 index 000000000..1524f6aa8 --- /dev/null +++ b/test/cases/predicate_builder_test_sqlserver.rb @@ -0,0 +1,20 @@ +require 'cases/sqlserver_helper' +require 'models/topic' +require 'models_sqlserver/topic' + +module ActiveRecord + class PredicateBuilderTest < ActiveRecord::TestCase + + COERCED_TESTS = [:test_registering_new_handlers] + + include SqlserverCoercedTest + + def test_coerced_registering_new_handlers + ActiveRecord::PredicateBuilder.register_handler(Regexp, proc do |column, value| + Arel::Nodes::InfixOperation.new('~', column, value.source) + end) + + assert_match %r{\[topics\].\[title\] ~ N'rails'}i, Topic.where(title: /rails/).to_sql + end + end +end From f41742103c3705ad4d340b3f90fe53dc66679fc0 Mon Sep 17 00:00:00 2001 From: wbond Date: Fri, 16 May 2014 13:26:17 -0400 Subject: [PATCH 15/17] Fixed test NamedScopingTest#test_scopes_honor_current_scopes_from_when_defined by adding a second column to the ORDER BY condition of the :ranked_by_comments scope of the Post model --- test/cases/named_scoping_test_sqlserver.rb | 6 ++++++ test/models_sqlserver/post.rb | 3 +++ 2 files changed, 9 insertions(+) create mode 100644 test/cases/named_scoping_test_sqlserver.rb create mode 100644 test/models_sqlserver/post.rb diff --git a/test/cases/named_scoping_test_sqlserver.rb b/test/cases/named_scoping_test_sqlserver.rb new file mode 100644 index 000000000..398c51109 --- /dev/null +++ b/test/cases/named_scoping_test_sqlserver.rb @@ -0,0 +1,6 @@ +require 'cases/sqlserver_helper' +require 'models/post' +require 'models_sqlserver/post' + +# This file is really just to ensure we fix the order by on the +# :ranked_by_comments scope of Post diff --git a/test/models_sqlserver/post.rb b/test/models_sqlserver/post.rb new file mode 100644 index 000000000..ba846ea4a --- /dev/null +++ b/test/models_sqlserver/post.rb @@ -0,0 +1,3 @@ +class Post < ActiveRecord::Base + scope :ranked_by_comments, -> { order("comments_count DESC, id ASC") } +end From 0b638b7d843857e824ce09068a85fbb2393154e3 Mon Sep 17 00:00:00 2001 From: wbond Date: Fri, 16 May 2014 13:58:48 -0400 Subject: [PATCH 16/17] Added savepoint name param to create_savepoint, release_savepoint and rollback_to_savepoint --- .../sqlserver/database_statements.rb | 10 +++++----- test/cases/transaction_test_sqlserver.rb | 16 ++++++++++++++++ 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/lib/active_record/connection_adapters/sqlserver/database_statements.rb b/lib/active_record/connection_adapters/sqlserver/database_statements.rb index 142174c5d..4bd36bd20 100644 --- a/lib/active_record/connection_adapters/sqlserver/database_statements.rb +++ b/lib/active_record/connection_adapters/sqlserver/database_statements.rb @@ -56,15 +56,15 @@ def rollback_db_transaction do_execute 'IF @@TRANCOUNT > 0 ROLLBACK TRANSACTION' end - def create_savepoint - disable_auto_reconnect { do_execute "SAVE TRANSACTION #{current_savepoint_name}" } + def create_savepoint(name = current_savepoint_name) + disable_auto_reconnect { do_execute "SAVE TRANSACTION #{name}" } end - def release_savepoint + def release_savepoint(name = current_savepoint_name) end - def rollback_to_savepoint - disable_auto_reconnect { do_execute "ROLLBACK TRANSACTION #{current_savepoint_name}" } + def rollback_to_savepoint(name = current_savepoint_name) + disable_auto_reconnect { do_execute "ROLLBACK TRANSACTION #{name}" } end def add_limit_offset!(_sql, _options) diff --git a/test/cases/transaction_test_sqlserver.rb b/test/cases/transaction_test_sqlserver.rb index 36976b287..a78bfd2ce 100644 --- a/test/cases/transaction_test_sqlserver.rb +++ b/test/cases/transaction_test_sqlserver.rb @@ -46,3 +46,19 @@ def assert_no_ships end +class TransactionTest < ActiveRecord::TestCase + include SqlserverCoercedTest + + COERCED_TESTS = [:test_releasing_named_savepoints] + + def test_coerced_releasing_named_savepoints + Topic.transaction do + Topic.connection.create_savepoint("another") + Topic.connection.release_savepoint("another") + + # The origin rails test tries to re-release the savepoint, but + # since sqlserver doesn't have the concept of releasing, it doesn't + # fail, so we just omit that part here + end + end +end From d1760460f8b7f0932b674243cecef907d0252847 Mon Sep 17 00:00:00 2001 From: wbond Date: Fri, 16 May 2014 14:59:16 -0400 Subject: [PATCH 17/17] Updated UUID enhancements to work with rails 4.1 API --- .../connection_adapters/sqlserver/schema_statements.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/active_record/connection_adapters/sqlserver/schema_statements.rb b/lib/active_record/connection_adapters/sqlserver/schema_statements.rb index 6a8863bfc..fd2c7bc21 100644 --- a/lib/active_record/connection_adapters/sqlserver/schema_statements.rb +++ b/lib/active_record/connection_adapters/sqlserver/schema_statements.rb @@ -414,8 +414,8 @@ def identity_column(table_name) private - def create_table_definition(name, temporary, options) - TableDefinition.new native_database_types, name, temporary, options + def create_table_definition(name, temporary, options, as = nil) + TableDefinition.new native_database_types, name, temporary, options, as end end end