activerecord-sqlserver-adapter 7.1.3 → 7.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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:
|