activerecord 7.1.0 → 7.1.2
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 +95 -0
- data/README.rdoc +1 -0
- data/lib/active_record/associations.rb +14 -14
- data/lib/active_record/attribute_methods/dirty.rb +13 -9
- data/lib/active_record/callbacks.rb +2 -2
- data/lib/active_record/connection_adapters/abstract/database_statements.rb +5 -3
- data/lib/active_record/connection_adapters/abstract/schema_statements.rb +1 -3
- data/lib/active_record/connection_adapters/abstract_adapter.rb +13 -4
- data/lib/active_record/connection_adapters/mysql2/database_statements.rb +3 -0
- data/lib/active_record/connection_adapters/postgresql/column.rb +14 -2
- data/lib/active_record/connection_adapters/postgresql/database_statements.rb +4 -1
- data/lib/active_record/connection_adapters/postgresql/oid/money.rb +3 -2
- data/lib/active_record/connection_adapters/postgresql/oid/timestamp_with_time_zone.rb +1 -1
- data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +14 -6
- data/lib/active_record/connection_adapters/postgresql_adapter.rb +32 -32
- data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +10 -3
- data/lib/active_record/connection_adapters/trilogy/database_statements.rb +1 -0
- data/lib/active_record/core.rb +25 -24
- data/lib/active_record/encryption/extended_deterministic_queries.rb +0 -15
- data/lib/active_record/enum.rb +6 -9
- data/lib/active_record/gem_version.rb +1 -1
- data/lib/active_record/insert_all.rb +3 -3
- data/lib/active_record/internal_metadata.rb +3 -1
- data/lib/active_record/migration/command_recorder.rb +4 -1
- data/lib/active_record/migration/pending_migration_connection.rb +21 -0
- data/lib/active_record/migration.rb +6 -3
- data/lib/active_record/model_schema.rb +5 -5
- data/lib/active_record/nested_attributes.rb +7 -9
- data/lib/active_record/normalization.rb +8 -0
- data/lib/active_record/promise.rb +1 -1
- data/lib/active_record/railtie.rb +1 -1
- data/lib/active_record/railties/databases.rake +5 -5
- data/lib/active_record/reflection.rb +12 -0
- data/lib/active_record/relation/calculations.rb +16 -8
- data/lib/active_record/relation/query_methods.rb +1 -1
- data/lib/active_record/schema_migration.rb +1 -1
- data/lib/active_record/timestamp.rb +1 -1
- data/lib/arel/nodes/homogeneous_in.rb +1 -1
- metadata +10 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: dba30f1c9ab82b5a3e78337bcdb364d613e04a20e815c4b1f6952e1360d8e602
|
4
|
+
data.tar.gz: dc7470a1bc6823f31ec4c3b678df945ac4a32a2a1a642943909f47318af205f6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b85f866d527785cad076c222228e1b6ee39122b383663cc1fe81dcad6eb152c52dfb46ad86dee471f01525c5e074a382fbe5360fd99e78e7886d7169c2c60091
|
7
|
+
data.tar.gz: 5291b47487b7bdb83885687b2c6ca90fe5295ed0c017317585bbb712c125c28f66c4b3d5c7cceb0e041bd25be069854c365222179bad6dc360b9156e5f3753ae
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,94 @@
|
|
1
|
+
## Rails 7.1.2 (November 10, 2023) ##
|
2
|
+
|
3
|
+
* Fix renaming primary key index when renaming a table with a UUID primary key
|
4
|
+
in PostgreSQL.
|
5
|
+
|
6
|
+
*fatkodima*
|
7
|
+
|
8
|
+
* Fix `where(field: values)` queries when `field` is a serialized attribute
|
9
|
+
(for example, when `field` uses `ActiveRecord::Base.serialize` or is a JSON
|
10
|
+
column).
|
11
|
+
|
12
|
+
*João Alves*
|
13
|
+
|
14
|
+
* Prevent marking broken connections as verified.
|
15
|
+
|
16
|
+
*Daniel Colson*
|
17
|
+
|
18
|
+
* Don't mark Float::INFINITY as changed when reassigning it
|
19
|
+
|
20
|
+
When saving a record with a float infinite value, it shouldn't mark as changed
|
21
|
+
|
22
|
+
*Maicol Bentancor*
|
23
|
+
|
24
|
+
* `ActiveRecord::Base.table_name` now returns `nil` instead of raising
|
25
|
+
"undefined method `abstract_class?` for Object:Class".
|
26
|
+
|
27
|
+
*a5-stable*
|
28
|
+
|
29
|
+
* Fix upserting for custom `:on_duplicate` and `:unique_by` consisting of all
|
30
|
+
inserts keys.
|
31
|
+
|
32
|
+
*fatkodima*
|
33
|
+
|
34
|
+
* Fixed an [issue](https://github.com/rails/rails/issues/49809) where saving a
|
35
|
+
record could innappropriately `dup` its attributes.
|
36
|
+
|
37
|
+
*Jonathan Hefner*
|
38
|
+
|
39
|
+
* Dump schema only for a specific db for rollback/up/down tasks for multiple dbs.
|
40
|
+
|
41
|
+
*fatkodima*
|
42
|
+
|
43
|
+
* Fix `NoMethodError` when casting a PostgreSQL `money` value that uses a
|
44
|
+
comma as its radix point and has no leading currency symbol. For example,
|
45
|
+
when casting `"3,50"`.
|
46
|
+
|
47
|
+
*Andreas Reischuck* and *Jonathan Hefner*
|
48
|
+
|
49
|
+
* Re-enable support for using `enum` with non-column-backed attributes.
|
50
|
+
Non-column-backed attributes must be previously declared with an explicit
|
51
|
+
type. For example:
|
52
|
+
|
53
|
+
```ruby
|
54
|
+
class Post < ActiveRecord::Base
|
55
|
+
attribute :topic, :string
|
56
|
+
enum topic: %i[science tech engineering math]
|
57
|
+
end
|
58
|
+
```
|
59
|
+
|
60
|
+
*Jonathan Hefner*
|
61
|
+
|
62
|
+
* Raise on `foreign_key:` being passed as an array in associations
|
63
|
+
|
64
|
+
*Nikita Vasilevsky*
|
65
|
+
|
66
|
+
* Return back maximum allowed PostgreSQL table name to 63 characters.
|
67
|
+
|
68
|
+
*fatkodima*
|
69
|
+
|
70
|
+
* Fix detecting `IDENTITY` columns for PostgreSQL < 10.
|
71
|
+
|
72
|
+
*fatkodima*
|
73
|
+
|
74
|
+
|
75
|
+
## Rails 7.1.1 (October 11, 2023) ##
|
76
|
+
|
77
|
+
* Fix auto populating IDENTITY columns for PostgreSQL.
|
78
|
+
|
79
|
+
*fatkodima*
|
80
|
+
|
81
|
+
* Fix "ArgumentError: wrong number of arguments (given 3, expected 2)" when
|
82
|
+
down migrating `rename_table` in older migrations.
|
83
|
+
|
84
|
+
*fatkodima*
|
85
|
+
|
86
|
+
* Do not require the Action Text, Active Storage and Action Mailbox tables
|
87
|
+
to be present when running when running test on CI.
|
88
|
+
|
89
|
+
*Rafael Mendonça França*
|
90
|
+
|
91
|
+
|
1
92
|
## Rails 7.1.0 (October 05, 2023) ##
|
2
93
|
|
3
94
|
* No changes.
|
@@ -148,6 +239,10 @@
|
|
148
239
|
|
149
240
|
*Adam Hess*
|
150
241
|
|
242
|
+
* Deprecate aliasing non-attributes with `alias_attribute`.
|
243
|
+
|
244
|
+
*Ian Candy*
|
245
|
+
|
151
246
|
* Fix unscope is not working in specific case
|
152
247
|
|
153
248
|
Before:
|
data/README.rdoc
CHANGED
@@ -166,6 +166,7 @@ Active Record is an implementation of the object-relational mapping (ORM)
|
|
166
166
|
pattern[https://www.martinfowler.com/eaaCatalog/activeRecord.html] by the same
|
167
167
|
name described by Martin Fowler:
|
168
168
|
|
169
|
+
>>>
|
169
170
|
"An object that wraps a row in a database table or view,
|
170
171
|
encapsulates the database access, and adds domain logic on that data."
|
171
172
|
|
@@ -1339,7 +1339,7 @@ module ActiveRecord
|
|
1339
1339
|
# Returns a Relation of all of the associated objects, forcing a database read.
|
1340
1340
|
# An empty Relation is returned if none are found.
|
1341
1341
|
#
|
1342
|
-
#
|
1342
|
+
# ==== Example
|
1343
1343
|
#
|
1344
1344
|
# class Firm < ActiveRecord::Base
|
1345
1345
|
# has_many :clients
|
@@ -1369,7 +1369,7 @@ module ActiveRecord
|
|
1369
1369
|
#
|
1370
1370
|
# The declaration can also include an +options+ hash to specialize the behavior of the association.
|
1371
1371
|
#
|
1372
|
-
#
|
1372
|
+
# ==== Scopes
|
1373
1373
|
#
|
1374
1374
|
# You can pass a second argument +scope+ as a callable (i.e. proc or
|
1375
1375
|
# lambda) to retrieve a specific set of records or customize the generated
|
@@ -1380,7 +1380,7 @@ module ActiveRecord
|
|
1380
1380
|
# has_many :employees, -> { joins(:address) }
|
1381
1381
|
# has_many :posts, ->(blog) { where("max_post_length > ?", blog.max_post_length) }
|
1382
1382
|
#
|
1383
|
-
#
|
1383
|
+
# ==== Extensions
|
1384
1384
|
#
|
1385
1385
|
# The +extension+ argument allows you to pass a block into a has_many
|
1386
1386
|
# association. This is useful for adding new finders, creators, and other
|
@@ -1394,7 +1394,7 @@ module ActiveRecord
|
|
1394
1394
|
# end
|
1395
1395
|
# end
|
1396
1396
|
#
|
1397
|
-
#
|
1397
|
+
# ==== Options
|
1398
1398
|
# [+:class_name+]
|
1399
1399
|
# Specify the class name of the association. Use it only if that name can't be inferred
|
1400
1400
|
# from the association name. So <tt>has_many :products</tt> will by default be linked
|
@@ -1556,7 +1556,7 @@ module ActiveRecord
|
|
1556
1556
|
# [<tt>reset_association</tt>]
|
1557
1557
|
# Unloads the associated object. The next access will query it from the database.
|
1558
1558
|
#
|
1559
|
-
#
|
1559
|
+
# ==== Example
|
1560
1560
|
#
|
1561
1561
|
# class Account < ActiveRecord::Base
|
1562
1562
|
# has_one :beneficiary
|
@@ -1575,7 +1575,7 @@ module ActiveRecord
|
|
1575
1575
|
# account.reload_beneficiary
|
1576
1576
|
# account.reset_beneficiary
|
1577
1577
|
#
|
1578
|
-
#
|
1578
|
+
# ==== Scopes
|
1579
1579
|
#
|
1580
1580
|
# You can pass a second argument +scope+ as a callable (i.e. proc or
|
1581
1581
|
# lambda) to retrieve a specific record or customize the generated query
|
@@ -1586,7 +1586,7 @@ module ActiveRecord
|
|
1586
1586
|
# has_one :employer, -> { joins(:company) }
|
1587
1587
|
# has_one :latest_post, ->(blog) { where("created_at > ?", blog.enabled_at) }
|
1588
1588
|
#
|
1589
|
-
#
|
1589
|
+
# ==== Options
|
1590
1590
|
#
|
1591
1591
|
# The declaration can also include an +options+ hash to specialize the behavior of the association.
|
1592
1592
|
#
|
@@ -1745,7 +1745,7 @@ module ActiveRecord
|
|
1745
1745
|
# [<tt>association_previously_changed?</tt>]
|
1746
1746
|
# Returns true if the previous save updated the association to reference a new associate object.
|
1747
1747
|
#
|
1748
|
-
#
|
1748
|
+
# ==== Example
|
1749
1749
|
#
|
1750
1750
|
# class Post < ActiveRecord::Base
|
1751
1751
|
# belongs_to :author
|
@@ -1766,7 +1766,7 @@ module ActiveRecord
|
|
1766
1766
|
# post.author_changed?
|
1767
1767
|
# post.author_previously_changed?
|
1768
1768
|
#
|
1769
|
-
#
|
1769
|
+
# ==== Scopes
|
1770
1770
|
#
|
1771
1771
|
# You can pass a second argument +scope+ as a callable (i.e. proc or
|
1772
1772
|
# lambda) to retrieve a specific record or customize the generated query
|
@@ -1777,7 +1777,7 @@ module ActiveRecord
|
|
1777
1777
|
# belongs_to :user, -> { joins(:friends) }
|
1778
1778
|
# belongs_to :level, ->(game) { where("game_level > ?", game.current_level) }
|
1779
1779
|
#
|
1780
|
-
#
|
1780
|
+
# ==== Options
|
1781
1781
|
#
|
1782
1782
|
# The declaration can also include an +options+ hash to specialize the behavior of the association.
|
1783
1783
|
#
|
@@ -1964,7 +1964,7 @@ module ActiveRecord
|
|
1964
1964
|
# Returns a Relation of all of the associated objects, forcing a database read.
|
1965
1965
|
# An empty Relation is returned if none are found.
|
1966
1966
|
#
|
1967
|
-
#
|
1967
|
+
# ==== Example
|
1968
1968
|
#
|
1969
1969
|
# class Developer < ActiveRecord::Base
|
1970
1970
|
# has_and_belongs_to_many :projects
|
@@ -1993,7 +1993,7 @@ module ActiveRecord
|
|
1993
1993
|
#
|
1994
1994
|
# The declaration may include an +options+ hash to specialize the behavior of the association.
|
1995
1995
|
#
|
1996
|
-
#
|
1996
|
+
# ==== Scopes
|
1997
1997
|
#
|
1998
1998
|
# You can pass a second argument +scope+ as a callable (i.e. proc or
|
1999
1999
|
# lambda) to retrieve a specific set of records or customize the generated
|
@@ -2005,7 +2005,7 @@ module ActiveRecord
|
|
2005
2005
|
# where("default_category = ?", post.default_category)
|
2006
2006
|
# }
|
2007
2007
|
#
|
2008
|
-
#
|
2008
|
+
# ==== Extensions
|
2009
2009
|
#
|
2010
2010
|
# The +extension+ argument allows you to pass a block into a
|
2011
2011
|
# has_and_belongs_to_many association. This is useful for adding new
|
@@ -2020,7 +2020,7 @@ module ActiveRecord
|
|
2020
2020
|
# end
|
2021
2021
|
# end
|
2022
2022
|
#
|
2023
|
-
#
|
2023
|
+
# ==== Options
|
2024
2024
|
#
|
2025
2025
|
# [+:class_name+]
|
2026
2026
|
# Specify the class name of the association. Use it only if that name can't be inferred
|
@@ -7,7 +7,7 @@ module ActiveRecord
|
|
7
7
|
# = Active Record Attribute Methods \Dirty
|
8
8
|
#
|
9
9
|
# Provides a way to track changes in your Active Record models. It adds all
|
10
|
-
# methods from ActiveModel::Dirty and adds database
|
10
|
+
# methods from ActiveModel::Dirty and adds database-specific methods.
|
11
11
|
#
|
12
12
|
# A newly created +Person+ object is unchanged:
|
13
13
|
#
|
@@ -76,11 +76,13 @@ module ActiveRecord
|
|
76
76
|
#
|
77
77
|
# ==== Options
|
78
78
|
#
|
79
|
-
# +from+
|
80
|
-
#
|
79
|
+
# [+from+]
|
80
|
+
# When specified, this method will return false unless the original
|
81
|
+
# value is equal to the given value.
|
81
82
|
#
|
82
|
-
# +to+
|
83
|
-
#
|
83
|
+
# [+to+]
|
84
|
+
# When specified, this method will return false unless the value will be
|
85
|
+
# changed to the given value.
|
84
86
|
def saved_change_to_attribute?(attr_name, **options)
|
85
87
|
mutations_before_last_save.changed?(attr_name.to_s, **options)
|
86
88
|
end
|
@@ -126,11 +128,13 @@ module ActiveRecord
|
|
126
128
|
#
|
127
129
|
# ==== Options
|
128
130
|
#
|
129
|
-
# +from+
|
130
|
-
#
|
131
|
+
# [+from+]
|
132
|
+
# When specified, this method will return false unless the original
|
133
|
+
# value is equal to the given value.
|
131
134
|
#
|
132
|
-
# +to+
|
133
|
-
#
|
135
|
+
# [+to+]
|
136
|
+
# When specified, this method will return false unless the value will be
|
137
|
+
# changed to the given value.
|
134
138
|
def will_save_change_to_attribute?(attr_name, **options)
|
135
139
|
mutations_from_database.changed?(attr_name.to_s, **options)
|
136
140
|
end
|
@@ -241,8 +241,8 @@ module ActiveRecord
|
|
241
241
|
#
|
242
242
|
# config.active_record.run_after_transaction_callbacks_in_order_defined = false
|
243
243
|
#
|
244
|
-
#
|
245
|
-
# are defined, just like the example above.
|
244
|
+
# When set to +true+ (the default from \Rails 7.1), callbacks are executed in the order they
|
245
|
+
# are defined, just like the example above. When set to +false+, the order is reversed, so
|
246
246
|
# +do_something_else+ is executed before +log_children+.
|
247
247
|
#
|
248
248
|
# == \Transactions
|
@@ -189,8 +189,10 @@ module ActiveRecord
|
|
189
189
|
def insert(arel, name = nil, pk = nil, id_value = nil, sequence_name = nil, binds = [], returning: nil)
|
190
190
|
sql, binds = to_sql_and_binds(arel, binds)
|
191
191
|
value = exec_insert(sql, name, binds, pk, sequence_name, returning: returning)
|
192
|
-
|
193
|
-
|
192
|
+
|
193
|
+
return returning_column_values(value) unless returning.nil?
|
194
|
+
|
195
|
+
id_value || last_inserted_id(value)
|
194
196
|
end
|
195
197
|
alias create insert
|
196
198
|
|
@@ -673,7 +675,7 @@ module ActiveRecord
|
|
673
675
|
|
674
676
|
def extract_table_ref_from_insert_sql(sql)
|
675
677
|
if sql =~ /into\s("[A-Za-z0-9_."\[\]\s]+"|[A-Za-z0-9_."\[\]]+)\s*/im
|
676
|
-
$1.strip
|
678
|
+
$1.delete('"').strip
|
677
679
|
end
|
678
680
|
end
|
679
681
|
end
|
@@ -983,7 +983,6 @@ module ActiveRecord
|
|
983
983
|
# Adds a reference. The reference column is a bigint by default,
|
984
984
|
# the <tt>:type</tt> option can be used to specify a different type.
|
985
985
|
# Optionally adds a +_type+ column, if <tt>:polymorphic</tt> option is provided.
|
986
|
-
# #add_reference and #add_belongs_to are acceptable.
|
987
986
|
#
|
988
987
|
# The +options+ hash can include the following keys:
|
989
988
|
# [<tt>:type</tt>]
|
@@ -1034,7 +1033,6 @@ module ActiveRecord
|
|
1034
1033
|
alias :add_belongs_to :add_reference
|
1035
1034
|
|
1036
1035
|
# Removes the reference(s). Also removes a +type+ column if one exists.
|
1037
|
-
# #remove_reference and #remove_belongs_to are acceptable.
|
1038
1036
|
#
|
1039
1037
|
# ====== Remove the reference
|
1040
1038
|
#
|
@@ -1400,7 +1398,7 @@ module ActiveRecord
|
|
1400
1398
|
|
1401
1399
|
limited = relation.reselect(values).distinct!
|
1402
1400
|
limited_ids = select_rows(limited.arel, "SQL").map do |results|
|
1403
|
-
results.last(Array(relation.primary_key).length) # ignores order values for MySQL and
|
1401
|
+
results.last(Array(relation.primary_key).length) # ignores order values for MySQL and PostgreSQL
|
1404
1402
|
end
|
1405
1403
|
|
1406
1404
|
if limited_ids.empty?
|
@@ -970,7 +970,11 @@ module ActiveRecord
|
|
970
970
|
# If +allow_retry+ is true, a connection-related exception will
|
971
971
|
# cause an automatic reconnect and re-run of the block, up to
|
972
972
|
# the connection's configured +connection_retries+ setting
|
973
|
-
# and the configured +retry_deadline+ limit.
|
973
|
+
# and the configured +retry_deadline+ limit. (Note that when
|
974
|
+
# +allow_retry+ is true, it's possible to return without having marked
|
975
|
+
# the connection as verified. If the block is guaranteed to exercise the
|
976
|
+
# connection, consider calling `verified!` to avoid needless
|
977
|
+
# verification queries in subsequent calls.)
|
974
978
|
#
|
975
979
|
# If +materialize_transactions+ is false, the block will be run without
|
976
980
|
# ensuring virtual transactions have been materialized in the DB
|
@@ -1021,9 +1025,7 @@ module ActiveRecord
|
|
1021
1025
|
end
|
1022
1026
|
|
1023
1027
|
begin
|
1024
|
-
|
1025
|
-
@verified = true
|
1026
|
-
result
|
1028
|
+
yield @raw_connection
|
1027
1029
|
rescue => original_exception
|
1028
1030
|
translated_exception = translate_exception_class(original_exception, nil, nil)
|
1029
1031
|
invalidate_transaction(translated_exception)
|
@@ -1058,6 +1060,13 @@ module ActiveRecord
|
|
1058
1060
|
end
|
1059
1061
|
end
|
1060
1062
|
|
1063
|
+
# Mark the connection as verified. Call this inside a
|
1064
|
+
# `with_raw_connection` block only when the block is guaranteed to
|
1065
|
+
# exercise the raw connection.
|
1066
|
+
def verified!
|
1067
|
+
@verified = true
|
1068
|
+
end
|
1069
|
+
|
1061
1070
|
def retryable_connection_error?(exception)
|
1062
1071
|
exception.is_a?(ConnectionNotEstablished) || exception.is_a?(ConnectionFailed)
|
1063
1072
|
end
|
@@ -98,6 +98,7 @@ module ActiveRecord
|
|
98
98
|
with_raw_connection(allow_retry: allow_retry, materialize_transactions: materialize_transactions) do |conn|
|
99
99
|
sync_timezone_changes(conn)
|
100
100
|
result = conn.query(sql)
|
101
|
+
verified!
|
101
102
|
handle_warnings(sql)
|
102
103
|
result
|
103
104
|
end
|
@@ -126,6 +127,8 @@ module ActiveRecord
|
|
126
127
|
result = ActiveSupport::Dependencies.interlock.permit_concurrent_loads do
|
127
128
|
stmt.execute(*type_casted_binds)
|
128
129
|
end
|
130
|
+
verified!
|
131
|
+
result
|
129
132
|
rescue ::Mysql2::Error => e
|
130
133
|
if cache_stmt
|
131
134
|
@statements.delete(sql)
|
@@ -6,16 +6,24 @@ module ActiveRecord
|
|
6
6
|
class Column < ConnectionAdapters::Column # :nodoc:
|
7
7
|
delegate :oid, :fmod, to: :sql_type_metadata
|
8
8
|
|
9
|
-
def initialize(*, serial: nil, generated: nil, **)
|
9
|
+
def initialize(*, serial: nil, identity: nil, generated: nil, **)
|
10
10
|
super
|
11
11
|
@serial = serial
|
12
|
+
@identity = identity
|
12
13
|
@generated = generated
|
13
14
|
end
|
14
15
|
|
16
|
+
def identity?
|
17
|
+
@identity
|
18
|
+
end
|
19
|
+
|
15
20
|
def serial?
|
16
21
|
@serial
|
17
22
|
end
|
18
|
-
|
23
|
+
|
24
|
+
def auto_incremented_by_db?
|
25
|
+
serial? || identity?
|
26
|
+
end
|
19
27
|
|
20
28
|
def virtual?
|
21
29
|
# We assume every generated column is virtual, no matter the concrete type
|
@@ -41,12 +49,14 @@ module ActiveRecord
|
|
41
49
|
|
42
50
|
def init_with(coder)
|
43
51
|
@serial = coder["serial"]
|
52
|
+
@identity = coder["identity"]
|
44
53
|
@generated = coder["generated"]
|
45
54
|
super
|
46
55
|
end
|
47
56
|
|
48
57
|
def encode_with(coder)
|
49
58
|
coder["serial"] = @serial
|
59
|
+
coder["identity"] = @identity
|
50
60
|
coder["generated"] = @generated
|
51
61
|
super
|
52
62
|
end
|
@@ -54,6 +64,7 @@ module ActiveRecord
|
|
54
64
|
def ==(other)
|
55
65
|
other.is_a?(Column) &&
|
56
66
|
super &&
|
67
|
+
identity? == other.identity? &&
|
57
68
|
serial? == other.serial?
|
58
69
|
end
|
59
70
|
alias :eql? :==
|
@@ -61,6 +72,7 @@ module ActiveRecord
|
|
61
72
|
def hash
|
62
73
|
Column.hash ^
|
63
74
|
super.hash ^
|
75
|
+
identity?.hash ^
|
64
76
|
serial?.hash
|
65
77
|
end
|
66
78
|
end
|
@@ -16,7 +16,9 @@ module ActiveRecord
|
|
16
16
|
|
17
17
|
log(sql, name) do
|
18
18
|
with_raw_connection do |conn|
|
19
|
-
conn.async_exec(sql).map_types!(@type_map_for_results).values
|
19
|
+
result = conn.async_exec(sql).map_types!(@type_map_for_results).values
|
20
|
+
verified!
|
21
|
+
result
|
20
22
|
end
|
21
23
|
end
|
22
24
|
end
|
@@ -51,6 +53,7 @@ module ActiveRecord
|
|
51
53
|
log(sql, name, async: async) do
|
52
54
|
with_raw_connection(allow_retry: allow_retry, materialize_transactions: materialize_transactions) do |conn|
|
53
55
|
result = conn.async_exec(sql)
|
56
|
+
verified!
|
54
57
|
handle_warnings(result)
|
55
58
|
result
|
56
59
|
end
|
@@ -27,9 +27,10 @@ module ActiveRecord
|
|
27
27
|
value = value.sub(/^\((.+)\)$/, '-\1') # (4)
|
28
28
|
case value
|
29
29
|
when /^-?\D*+[\d,]+\.\d{2}$/ # (1)
|
30
|
-
value.
|
30
|
+
value.delete!("^-0-9.")
|
31
31
|
when /^-?\D*+[\d.]+,\d{2}$/ # (2)
|
32
|
-
value.
|
32
|
+
value.delete!("^-0-9,")
|
33
|
+
value.tr!(",", ".")
|
33
34
|
end
|
34
35
|
|
35
36
|
super(value)
|
@@ -15,7 +15,7 @@ module ActiveRecord
|
|
15
15
|
time = super
|
16
16
|
return time if time.is_a?(ActiveSupport::TimeWithZone) || !time.acts_like?(:time)
|
17
17
|
|
18
|
-
# While in UTC mode, the PG gem may not return times back in "UTC" even if they were provided to
|
18
|
+
# While in UTC mode, the PG gem may not return times back in "UTC" even if they were provided to PostgreSQL in UTC.
|
19
19
|
# We prefer times always in UTC, so here we convert back.
|
20
20
|
if is_utc?
|
21
21
|
time.getutc
|
@@ -341,7 +341,7 @@ module ActiveRecord
|
|
341
341
|
JOIN pg_namespace nsp ON (t.relnamespace = nsp.oid)
|
342
342
|
WHERE t.oid = #{quote(quote_table_name(table))}::regclass
|
343
343
|
AND cons.contype = 'p'
|
344
|
-
AND pg_get_expr(def.adbin, def.adrelid) ~* 'nextval|uuid_generate'
|
344
|
+
AND pg_get_expr(def.adbin, def.adrelid) ~* 'nextval|uuid_generate|gen_random_uuid'
|
345
345
|
SQL
|
346
346
|
end
|
347
347
|
|
@@ -385,11 +385,18 @@ module ActiveRecord
|
|
385
385
|
execute "ALTER TABLE #{quote_table_name(table_name)} RENAME TO #{quote_table_name(new_name)}"
|
386
386
|
pk, seq = pk_and_sequence_for(new_name)
|
387
387
|
if pk
|
388
|
-
|
389
|
-
|
388
|
+
# PostgreSQL automatically creates an index for PRIMARY KEY with name consisting of
|
389
|
+
# truncated table name and "_pkey" suffix fitting into max_identifier_length number of characters.
|
390
|
+
max_pkey_prefix = max_identifier_length - "_pkey".size
|
391
|
+
idx = "#{table_name[0, max_pkey_prefix]}_pkey"
|
392
|
+
new_idx = "#{new_name[0, max_pkey_prefix]}_pkey"
|
390
393
|
execute "ALTER INDEX #{quote_table_name(idx)} RENAME TO #{quote_table_name(new_idx)}"
|
391
|
-
|
392
|
-
|
394
|
+
|
395
|
+
# PostgreSQL automatically creates a sequence for PRIMARY KEY with name consisting of
|
396
|
+
# truncated table name and "#{primary_key}_seq" suffix fitting into max_identifier_length number of characters.
|
397
|
+
max_seq_prefix = max_identifier_length - "_#{pk}_seq".size
|
398
|
+
if seq && seq.identifier == "#{table_name[0, max_seq_prefix]}_#{pk}_seq"
|
399
|
+
new_seq = "#{new_name[0, max_seq_prefix]}_#{pk}_seq"
|
393
400
|
execute "ALTER TABLE #{seq.quoted} RENAME TO #{quote_table_name(new_seq)}"
|
394
401
|
end
|
395
402
|
end
|
@@ -908,7 +915,7 @@ module ActiveRecord
|
|
908
915
|
end
|
909
916
|
|
910
917
|
def new_column_from_field(table_name, field, _definitions)
|
911
|
-
column_name, type, default, notnull, oid, fmod, collation, comment, attgenerated = field
|
918
|
+
column_name, type, default, notnull, oid, fmod, collation, comment, identity, attgenerated = field
|
912
919
|
type_metadata = fetch_type_metadata(column_name, type, oid.to_i, fmod.to_i)
|
913
920
|
default_value = extract_value_from_default(default)
|
914
921
|
|
@@ -931,6 +938,7 @@ module ActiveRecord
|
|
931
938
|
collation: collation,
|
932
939
|
comment: comment.presence,
|
933
940
|
serial: serial,
|
941
|
+
identity: identity.presence,
|
934
942
|
generated: attgenerated
|
935
943
|
)
|
936
944
|
end
|