Skip to content

Commit b382f00

Browse files
authored
Fix for inserting records into non-dbo schema table (#1049)
1 parent 79919a0 commit b382f00

File tree

6 files changed

+30
-9
lines changed

6 files changed

+30
-9
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
## Unreleased
2+
3+
- [#1049](https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/pull/1049) Fix for inserting records into non-dbo schema table.
4+
15
## v7.0.1.0
26

37
[Full changelog](https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/compare/v7.0.0.0...v7.0.1.0)

lib/active_record/connection_adapters/sqlserver/database_statements.rb

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -397,14 +397,12 @@ def exec_insert_requires_identity?(sql, pk, binds)
397397
end
398398

399399
def query_requires_identity_insert?(sql)
400-
if insert_sql?(sql)
401-
table_name = get_table_name(sql)
402-
id_column = identity_columns(table_name).first
403-
# id_column && sql =~ /^\s*(INSERT|EXEC sp_executesql N'INSERT)[^(]+\([^)]*\b(#{id_column.name})\b,?[^)]*\)/i ? quote_table_name(table_name) : false
404-
id_column && sql =~ /^\s*(INSERT|EXEC sp_executesql N'INSERT)[^(]+\([^)]*\b(#{id_column.name})\b,?[^)]*\)/i ? table_name : false
405-
else
406-
false
407-
end
400+
return false unless insert_sql?(sql)
401+
402+
raw_table_name = get_raw_table_name(sql)
403+
id_column = identity_columns(raw_table_name).first
404+
405+
id_column && sql =~ /^\s*(INSERT|EXEC sp_executesql N'INSERT)[^(]+\([^)]*\b(#{id_column.name})\b,?[^)]*\)/i ? SQLServer::Utils.extract_identifiers(raw_table_name).object : false
408406
end
409407

410408
def insert_sql?(sql)

test/cases/adapter_test_sqlserver.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,7 @@ class AdapterTestSQLServer < ActiveRecord::TestCase
197197
@identity_insert_sql_unordered_sp = "EXEC sp_executesql N'INSERT INTO [funny_jokes] ([name],[id]) VALUES (@0, @1)', N'@0 nvarchar(255), @1 int', @0 = N'Knock knock', @1 = 420"
198198
end
199199

200-
it "return quoted table_name to #query_requires_identity_insert? when INSERT sql contains id column" do
200+
it "return unquoted table_name to #query_requires_identity_insert? when INSERT sql contains id column" do
201201
assert_equal "funny_jokes", connection.send(:query_requires_identity_insert?, @identity_insert_sql)
202202
assert_equal "funny_jokes", connection.send(:query_requires_identity_insert?, @identity_insert_sql_unquoted)
203203
assert_equal "funny_jokes", connection.send(:query_requires_identity_insert?, @identity_insert_sql_unordered)

test/cases/schema_test_sqlserver.rb

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ class SchemaTestSQLServer < ActiveRecord::TestCase
2121

2222
it "have only one identity column" do
2323
columns = connection.columns("test.sst_schema_identity")
24+
2425
assert_equal 2, columns.size
2526
assert_equal 1, columns.select { |c| c.is_identity? }.size
2627
end
@@ -29,6 +30,7 @@ class SchemaTestSQLServer < ActiveRecord::TestCase
2930
test_columns = connection.columns("test.sst_schema_columns")
3031
dbo_columns = connection.columns("dbo.sst_schema_columns")
3132
columns = connection.columns("sst_schema_columns") # This returns table from dbo schema
33+
3234
assert_equal 7, test_columns.size
3335
assert_equal 2, dbo_columns.size
3436
assert_equal 2, columns.size
@@ -39,10 +41,15 @@ class SchemaTestSQLServer < ActiveRecord::TestCase
3941

4042
it "return correct varchar and nvarchar column limit length when table is in non dbo schema" do
4143
columns = connection.columns("test.sst_schema_columns")
44+
4245
assert_equal 255, columns.find { |c| c.name == "name" }.limit
4346
assert_equal 1000, columns.find { |c| c.name == "description" }.limit
4447
assert_equal 255, columns.find { |c| c.name == "n_name" }.limit
4548
assert_equal 1000, columns.find { |c| c.name == "n_description" }.limit
4649
end
50+
51+
it "creates new record" do
52+
Alien.create!(name: 'Trisolarans')
53+
end
4754
end
4855
end

test/models/sqlserver/alien.rb

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
# frozen_string_literal: true
2+
3+
class Alien < ActiveRecord::Base
4+
self.table_name = "test.aliens"
5+
end

test/schema/sqlserver_specific_schema.rb

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -312,4 +312,11 @@
312312
CONSTRAINT PK_sst_composite_with_identity PRIMARY KEY (pk_col_one, pk_col_two)
313313
);
314314
COMPOSITE_WITH_IDENTITY
315+
316+
execute "IF EXISTS(SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'aliens' and TABLE_SCHEMA = 'test') DROP TABLE test.aliens"
317+
execute <<-TABLE_IN_OTHER_SCHEMA_USED_BY_MODEL
318+
CREATE TABLE test.aliens(
319+
name varchar(255)
320+
)
321+
TABLE_IN_OTHER_SCHEMA_USED_BY_MODEL
315322
end

0 commit comments

Comments
 (0)