activerecord 6.1.4.2 → 6.1.7.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (36) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +238 -12
  3. data/MIT-LICENSE +1 -1
  4. data/lib/active_record/associations/collection_association.rb +16 -8
  5. data/lib/active_record/associations/preloader/association.rb +1 -3
  6. data/lib/active_record/coders/yaml_column.rb +14 -2
  7. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +1 -1
  8. data/lib/active_record/connection_adapters/abstract/quoting.rb +13 -4
  9. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +4 -0
  10. data/lib/active_record/connection_adapters/mysql/database_statements.rb +2 -0
  11. data/lib/active_record/connection_adapters/mysql/schema_statements.rb +4 -1
  12. data/lib/active_record/connection_adapters/postgresql/database_statements.rb +2 -0
  13. data/lib/active_record/connection_adapters/postgresql/quoting.rb +26 -0
  14. data/lib/active_record/connection_adapters/postgresql_adapter.rb +2 -2
  15. data/lib/active_record/connection_adapters/schema_cache.rb +34 -10
  16. data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +2 -0
  17. data/lib/active_record/connection_handling.rb +2 -2
  18. data/lib/active_record/core.rb +17 -2
  19. data/lib/active_record/database_configurations/connection_url_resolver.rb +1 -0
  20. data/lib/active_record/database_configurations/hash_config.rb +1 -1
  21. data/lib/active_record/database_configurations.rb +2 -1
  22. data/lib/active_record/gem_version.rb +2 -2
  23. data/lib/active_record/internal_metadata.rb +2 -0
  24. data/lib/active_record/legacy_yaml_adapter.rb +1 -1
  25. data/lib/active_record/migration/compatibility.rb +9 -6
  26. data/lib/active_record/model_schema.rb +1 -1
  27. data/lib/active_record/railties/databases.rake +8 -8
  28. data/lib/active_record/relation/calculations.rb +2 -2
  29. data/lib/active_record/relation/finder_methods.rb +1 -1
  30. data/lib/active_record/relation/query_methods.rb +4 -2
  31. data/lib/active_record/relation/where_clause.rb +2 -2
  32. data/lib/active_record/store.rb +6 -1
  33. data/lib/active_record/tasks/database_tasks.rb +1 -1
  34. data/lib/active_record/test_fixtures.rb +9 -5
  35. data/lib/active_record.rb +1 -1
  36. metadata +11 -10
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6821089513b1694ce3705b3bccb709acab929c03c80c8d9a1bba622e1071bc8a
4
- data.tar.gz: 86c0829da5822d33fb0d47d66f1e776adc8b924122131b3093eb1dc8ecd7bb65
3
+ metadata.gz: 4210c6bb4e56ba5e01d289f5c2ef10a3cb75a87fdbf221d264ce1cff8a6de48e
4
+ data.tar.gz: 68fce96400cf56e66f2fc1900f6f88d077fc1272f5492a4bfa6b72244677af4e
5
5
  SHA512:
