Skip to content

Commit 364817b

Browse files
committed
Passing tests for 3.1.0.rc6.
1 parent 74219af commit 364817b

File tree

11 files changed

+78
-27
lines changed

11 files changed

+78
-27
lines changed

RUNNING_UNIT_TESTS

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,11 @@ variable.
9393

9494
= Current Expected Failures
9595

96-
* Misc Date/Time object instance matches when using ODBC mode.
96+
Note that there are a few tests that we just did not even try to pass and hence coerced
97+
into passing. The biggest are a collection found in our relations_test_sqlserver.rb file.
98+
If you run into problems and think you can make the Arel visitor pass these test, patches
99+
are very much welcome.
100+
101+
* Misc Date/Time object instance matches when using ODBC mode.
97102

98103

activerecord-sqlserver-adapter.gemspec

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
Gem::Specification.new do |s|
33
s.platform = Gem::Platform::RUBY
44
s.name = "activerecord-sqlserver-adapter"
5-
s.version = "3.1.0.rc5"
5+
s.version = "3.1.0.rc6"
66
s.summary = "SQL Server 2005 and 2008 Adapter For ActiveRecord."
77
s.description = "SQL Server 2005 and 2008 Adapter For ActiveRecord"
88

@@ -16,6 +16,6 @@ Gem::Specification.new do |s|
1616
s.rdoc_options.concat ['--main', 'README.rdoc']
1717
s.rubyforge_project = 'activerecord-sqlserver-adapter'
1818

19-
s.add_dependency('activerecord', '~> 3.1.0.rc5')
19+
s.add_dependency('activerecord', '~> 3.1.0.rc6')
2020
end
2121

lib/active_record/connection_adapters/sqlserver/quoting.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ def quote_string(string)
3838

3939
def quote_column_name(name)
4040
@sqlserver_quoted_column_and_table_names[name] ||=
41-
name.to_s.split('.').map{ |n| n =~ /^\[.*\]$/ ? n : "[#{n}]" }.join('.')
41+
name.to_s.split('.').map{ |n| n =~ /^\[.*\]$/ ? n : "[#{n.to_s.gsub(']', ']]')}]" }.join('.')
4242
end
4343

4444
def quote_table_name(name)

lib/active_record/connection_adapters/sqlserver_adapter.rb

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ class SQLServerAdapter < AbstractAdapter
159159
include Sqlserver::Errors
160160

161161
ADAPTER_NAME = 'SQLServer'.freeze
162-
VERSION = '3.1.0.rc5'.freeze
162+
VERSION = '3.1.0.rc6'.freeze
163163
DATABASE_VERSION_REGEXP = /Microsoft SQL Server\s+"?(\d{4}|\w+)"?/
164164
SUPPORTED_VERSIONS = [2005,2008,2010,2011].freeze
165165

@@ -171,6 +171,13 @@ class SQLServerAdapter < AbstractAdapter
171171

172172
self.enable_default_unicode_types = true
173173

174+
class << self
175+
176+
def visitor_for(pool)
177+
Arel::Visitors::SQLServer.new(pool)
178+
end
179+
180+
end
174181

175182
def initialize(logger,config)
176183
@connection_options = config

lib/arel/visitors/sqlserver.rb

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,16 @@ def eql?(other)
2121
end
2222

