Skip to content

Commit 3e82571

Browse files
committed
Final clean up and testing of all the insert sql helpers along with #get_table_name.
1 parent 629cddd commit 3e82571

File tree

2 files changed

+47
-13
lines changed

2 files changed

+47
-13
lines changed

lib/active_record/connection_adapters/sqlserver_adapter.rb

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -411,7 +411,7 @@ def select_rows(sql, name = nil)
411411
end
412412

413413
def execute(sql, name = nil)
414-
if sql =~ /^\s*INSERT/i && (table_name = query_requires_identity_insert?(sql))
414+
if table_name = query_requires_identity_insert?(sql)
415415
log(sql, name) do
416416
with_identity_insert_enabled(table_name) do
417417
@connection.execute(sql) do |handle|
@@ -862,17 +862,24 @@ def set_identity_insert(table_name, enable = true)
862862
end
863863

864864
def query_requires_identity_insert?(sql)
865-
table_name = get_table_name(sql)
866-
id_column = identity_column(table_name)
867-
sql =~ /INSERT[^(]+\([^)]*\[#{id_column}\][^)]*\)/ ? table_name : nil
865+
if insert_sql?(sql)
866+
table_name = get_table_name(sql)
867+
id_column = identity_column(table_name)
868+
id_column && sql =~ /INSERT[^(]+\([^)]*\[#{id_column.name}\][^)]*\)/ ? table_name : false
869+
else
870+
false
871+
end
868872
end
869873

870874
def identity_column(table_name)
871-
idcol = columns(table_name).detect(&:is_identity?)
872-
idcol ? idcol.name : nil
875+
columns(table_name).detect(&:is_identity?)
873876
end
874877

875-
# SQL UTILITY METHODS ======================================#
878+
# HELPER METHODS ===========================================#
879+
880+
def insert_sql?(sql)
881+
!(sql =~ /^\s*INSERT/i).nil?
882+
end
876883

877884
def unqualify_table_name(table_name)
878885
table_name.to_s.split('.').last.gsub(/[\[\]]/,'')

test/cases/adapter_test_sqlserver.rb

Lines changed: 33 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,16 @@
11
require 'cases/sqlserver_helper'
22
require 'models/task'
33
require 'models/topic'
4+
require 'models/joke'
5+
require 'models/subscriber'
46

57
class AdapterTestSqlserver < ActiveRecord::TestCase
68

79
def setup
810
@connection = ActiveRecord::Base.connection
11+
@basic_insert_sql = "INSERT INTO [funny_jokes] ([name]) VALUES('Knock knock')"
12+
@basic_update_sql = "UPDATE [customers] SET [address_street] = NULL WHERE [id] = 2"
13+
@basic_select_sql = "SELECT * FROM [customers] WHERE ([customers].[id] = 1)"
914
end
1015

1116
context 'For abstract behavior' do
@@ -87,6 +92,22 @@ def setup
8792

8893
end
8994

95+
should 'return true to #insert_sql? for inserts only' do
96+
assert @connection.send(:insert_sql?,'INSERT...')
97+
assert !@connection.send(:insert_sql?,'UPDATE...')
98+
assert !@connection.send(:insert_sql?,'SELECT...')
99+
end
100+
101+
context 'for #get_table_name' do
102+
103+
should 'return quoted table name from basic INSERT, UPDATE and SELECT statements' do
104+
assert_equal '[funny_jokes]', @connection.send(:get_table_name,@basic_insert_sql)
105+
assert_equal '[customers]', @connection.send(:get_table_name,@basic_update_sql)
106+
assert_equal '[customers]', @connection.send(:get_table_name,@basic_select_sql)
107+
end
108+
109+
end
110+
90111
end
91112

92113
context 'For identity inserts' do
@@ -95,19 +116,25 @@ def setup
95116
@identity_insert_sql = "INSERT INTO [funny_jokes] ([id],[name]) VALUES(420,'Knock knock')"
96117
end
97118

98-
should 'return true to #query_requires_identity_insert? when INSERT sql contains id_column ' do
99-
assert @connection.send(:query_requires_identity_insert?,@identity_insert_sql)
119+
should 'return quoted table_name to #query_requires_identity_insert? when INSERT sql contains id_column' do
120+
assert_equal '[funny_jokes]', @connection.send(:query_requires_identity_insert?,@identity_insert_sql)
100121
end
101122

102123
should 'return false to #query_requires_identity_insert? for normal SQL' do
103-
insert_sql = "INSERT INTO [funny_jokes] ([name]) VALUES('Knock knock')"
104-
update_sql = "UPDATE [customers] SET [address_street] = NULL WHERE [id] = 2"
105-
select_sql = "SELECT * FROM [customers] WHERE ([customers].[id] = 1)"
106-
[insert_sql,update_sql,select_sql].each do |sql|
124+
[@basic_insert_sql, @basic_update_sql, @basic_select_sql].each do |sql|
107125
assert !@connection.send(:query_requires_identity_insert?,sql), "SQL was #{sql}"
108126
end
109127
end
110128

129+
should 'find identity column using #identity_column' do
130+
joke_id_column = Joke.columns.detect { |c| c.name == 'id' }
131+
assert_equal joke_id_column, @connection.send(:identity_column,Joke.table_name)
132+
end
133+
134+
should 'return nil when calling #identity_column for a table_name with no identity' do
135+
assert_nil @connection.send(:identity_column,Subscriber.table_name)
136+
end
137+
111138
end
112139

113140
context 'For Quoting' do

0 commit comments

Comments
 (0)