activerecord-cockroachdb-adapter 6.1.8 → 7.0.0
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 +19 -1
- data/Gemfile +6 -4
- data/README.md +4 -2
- data/activerecord-cockroachdb-adapter.gemspec +3 -1
- data/build/teamcity-test.sh +4 -9
- data/lib/active_record/connection_adapters/cockroachdb/column.rb +11 -2
- data/lib/active_record/connection_adapters/cockroachdb/database_statements.rb +2 -1
- data/lib/active_record/connection_adapters/cockroachdb/oid/date_time.rb +21 -0
- data/lib/active_record/connection_adapters/cockroachdb/quoting.rb +1 -3
- data/lib/active_record/connection_adapters/cockroachdb/referential_integrity.rb +23 -9
- data/lib/active_record/connection_adapters/cockroachdb/schema_creation.rb +18 -0
- data/lib/active_record/connection_adapters/cockroachdb/schema_dumper.rb +19 -0
- data/lib/active_record/connection_adapters/cockroachdb/schema_statements.rb +12 -2
- data/lib/active_record/connection_adapters/cockroachdb_adapter.rb +45 -8
- data/lib/active_record/migration/cockroachdb/compatibility.rb +28 -0
- data/lib/version.rb +1 -1
- metadata +22 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c8f39021d1353c56c2830adac978ec3336f993bdb46e670f4c975be8d2c307c5
|
4
|
+
data.tar.gz: 8ea587bc12a5e5bc806901d28c7e67e9f63a0c2f5dfc769f2370ab4dd3f20c65
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6c7fca690e7203047ffeac709b9a62165c96f3ccb7ec26f3fe412daffc979f62ec392117912e15af15865aacf9f2b09bf2ff4d2efc155ee1f3dcbef1b2a213bb
|
7
|
+
data.tar.gz: 55cf42b3a055eabbec2045dac6650d50a96a085794dc2ef6bbb08efb44182daff7664720292f720099c3b08239edafbe1ae668779aa975426d9d8905fe98620b
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,23 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
## 7.0.0 - 2022-06-02
|
4
|
+
|
5
|
+
- Add support for Active Record 7.0.3
|
6
|
+
|
7
|
+
## 6.1.10 - 2022-05-06
|
8
|
+
|
9
|
+
- Disable supports_expression_index regardless of CockroachDB version until
|
10
|
+
`ON CONFLICT expression` is supported.
|
11
|
+
|
12
|
+
See https://github.com/cockroachdb/cockroach/issues/67893.
|
13
|
+
|
14
|
+
## 6.1.9 - 2022-04-26
|
15
|
+
|
16
|
+
- Fix bug where duplicate `rowid` columns would be created when loading
|
17
|
+
a schema dump of a table that was not created with an explicit primary key.
|
18
|
+
- Support the NOT VISIBLE syntax from CockroachDB, by using the `hidden`
|
19
|
+
column modifier in the Rails schema.
|
20
|
+
|
3
21
|
## 6.1.8 - 2022-03-14
|
4
22
|
|
5
23
|
- Add a test helper from https://github.com/rails/rails/pull/40822
|
@@ -32,7 +50,7 @@
|
|
32
50
|
|
33
51
|
## 6.1.1 - 2021-05-14
|
34
52
|
|
35
|
-
- Fix a bug where starting the driver can result in a NoDatabaseError.
|
53
|
+
- Fix a bug where starting the driver can result in a NoDatabaseError.
|
36
54
|
|
37
55
|
## 6.1.0 - 2021-04-26
|
38
56
|
|
data/Gemfile
CHANGED
@@ -54,10 +54,12 @@ end
|
|
54
54
|
|
55
55
|
group :development do
|
56
56
|
gem "byebug"
|
57
|
-
gem "minitest-excludes"
|
57
|
+
gem "minitest-excludes", "~> 2.0.1"
|
58
58
|
|
59
59
|
# Gems used by the ActiveRecord test suite
|
60
|
-
gem "bcrypt"
|
61
|
-
gem "mocha"
|
62
|
-
gem "sqlite3"
|
60
|
+
gem "bcrypt", "~> 3.1.18"
|
61
|
+
gem "mocha", "~> 1.14.0"
|
62
|
+
gem "sqlite3", "~> 1.4.4"
|
63
|
+
|
64
|
+
gem "minitest", "~> 5.15.0"
|
63
65
|
end
|
data/README.md
CHANGED
@@ -1,19 +1,21 @@
|
|
1
1
|
# ActiveRecord CockroachDB Adapter
|
2
2
|
|
3
|
-
CockroachDB adapter for ActiveRecord 5 and
|
3
|
+
CockroachDB adapter for ActiveRecord 5, 6, and 7. This is a lightweight extension of the PostgreSQL adapter that establishes compatibility with [CockroachDB](https://github.com/cockroachdb/cockroach).
|
4
4
|
|
5
5
|
## Installation
|
6
6
|
|
7
7
|
Add this line to your project's Gemfile:
|
8
8
|
|
9
9
|
```ruby
|
10
|
-
gem 'activerecord-cockroachdb-adapter', '~>
|
10
|
+
gem 'activerecord-cockroachdb-adapter', '~> 7.0.0'
|
11
11
|
```
|
12
12
|
|
13
13
|
If you're using Rails 5.2, use the `5.2.x` versions of this gem.
|
14
14
|
|
15
15
|
If you're using Rails 6.0, use the `6.0.x` versions of this gem.
|
16
16
|
|
17
|
+
If you're using Rails 7.0, use the `7.0.x` versions of this gem.
|
18
|
+
|
17
19
|
In `database.yml`, use the following adapter setting:
|
18
20
|
|
19
21
|
```
|
@@ -17,10 +17,12 @@ Gem::Specification.new do |spec|
|
|
17
17
|
spec.description = "Allows the use of CockroachDB as a backend for ActiveRecord and Rails apps."
|
18
18
|
spec.homepage = "https://github.com/cockroachdb/activerecord-cockroachdb-adapter"
|
19
19
|
|
20
|
-
spec.add_dependency "activerecord", "~>
|
20
|
+
spec.add_dependency "activerecord", "~> 7.0.3"
|
21
21
|
spec.add_dependency "pg", "~> 1.2"
|
22
22
|
spec.add_dependency "rgeo-activerecord", "~> 7.0.0"
|
23
23
|
|
24
|
+
spec.add_development_dependency "benchmark-ips", "~> 2.9.1"
|
25
|
+
|
24
26
|
# Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
|
25
27
|
# to allow pushing to a single host or delete this section to allow pushing to any host.
|
26
28
|
if spec.respond_to?(:metadata)
|
data/build/teamcity-test.sh
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
set -euox pipefail
|
4
4
|
|
5
5
|
# Download CockroachDB
|
6
|
-
VERSION=
|
6
|
+
VERSION=v22.1.0
|
7
7
|
wget -qO- https://binaries.cockroachdb.com/cockroach-$VERSION.linux-amd64.tgz | tar xvz
|
8
8
|
readonly COCKROACH=./cockroach-$VERSION.linux-amd64/cockroach
|
9
9
|
|
@@ -35,6 +35,8 @@ run_cockroach() {
|
|
35
35
|
cockroach sql --insecure -e 'CREATE DATABASE activerecord_unittest2;'
|
36
36
|
cockroach sql --insecure -e 'SET CLUSTER SETTING sql.stats.automatic_collection.enabled = false;'
|
37
37
|
cockroach sql --insecure -e 'SET CLUSTER SETTING sql.stats.histogram_collection.enabled = false;'
|
38
|
+
cockroach sql --insecure -e "SET CLUSTER SETTING jobs.retention_time = '180s';"
|
39
|
+
cockroach sql --insecure -e "SET CLUSTER SETTING sql.defaults.experimental_alter_column_type.enabled = 'true'"
|
38
40
|
|
39
41
|
cockroach sql --insecure -e "ALTER RANGE default CONFIGURE ZONE USING num_replicas = 1, gc.ttlseconds = 30;"
|
40
42
|
cockroach sql --insecure -e "ALTER TABLE system.public.jobs CONFIGURE ZONE USING num_replicas = 1, gc.ttlseconds = 30;"
|
@@ -46,21 +48,14 @@ run_cockroach() {
|
|
46
48
|
cockroach sql --insecure -e "SET CLUSTER SETTING kv.raft_log.disable_synchronization_unsafe = 'true'"
|
47
49
|
cockroach sql --insecure -e "SET CLUSTER SETTING jobs.registry.interval.cancel = '180s';"
|
48
50
|
cockroach sql --insecure -e "SET CLUSTER SETTING jobs.registry.interval.gc = '30s';"
|
49
|
-
cockroach sql --insecure -e "SET CLUSTER SETTING jobs.retention_time = '15s';"
|
50
|
-
cockroach sql --insecure -e "SET CLUSTER SETTING sql.stats.automatic_collection.enabled = false;"
|
51
51
|
cockroach sql --insecure -e "SET CLUSTER SETTING kv.range_split.by_load_merge_delay = '5s';"
|
52
52
|
|
53
|
-
# Enable when we test with v22.1.
|
54
|
-
# cockroach sql --insecure -e "SET CLUSTER SETTING sql.catalog.unsafe_skip_system_config_trigger.enabled = true;"
|
55
|
-
|
56
53
|
# Enable experimental features.
|
57
54
|
cockroach sql --insecure -e "SET CLUSTER SETTING sql.defaults.experimental_temporary_tables.enabled = 'true';"
|
58
|
-
cockroach sql --insecure -e "SET CLUSTER SETTING sql.defaults.datestyle.enabled = true"
|
59
|
-
cockroach sql --insecure -e "SET CLUSTER SETTING sql.defaults.intervalstyle.enabled = true;"
|
60
55
|
}
|
61
56
|
|
62
57
|
# Install ruby dependencies.
|
63
|
-
gem install bundler:2.
|
58
|
+
gem install bundler:2.3.14
|
64
59
|
bundle install
|
65
60
|
|
66
61
|
run_cockroach
|
@@ -6,9 +6,10 @@ module ActiveRecord
|
|
6
6
|
# https://github.com/rgeo/activerecord-postgis-adapter/blob/master/lib/active_record/connection_adapters/postgis/spatial_column.rb
|
7
7
|
def initialize(name, default, sql_type_metadata = nil, null = true,
|
8
8
|
default_function = nil, collation: nil, comment: nil,
|
9
|
-
serial: nil, spatial: nil)
|
9
|
+
serial: nil, spatial: nil, generated: nil, hidden: nil)
|
10
10
|
@sql_type_metadata = sql_type_metadata
|
11
11
|
@geographic = !!(sql_type_metadata.sql_type =~ /geography\(/i)
|
12
|
+
@hidden = hidden
|
12
13
|
|
13
14
|
if spatial
|
14
15
|
# This case comes from an entry in the geometry_columns table
|
@@ -29,7 +30,7 @@ module ActiveRecord
|
|
29
30
|
build_from_sql_type(sql_type_metadata.sql_type)
|
30
31
|
end
|
31
32
|
super(name, default, sql_type_metadata, null, default_function,
|
32
|
-
collation: collation, comment: comment, serial: serial)
|
33
|
+
collation: collation, comment: comment, serial: serial, generated: generated)
|
33
34
|
if spatial? && @srid
|
34
35
|
@limit = { srid: @srid, type: to_type_name(geometric_type) }
|
35
36
|
@limit[:has_z] = true if @has_z
|
@@ -52,6 +53,14 @@ module ActiveRecord
|
|
52
53
|
spatial? ? @limit : super
|
53
54
|
end
|
54
55
|
|
56
|
+
def virtual?
|
57
|
+
@generated.present?
|
58
|
+
end
|
59
|
+
|
60
|
+
def hidden?
|
61
|
+
@hidden
|
62
|
+
end
|
63
|
+
|
55
64
|
def spatial?
|
56
65
|
%i[geometry geography].include?(@sql_type_metadata.type)
|
57
66
|
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ActiveRecord
|
4
|
+
module ConnectionAdapters
|
5
|
+
module CockroachDB
|
6
|
+
module OID
|
7
|
+
module DateTime
|
8
|
+
protected
|
9
|
+
|
10
|
+
# override
|
11
|
+
# Uses CockroachDBAdapter instead of PostgreSQLAdapter
|
12
|
+
def real_type_unless_aliased(real_type)
|
13
|
+
ActiveRecord::ConnectionAdapters::CockroachDBAdapter.datetime_type == real_type ? :datetime : real_type
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
PostgreSQL::OID::DateTime.prepend(DateTime)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -2,8 +2,6 @@ module ActiveRecord
|
|
2
2
|
module ConnectionAdapters
|
3
3
|
module CockroachDB
|
4
4
|
module Quoting
|
5
|
-
private
|
6
|
-
|
7
5
|
# CockroachDB does not allow inserting integer values into string
|
8
6
|
# columns, but ActiveRecord expects this to work. CockroachDB will
|
9
7
|
# however allow inserting string values into integer columns. It will
|
@@ -19,7 +17,7 @@ module ActiveRecord
|
|
19
17
|
# (https://en.wikipedia.org/wiki/Well-known_text_representation_of_geometry#Well-known_binary)
|
20
18
|
# but when creating objects, using RGeo features is more convenient than
|
21
19
|
# converting to WKB, so this does it automatically.
|
22
|
-
def
|
20
|
+
def quote(value)
|
23
21
|
if value.is_a?(Numeric)
|
24
22
|
"'#{quote_string(value.to_s)}'"
|
25
23
|
elsif RGeo::Feature::Geometry.check_type(value)
|
@@ -20,17 +20,31 @@ module ActiveRecord
|
|
20
20
|
|
21
21
|
yield
|
22
22
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
23
|
+
# Prefixes and suffixes are added in add_foreign_key
|
24
|
+
# in AR7+ so we need to temporarily disable them here,
|
25
|
+
# otherwise prefixes/suffixes will be erroneously added.
|
26
|
+
old_prefix = ActiveRecord::Base.table_name_prefix
|
27
|
+
old_suffix = ActiveRecord::Base.table_name_suffix
|
28
|
+
|
29
|
+
ActiveRecord::Base.table_name_prefix = ""
|
30
|
+
ActiveRecord::Base.table_name_suffix = ""
|
31
|
+
|
32
|
+
begin
|
33
|
+
foreign_keys.each do |foreign_key|
|
34
|
+
begin
|
35
|
+
add_foreign_key(foreign_key.from_table, foreign_key.to_table, **foreign_key.options)
|
36
|
+
rescue ActiveRecord::StatementInvalid => error
|
37
|
+
if error.cause.class == PG::DuplicateObject
|
38
|
+
# This error is safe to ignore because the yielded caller
|
39
|
+
# already re-added the foreign key constraint.
|
40
|
+
else
|
41
|
+
raise error
|
42
|
+
end
|
32
43
|
end
|
33
44
|
end
|
45
|
+
ensure
|
46
|
+
ActiveRecord::Base.table_name_prefix = old_prefix
|
47
|
+
ActiveRecord::Base.table_name_suffix = old_suffix
|
34
48
|
end
|
35
49
|
end
|
36
50
|
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ActiveRecord
|
4
|
+
module ConnectionAdapters
|
5
|
+
module CockroachDB
|
6
|
+
class SchemaCreation < PostgreSQL::SchemaCreation # :nodoc:
|
7
|
+
private
|
8
|
+
def add_column_options!(sql, options)
|
9
|
+
if options[:hidden]
|
10
|
+
sql << " NOT VISIBLE"
|
11
|
+
end
|
12
|
+
super
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ActiveRecord
|
4
|
+
module ConnectionAdapters
|
5
|
+
module CockroachDB
|
6
|
+
class SchemaDumper < ConnectionAdapters::PostgreSQL::SchemaDumper # :nodoc:
|
7
|
+
private
|
8
|
+
def prepare_column_options(column)
|
9
|
+
spec = super
|
10
|
+
if column.hidden?
|
11
|
+
spec[:hidden] = true
|
12
|
+
end
|
13
|
+
spec
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
@@ -77,7 +77,7 @@ module ActiveRecord
|
|
77
77
|
# override
|
78
78
|
# https://github.com/rails/rails/blob/6-0-stable/activerecord/lib/active_record/connection_adapters/postgresql/schema_statements.rb#L624
|
79
79
|
def new_column_from_field(table_name, field)
|
80
|
-
column_name, type, default, notnull, oid, fmod, collation, comment = field
|
80
|
+
column_name, type, default, notnull, oid, fmod, collation, comment, generated, hidden = field
|
81
81
|
type_metadata = fetch_type_metadata(column_name, type, oid.to_i, fmod.to_i)
|
82
82
|
default_value = extract_value_from_default(default)
|
83
83
|
default_function = extract_default_function(default_value, default)
|
@@ -99,7 +99,9 @@ module ActiveRecord
|
|
99
99
|
collation: collation,
|
100
100
|
comment: comment.presence,
|
101
101
|
serial: serial,
|
102
|
-
spatial: spatial
|
102
|
+
spatial: spatial,
|
103
|
+
generated: generated,
|
104
|
+
hidden: hidden
|
103
105
|
)
|
104
106
|
end
|
105
107
|
|
@@ -186,6 +188,14 @@ module ActiveRecord
|
|
186
188
|
@spatial_column_info ||= {}
|
187
189
|
@spatial_column_info[table_name.to_sym] ||= SpatialColumnInfo.new(self, table_name.to_s)
|
188
190
|
end
|
191
|
+
|
192
|
+
def create_schema_dumper(options)
|
193
|
+
CockroachDB::SchemaDumper.create(self, options)
|
194
|
+
end
|
195
|
+
|
196
|
+
def schema_creation
|
197
|
+
CockroachDB::SchemaCreation.new(self)
|
198
|
+
end
|
189
199
|
end
|
190
200
|
end
|
191
201
|
end
|
@@ -1,7 +1,10 @@
|
|
1
1
|
require "rgeo/active_record"
|
2
2
|
|
3
3
|
require "active_record/connection_adapters/postgresql_adapter"
|
4
|
+
require "active_record/connection_adapters/cockroachdb/attribute_methods"
|
4
5
|
require "active_record/connection_adapters/cockroachdb/column_methods"
|
6
|
+
require "active_record/connection_adapters/cockroachdb/schema_creation"
|
7
|
+
require "active_record/connection_adapters/cockroachdb/schema_dumper"
|
5
8
|
require "active_record/connection_adapters/cockroachdb/schema_statements"
|
6
9
|
require "active_record/connection_adapters/cockroachdb/referential_integrity"
|
7
10
|
require "active_record/connection_adapters/cockroachdb/transaction_manager"
|
@@ -9,14 +12,15 @@ require "active_record/connection_adapters/cockroachdb/database_statements"
|
|
9
12
|
require "active_record/connection_adapters/cockroachdb/table_definition"
|
10
13
|
require "active_record/connection_adapters/cockroachdb/quoting"
|
11
14
|
require "active_record/connection_adapters/cockroachdb/type"
|
12
|
-
require "active_record/connection_adapters/cockroachdb/attribute_methods"
|
13
15
|
require "active_record/connection_adapters/cockroachdb/column"
|
14
16
|
require "active_record/connection_adapters/cockroachdb/spatial_column_info"
|
15
17
|
require "active_record/connection_adapters/cockroachdb/setup"
|
16
18
|
require "active_record/connection_adapters/cockroachdb/oid/type_map_initializer"
|
17
19
|
require "active_record/connection_adapters/cockroachdb/oid/spatial"
|
18
20
|
require "active_record/connection_adapters/cockroachdb/oid/interval"
|
21
|
+
require "active_record/connection_adapters/cockroachdb/oid/date_time"
|
19
22
|
require "active_record/connection_adapters/cockroachdb/arel_tosql"
|
23
|
+
require_relative "../migration/cockroachdb/compatibility"
|
20
24
|
require_relative "../../version"
|
21
25
|
|
22
26
|
# Run to ignore spatial tables that will break schemna dumper.
|
@@ -179,7 +183,10 @@ module ActiveRecord
|
|
179
183
|
end
|
180
184
|
|
181
185
|
def supports_expression_index?
|
182
|
-
|
186
|
+
# Expression indexes are partially supported by CockroachDB v21.2,
|
187
|
+
# but activerecord requires "ON CONFLICT expression" support.
|
188
|
+
# See https://github.com/cockroachdb/cockroach/issues/67893
|
189
|
+
false
|
183
190
|
end
|
184
191
|
|
185
192
|
def supports_datetime_with_precision?
|
@@ -199,7 +206,7 @@ module ActiveRecord
|
|
199
206
|
end
|
200
207
|
|
201
208
|
def supports_virtual_columns?
|
202
|
-
|
209
|
+
@crdb_version >= 2110
|
203
210
|
end
|
204
211
|
|
205
212
|
def supports_string_to_array_coercion?
|
@@ -210,6 +217,10 @@ module ActiveRecord
|
|
210
217
|
false
|
211
218
|
end
|
212
219
|
|
220
|
+
def supports_deferrable_constraints?
|
221
|
+
false
|
222
|
+
end
|
223
|
+
|
213
224
|
# This is hardcoded to 63 (as previously was in ActiveRecord 5.0) to aid in
|
214
225
|
# migration from PostgreSQL to CockroachDB. In practice, this limitation
|
215
226
|
# is arbitrary since CockroachDB supports index name lengths and table alias
|
@@ -288,8 +299,20 @@ module ActiveRecord
|
|
288
299
|
false
|
289
300
|
end
|
290
301
|
|
291
|
-
|
302
|
+
# override
|
303
|
+
# The PostgreSQLAdapter uses syntax for an anonymous function
|
304
|
+
# (DO $$) that CockroachDB does not support.
|
305
|
+
#
|
306
|
+
# Given a name and an array of values, creates an enum type.
|
307
|
+
def create_enum(name, values)
|
308
|
+
sql_values = values.map { |s| "'#{s}'" }.join(", ")
|
309
|
+
query = <<~SQL
|
310
|
+
CREATE TYPE IF NOT EXISTS \"#{name}\" AS ENUM (#{sql_values});
|
311
|
+
SQL
|
312
|
+
exec_query(query)
|
313
|
+
end
|
292
314
|
|
315
|
+
class << self
|
293
316
|
def initialize_type_map(m = type_map)
|
294
317
|
%w(
|
295
318
|
geography
|
@@ -336,10 +359,13 @@ module ActiveRecord
|
|
336
359
|
# lookups on PG
|
337
360
|
Type::DecimalWithoutScale.new(precision: precision)
|
338
361
|
else
|
339
|
-
OID::Decimal.new(precision: precision, scale: scale)
|
362
|
+
ActiveRecord::ConnectionAdapters::PostgreSQL::OID::Decimal.new(precision: precision, scale: scale)
|
340
363
|
end
|
341
364
|
end
|
342
365
|
end
|
366
|
+
end
|
367
|
+
|
368
|
+
private
|
343
369
|
|
344
370
|
# Configures the encoding, verbosity, schema search path, and time zone of the connection.
|
345
371
|
# This is called by #connect and should not be called manually.
|
@@ -361,7 +387,7 @@ module ActiveRecord
|
|
361
387
|
# If using Active Record's time zone support configure the connection to return
|
362
388
|
# TIMESTAMP WITH ZONE types in UTC.
|
363
389
|
unless variables["timezone"]
|
364
|
-
if ActiveRecord
|
390
|
+
if ActiveRecord.default_timezone == :utc
|
365
391
|
variables["timezone"] = "UTC"
|
366
392
|
elsif @local_tz
|
367
393
|
variables["timezone"] = @local_tz
|
@@ -474,7 +500,8 @@ module ActiveRecord
|
|
474
500
|
SELECT a.attname, format_type(a.atttypid, a.atttypmod),
|
475
501
|
pg_get_expr(d.adbin, d.adrelid), a.attnotnull, a.atttypid, a.atttypmod,
|
476
502
|
c.collname, NULL AS comment,
|
477
|
-
#{supports_virtual_columns? ? 'attgenerated' : quote('')} as attgenerated
|
503
|
+
#{supports_virtual_columns? ? 'attgenerated' : quote('')} as attgenerated,
|
504
|
+
NULL as is_hidden
|
478
505
|
FROM pg_attribute a
|
479
506
|
LEFT JOIN pg_attrdef d ON a.attrelid = d.adrelid AND a.attnum = d.adnum
|
480
507
|
LEFT JOIN pg_type t ON a.atttypid = t.oid
|
@@ -500,8 +527,18 @@ module ActiveRecord
|
|
500
527
|
dtype = field[1]
|
501
528
|
field[1] = crdb_fields[field[0]][2].downcase if re.match(dtype)
|
502
529
|
field[7] = crdb_fields[field[0]][1]&.gsub!(/^\'|\'?$/, '')
|
530
|
+
field[9] = true if crdb_fields[field[0]][3]
|
503
531
|
field
|
504
532
|
end
|
533
|
+
fields.delete_if do |field|
|
534
|
+
# Don't include rowid column if it is hidden and the primary key
|
535
|
+
# is not defined (meaning CRDB implicitly created it).
|
536
|
+
if field[0] == CockroachDBAdapter::DEFAULT_PRIMARY_KEY
|
537
|
+
field[9] && !primary_key(table_name)
|
538
|
+
else
|
539
|
+
false # Keep this entry.
|
540
|
+
end
|
541
|
+
end
|
505
542
|
end
|
506
543
|
|
507
544
|
# Fetch the column comment because it's faster this way
|
@@ -512,7 +549,7 @@ module ActiveRecord
|
|
512
549
|
def crdb_column_definitions(table_name)
|
513
550
|
fields = \
|
514
551
|
query(<<~SQL, "SCHEMA")
|
515
|
-
SELECT c.column_name, c.column_comment, c.crdb_sql_type
|
552
|
+
SELECT c.column_name, c.column_comment, c.crdb_sql_type, c.is_hidden::BOOLEAN
|
516
553
|
FROM information_schema.columns c
|
517
554
|
WHERE c.table_name = #{quote(table_name)}
|
518
555
|
SQL
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require "active_record/migration"
|
2
|
+
require "active_record/migration/compatibility"
|
3
|
+
|
4
|
+
module ActiveRecord
|
5
|
+
class Migration
|
6
|
+
module CockroachDB
|
7
|
+
module Compatibility
|
8
|
+
module V7_0Patch
|
9
|
+
# Override. Use "CockroachDB" instead of "PostgreSQL"
|
10
|
+
def compatible_timestamp_type(type, connection)
|
11
|
+
if connection.adapter_name == "CockroachDB"
|
12
|
+
# For Rails <= 6.1, :datetime was aliased to :timestamp
|
13
|
+
# See: https://github.com/rails/rails/blob/v6.1.3.2/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb#L108
|
14
|
+
# From Rails 7 onwards, you can define what :datetime resolves to (the default is still :timestamp)
|
15
|
+
# See `ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.datetime_type`
|
16
|
+
type.to_sym == :datetime ? :timestamp : type
|
17
|
+
else
|
18
|
+
type
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
prepend_mod = ActiveRecord::Migration::CockroachDB::Compatibility::V7_0Patch
|
28
|
+
ActiveRecord::Migration::Compatibility::V6_1::PostgreSQLCompat.singleton_class.prepend(prepend_mod)
|
data/lib/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: activerecord-cockroachdb-adapter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 7.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Cockroach Labs
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-07-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
19
|
+
version: 7.0.3
|
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:
|
26
|
+
version: 7.0.3
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: pg
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -52,6 +52,20 @@ dependencies:
|
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: 7.0.0
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: benchmark-ips
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 2.9.1
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 2.9.1
|
55
69
|
description: Allows the use of CockroachDB as a backend for ActiveRecord and Rails
|
56
70
|
apps.
|
57
71
|
email:
|
@@ -82,11 +96,14 @@ files:
|
|
82
96
|
- lib/active_record/connection_adapters/cockroachdb/column_methods.rb
|
83
97
|
- lib/active_record/connection_adapters/cockroachdb/database_statements.rb
|
84
98
|
- lib/active_record/connection_adapters/cockroachdb/database_tasks.rb
|
99
|
+
- lib/active_record/connection_adapters/cockroachdb/oid/date_time.rb
|
85
100
|
- lib/active_record/connection_adapters/cockroachdb/oid/interval.rb
|
86
101
|
- lib/active_record/connection_adapters/cockroachdb/oid/spatial.rb
|
87
102
|
- lib/active_record/connection_adapters/cockroachdb/oid/type_map_initializer.rb
|
88
103
|
- lib/active_record/connection_adapters/cockroachdb/quoting.rb
|
89
104
|
- lib/active_record/connection_adapters/cockroachdb/referential_integrity.rb
|
105
|
+
- lib/active_record/connection_adapters/cockroachdb/schema_creation.rb
|
106
|
+
- lib/active_record/connection_adapters/cockroachdb/schema_dumper.rb
|
90
107
|
- lib/active_record/connection_adapters/cockroachdb/schema_statements.rb
|
91
108
|
- lib/active_record/connection_adapters/cockroachdb/setup.rb
|
92
109
|
- lib/active_record/connection_adapters/cockroachdb/spatial_column_info.rb
|
@@ -94,6 +111,7 @@ files:
|
|
94
111
|
- lib/active_record/connection_adapters/cockroachdb/transaction_manager.rb
|
95
112
|
- lib/active_record/connection_adapters/cockroachdb/type.rb
|
96
113
|
- lib/active_record/connection_adapters/cockroachdb_adapter.rb
|
114
|
+
- lib/active_record/migration/cockroachdb/compatibility.rb
|
97
115
|
- lib/activerecord-cockroachdb-adapter.rb
|
98
116
|
- lib/version.rb
|
99
117
|
homepage: https://github.com/cockroachdb/activerecord-cockroachdb-adapter
|