2323
class SelectManager < Arel::TreeManager
24-
24+
25+
AR_CA_SQLSA_NAME = 'ActiveRecord::ConnectionAdapters::SQLServerAdapter'.freeze
26+
2527
# Getting real Ordering objects is very important for us. We need to be able to call #uniq on
2628
# a colleciton of them reliably as well as using their true object attributes to mutate them
2729
# to grouping objects for the inner sql during a select statment with an offset/rownumber. So this
2830
# is here till ActiveRecord & ARel does this for us instead of using SqlLiteral objects.
2931
alias :order_without_sqlserver :order
3032
def order(*expr)
31-
return order_without_sqlserver(*expr) unless Arel::Visitors::SQLServer === @visitor
33+
return order_without_sqlserver(*expr) unless engine_activerecord_sqlserver_adapter?
3234
@ast.orders.concat(expr.map{ |x|
3335
case x
3436
when Arel::Attributes::Attribute
@@ -55,7 +57,7 @@ def order(*expr)
5557
# custom string hints down. See the visit_Arel_Nodes_LockWithSQLServer delegation method.
5658
alias :lock_without_sqlserver :lock
5759
def lock(locking=true)
58-
if Arel::Visitors::SQLServer === @visitor
60+
if engine_activerecord_sqlserver_adapter?
5961
case locking
6062
when true
6163
locking = Arel.sql('WITH(HOLDLOCK, ROWLOCK)')
@@ -69,7 +71,13 @@ def lock(locking=true)
6971
lock_without_sqlserver(locking)
7072
end
7173
end
72-
74+
75+
private
76+
77+
def engine_activerecord_sqlserver_adapter?
78+
@engine.connection && @engine.connection.class.name == AR_CA_SQLSA_NAME
79+
end
80+
7381
end
7482

7583
module Visitors
@@ -117,7 +125,7 @@ def visit_Arel_Nodes_Ordering(o)
117125
end
118126

119127
def visit_Arel_Nodes_Bin(o)
120-
"#{visit o.expr} #{@engine.connection.cs_equality_operator}"
128+
"#{visit o.expr} #{@connection.cs_equality_operator}"
121129
end
122130

123131
# SQLServer ToSql/Visitor (Additions)
@@ -189,7 +197,7 @@ def visit_Arel_Nodes_SelectStatementForComplexCount(o)
189197

190198
def source_with_lock_for_select_statement(o)
191199
core = o.cores.first
192-
source = visit(core.source).strip if core.source
200+
source = "FROM #{visit(core.source).strip}" if core.source
193201
if source && o.lock
194202
lock = visit o.lock
195203
index = source.match(/FROM [\w\[\]\.]+/)[0].length
@@ -272,6 +280,14 @@ def complex_count_sql?(o)
272280
o.limit &&
273281
!join_in_select_statement?(o)
274282
end
283+
284+
def select_primary_key_sql?(o)
285+
core = o.cores.first
286+
return false if core.projections.size != 1
287+
p = core.projections.first
288+
t = table_from_select_statement(o)
289+
Arel::Attributes::Attribute === p && t.primary_key && t.primary_key.name == p.name
290+
end
275291

276292
def find_and_fix_uncorrelated_joins_in_select_statement(o)
277293
core = o.cores.first
@@ -315,6 +331,8 @@ def rowtable_projections(o)
315331
end
316332
elsif function_select_statement?(o)
317333
[Arel.star]
334+
elsif select_primary_key_sql?(o)
335+
[Arel.sql("[__rnt].#{quote_column_name(core.projections.first.name)}")]
318336
else
319337
core.projections.map do |x|
320338
if x.respond_to?(:relation)

test/cases/base_test_sqlserver.rb

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
require 'cases/sqlserver_helper'
2+
3+
class BasicsTest < ActiveRecord::TestCase
4+
5+
COERCED_TESTS = [:test_column_names_are_escaped]
6+
7+
include SqlserverCoercedTest
8+
9+
def test_coerced_column_names_are_escaped
10+
assert_equal "[foo]]bar]", ActiveRecord::Base.connection.quote_column_name("foo]bar")
11+
end
12+
13+
end
14+

test/cases/column_test_sqlserver.rb

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
require 'cases/sqlserver_helper'
22
require 'models/binary'
33

4-
class SqlServerEdgeSchema < ActiveRecord::Base; end;
5-
64
class ColumnTestSqlserver < ActiveRecord::TestCase
75

86
def setup

test/cases/relations_test_sqlserver.rb

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,7 @@ class RelationTest < ActiveRecord::TestCase
2727
COERCED_TESTS = [
2828
:test_finding_with_cross_table_order_and_limit,
2929
:test_finding_with_complex_order_and_limit,
30-
:test_finding_with_complex_order,
31-
:test_count_explicit_columns
30+
:test_finding_with_complex_order
3231
]
3332

3433
include SqlserverCoercedTest

test/cases/specific_schema_test_sqlserver.rb

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,5 @@
11
require 'cases/sqlserver_helper'
22

3-
class NoPkData < ActiveRecord::Base ; self.table_name = 'no_pk_data' ; end
4-
class StringDefault < ActiveRecord::Base; end;
5-
class SqlServerEdgeSchema < ActiveRecord::Base; end;
6-
class SqlServerEdgeSchema < ActiveRecord::Base
7-
attr_accessor :new_id_setting
8-
before_create :set_new_id
9-
protected
10-
def set_new_id
11-
self[:guid_newid] ||= connection.newid_function if new_id_setting
12-
end
13-
end
14-
153
class SpecificSchemaTestSqlserver < ActiveRecord::TestCase
164

175
should 'be able to complex count tables with no primary key' do
@@ -59,6 +47,17 @@ class SpecificSchemaTestSqlserver < ActiveRecord::TestCase
5947
@edge_class = SqlServerEdgeSchema
6048
end
6149

50+
context 'With special quoted column' do
51+
52+
should 'work as normal' do
53+
@edge_class.delete_all
54+
r = @edge_class.create! 'crazy]]quote' => 'crazyqoute'
55+
assert @edge_class.columns_hash['crazy]]quote']
56+
assert_equal r, @edge_class.first(:conditions => {'crazy]]quote' => 'crazyqoute'})
57+
end
58+
59+
end
60+
6261
context 'with description column' do
6362

6463
setup do

test/cases/sqlserver_helper.rb

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,16 @@ class SqlServerQuotedView1 < ActiveRecord::Base ; self.table_name = 'quoted-view
4242
class SqlServerQuotedView2 < ActiveRecord::Base ; self.table_name = 'quoted-view2' ; end
4343
class SqlServerUnicode < ActiveRecord::Base ; end
4444
class SqlServerString < ActiveRecord::Base ; end
45+
class NoPkData < ActiveRecord::Base ; self.table_name = 'no_pk_data' ; end
46+
class StringDefault < ActiveRecord::Base; end
47+
class SqlServerEdgeSchema < ActiveRecord::Base
48+
attr_accessor :new_id_setting
49+
before_create :set_new_id
50+
protected
51+
def set_new_id
52+
self[:guid_newid] ||= connection.newid_function if new_id_setting
53+
end
54+
end
4555
class SqlServerChronic < ActiveRecord::Base
4656
coerce_sqlserver_date :date
4757
coerce_sqlserver_time :time

0 commit comments

Comments
 (0)