6
- metadata.gz: 96cb635b5c2698b1f8c37978ca66ed671d00a2be75368a47ed7952ac88f80434b50e35abcff1fd42c9afc29f2a65aa80777443e9cbd8272a5f583280034988fa
7
- data.tar.gz: 6d3a4e7b73dc228c8c9ed30421ff8a452511ee2f068faeca78e235c059e02de33804c0a270a20cbbcf69056f6821be4f049c13ca38f060ccca318265a94b17b9
6
+ metadata.gz: 8157ef3f7abe6813ba3f30af3993a21ac16205844fb86b001b3a3fcb2786d301785a190964cbefa7b6426ead62549fb4e4ef4c7a3b8d007cfaa770f8e5c0fc06
7
+ data.tar.gz: e35574ea93a13ce49f9621318a9c2a136f9ec628cf4ab92b6fa0e12d6b9a39e3afc506443a52512bffcfd30b9741606314d28940e55dce139da033a1182656b0
data/CHANGELOG.md CHANGED
@@ -1,3 +1,229 @@
1
+ ## Rails 6.1.7.7 (February 21, 2024) ##
2
+
3
+ * No changes.
4
+
5
+
6
+ ## Rails 6.1.7.6 (August 22, 2023) ##
7
+
8
+ * No changes.
9
+
10
+
11
+ ## Rails 6.1.7.5 (August 22, 2023) ##
12
+
13
+ * No changes.
14
+
15
+
16
+ ## Rails 6.1.7.4 (June 26, 2023) ##
17
+
18
+ * No changes.
19
+
20
+
21
+ ## Rails 6.1.7.3 (March 13, 2023) ##
22
+
23
+ * No changes.
24
+
25
+
26
+ ## Rails 6.1.7.2 (January 24, 2023) ##
27
+
28
+ * No changes.
29
+
30
+
31
+ ## Rails 6.1.7.1 (January 17, 2023) ##
32
+
33
+ * Make sanitize_as_sql_comment more strict
34
+
35
+ Though this method was likely never meant to take user input, it was
36
+ attempting sanitization. That sanitization could be bypassed with
37
+ carefully crafted input.
38
+
39
+ This commit makes the sanitization more robust by replacing any
40
+ occurrances of "/*" or "*/" with "/ *" or "* /". It also performs a
41
+ first pass to remove one surrounding comment to avoid compatibility
42
+ issues for users relying on the existing removal.
43
+
44
+ This also clarifies in the documentation of annotate that it should not
45
+ be provided user input.
46
+
47
+ [CVE-2023-22794]
48
+
49
+ * Added integer width check to PostgreSQL::Quoting
50
+
51
+ Given a value outside the range for a 64bit signed integer type
52
+ PostgreSQL will treat the column type as numeric. Comparing
53
+ integer values against numeric values can result in a slow
54
+ sequential scan.
55
+
56
+ This behavior is configurable via
57
+ ActiveRecord::Base.raise_int_wider_than_64bit which defaults to true.
58
+
59
+ [CVE-2022-44566]
60
+
61
+ ## Rails 6.1.7 (September 09, 2022) ##
62
+
63
+ * Symbol is allowed by default for YAML columns
64
+
65
+ *Étienne Barrié*
66
+
67
+ * Fix `ActiveRecord::Store` to serialize as a regular Hash
68
+
69
+ Previously it would serialize as an `ActiveSupport::HashWithIndifferentAccess`
70
+ which is wasteful and cause problem with YAML safe_load.
71
+
72
+ *Jean Boussier*
73
+
74
+ * Fix PG.connect keyword arguments deprecation warning on ruby 2.7
75
+
76
+ Fixes #44307.
77
+
78
+ *Nikita Vasilevsky*
79
+
80
+ ## Rails 6.1.6.1 (July 12, 2022) ##
81
+
82
+ * Change ActiveRecord::Coders::YAMLColumn default to safe_load
83
+
84
+ This adds two new configuration options The configuration options are as
85
+ follows:
86
+
87
+ * `config.active_storage.use_yaml_unsafe_load`
88
+
89
+ When set to true, this configuration option tells Rails to use the old
90
+ "unsafe" YAML loading strategy, maintaining the existing behavior but leaving
91
+ the possible escalation vulnerability in place. Setting this option to true
92
+ is *not* recommended, but can aid in upgrading.
93
+
94
+ * `config.active_record.yaml_column_permitted_classes`
95
+
96
+ The "safe YAML" loading method does not allow all classes to be deserialized
97
+ by default. This option allows you to specify classes deemed "safe" in your
98
+ application. For example, if your application uses Symbol and Time in
99
+ serialized data, you can add Symbol and Time to the allowed list as follows:
100
+
101
+ ```
102
+ config.active_record.yaml_column_permitted_classes = [Symbol, Date, Time]
103
+ ```
104
+
105
+ [CVE-2022-32224]
106
+
107
+
108
+ ## Rails 6.1.6 (May 09, 2022) ##
109
+
110
+ * No changes.
111
+
112
+
113
+ ## Rails 6.1.5.1 (April 26, 2022) ##
114
+
115
+ * No changes.
116
+
117
+
118
+ ## Rails 6.1.5 (March 09, 2022) ##
119
+
120
+ * Fix `ActiveRecord::ConnectionAdapters::SchemaCache#deep_deduplicate` for Ruby 2.6.
121
+
122
+ Ruby 2.6 and 2.7 have slightly different implementations of the `String#-@` method.
123
+ In Ruby 2.6, the receiver of the `String#-@` method is modified under certain circumstances.
124
+ This was later identified as a bug (https://bugs.ruby-lang.org/issues/15926) and only
125
+ fixed in Ruby 2.7.
126
+
127
+ Before the changes in this commit, the
128
+ `ActiveRecord::ConnectionAdapters::SchemaCache#deep_deduplicate` method, which internally
129
+ calls the `String#-@` method, could also modify an input string argument in Ruby 2.6 --
130
+ changing a tainted, unfrozen string into a tainted, frozen string.
131
+
132
+ Fixes #43056
133
+
134
+ *Eric O'Hanlon*
135
+
136
+ * Fix migration compatibility to create SQLite references/belongs_to column as integer when
137
+ migration version is 6.0.
138
+
139
+ `reference`/`belongs_to` in migrations with version 6.0 were creating columns as
140
+ bigint instead of integer for the SQLite Adapter.
141
+
142
+ *Marcelo Lauxen*
143
+
144
+ * Fix dbconsole for 3-tier config.
145
+
146
+ *Eileen M. Uchitelle*
147
+
148
+ * Better handle SQL queries with invalid encoding.
149
+
150
+ ```ruby
151
+ Post.create(name: "broken \xC8 UTF-8")
152
+ ```
153
+
154
+ Would cause all adapters to fail in a non controlled way in the code
155
+ responsible to detect write queries.
156
+
157
+ The query is now properly passed to the database connection, which might or might
158
+ not be able to handle it, but will either succeed or failed in a more correct way.
159
+
160
+ *Jean Boussier*
161
+
162
+ * Ignore persisted in-memory records when merging target lists.
163
+
164
+ *Kevin Sjöberg*
165
+
166
+ * Fix regression bug that caused ignoring additional conditions for preloading
167
+ `has_many` through relations.
168
+
169
+ Fixes #43132
170
+
171
+ *Alexander Pauly*
172
+
173
+ * Fix `ActiveRecord::InternalMetadata` to not be broken by
174
+ `config.active_record.record_timestamps = false`
175
+
176
+ Since the model always create the timestamp columns, it has to set them, otherwise it breaks
177
+ various DB management tasks.
178
+
179
+ Fixes #42983
180
+
181
+ *Jean Boussier*
182
+
183
+ * Fix duplicate active record objects on `inverse_of`.
184
+
185
+ *Justin Carvalho*
186
+
187
+ * Fix duplicate objects stored in has many association after save.
188
+
189
+ Fixes #42549.
190
+
191
+ *Alex Ghiculescu*
192
+
193
+ * Fix performance regression in `CollectionAssocation#build`.
194
+
195
+ *Alex Ghiculescu*
196
+
197
+ * Fix retrieving default value for text column for MariaDB.
198
+
199
+ *fatkodima*
200
+
201
+
202
+ ## Rails 6.1.4.7 (March 08, 2022) ##
203
+
204
+ * No changes.
205
+
206
+
207
+ ## Rails 6.1.4.6 (February 11, 2022) ##
208
+
209
+ * No changes.
210
+
211
+
212
+ ## Rails 6.1.4.5 (February 11, 2022) ##
213
+
214
+ * No changes.
215
+
216
+
217
+ ## Rails 6.1.4.4 (December 15, 2021) ##
218
+
219
+ * No changes.
220
+
221
+
222
+ ## Rails 6.1.4.3 (December 14, 2021) ##
223
+
224
+ * No changes.
225
+
226
+
1
227
  ## Rails 6.1.4.2 (December 14, 2021) ##
2
228
 
3
229
  * No changes.
@@ -77,10 +303,10 @@
77
303
  ```
78
304
 
79
305
  In the example, `dog.treats` would still raise even though
80
- `strict_loading` was set to false. This is a bug effecting more than
81
- Active Storage which is why I made this PR superceeding #41461. We need
306
+ `strict_loading` was set to false. This is a bug affecting more than
307
+ Active Storage which is why I made this PR superseding #41461. We need
82
308
  to fix this for all applications since the behavior is a little
83
- surprising. I took the test from ##41461 and the code suggestion from #41453
309
+ surprising. I took the test from #41461 and the code suggestion from #41453
84
310
  with some additions.
85
311
 
86
312
  *Eileen M. Uchitelle*, *Radamés Roriz*
@@ -582,7 +808,7 @@
582
808
 
583
809
  attribute :duration, :interval
584
810
 
585
- To keep old behavior until 6.2 is released:
811
+ To keep old behavior until 7.0 is released:
586
812
 
587
813
  attribute :duration, :string
588
814
 
@@ -754,8 +980,8 @@
754
980
  *Ryuta Kamizono*
755
981
 
756
982
  * Merging conditions on the same column no longer maintain both conditions,
757
- and will be consistently replaced by the latter condition in Rails 6.2.
758
- To migrate to Rails 6.2's behavior, use `relation.merge(other, rewhere: true)`.
983
+ and will be consistently replaced by the latter condition in Rails 7.0.
984
+ To migrate to Rails 7.0's behavior, use `relation.merge(other, rewhere: true)`.
759
985
 
760
986
  ```ruby
761
987
  # Rails 6.1 (IN clause is replaced by merger side equality condition)
@@ -764,10 +990,10 @@
764
990
  # Rails 6.1 (both conflict conditions exists, deprecated)
765
991
  Author.where(id: david.id..mary.id).merge(Author.where(id: bob)) # => []
766
992
 
767
- # Rails 6.1 with rewhere to migrate to Rails 6.2's behavior
993
+ # Rails 6.1 with rewhere to migrate to Rails 7.0's behavior
768
994
  Author.where(id: david.id..mary.id).merge(Author.where(id: bob), rewhere: true) # => [bob]
769
995
 
770
- # Rails 6.2 (same behavior with IN clause, mergee side condition is consistently replaced)
996
+ # Rails 7.0 (same behavior with IN clause, mergee side condition is consistently replaced)
771
997
  Author.where(id: [david.id, mary.id]).merge(Author.where(id: bob)) # => [bob]
772
998
  Author.where(id: david.id..mary.id).merge(Author.where(id: bob)) # => [bob]
773
999
  ```
@@ -859,7 +1085,7 @@
859
1085
 
860
1086
  * Deprecate aggregations with group by duplicated fields.
861
1087
 
862
- To migrate to Rails 6.2's behavior, use `uniq!(:group)` to deduplicate group fields.
1088
+ To migrate to Rails 7.0's behavior, use `uniq!(:group)` to deduplicate group fields.
863
1089
 
864
1090
  ```ruby
865
1091
  accounts = Account.group(:firm_id)
@@ -883,7 +1109,7 @@
883
1109
 
884
1110
  * Deprecate duplicated query annotations.
885
1111
 
886
- To migrate to Rails 6.2's behavior, use `uniq!(:annotate)` to deduplicate query annotations.
1112
+ To migrate to Rails 7.0's behavior, use `uniq!(:annotate)` to deduplicate query annotations.
887
1113
 
888
1114
  ```ruby
889
1115
  accounts = Account.where(id: [1, 2]).annotate("david and mary")
@@ -1304,13 +1530,13 @@
1304
1530
 
1305
1531
  * Deprecate `#remove_connection` in favor of `#remove_connection_pool` when called on the handler.
1306
1532
 
1307
- `#remove_connection` is deprecated in order to support returning a `DatabaseConfig` object instead of a `Hash`. Use `#remove_connection_pool`, `#remove_connection` will be removed in 6.2.
1533
+ `#remove_connection` is deprecated in order to support returning a `DatabaseConfig` object instead of a `Hash`. Use `#remove_connection_pool`, `#remove_connection` will be removed in Rails 7.0.
1308
1534
 
1309
1535
  *Eileen M. Uchitelle*, *John Crepezzi*
1310
1536
 
1311
1537
  * Deprecate `#default_hash` and it's alias `#[]` on database configurations.
1312
1538
 
1313
- Applications should use `configs_for`. `#default_hash` and `#[]` will be removed in 6.2.
1539
+ Applications should use `configs_for`. `#default_hash` and `#[]` will be removed in Rails 7.0.
1314
1540
 
1315
1541
  *Eileen M. Uchitelle*, *John Crepezzi*
1316
1542
 
data/MIT-LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2004-2020 David Heinemeier Hansson
1
+ Copyright (c) 2004-2022 David Heinemeier Hansson
2
2
 
3
3
  Arel originally copyright (c) 2007-2016 Nick Kallen, Bryan Helmkamp, Emilio Tagua, Aaron Patterson
4
4
 
@@ -75,6 +75,7 @@ module ActiveRecord
75
75
  def reset
76
76
  super
77
77
  @target = []
78
+ @replaced_or_added_targets = Set.new
78
79
  @association_ids = nil
79
80
  end
80
81
 
@@ -279,10 +280,7 @@ module ActiveRecord
279
280
  end
280
281
 
281
282
  def add_to_target(record, skip_callbacks: false, replace: false, &block)
282
- if replace || association_scope.distinct_value
283
- index = @target.index(record)
284
- end
285
- replace_on_target(record, index, skip_callbacks, &block)
283
+ replace_on_target(record, skip_callbacks, replace: replace || association_scope.distinct_value, &block)
286
284
  end
287
285
 
288
286
  def target=(record)
@@ -292,7 +290,7 @@ module ActiveRecord
292
290
  when Array
293
291
  super
294
292
  else
295
- add_to_target(record, skip_callbacks: true, replace: true)
293
+ replace_on_target(record, true, replace: true, inversing: true)
296
294
  end
297
295
  end
298
296
 
@@ -342,7 +340,7 @@ module ActiveRecord
342
340
  end
343
341
  end
344
342
 
345
- persisted + memory
343
+ persisted + memory.reject(&:persisted?)
346
344
  end
347
345
 
348
346
  def _create_record(attributes, raise = false, &block)
@@ -425,7 +423,7 @@ module ActiveRecord
425
423
  common_records = intersection(new_target, original_target)
426
424
  common_records.each do |record|
427
425
  skip_callbacks = true
428
- replace_on_target(record, @target.index(record), skip_callbacks)
426
+ replace_on_target(record, skip_callbacks, replace: true)
429
427
  end
430
428
  end
431
429
 
@@ -448,7 +446,11 @@ module ActiveRecord
448
446
  records
449
447
  end
450
448
 
451
- def replace_on_target(record, index, skip_callbacks)
449
+ def replace_on_target(record, skip_callbacks, replace:, inversing: false)
450
+ if replace && (!record.new_record? || @replaced_or_added_targets.include?(record))
451
+ index = @target.index(record)
452
+ end
453
+
452
454
  catch(:abort) do
453
455
  callback(:before_add, record)
454
456
  end || return unless skip_callbacks
@@ -459,6 +461,12 @@ module ActiveRecord
459
461
 
460
462
  yield(record) if block_given?
461
463
 
464
+ if !index && @replaced_or_added_targets.include?(record)
465
+ index = @target.index(record)
466
+ end
467
+
468
+ @replaced_or_added_targets << record if inversing || index || record.new_record?
469
+
462
470
  if index
463
471
  target[index] = record
464
472
  elsif @_was_loaded || !loaded?
@@ -129,9 +129,7 @@ module ActiveRecord
129
129
  end
130
130
 
131
131
  def reflection_scope
132
- @reflection_scope ||= begin
133
- reflection.join_scopes(klass.arel_table, klass.predicate_builder, klass).inject(&:merge!) || klass.unscoped
134
- end
132
+ @reflection_scope ||= reflection.join_scopes(klass.arel_table, klass.predicate_builder, klass).inject(klass.unscoped, &:merge!)
135
133
  end
136
134
 
137
135
  def build_scope
@@ -47,11 +47,23 @@ module ActiveRecord
47
47
 
48
48
  if YAML.respond_to?(:unsafe_load)
49
49
  def yaml_load(payload)
50
- YAML.unsafe_load(payload)
50
+ if ActiveRecord::Base.use_yaml_unsafe_load
51
+ YAML.unsafe_load(payload)
52
+ elsif YAML.method(:safe_load).parameters.include?([:key, :permitted_classes])
53
+ YAML.safe_load(payload, permitted_classes: ActiveRecord::Base.yaml_column_permitted_classes, aliases: true)
54
+ else
55
+ YAML.safe_load(payload, ActiveRecord::Base.yaml_column_permitted_classes, [], true)
56
+ end
51
57
  end
52
58
  else
53
59
  def yaml_load(payload)
54
- YAML.load(payload)
60
+ if ActiveRecord::Base.use_yaml_unsafe_load
61
+ YAML.load(payload)
62
+ elsif YAML.method(:safe_load).parameters.include?([:key, :permitted_classes])
63
+ YAML.safe_load(payload, permitted_classes: ActiveRecord::Base.yaml_column_permitted_classes, aliases: true)
64
+ else
65
+ YAML.safe_load(payload, ActiveRecord::Base.yaml_column_permitted_classes, [], true)
66
+ end
55
67
  end
56
68
  end
57
69
  end
@@ -1177,7 +1177,7 @@ module ActiveRecord
1177
1177
  return owner_to_pool_manager[owner] if owner_to_pool_manager.key?(owner)
1178
1178
 
1179
1179
  if owner == "primary"
1180
- ActiveSupport::Deprecation.warn("Using `\"primary\"` as a `connection_specification_name` is deprecated and will be removed in Rails 6.2.0. Please use `ActiveRecord::Base`.")
1180
+ ActiveSupport::Deprecation.warn("Using `\"primary\"` as a `connection_specification_name` is deprecated and will be removed in Rails 7.0.0. Please use `ActiveRecord::Base`.")
1181
1181
  owner_to_pool_manager[Base.name]
1182
1182
  end
1183
1183
  end
@@ -12,7 +12,7 @@ module ActiveRecord
12
12
  if value.is_a?(Base)
13
13
  ActiveSupport::Deprecation.warn(<<~MSG)
14
14
  Passing an Active Record object to `quote` directly is deprecated
15
- and will be no longer quoted as id value in Rails 6.2.
15
+ and will be no longer quoted as id value in Rails 7.0.
16
16
  MSG
17
17
  value = value.id_for_database
18
18
  end
@@ -27,14 +27,14 @@ module ActiveRecord
27
27
  if value.is_a?(Base)
28
28
  ActiveSupport::Deprecation.warn(<<~MSG)
29
29
  Passing an Active Record object to `type_cast` directly is deprecated
30
- and will be no longer type casted as id value in Rails 6.2.
30
+ and will be no longer type casted as id value in Rails 7.0.
31
31
  MSG
32
32
  value = value.id_for_database
33
33
  end
34
34
 
35
35
  if column
36
36
  ActiveSupport::Deprecation.warn(<<~MSG)
37
- Passing a column to `type_cast` is deprecated and will be removed in Rails 6.2.
37
+ Passing a column to `type_cast` is deprecated and will be removed in Rails 7.0.
38
38
  MSG
39
39
  type = lookup_cast_type_from_column(column)
40
40
  value = type.serialize(value)
@@ -138,7 +138,16 @@ module ActiveRecord
138
138
  end
139
139
 
140
140
  def sanitize_as_sql_comment(value) # :nodoc:
141
- value.to_s.gsub(%r{ (/ (?: | \g<1>) \*) \+? \s* | \s* (\* (?: | \g<2>) /) }x, "")
141
+ # Sanitize a string to appear within a SQL comment
142
+ # For compatibility, this also surrounding "/*+", "/*", and "*/"
143
+ # charcacters, possibly with single surrounding space.
144
+ # Then follows that by replacing any internal "*/" or "/ *" with
145
+ # "* /" or "/ *"
146
+ comment = value.to_s.dup
147
+ comment.gsub!(%r{\A\s*/\*\+?\s?|\s?\*/\s*\Z}, "")
148
+ comment.gsub!("*/", "* /")
149
+ comment.gsub!("/*", "/ *")
150
+ comment
142
151
  end
143
152
 
144
153
  def column_name_matcher # :nodoc:
@@ -198,6 +198,10 @@ module ActiveRecord
198
198
 
199
199
  def index_options(table_name)
200
200
  index_options = as_options(index)
201
+
202
+ # legacy reference index names are used on versions 6.0 and earlier
203
+ return index_options if options[:_uses_legacy_reference_index_name]
204
+
201
205
  index_options[:name] ||= polymorphic_index_name(table_name) if polymorphic
202
206
  index_options
203
207
  end
@@ -26,6 +26,8 @@ module ActiveRecord
26
26
 
27
27
  def write_query?(sql) # :nodoc:
28
28
  !READ_QUERY.match?(sql)
29
+ rescue ArgumentError # Invalid encoding
30
+ !READ_QUERY.match?(sql.b)
29
31
  end
30
32
 
31
33
  def explain(arel, binds = [])
@@ -167,6 +167,9 @@ module ActiveRecord
167
167
  elsif type_metadata.extra == "DEFAULT_GENERATED"
168
168
  default = +"(#{default})" unless default.start_with?("(")
169
169
  default, default_function = nil, default
170
+ elsif type_metadata.type == :text && default
171
+ # strip and unescape quotes
172
+ default = default[1...-1].gsub("\\'", "'")
170
173
  end
171
174
 
172
175
  MySQL::Column.new(
@@ -203,7 +206,7 @@ module ActiveRecord
203
206
  def data_source_sql(name = nil, type: nil)
204
207
  scope = quoted_scope(name, type: type)
205
208
 
206
- sql = +"SELECT table_name FROM (SELECT * FROM information_schema.tables "
209
+ sql = +"SELECT table_name FROM (SELECT table_name, table_type FROM information_schema.tables "
207
210
  sql << " WHERE table_schema = #{scope[:schema]}) _subquery"
208
211
  if scope[:type] || scope[:name]
209
212
  conditions = []
@@ -28,6 +28,8 @@ module ActiveRecord
28
28
 
29
29
  def write_query?(sql) # :nodoc:
30
30
  !READ_QUERY.match?(sql)
31
+ rescue ArgumentError # Invalid encoding
32
+ !READ_QUERY.match?(sql.b)
31
33
  end
32
34
 
33
35
  # Executes an SQL statement, returning a PG::Result object on success
@@ -4,6 +4,12 @@ module ActiveRecord
4
4
  module ConnectionAdapters
5
5
  module PostgreSQL
6
6
  module Quoting
7
+ class IntegerOutOf64BitRange < StandardError
8
+ def initialize(msg)
9
+ super(msg)
10
+ end
11
+ end
12
+
7
13
  # Escapes binary strings for bytea input to the database.
8
14
  def escape_bytea(value)
9
15
  @connection.escape_bytea(value) if value
@@ -120,7 +126,27 @@ module ActiveRecord
120
126
  super(query_value("SELECT #{quote(sql_type)}::regtype::oid", "SCHEMA").to_i)
121
127
  end
122
128
 
129
+ def check_int_in_range(value)
130
+ if value.to_int > 9223372036854775807 || value.to_int < -9223372036854775808
131
+ exception = <<~ERROR
132
+ Provided value outside of the range of a signed 64bit integer.
133
+
134
+ PostgreSQL will treat the column type in question as a numeric.
135
+ This may result in a slow sequential scan due to a comparison
136
+ being performed between an integer or bigint value and a numeric value.
137
+
138
+ To allow for this potentially unwanted behavior, set
139
+ ActiveRecord::Base.raise_int_wider_than_64bit to false.
140
+ ERROR
141
+ raise IntegerOutOf64BitRange.new exception
142
+ end
143
+ end
144
+
123
145
  def _quote(value)
146
+ if ActiveRecord::Base.raise_int_wider_than_64bit && value.is_a?(Integer)
147
+ check_int_in_range(value)
148
+ end
149
+
124
150
  case value
125
151
  when OID::Xml::Data
126
152
  "xml '#{quote_string(value.to_s)}'"
@@ -75,7 +75,7 @@ module ActiveRecord
75
75
 
76
76
  class << self
77
77
  def new_client(conn_params)
78
- PG.connect(conn_params)
78
+ PG.connect(**conn_params)
79
79
  rescue ::PG::Error => error
80
80
  if conn_params && conn_params[:dbname] && error.message.include?(conn_params[:dbname])
81
81
  raise ActiveRecord::NoDatabaseError
@@ -247,7 +247,7 @@ module ActiveRecord
247
247
  def initialize(connection, logger, connection_parameters, config)
248
248
  super(connection, logger, config)
249
249
 
250
- @connection_parameters = connection_parameters
250
+ @connection_parameters = connection_parameters || {}
251
251
 
252
252
  # @local_tz is initialized as nil to avoid warnings when connect tries to use it
253
253
  @local_tz = nil
@@ -198,16 +198,40 @@ module ActiveRecord
198
198
  @indexes = deep_deduplicate(@indexes)
199
199
  end
200
200
 
201
- def deep_deduplicate(value)
202
- case value
203
- when Hash
204
- value.transform_keys { |k| deep_deduplicate(k) }.transform_values { |v| deep_deduplicate(v) }
205
- when Array
206
- value.map { |i| deep_deduplicate(i) }
207
- when String, Deduplicable
208
- -value
209
- else
210
- value
201
+ if RUBY_VERSION < "2.7"
202
+ def deep_deduplicate(value)
203
+ case value
204
+ when Hash
205
+ value.transform_keys { |k| deep_deduplicate(k) }.transform_values { |v| deep_deduplicate(v) }
206
+ when Array
207
+ value.map { |i| deep_deduplicate(i) }
208
+ when String
209
+ if value.tainted?
210
+ # Ruby 2.6 and 2.7 have slightly different implementations of the String#-@ method.
211
+ # In Ruby 2.6, the receiver of the String#-@ method is modified under certain
212
+ # circumstances, and this was later identified as a bug
213
+ # (https://bugs.ruby-lang.org/issues/15926) and only fixed in Ruby 2.7.
214
+ value = value.dup
215
+ end
216
+ -value
217
+ when Deduplicable
218
+ -value
219
+ else
220
+ value
221
+ end
222
+ end
223
+ else
224
+ def deep_deduplicate(value)
225
+ case value
226
+ when Hash
227
+ value.transform_keys { |k| deep_deduplicate(k) }.transform_values { |v| deep_deduplicate(v) }
228
+ when Array
229
+ value.map { |i| deep_deduplicate(i) }
230
+ when String, Deduplicable
231
+ -value
232
+ else
233
+ value
234
+ end
211
235
  end
212
236
  end
213
237
 
@@ -11,6 +11,8 @@ module ActiveRecord
11
11
 
12
12
  def write_query?(sql) # :nodoc:
13
13
  !READ_QUERY.match?(sql)
14
+ rescue ArgumentError # Invalid encoding
15
+ !READ_QUERY.match?(sql.b)
14
16
  end
15
17
 
16
18
  def explain(arel, binds = [])
@@ -135,7 +135,7 @@ module ActiveRecord
135
135
  # Dog.first # finds first Dog record stored on the shard one replica
136
136
  # end
137
137
  #
138
- # The database kwarg is deprecated and will be removed in 6.2.0 without replacement.
138
+ # The database kwarg is deprecated and will be removed in Rails 7.0.0 without replacement.
139
139
  def connected_to(database: nil, role: nil, shard: nil, prevent_writes: false, &blk)
140
140
  if legacy_connection_handling
141
141
  if self != Base
@@ -154,7 +154,7 @@ module ActiveRecord
154
154
  if database && (role || shard)
155
155
  raise ArgumentError, "`connected_to` cannot accept a `database` argument with any other arguments."
156
156
  elsif database
157
- ActiveSupport::Deprecation.warn("The database key in `connected_to` is deprecated. It will be removed in Rails 6.2.0 without replacement.")
157
+ ActiveSupport::Deprecation.warn("The database key in `connected_to` is deprecated. It will be removed in Rails 7.0.0 without replacement.")
158
158
 
159
159
  if database.is_a?(Hash)
160
160
  role, database = database.first
@@ -155,6 +155,21 @@ module ActiveRecord
155
155
 
156
156
  mattr_accessor :legacy_connection_handling, instance_writer: false, default: true
157
157
 
158
+ # Application configurable boolean that instructs the YAML Coder to use
159
+ # an unsafe load if set to true.
160
+ mattr_accessor :use_yaml_unsafe_load, instance_writer: false, default: false
161
+
162
+ # Application configurable array that provides additional permitted classes
163
+ # to Psych safe_load in the YAML Coder
164
+ mattr_accessor :yaml_column_permitted_classes, instance_writer: false, default: [Symbol]
165
+
166
+ ##
167
+ # :singleton-method:
168
+ # Application configurable boolean that denotes whether or not to raise
169
+ # an exception when the PostgreSQLAdapter is provided with an integer that is
170
+ # wider than signed 64bit representation
171
+ mattr_accessor :raise_int_wider_than_64bit, instance_writer: false, default: true
172
+
158
173
  self.filter_attributes = []
159
174
 
160
175
  def self.connection_handler
@@ -278,11 +293,11 @@ module ActiveRecord
278
293
  end
279
294
 
280
295
  def self.allow_unsafe_raw_sql # :nodoc:
281
- ActiveSupport::Deprecation.warn("ActiveRecord::Base.allow_unsafe_raw_sql is deprecated and will be removed in Rails 6.2")
296
+ ActiveSupport::Deprecation.warn("ActiveRecord::Base.allow_unsafe_raw_sql is deprecated and will be removed in Rails 7.0")
282
297
  end
283
298
 
284
299
  def self.allow_unsafe_raw_sql=(value) # :nodoc:
285
- ActiveSupport::Deprecation.warn("ActiveRecord::Base.allow_unsafe_raw_sql= is deprecated and will be removed in Rails 6.2")
300
+ ActiveSupport::Deprecation.warn("ActiveRecord::Base.allow_unsafe_raw_sql= is deprecated and will be removed in Rails 7.0")
286
301
  end
287
302
 
288
303
  self.default_connection_handler = ConnectionAdapters::ConnectionHandler.new
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "uri"
3
4
  require "active_support/core_ext/enumerable"
4
5
 
5
6
  module ActiveRecord
@@ -32,7 +32,7 @@ module ActiveRecord
32
32
  end
33
33
 
34
34
  def config
35
- ActiveSupport::Deprecation.warn("DatabaseConfig#config will be removed in 6.2.0 in favor of DatabaseConfigurations#configuration_hash which returns a hash with symbol keys")
35
+ ActiveSupport::Deprecation.warn("DatabaseConfig#config will be removed in 7.0.0 in favor of DatabaseConfig#configuration_hash which returns a hash with symbol keys")
36
36
  configuration_hash.stringify_keys
37
37
  end
38
38
 
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "uri"
3
4
  require "active_record/database_configurations/database_config"
4
5
  require "active_record/database_configurations/hash_config"
5
6
  require "active_record/database_configurations/url_config"
@@ -40,7 +41,7 @@ module ActiveRecord
40
41
  def configs_for(env_name: nil, spec_name: nil, name: nil, include_replicas: false)
41
42
  if spec_name
42
43
  name = spec_name
43
- ActiveSupport::Deprecation.warn("The kwarg `spec_name` is deprecated in favor of `name`. `spec_name` will be removed in Rails 6.2")
44
+ ActiveSupport::Deprecation.warn("The kwarg `spec_name` is deprecated in favor of `name`. `spec_name` will be removed in Rails 7.0")
44
45
  end
45
46
 
46
47
  env_name ||= default_env if name
@@ -9,8 +9,8 @@ module ActiveRecord
9
9
  module VERSION
10
10
  MAJOR = 6
11
11
  MINOR = 1
12
- TINY = 4
13
- PRE = "2"
12
+ TINY = 7
13
+ PRE = "7"
14
14
 
15
15
  STRING = [MAJOR, MINOR, TINY, PRE].compact.join(".")
16
16
  end
@@ -10,6 +10,8 @@ module ActiveRecord
10
10
  # This is enabled by default. To disable this functionality set
11
11
  # `use_metadata_table` to false in your database configuration.
12
12
  class InternalMetadata < ActiveRecord::Base # :nodoc:
13
+ self.record_timestamps = true
14
+
13
15
  class << self
14
16
  def enabled?
15
17
  ActiveRecord::Base.connection.use_metadata_table?
@@ -10,7 +10,7 @@ module ActiveRecord
10
10
  else
11
11
  ActiveSupport::Deprecation.warn(<<-MSG.squish)
12
12
  YAML loading from legacy format older than Rails 5.0 is deprecated
13
- and will be removed in Rails 6.2.
13
+ and will be removed in Rails 7.0.
14
14
  MSG
15
15
  if coder["attributes"].is_a?(ActiveModel::AttributeSet)
16
16
  Rails420.convert(klass, coder)
@@ -24,9 +24,8 @@ module ActiveRecord
24
24
 
25
25
  module TableDefinition
26
26
  def references(*args, **options)
27
- args.each do |ref_name|
28
- ReferenceDefinition.new(ref_name, **options).add_to(self)
29
- end
27
+ options[:_uses_legacy_reference_index_name] = true
28
+ super
30
29
  end
31
30
  alias :belongs_to :references
32
31
  end
@@ -56,8 +55,12 @@ module ActiveRecord
56
55
  end
57
56
 
58
57
  def add_reference(table_name, ref_name, **options)
59
- ReferenceDefinition.new(ref_name, **options)
60
- .add_to(connection.update_table_definition(table_name, self))
58
+ if connection.adapter_name == "SQLite"
59
+ options[:type] = :integer
60
+ end
61
+
62
+ options[:_uses_legacy_reference_index_name] = true
63
+ super
61
64
  end
62
65
  alias :add_belongs_to :add_reference
63
66
 
@@ -126,7 +129,7 @@ module ActiveRecord
126
129
  class << t
127
130
  prepend TableDefinition
128
131
  end
129
- t
132
+ super
130
133
  end
131
134
 
132
135
  def command_recorder
@@ -630,7 +630,7 @@ module ActiveRecord
630
630
  if column.sql_type.start_with?("interval")
631
631
  precision_arguments = column.precision.presence && ", precision: #{column.precision}"
632
632
  ActiveSupport::Deprecation.warn(<<~WARNING)
633
- The behavior of the `:interval` type will be changing in Rails 6.2
633
+ The behavior of the `:interval` type will be changing in Rails 7.0
634
634
  to return an `ActiveSupport::Duration` object. If you'd like to keep
635
635
  the old behavior, you can add this line to #{self.name} model:
636
636
 
@@ -464,7 +464,7 @@ db_namespace = namespace :db do
464
464
 
465
465
  task load_if_ruby: ["db:create", :environment] do
466
466
  ActiveSupport::Deprecation.warn(<<-MSG.squish)
467
- Using `bin/rails db:schema:load_if_ruby` is deprecated and will be removed in Rails 6.2.
467
+ Using `bin/rails db:schema:load_if_ruby` is deprecated and will be removed in Rails 7.0.
468
468
  Configure the format using `config.active_record.schema_format = :ruby` to use `schema.rb` and run `bin/rails db:schema:load` instead.
469
469
  MSG
470
470
  db_namespace["schema:load"].invoke if ActiveRecord::Base.schema_format == :ruby
@@ -527,7 +527,7 @@ db_namespace = namespace :db do
527
527
  desc "Dumps the database structure to db/structure.sql. Specify another file with SCHEMA=db/my_structure.sql"
528
528
  task dump: :load_config do
529
529
  ActiveSupport::Deprecation.warn(<<-MSG.squish)
530
- Using `bin/rails db:structure:dump` is deprecated and will be removed in Rails 6.2.
530
+ Using `bin/rails db:structure:dump` is deprecated and will be removed in Rails 7.0.
531
531
  Configure the format using `config.active_record.schema_format = :sql` to use `structure.sql` and run `bin/rails db:schema:dump` instead.
532
532
  MSG
533
533
 
@@ -538,7 +538,7 @@ db_namespace = namespace :db do
538
538
  desc "Recreates the databases from the structure.sql file"
539
539
  task load: [:load_config, :check_protected_environments] do
540
540
  ActiveSupport::Deprecation.warn(<<-MSG.squish)
541
- Using `bin/rails db:structure:load` is deprecated and will be removed in Rails 6.2.
541
+ Using `bin/rails db:structure:load` is deprecated and will be removed in Rails 7.0.
542
542
  Configure the format using `config.active_record.schema_format = :sql` to use `structure.sql` and run `bin/rails db:schema:load` instead.
543
543
  MSG
544
544
  db_namespace["schema:load"].invoke
@@ -546,7 +546,7 @@ db_namespace = namespace :db do
546
546
 
547
547
  task load_if_sql: ["db:create", :environment] do
548
548
  ActiveSupport::Deprecation.warn(<<-MSG.squish)
549
- Using `bin/rails db:structure:load_if_sql` is deprecated and will be removed in Rails 6.2.
549
+ Using `bin/rails db:structure:load_if_sql` is deprecated and will be removed in Rails 7.0.
550
550
  Configure the format using `config.active_record.schema_format = :sql` to use `structure.sql` and run `bin/rails db:schema:load` instead.
551
551
  MSG
552
552
  db_namespace["schema:load"].invoke if ActiveRecord::Base.schema_format == :sql
@@ -557,7 +557,7 @@ db_namespace = namespace :db do
557
557
  desc "Dumps the #{name} database structure to db/structure.sql. Specify another file with SCHEMA=db/my_structure.sql"
558
558
  task name => :load_config do
559
559
  ActiveSupport::Deprecation.warn(<<-MSG.squish)
560
- Using `bin/rails db:structure:dump:#{name}` is deprecated and will be removed in Rails 6.2.
560
+ Using `bin/rails db:structure:dump:#{name}` is deprecated and will be removed in Rails 7.0.
561
561
  Configure the format using `config.active_record.schema_format = :sql` to use `structure.sql` and run `bin/rails db:schema:dump:#{name}` instead.
562
562
  MSG
563
563
  db_namespace["schema:dump:#{name}"].invoke
@@ -571,7 +571,7 @@ db_namespace = namespace :db do
571
571
  desc "Recreates the #{name} database from the structure.sql file"
572
572
  task name => :load_config do
573
573
  ActiveSupport::Deprecation.warn(<<-MSG.squish)
574
- Using `bin/rails db:structure:load:#{name}` is deprecated and will be removed in Rails 6.2.
574
+ Using `bin/rails db:structure:load:#{name}` is deprecated and will be removed in Rails 7.0.
575
575
  Configure the format using `config.active_record.schema_format = :sql` to use `structure.sql` and run `bin/rails db:schema:load:#{name}` instead.
576
576
  MSG
577
577
  db_namespace["schema:load:#{name}"].invoke
@@ -603,7 +603,7 @@ db_namespace = namespace :db do
603
603
  # desc "Recreate the test database from an existent structure.sql file"
604
604
  task load_structure: %w(db:test:purge) do
605
605
  ActiveSupport::Deprecation.warn(<<-MSG.squish)
606
- Using `bin/rails db:test:load_structure` is deprecated and will be removed in Rails 6.2.
606
+ Using `bin/rails db:test:load_structure` is deprecated and will be removed in Rails 7.0.
607
607
  Configure the format using `config.active_record.schema_format = :sql` to use `structure.sql` and run `bin/rails db:test:load_schema` instead.
608
608
  MSG
609
609
  db_namespace["test:load_schema"].invoke
@@ -650,7 +650,7 @@ db_namespace = namespace :db do
650
650
  namespace :load_structure do
651
651
  task name => "db:test:purge:#{name}" do
652
652
  ActiveSupport::Deprecation.warn(<<-MSG.squish)
653
- Using `bin/rails db:test:load_structure:#{name}` is deprecated and will be removed in Rails 6.2.
653
+ Using `bin/rails db:test:load_structure:#{name}` is deprecated and will be removed in Rails 7.0.
654
654
  Configure the format using `config.active_record.schema_format = :sql` to use `structure.sql` and run `bin/rails db:test:load_structure:#{name}` instead.
655
655
  MSG
656
656
  db_namespace["test:load_schema:#{name}"].invoke
@@ -321,8 +321,8 @@ module ActiveRecord
321
321
 
322
322
  unless group_fields == group_values
323
323
  ActiveSupport::Deprecation.warn(<<-MSG.squish)
324
- `#{operation}` with group by duplicated fields does no longer affect to result in Rails 6.2.
325
- To migrate to Rails 6.2's behavior, use `uniq!(:group)` to deduplicate group fields
324
+ `#{operation}` with group by duplicated fields does no longer affect to result in Rails 7.0.
325
+ To migrate to Rails 7.0's behavior, use `uniq!(:group)` to deduplicate group fields
326
326
  (`#{klass.name&.tableize || klass.table_name}.uniq!(:group).#{operation}(#{column_name.inspect})`).
327
327
  MSG
328
328
  group_fields = group_values
@@ -369,7 +369,7 @@ module ActiveRecord
369
369
  blank_value = order_values.first
370
370
  ActiveSupport::Deprecation.warn(<<~MSG.squish)
371
371
  `.reorder(#{blank_value.inspect})` with `.first` / `.first!` no longer
372
- takes non-deterministic result in Rails 6.2.
372
+ takes non-deterministic result in Rails 7.0.
373
373
  To continue taking non-deterministic result, use `.take` / `.take!` instead.
374
374
  MSG
375
375
  end
@@ -1035,6 +1035,8 @@ module ActiveRecord
1035
1035
  # # SELECT "users"."name" FROM "users" /* selecting */ /* user */ /* names */
1036
1036
  #
1037
1037
  # The SQL block comment delimiters, "/*" and "*/", will be added automatically.
1038
+ #
1039
+ # Some escaping is performed, however untrusted user input should not be used.
1038
1040
  def annotate(*args)
1039
1041
  check_if_method_has_arguments!(:annotate, args)
1040
1042
  spawn.annotate!(*args)
@@ -1157,8 +1159,8 @@ module ActiveRecord
1157
1159
  annotates = annotates.uniq if annotates.size > 1
1158
1160
  unless annotates == annotate_values
1159
1161
  ActiveSupport::Deprecation.warn(<<-MSG.squish)
1160
- Duplicated query annotations are no longer shown in queries in Rails 6.2.
1161
- To migrate to Rails 6.2's behavior, use `uniq!(:annotate)` to deduplicate query annotations
1162
+ Duplicated query annotations are no longer shown in queries in Rails 7.0.
1163
+ To migrate to Rails 7.0's behavior, use `uniq!(:annotate)` to deduplicate query annotations
1162
1164
  (`#{klass.name&.tableize || klass.table_name}.uniq!(:annotate)`).
1163
1165
  MSG
1164
1166
  annotates = annotate_values
@@ -168,8 +168,8 @@ module ActiveRecord
168
168
  else
169
169
  ActiveSupport::Deprecation.warn(<<-MSG.squish)
170
170
  Merging (#{node.to_sql}) and (#{ref.to_sql}) no longer maintain
171
- both conditions, and will be replaced by the latter in Rails 6.2.
172
- To migrate to Rails 6.2's behavior, use `relation.merge(other, rewhere: true)`.
171
+ both conditions, and will be replaced by the latter in Rails 7.0.
172
+ To migrate to Rails 7.0's behavior, use `relation.merge(other, rewhere: true)`.
173
173
  MSG
174
174
  false
175
175
  end
@@ -268,7 +268,7 @@ module ActiveRecord
268
268
  end
269
269
 
270
270
  def dump(obj)
271
- @coder.dump self.class.as_indifferent_hash(obj)
271
+ @coder.dump as_regular_hash(obj)
272
272
  end
273
273
 
274
274
  def load(yaml)
@@ -285,6 +285,11 @@ module ActiveRecord
285
285
  ActiveSupport::HashWithIndifferentAccess.new
286
286
  end
287
287
  end
288
+
289
+ private
290
+ def as_regular_hash(obj)
291
+ obj.respond_to?(:to_hash) ? obj.to_hash : {}
292
+ end
288
293
  end
289
294
  end
290
295
  end
@@ -340,7 +340,7 @@ module ActiveRecord
340
340
  db_config = resolve_configuration(configuration)
341
341
 
342
342
  if environment || name
343
- ActiveSupport::Deprecation.warn("`environment` and `name` will be removed as parameters in 6.2.0, you may now pass an ActiveRecord::DatabaseConfigurations::DatabaseConfig as `configuration` instead.")
343
+ ActiveSupport::Deprecation.warn("`environment` and `name` will be removed as parameters in 7.0.0, you may now pass an ActiveRecord::DatabaseConfigurations::DatabaseConfig as `configuration` instead.")
344
344
  end
345
345
 
346
346
  name ||= db_config.name
@@ -134,7 +134,7 @@ module ActiveRecord
134
134
  @connection_subscriber = ActiveSupport::Notifications.subscribe("!connection.active_record") do |_, _, _, _, payload|
135
135
  spec_name = payload[:spec_name] if payload.key?(:spec_name)
136
136
  shard = payload[:shard] if payload.key?(:shard)
137
- setup_shared_connection_pool
137
+ setup_shared_connection_pool if ActiveRecord::Base.legacy_connection_handling
138
138
 
139
139
  if spec_name
140
140
  begin
@@ -143,10 +143,14 @@ module ActiveRecord
143
143
  connection = nil
144
144
  end
145
145
 
146
- if connection && !@fixture_connections.include?(connection)
147
- connection.begin_transaction joinable: false, _lazy: false
148
- connection.pool.lock_thread = true if lock_threads
149
- @fixture_connections << connection
146
+ if connection
147
+ setup_shared_connection_pool unless ActiveRecord::Base.legacy_connection_handling
148
+
149
+ if !@fixture_connections.include?(connection)
150
+ connection.begin_transaction joinable: false, _lazy: false
151
+ connection.pool.lock_thread = true if lock_threads
152
+ @fixture_connections << connection
153
+ end
150
154
  end
151
155
  end
152
156
  end
data/lib/active_record.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  #--
4
- # Copyright (c) 2004-2020 David Heinemeier Hansson
4
+ # Copyright (c) 2004-2022 David Heinemeier Hansson
5
5
  #
6
6
  # Permission is hereby granted, free of charge, to any person obtaining
7
7
  # a copy of this software and associated documentation files (the
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: activerecord
3
3
  version: !ruby/object:Gem::Version
4
- version: 6.1.4.2
4
+ version: 6.1.7.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Heinemeier Hansson
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-12-14 00:00:00.000000000 Z
11
+ date: 2024-02-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -16,28 +16,28 @@ dependencies:
16
16
  requirements:
17
17
  - - '='
18
18
  - !ruby/object:Gem::Version
19
- version: 6.1.4.2
19
+ version: 6.1.7.7
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - '='
25
25
  - !ruby/object:Gem::Version
26
- version: 6.1.4.2
26
+ version: 6.1.7.7
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: activemodel
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - '='
32
32
  - !ruby/object:Gem::Version
33
- version: 6.1.4.2
33
+ version: 6.1.7.7
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - '='
39
39
  - !ruby/object:Gem::Version
40
- version: 6.1.4.2
40
+ version: 6.1.7.7
41
41
  description: Databases on Rails. Build a persistent domain model by mapping database
42
42
  tables to Ruby classes. Strong conventions for associations, validations, aggregations,
43
43
  migrations, and testing come baked-in.
@@ -390,10 +390,11 @@ licenses:
390
390
  - MIT
391
391
  metadata:
392
392
  bug_tracker_uri: https://github.com/rails/rails/issues
393
- changelog_uri: https://github.com/rails/rails/blob/v6.1.4.2/activerecord/CHANGELOG.md
394
- documentation_uri: https://api.rubyonrails.org/v6.1.4.2/
393
+ changelog_uri: https://github.com/rails/rails/blob/v6.1.7.7/activerecord/CHANGELOG.md
394
+ documentation_uri: https://api.rubyonrails.org/v6.1.7.7/
395
395
  mailing_list_uri: https://discuss.rubyonrails.org/c/rubyonrails-talk
396
- source_code_uri: https://github.com/rails/rails/tree/v6.1.4.2/activerecord
396
+ source_code_uri: https://github.com/rails/rails/tree/v6.1.7.7/activerecord
397
+ rubygems_mfa_required: 'true'
397
398
  post_install_message:
398
399
  rdoc_options:
399
400
  - "--main"
@@ -411,7 +412,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
411
412
  - !ruby/object:Gem::Version
412
413
  version: '0'
413
414
  requirements: []
414
- rubygems_version: 3.2.15
415
+ rubygems_version: 3.2.22
415
416
  signing_key:
416
417
  specification_version: 4
417
418
  summary: Object-relational mapper framework (part of Rails).