Skip to content

Commit 116be8a

Browse files
committed
Perf w/inserts. Check binds & use schema cache. Fixes #572. Thanks @noelr.
1 parent 388cdf7 commit 116be8a

File tree

4 files changed

+33
-23
lines changed

4 files changed

+33
-23
lines changed

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
## v5.0.6
22

3+
#### Fixed
4+
5+
* Performance w/inserts. Check binds & use schema cache for id inserts.
6+
Fixes #572. Thanks @noelr.
7+
38
#### Changed
49

510
* Misc index enhancements or testing. Fixes #570

lib/active_record/connection_adapters/sqlserver/database_statements.rb

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ def exec_query(sql, name = 'SQL', binds = [], prepare: false)
2020
end
2121

2222
def exec_insert(sql, name, binds, pk = nil, _sequence_name = nil)
23-
if pk && id_insert_table_name = query_requires_identity_insert?(sql)
23+
if id_insert_table_name = exec_insert_requires_identity?(sql, pk, binds)
2424
with_identity_insert_enabled(id_insert_table_name) { exec_query(sql, name, binds) }
2525
else
2626
exec_query(sql, name, binds)
@@ -281,6 +281,30 @@ def raw_connection_do(sql)
281281
@update_sql = false
282282
end
283283

284+
# === SQLServer Specific (Identity Inserts) ===================== #
285+
286+
def exec_insert_requires_identity?(sql, pk, binds)
287+
query_requires_identity_insert?(sql) if pk && binds.map(&:name).include?(pk)
288+
end
289+
290+
def query_requires_identity_insert?(sql)
291+
if insert_sql?(sql)
292+
table_name = get_table_name(sql)
293+
id_column = identity_columns(table_name).first
294+
id_column && sql =~ /^\s*(INSERT|EXEC sp_executesql N'INSERT)[^(]+\([^)]*\b(#{id_column.name})\b,?[^)]*\)/i ? quote_table_name(table_name) : false
295+
else
296+
false
297+
end
298+
end
299+
300+
def insert_sql?(sql)
301+
!(sql =~ /^\s*(INSERT|EXEC sp_executesql N'INSERT)/i).nil?
302+
end
303+
304+
def identity_columns(table_name)
305+
schema_cache.columns(table_name).select(&:is_identity?)
306+
end
307+
284308
# === SQLServer Specific (Selecting) ============================ #
285309

286310
def raw_select(sql, name = 'SQL', binds = [], options = {})

lib/active_record/connection_adapters/sqlserver/schema_statements.rb

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -497,27 +497,6 @@ def views_real_column_name(table_name, column_name)
497497
match_data ? match_data[1] : column_name
498498
end
499499

500-
# === SQLServer Specific (Identity Inserts) ===================== #
501-
502-
def query_requires_identity_insert?(sql)
503-
if insert_sql?(sql)
504-
table_name = get_table_name(sql)
505-
id_column = identity_columns(table_name).first
506-
id_column && sql =~ /^\s*(INSERT|EXEC sp_executesql N'INSERT)[^(]+\([^)]*\b(#{id_column.name})\b,?[^)]*\)/i ? quote_table_name(table_name) : false
507-
else
508-
false
509-
end
510-
end
511-
512-
def insert_sql?(sql)
513-
!(sql =~ /^\s*(INSERT|EXEC sp_executesql N'INSERT)/i).nil?
514-
end
515-
516-
def identity_columns(table_name)
517-
columns(table_name).select(&:is_identity?)
518-
end
519-
520-
521500
private
522501

523502
def create_table_definition(*args)
Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
require 'cases/helper_sqlserver'
2+
require 'models/book'
23

34
class ScratchpadTestSQLServer < ActiveRecord::TestCase
45

56
it 'helps debug things' do
6-
#
7+
$FOO = true
8+
1000.times { Book.create! name: 'test' }
79
end
810

911
end

0 commit comments

Comments
 (0)