Skip to content

Commit 521d480

Browse files
committed
Limit fixture insert to 1000 rows
SQL Server has a limit of 1000 rows per insert statement. ActiveRecord does not expose a configuration so adapters can set this limit by themselves. This change creates a new config entry and apply the limit fixtures creation.
1 parent 702ac53 commit 521d480

File tree

2 files changed

+27
-0
lines changed

2 files changed

+27
-0
lines changed

lib/active_record/connection_adapters/sqlserver/database_limits.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,10 @@ def joins_per_query
5050
def bind_params_length
5151
2_098
5252
end
53+
54+
def insert_rows_length
55+
1_000
56+
end
5357
end
5458
end
5559
end

lib/active_record/connection_adapters/sqlserver/database_statements.rb

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,29 @@ def case_sensitive_comparison(table, attribute, column, value)
7979
end
8080
end
8181

82+
# We should propose this change to Rails team
83+
def insert_fixtures_set(fixture_set, tables_to_delete = [])
84+
fixture_inserts = []
85+
86+
fixture_set.each do |table_name, fixtures|
87+
fixtures.each_slice(insert_rows_length) do |batch|
88+
fixture_inserts << build_fixture_sql(batch, table_name)
89+
end
90+
end
91+
92+
table_deletes = tables_to_delete.map { |table| "DELETE FROM #{quote_table_name table}".dup }
93+
total_sql = Array.wrap(combine_multi_statements(table_deletes + fixture_inserts))
94+
95+
disable_referential_integrity do
96+
transaction(requires_new: true) do
97+
total_sql.each do |sql|
98+
execute sql, "Fixtures Load"
99+
yield if block_given?
100+
end
101+
end
102+
end
103+
end
104+
82105
def can_perform_case_insensitive_comparison_for?(column)
83106
column.type == :string && (!column.collation || column.case_sensitive?)
84107
end

0 commit comments

Comments
 (0)