activerecord-sqlserver-adapter 7.1.3 → 7.1.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +10 -0
- data/README.md +6 -2
- data/VERSION +1 -1
- data/lib/active_record/connection_adapters/sqlserver/core_ext/calculations.rb +1 -43
- data/lib/active_record/connection_adapters/sqlserver/database_statements.rb +15 -5
- data/test/cases/trigger_test_sqlserver.rb +10 -0
- data/test/models/sqlserver/trigger.rb +4 -0
- data/test/schema/sqlserver_specific_schema.rb +17 -0
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4e12d59815d11d0cbecea5d206057d6251384ef3a37df229c3c20c92eb7e0312
|
4
|
+
data.tar.gz: 25644794411a6dd0e709216a5cc444571645f94f2faf07ede21a6680c9682b35
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ff6fc5d218ed61de3c5b28024f72e42023ee15e710048f797e428d00487dd3be8284fadc8a23922aacb08ae22389aa0eaf7d9e86123d1a9d23ee9f2f222cc54e
|
7
|
+
data.tar.gz: ee6cd4a68000ec209f06f39c5029b049dd870993652a9bce9125cc118efc829bced1a921631fec7a8353e7bf96790eacdd9718a606fa82dee8ff2e74143b45c5
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,13 @@
|
|
1
|
+
## v7.1.4
|
2
|
+
|
3
|
+
#### Fixed
|
4
|
+
|
5
|
+
- [#1164](https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/pull/1164) Fix composite primary key with different data type with triggers
|
6
|
+
|
7
|
+
#### Changed
|
8
|
+
|
9
|
+
- [#1199](https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/pull/1199) Remove ActiveRecord::Relation#calculate patch
|
10
|
+
|
1
11
|
## v7.1.3
|
2
12
|
|
3
13
|
#### Fixed
|
data/README.md
CHANGED
@@ -13,8 +13,8 @@ Interested in older versions? We follow a rational versioning policy that tracks
|
|
13
13
|
|
14
14
|
| Adapter Version | Rails Version | Support | Branch |
|
15
15
|
|-----------------|---------------|---------|--------------------------------------------------------------------------------------------------|
|
16
|
-
| `7.1.
|
17
|
-
| `7.0.
|
16
|
+
| `7.1.4` | `7.1.x` | Active | [main](https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/tree/main) |
|
17
|
+
| `7.0.7` | `7.0.x` | Active | [7-0-stable](https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/tree/7-0-stable) |
|
18
18
|
| `6.1.3.0` | `6.1.x` | Active | [6-1-stable](https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/tree/6-1-stable) |
|
19
19
|
| `6.0.3` | `6.0.x` | Ended | [6-0-stable](https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/tree/6-0-stable) |
|
20
20
|
| `5.2.1` | `5.2.x` | Ended | [5-2-stable](https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/tree/5-2-stable) |
|
@@ -49,6 +49,10 @@ adapter.exclude_output_inserted_table_names['my_table_name'] = true
|
|
49
49
|
|
50
50
|
# Explicitly set the data type for the temporary key table.
|
51
51
|
adapter.exclude_output_inserted_table_names['my_uuid_table_name'] = 'uniqueidentifier'
|
52
|
+
|
53
|
+
|
54
|
+
# Explicitly set data types when data type is different for composite primary keys.
|
55
|
+
adapter.exclude_output_inserted_table_names['my_composite_pk_table_name'] = { pk_col_one: "uniqueidentifier", pk_col_two: "int" }
|
52
56
|
```
|
53
57
|
|
54
58
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
7.1.
|
1
|
+
7.1.4
|
@@ -8,51 +8,9 @@ module ActiveRecord
|
|
8
8
|
module SQLServer
|
9
9
|
module CoreExt
|
10
10
|
module Calculations
|
11
|
-
|
12
|
-
if klass.connection.sqlserver?
|
13
|
-
_calculate(operation, column_name)
|
14
|
-
else
|
15
|
-
super
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
11
|
+
|
19
12
|
private
|
20
13
|
|
21
|
-
# Same as original `calculate` method except we don't perform PostgreSQL hack that removes ordering.
|
22
|
-
def _calculate(operation, column_name)
|
23
|
-
operation = operation.to_s.downcase
|
24
|
-
|
25
|
-
if @none
|
26
|
-
case operation
|
27
|
-
when "count", "sum"
|
28
|
-
result = group_values.any? ? Hash.new : 0
|
29
|
-
return @async ? Promise::Complete.new(result) : result
|
30
|
-
when "average", "minimum", "maximum"
|
31
|
-
result = group_values.any? ? Hash.new : nil
|
32
|
-
return @async ? Promise::Complete.new(result) : result
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
if has_include?(column_name)
|
37
|
-
relation = apply_join_dependency
|
38
|
-
|
39
|
-
if operation == "count"
|
40
|
-
unless distinct_value || distinct_select?(column_name || select_for_count)
|
41
|
-
relation.distinct!
|
42
|
-
relation.select_values = [ klass.primary_key || table[Arel.star] ]
|
43
|
-
end
|
44
|
-
# PostgreSQL: ORDER BY expressions must appear in SELECT list when using DISTINCT
|
45
|
-
# Start of monkey-patch
|
46
|
-
# relation.order_values = [] if group_values.empty?
|
47
|
-
# End of monkey-patch
|
48
|
-
end
|
49
|
-
|
50
|
-
relation.calculate(operation, column_name)
|
51
|
-
else
|
52
|
-
perform_calculation(operation, column_name)
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
14
|
def build_count_subquery(relation, column_name, distinct)
|
57
15
|
return super unless klass.connection.adapter_name == "SQLServer"
|
58
16
|
|
@@ -278,13 +278,17 @@ module ActiveRecord
|
|
278
278
|
exclude_output_inserted = exclude_output_inserted_table_name?(table_name, sql)
|
279
279
|
|
280
280
|
if exclude_output_inserted
|
281
|
-
|
281
|
+
pk_and_types = Array(pk).map do |subkey|
|
282
|
+
{
|
283
|
+
quoted: SQLServer::Utils.extract_identifiers(subkey).quoted,
|
284
|
+
id_sql_type: exclude_output_inserted_id_sql_type(subkey, exclude_output_inserted)
|
285
|
+
}
|
286
|
+
end
|
282
287
|
|
283
|
-
id_sql_type = exclude_output_inserted.is_a?(TrueClass) ? "bigint" : exclude_output_inserted
|
284
288
|
<<~SQL.squish
|
285
|
-
DECLARE @ssaIdInsertTable table (#{
|
286
|
-
#{sql.dup.insert sql.index(/ (DEFAULT )?VALUES/i), " OUTPUT #{
|
287
|
-
SELECT #{
|
289
|
+
DECLARE @ssaIdInsertTable table (#{pk_and_types.map { |pk_and_type| "#{pk_and_type[:quoted]} #{pk_and_type[:id_sql_type]}"}.join(", ") });
|
290
|
+
#{sql.dup.insert sql.index(/ (DEFAULT )?VALUES/i), " OUTPUT #{ pk_and_types.map { |pk_and_type| "INSERTED.#{pk_and_type[:quoted]}" }.join(", ") } INTO @ssaIdInsertTable"}
|
291
|
+
SELECT #{pk_and_types.map {|pk_and_type| "CAST(#{pk_and_type[:quoted]} AS #{pk_and_type[:id_sql_type]}) #{pk_and_type[:quoted]}"}.join(", ")} FROM @ssaIdInsertTable
|
288
292
|
SQL
|
289
293
|
else
|
290
294
|
returning_columns = returning || Array(pk)
|
@@ -382,6 +386,12 @@ module ActiveRecord
|
|
382
386
|
self.class.exclude_output_inserted_table_names[table_name]
|
383
387
|
end
|
384
388
|
|
389
|
+
def exclude_output_inserted_id_sql_type(pk, exclude_output_inserted)
|
390
|
+
return "bigint" if exclude_output_inserted.is_a?(TrueClass)
|
391
|
+
return exclude_output_inserted[pk.to_sym] if exclude_output_inserted.is_a?(Hash)
|
392
|
+
exclude_output_inserted
|
393
|
+
end
|
394
|
+
|
385
395
|
def query_requires_identity_insert?(sql)
|
386
396
|
return false unless insert_sql?(sql)
|
387
397
|
|
@@ -38,4 +38,14 @@ class SQLServerTriggerTest < ActiveRecord::TestCase
|
|
38
38
|
_(obj.pk_col_two).must_equal 42
|
39
39
|
_(obj.pk_col_one.to_s).must_equal SSTestTriggerHistory.first.id_source
|
40
40
|
end
|
41
|
+
|
42
|
+
it "can insert into a table with composite pk with different data type with output inserted - with a hash setting for table name" do
|
43
|
+
exclude_output_inserted_table_names["sst_table_with_composite_pk_trigger_with_different_data_type"] = { pk_col_one: "uniqueidentifier", pk_col_two: "int" }
|
44
|
+
assert SSTestTriggerHistory.all.empty?
|
45
|
+
obj = SSTestTriggerCompositePkWithDefferentDataType.create! pk_col_two: 123, event_name: "test trigger"
|
46
|
+
_(obj.event_name).must_equal "test trigger"
|
47
|
+
_(obj.pk_col_one).must_be :present?
|
48
|
+
_(obj.pk_col_two).must_equal 123
|
49
|
+
_(obj.pk_col_one.to_s).must_equal SSTestTriggerHistory.first.id_source
|
50
|
+
end
|
41
51
|
end
|
@@ -11,3 +11,7 @@ end
|
|
11
11
|
class SSTestTriggerCompositePk < ActiveRecord::Base
|
12
12
|
self.table_name = "sst_table_with_composite_pk_trigger"
|
13
13
|
end
|
14
|
+
|
15
|
+
class SSTestTriggerCompositePkWithDefferentDataType < ActiveRecord::Base
|
16
|
+
self.table_name = "sst_table_with_composite_pk_trigger_with_different_data_type"
|
17
|
+
end
|
@@ -249,6 +249,23 @@ ActiveRecord::Schema.define do
|
|
249
249
|
SELECT pk_col_one AS id_source, event_name FROM INSERTED
|
250
250
|
SQL
|
251
251
|
|
252
|
+
execute "IF EXISTS(SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'sst_table_with_composite_pk_trigger_with_different_data_type') DROP TABLE sst_table_with_composite_pk_trigger_with_different_data_type"
|
253
|
+
execute <<-SQL
|
254
|
+
CREATE TABLE sst_table_with_composite_pk_trigger_with_different_data_type(
|
255
|
+
pk_col_one uniqueidentifier DEFAULT NEWID(),
|
256
|
+
pk_col_two int NOT NULL,
|
257
|
+
event_name nvarchar(255),
|
258
|
+
CONSTRAINT PK_sst_table_with_composite_pk_trigger_with_different_data_type PRIMARY KEY (pk_col_one, pk_col_two)
|
259
|
+
)
|
260
|
+
SQL
|
261
|
+
execute <<-SQL
|
262
|
+
CREATE TRIGGER sst_table_with_composite_pk_trigger_with_different_data_type_t ON sst_table_with_composite_pk_trigger_with_different_data_type
|
263
|
+
FOR INSERT
|
264
|
+
AS
|
265
|
+
INSERT INTO sst_table_with_trigger_history (id_source, event_name)
|
266
|
+
SELECT pk_col_one AS id_source, event_name FROM INSERTED
|
267
|
+
SQL
|
268
|
+
|
252
269
|
# Another schema.
|
253
270
|
|
254
271
|
create_table :sst_schema_columns, force: true do |t|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: activerecord-sqlserver-adapter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 7.1.
|
4
|
+
version: 7.1.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ken Collins
|
@@ -15,7 +15,7 @@ authors:
|
|
15
15
|
autorequire:
|
16
16
|
bindir: bin
|
17
17
|
cert_chain: []
|
18
|
-
date: 2024-
|
18
|
+
date: 2024-07-04 00:00:00.000000000 Z
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
21
|
name: activerecord
|
@@ -239,8 +239,8 @@ licenses:
|
|
239
239
|
- MIT
|
240
240
|
metadata:
|
241
241
|
bug_tracker_uri: https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/issues
|
242
|
-
changelog_uri: https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/blob/v7.1.
|
243
|
-
source_code_uri: https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/tree/v7.1.
|
242
|
+
changelog_uri: https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/blob/v7.1.4/CHANGELOG.md
|
243
|
+
source_code_uri: https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/tree/v7.1.4
|
244
244
|
post_install_message:
|
245
245
|
rdoc_options: []
|
246
246
|
require_paths:
|