activerecord-cockroachdb-adapter 7.1.0 → 7.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/ci.yml +20 -27
- data/.ruby-version +1 -1
- data/CHANGELOG.md +7 -2
- data/Gemfile +4 -0
- data/bin/console +1 -1
- data/bin/start-cockroachdb +5 -20
- data/lib/active_record/connection_adapters/cockroachdb/database_tasks.rb +2 -1
- data/lib/active_record/connection_adapters/cockroachdb/schema_statements.rb +8 -1
- data/lib/active_record/connection_adapters/cockroachdb_adapter.rb +36 -91
- data/lib/active_record/relation/query_methods_ext.rb +2 -3
- data/lib/version.rb +1 -1
- data/setup.sql +18 -0
- metadata +4 -4
- data/lib/active_record/connection_adapters/cockroachdb/oid/type_map_initializer.rb +0 -26
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 672289521537934d4b9ed2d707c3faf55b4761c8d2b4e9e12cd8622166963ae7
|
4
|
+
data.tar.gz: 345a84d7c5bca0d574aa65eb0fb0e30986a23fcc2830f422e5b1d80ffa971076
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4ce6d2119bfc27192630c32ec488b3e7f533cc64963fc04035609122e5bdbc33e75b83766ca68e3eb73e2592b2fe0a1bae53a74389527762f790b16bda687da9
|
7
|
+
data.tar.gz: 42e10ab1106e4ffc4df89bbbf98f8ddbd05b6bccf97b062a9445ebf874a8bfef9e628dce8b39c3287424a7094f70790457293a2766a849bd39ac0e20c7a684fe
|
data/.github/workflows/ci.yml
CHANGED
@@ -37,15 +37,17 @@ jobs:
|
|
37
37
|
test:
|
38
38
|
runs-on: ubuntu-latest
|
39
39
|
strategy:
|
40
|
+
fail-fast: false
|
40
41
|
matrix:
|
41
|
-
|
42
|
+
# https://www.cockroachlabs.com/docs/releases/release-support-policy
|
43
|
+
crdb: [v22.2, v23.1, v23.2]
|
42
44
|
ruby: [head]
|
43
45
|
name: Test (crdb=${{ matrix.crdb }} ruby=${{ matrix.ruby }})
|
44
46
|
steps:
|
45
47
|
- name: Set Up Actions
|
46
48
|
uses: actions/checkout@v4
|
47
49
|
- name: Install GEOS
|
48
|
-
run: sudo apt-get install libgeos-dev
|
50
|
+
run: sudo apt-get install -yqq libgeos-dev
|
49
51
|
- name: Set Up Ruby
|
50
52
|
uses: ruby/setup-ruby@v1
|
51
53
|
with:
|
@@ -54,16 +56,28 @@ jobs:
|
|
54
56
|
- name: Install and Start Cockroachdb
|
55
57
|
run: |
|
56
58
|
# Download CockroachDB
|
57
|
-
|
59
|
+
readonly full_version=$(ruby -rnet/http -ruri -ryaml -e '
|
60
|
+
link = "https://raw.githubusercontent.com/cockroachdb/docs/main/src/current/_data/releases.yml"
|
61
|
+
puts YAML.safe_load(Net::HTTP.get(URI(link))).reverse.find {
|
62
|
+
_1["major_version"] == "${{ matrix.crdb }}" &&
|
63
|
+
_1["release_type"] == "Production" &&
|
64
|
+
!_1["cloud_only"] &&
|
65
|
+
!_1["withdrawn"] &&
|
66
|
+
!_1["release_name"].include?("-") # Pre-release
|
67
|
+
}["release_name"]
|
68
|
+
')
|
58
69
|
|
59
|
-
|
70
|
+
echo "Downloading $full_version..."
|
71
|
+
wget -qO- "https://binaries.cockroachdb.com/cockroach-$full_version.linux-amd64.tgz" | tar xvz
|
72
|
+
|
73
|
+
export PATH=./cockroach-$full_version.linux-amd64/:$PATH
|
60
74
|
readonly urlfile=cockroach-url
|
61
75
|
|
62
76
|
# Start a CockroachDB server and wait for it to become ready.
|
63
77
|
rm -f "$urlfile"
|
64
78
|
rm -rf cockroach-data
|
65
79
|
# Start CockroachDB.
|
66
|
-
cockroach start-single-node --max-sql-memory=25% --cache=25% --insecure --host=localhost --spatial-libs=./cockroach-$
|
80
|
+
cockroach start-single-node --max-sql-memory=25% --cache=25% --insecure --host=localhost --spatial-libs=./cockroach-$full_version.linux-amd64/lib --listening-url-file="$urlfile" >/dev/null 2>&1 &
|
67
81
|
# Ensure CockroachDB is stopped on script exit.
|
68
82
|
# Wait until CockroachDB has started.
|
69
83
|
for i in {0..3}; do
|
@@ -72,27 +86,6 @@ jobs:
|
|
72
86
|
echo "server not yet available; sleeping for $backoff seconds"
|
73
87
|
sleep $backoff
|
74
88
|
done
|
75
|
-
cockroach sql --insecure
|
76
|
-
CREATE DATABASE activerecord_unittest;
|
77
|
-
CREATE DATABASE activerecord_unittest2;
|
78
|
-
SET CLUSTER SETTING sql.stats.automatic_collection.enabled = false;
|
79
|
-
SET CLUSTER SETTING sql.stats.histogram_collection.enabled = false;
|
80
|
-
SET CLUSTER SETTING jobs.retention_time = '180s';
|
81
|
-
SET CLUSTER SETTING sql.defaults.experimental_alter_column_type.enabled = 'true';
|
82
|
-
|
83
|
-
ALTER RANGE default CONFIGURE ZONE USING num_replicas = 1, gc.ttlseconds = 30;
|
84
|
-
ALTER TABLE system.public.jobs CONFIGURE ZONE USING num_replicas = 1, gc.ttlseconds = 30;
|
85
|
-
ALTER RANGE meta CONFIGURE ZONE USING num_replicas = 1, gc.ttlseconds = 30;
|
86
|
-
ALTER RANGE system CONFIGURE ZONE USING num_replicas = 1, gc.ttlseconds = 30;
|
87
|
-
ALTER RANGE liveness CONFIGURE ZONE USING num_replicas = 1, gc.ttlseconds = 30;
|
88
|
-
|
89
|
-
SET CLUSTER SETTING kv.range_merge.queue_interval = '50ms';
|
90
|
-
SET CLUSTER SETTING kv.raft_log.disable_synchronization_unsafe = 'true';
|
91
|
-
SET CLUSTER SETTING jobs.registry.interval.cancel = '180s';
|
92
|
-
SET CLUSTER SETTING jobs.registry.interval.gc = '30s';
|
93
|
-
SET CLUSTER SETTING kv.range_split.by_load_merge_delay = '5s';
|
94
|
-
|
95
|
-
SET CLUSTER SETTING sql.defaults.experimental_temporary_tables.enabled = 'true';
|
96
|
-
"
|
89
|
+
cat ${{ github.workspace }}/setup.sql | cockroach sql --insecure
|
97
90
|
- name: Test
|
98
91
|
run: bundle exec rake test TESTOPTS='--profile=3'
|
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
3.2.
|
1
|
+
3.2.3
|
data/CHANGELOG.md
CHANGED
@@ -2,12 +2,17 @@
|
|
2
2
|
|
3
3
|
## Ongoing
|
4
4
|
|
5
|
-
|
6
|
-
|
5
|
+
## 7.1.1 - 2024-05-01
|
6
|
+
|
7
|
+
- Enable precision support ([#318](https://github.com/cockroachdb/activerecord-cockroachdb-adapter/pull/318))
|
8
|
+
- Support arbitrary max identifier length ([#317](https://github.com/cockroachdb/activerecord-cockroachdb-adapter/pull/317)).
|
9
|
+
- Fix `#schema_names` not to return `crdb_internal` ([#316](https://github.com/cockroachdb/activerecord-cockroachdb-adapter/pull/316))
|
7
10
|
|
8
11
|
## 7.1.0 - 2024-01-30
|
9
12
|
|
10
13
|
- Add support for Rails 7.1 ([#300](https://github.com/cockroachdb/activerecord-cockroachdb-adapter/pull/300)).
|
14
|
+
- Add support for [AOST](cockroachlabs.com/docs/stable/as-of-system-time) queries ([#284](https://github.com/cockroachdb/activerecord-cockroachdb-adapter/pull/284))
|
15
|
+
- Dump schema name in foreign keys ([#289](https://github.com/cockroachdb/activerecord-cockroachdb-adapter/pull/289))
|
11
16
|
|
12
17
|
## 7.0.3 - 2023-08-23
|
13
18
|
|
data/Gemfile
CHANGED
@@ -55,6 +55,10 @@ group :development, :test do
|
|
55
55
|
gem "debug"
|
56
56
|
gem "minitest-excludes", "~> 2.0.1"
|
57
57
|
gem "minitest-github_action_reporter", github: "BuonOmo/minitest-github_action_reporter", require: "minitest/github_action_reporter_plugin"
|
58
|
+
gem "ostruct", "~> 0.6"
|
59
|
+
|
60
|
+
# Gems used for tests meta-programming.
|
61
|
+
gem "parser"
|
58
62
|
|
59
63
|
# Gems used by the ActiveRecord test suite
|
60
64
|
gem "bcrypt", "~> 3.1.18"
|
data/bin/console
CHANGED
@@ -12,7 +12,7 @@ require "active_record"
|
|
12
12
|
# structure_load(Post.connection_db_config, "awesome-file.sql")
|
13
13
|
require "active_record/connection_adapters/cockroachdb/database_tasks"
|
14
14
|
|
15
|
-
schema_kind = ENV.fetch("SCHEMA_KIND", "default")
|
15
|
+
schema_kind = ENV.fetch("SCHEMA_KIND", ENV.fetch("SCHEMA", "default"))
|
16
16
|
|
17
17
|
system("cockroach sql --insecure --host=localhost:26257 --execute='drop database if exists ar_crdb_console'",
|
18
18
|
exception: true)
|
data/bin/start-cockroachdb
CHANGED
@@ -9,7 +9,7 @@ pid_file="$root_dir/tmp/cockroach.pid"
|
|
9
9
|
log_file="$root_dir/tmp/cockroachdb.log"
|
10
10
|
|
11
11
|
mkdir -p "$root_dir/tmp"
|
12
|
-
[[ -f "$pid_file" ]] && kill -9 $(cat "$pid_file")
|
12
|
+
[[ -f "$pid_file" ]] && kill -9 $(cat "$pid_file") || true
|
13
13
|
rm -f "$pid_file"
|
14
14
|
|
15
15
|
if ! (( ${+commands[cockroach]} )); then
|
@@ -18,7 +18,9 @@ See https://www.cockroachlabs.com/docs/stable/install-cockroachdb.html'
|
|
18
18
|
fi
|
19
19
|
|
20
20
|
cockroach start-single-node \
|
21
|
-
--insecure --store=type=mem,size=0.25 --advertise-addr=localhost
|
21
|
+
--insecure --store=type=mem,size=0.25 --advertise-addr=localhost \
|
22
|
+
--spatial-libs="$(geos-config --includes)" \
|
23
|
+
--pid-file "$pid_file" \
|
22
24
|
&> "$log_file" &
|
23
25
|
|
24
26
|
until [[ -f "$pid_file" ]]; do
|
@@ -26,23 +28,6 @@ until [[ -f "$pid_file" ]]; do
|
|
26
28
|
done
|
27
29
|
|
28
30
|
|
29
|
-
cat
|
30
|
-
-- https://www.cockroachlabs.com/docs/stable/local-testing.html
|
31
|
-
SET CLUSTER SETTING kv.raft_log.disable_synchronization_unsafe = true;
|
32
|
-
SET CLUSTER SETTING kv.range_merge.queue_interval = '50ms';
|
33
|
-
SET CLUSTER SETTING jobs.registry.interval.gc = '30s';
|
34
|
-
SET CLUSTER SETTING jobs.registry.interval.cancel = '180s';
|
35
|
-
SET CLUSTER SETTING jobs.retention_time = '15s';
|
36
|
-
SET CLUSTER SETTING sql.stats.automatic_collection.enabled = false;
|
37
|
-
SET CLUSTER SETTING kv.range_split.by_load_merge_delay = '5s';
|
38
|
-
ALTER RANGE default CONFIGURE ZONE USING "gc.ttlseconds" = 600;
|
39
|
-
ALTER DATABASE system CONFIGURE ZONE USING "gc.ttlseconds" = 600;
|
40
|
-
|
41
|
-
CREATE DATABASE activerecord_unittest;
|
42
|
-
CREATE DATABASE activerecord_unittest2;
|
43
|
-
|
44
|
-
SET CLUSTER SETTING sql.defaults.experimental_alter_column_type.enabled = 'true';
|
45
|
-
SET CLUSTER SETTING sql.defaults.experimental_temporary_tables.enabled = 'true';
|
46
|
-
SQL
|
31
|
+
cat "$root_dir/setup.sql" | cockroach sql --insecure --host=localhost:26257 > /dev/null
|
47
32
|
|
48
33
|
echo "CockroachDB started. PID: $(cat "$pid_file"). log: $log_file"
|
@@ -26,6 +26,7 @@ module ActiveRecord
|
|
26
26
|
old_search_path = conn.schema_search_path
|
27
27
|
conn.schema_search_path = search_path
|
28
28
|
File.open(filename, "w") do |file|
|
29
|
+
# NOTE: There is no issue with the crdb_internal schema, it is ignored by SHOW CREATE.
|
29
30
|
%w(SCHEMAS TYPES).each do |object_kind|
|
30
31
|
ActiveRecord::Base.connection.execute("SHOW CREATE ALL #{object_kind}").each_row { file.puts _1 }
|
31
32
|
end
|
@@ -44,7 +45,7 @@ module ActiveRecord
|
|
44
45
|
|
45
46
|
file.puts sql
|
46
47
|
end
|
47
|
-
file.puts "SET
|
48
|
+
file.puts "SET search_path TO #{conn.schema_search_path};\n\n"
|
48
49
|
end
|
49
50
|
ensure
|
50
51
|
conn.schema_search_path = old_search_path
|
@@ -4,6 +4,13 @@ module ActiveRecord
|
|
4
4
|
module SchemaStatements
|
5
5
|
include ActiveRecord::ConnectionAdapters::PostgreSQL::SchemaStatements
|
6
6
|
|
7
|
+
# OVERRIDE: We do not want to see the crdb_internal schema in the names.
|
8
|
+
#
|
9
|
+
# Returns an array of schema names.
|
10
|
+
def schema_names
|
11
|
+
super - ["crdb_internal"]
|
12
|
+
end
|
13
|
+
|
7
14
|
def add_index(table_name, column_name, **options)
|
8
15
|
super
|
9
16
|
rescue ActiveRecord::StatementInvalid => error
|
@@ -40,7 +47,7 @@ module ActiveRecord
|
|
40
47
|
# so we append it manually.
|
41
48
|
def foreign_keys(table_name)
|
42
49
|
scope = quoted_scope(table_name)
|
43
|
-
fk_info =
|
50
|
+
fk_info = internal_exec_query(<<~SQL, "SCHEMA")
|
44
51
|
SELECT CASE
|
45
52
|
WHEN n2.nspname = current_schema()
|
46
53
|
THEN ''
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "rgeo/active_record"
|
2
4
|
|
3
5
|
require_relative "../../arel/nodes/join_source_ext"
|
@@ -16,7 +18,6 @@ require "active_record/connection_adapters/cockroachdb/type"
|
|
16
18
|
require "active_record/connection_adapters/cockroachdb/column"
|
17
19
|
require "active_record/connection_adapters/cockroachdb/spatial_column_info"
|
18
20
|
require "active_record/connection_adapters/cockroachdb/setup"
|
19
|
-
require "active_record/connection_adapters/cockroachdb/oid/type_map_initializer"
|
20
21
|
require "active_record/connection_adapters/cockroachdb/oid/spatial"
|
21
22
|
require "active_record/connection_adapters/cockroachdb/oid/interval"
|
22
23
|
require "active_record/connection_adapters/cockroachdb/oid/date_time"
|
@@ -31,35 +32,15 @@ require_relative "../relation/query_methods_ext"
|
|
31
32
|
ActiveRecord::ConnectionAdapters::CockroachDB.initial_setup
|
32
33
|
|
33
34
|
module ActiveRecord
|
35
|
+
# TODO: once in rails 7.2, remove this and replace with a `#register` call.
|
36
|
+
# See: https://github.com/rails/rails/commit/22a26d7f74ea8f0d5f7c4169531ae38441cfd5e5#diff-2468c670eb10c24bd2823e42708489a336d6f21c6efc7e3c4a574166fa77bb22
|
34
37
|
module ConnectionHandling
|
38
|
+
def cockroachdb_adapter_class
|
39
|
+
ConnectionAdapters::CockroachDBAdapter
|
40
|
+
end
|
41
|
+
|
35
42
|
def cockroachdb_connection(config)
|
36
|
-
|
37
|
-
conn_params = config.symbolize_keys.compact
|
38
|
-
|
39
|
-
# Map ActiveRecords param names to PGs.
|
40
|
-
conn_params[:user] = conn_params.delete(:username) if conn_params[:username]
|
41
|
-
conn_params[:dbname] = conn_params.delete(:database) if conn_params[:database]
|
42
|
-
|
43
|
-
# Forward only valid config params to PG::Connection.connect.
|
44
|
-
valid_conn_param_keys = PG::Connection.conndefaults_hash.keys + [:requiressl]
|
45
|
-
conn_params.slice!(*valid_conn_param_keys)
|
46
|
-
|
47
|
-
ConnectionAdapters::CockroachDBAdapter.new(
|
48
|
-
ConnectionAdapters::CockroachDBAdapter.new_client(conn_params),
|
49
|
-
logger,
|
50
|
-
conn_params,
|
51
|
-
config
|
52
|
-
)
|
53
|
-
# This rescue flow appears in new_client, but it is needed here as well
|
54
|
-
# since Cockroach will sometimes not raise until a query is made.
|
55
|
-
rescue ActiveRecord::StatementInvalid => error
|
56
|
-
no_db_err_check1 = conn_params && conn_params[:dbname] && error.cause.message.include?(conn_params[:dbname])
|
57
|
-
no_db_err_check2 = conn_params && conn_params[:dbname] && error.cause.message.include?("pg_type")
|
58
|
-
if no_db_err_check1 || no_db_err_check2
|
59
|
-
raise ActiveRecord::NoDatabaseError
|
60
|
-
else
|
61
|
-
raise ActiveRecord::ConnectionNotEstablished, error.message
|
62
|
-
end
|
43
|
+
cockroachdb_adapter_class.new(config)
|
63
44
|
end
|
64
45
|
end
|
65
46
|
end
|
@@ -101,7 +82,7 @@ module ActiveRecord
|
|
101
82
|
ConnectionPool.prepend(CockroachDBConnectionPool)
|
102
83
|
|
103
84
|
class CockroachDBAdapter < PostgreSQLAdapter
|
104
|
-
ADAPTER_NAME = "CockroachDB"
|
85
|
+
ADAPTER_NAME = "CockroachDB"
|
105
86
|
DEFAULT_PRIMARY_KEY = "rowid"
|
106
87
|
|
107
88
|
SPATIAL_COLUMN_OPTIONS =
|
@@ -155,18 +136,21 @@ module ActiveRecord
|
|
155
136
|
@max_transaction_retries ||= @config.fetch(:max_transaction_retries, 3)
|
156
137
|
end
|
157
138
|
|
158
|
-
|
159
|
-
|
160
|
-
|
139
|
+
def get_database_version
|
140
|
+
major, minor, patch = query_value("SHOW crdb_version").match(/v(\d+).(\d+).(\d+)/)[1..].map(&:to_i)
|
141
|
+
major * 100 * 100 + minor * 100 + patch
|
161
142
|
end
|
143
|
+
undef :postgresql_version
|
144
|
+
alias :cockroachdb_version :database_version
|
162
145
|
|
163
|
-
def
|
164
|
-
|
146
|
+
def supports_datetime_with_precision?
|
147
|
+
# https://github.com/cockroachdb/cockroach/pull/111400
|
148
|
+
database_version >= 23_01_13
|
165
149
|
end
|
166
150
|
|
167
|
-
def
|
168
|
-
#
|
169
|
-
|
151
|
+
def supports_nulls_not_distinct?
|
152
|
+
# https://github.com/cockroachdb/cockroach/issues/115836
|
153
|
+
false
|
170
154
|
end
|
171
155
|
|
172
156
|
def supports_ddl_transactions?
|
@@ -181,10 +165,6 @@ module ActiveRecord
|
|
181
165
|
false
|
182
166
|
end
|
183
167
|
|
184
|
-
def supports_partial_index?
|
185
|
-
true
|
186
|
-
end
|
187
|
-
|
188
168
|
def supports_index_include?
|
189
169
|
false
|
190
170
|
end
|
@@ -200,14 +180,6 @@ module ActiveRecord
|
|
200
180
|
false
|
201
181
|
end
|
202
182
|
|
203
|
-
def supports_datetime_with_precision?
|
204
|
-
false
|
205
|
-
end
|
206
|
-
|
207
|
-
def supports_comments?
|
208
|
-
true
|
209
|
-
end
|
210
|
-
|
211
183
|
def supports_comments_in_create?
|
212
184
|
false
|
213
185
|
end
|
@@ -232,21 +204,6 @@ module ActiveRecord
|
|
232
204
|
false
|
233
205
|
end
|
234
206
|
|
235
|
-
# This is hardcoded to 63 (as previously was in ActiveRecord 5.0) to aid in
|
236
|
-
# migration from PostgreSQL to CockroachDB. In practice, this limitation
|
237
|
-
# is arbitrary since CockroachDB supports index name lengths and table alias
|
238
|
-
# lengths far greater than this value. For the time being though, we match
|
239
|
-
# the original behavior for PostgreSQL to simplify migrations.
|
240
|
-
#
|
241
|
-
# Note that in the migration to ActiveRecord 5.1, this was changed in
|
242
|
-
# PostgreSQLAdapter to use `SHOW max_identifier_length` (which does not
|
243
|
-
# exist in CockroachDB). Therefore, we have to redefine this here.
|
244
|
-
def max_identifier_length
|
245
|
-
63
|
246
|
-
end
|
247
|
-
alias index_name_length max_identifier_length
|
248
|
-
alias table_alias_length max_identifier_length
|
249
|
-
|
250
207
|
# NOTE: This commented bit of code allows to have access to crdb version,
|
251
208
|
# which can be useful for feature detection. However, we currently don't
|
252
209
|
# need, hence we avoid the extra queries.
|
@@ -278,6 +235,21 @@ module ActiveRecord
|
|
278
235
|
false
|
279
236
|
end
|
280
237
|
|
238
|
+
def initialize(...)
|
239
|
+
super
|
240
|
+
|
241
|
+
# This rescue flow appears in new_client, but it is needed here as well
|
242
|
+
# since Cockroach will sometimes not raise until a query is made.
|
243
|
+
rescue ActiveRecord::StatementInvalid => error
|
244
|
+
no_db_err_check1 = @connection_parameters && @connection_parameters[:dbname] && error.cause.message.include?(@connection_parameters[:dbname])
|
245
|
+
no_db_err_check2 = @connection_parameters && @connection_parameters[:dbname] && error.cause.message.include?("pg_type")
|
246
|
+
if no_db_err_check1 || no_db_err_check2
|
247
|
+
raise ActiveRecord::NoDatabaseError
|
248
|
+
else
|
249
|
+
raise ActiveRecord::ConnectionNotEstablished, error.message
|
250
|
+
end
|
251
|
+
end
|
252
|
+
|
281
253
|
# override
|
282
254
|
# The PostgreSQLAdapter uses syntax for an anonymous function
|
283
255
|
# (DO $$) that CockroachDB does not support.
|
@@ -351,7 +323,6 @@ module ActiveRecord
|
|
351
323
|
def extract_value_from_default(default)
|
352
324
|
super ||
|
353
325
|
extract_escaped_string_from_default(default) ||
|
354
|
-
extract_time_from_default(default) ||
|
355
326
|
extract_empty_array_from_default(default) ||
|
356
327
|
extract_decimal_from_default(default)
|
357
328
|
end
|
@@ -369,32 +340,6 @@ module ActiveRecord
|
|
369
340
|
"\"#{$1}\"".undump.gsub("\\'".freeze, "'".freeze)
|
370
341
|
end
|
371
342
|
|
372
|
-
# This method exists to extract the correct time and date defaults for a
|
373
|
-
# couple of reasons.
|
374
|
-
# 1) There's a bug in CockroachDB where the date type is missing from
|
375
|
-
# the column info query.
|
376
|
-
# https://github.com/cockroachdb/cockroach/issues/47285
|
377
|
-
# 2) PostgreSQL's timestamp without time zone type maps to CockroachDB's
|
378
|
-
# TIMESTAMP type. TIMESTAMP includes a UTC time zone while timestamp
|
379
|
-
# without time zone doesn't.
|
380
|
-
# https://www.cockroachlabs.com/docs/v19.2/timestamp.html#variants
|
381
|
-
def extract_time_from_default(default)
|
382
|
-
return unless default =~ /\A'(.*)'\z/
|
383
|
-
|
384
|
-
# If default has a UTC time zone, we'll drop the time zone information
|
385
|
-
# so it acts like PostgreSQL's timestamp without time zone. Then, try
|
386
|
-
# to parse the resulting string to verify if it's a time.
|
387
|
-
time = if default =~ /\A'(.*)(\+00:00)'\z/
|
388
|
-
$1
|
389
|
-
else
|
390
|
-
default
|
391
|
-
end
|
392
|
-
|
393
|
-
Time.parse(time).to_s
|
394
|
-
rescue
|
395
|
-
nil
|
396
|
-
end
|
397
|
-
|
398
343
|
# CockroachDB stores default values for arrays in the `ARRAY[...]` format.
|
399
344
|
# In general, it is hard to parse that, but it is easy to handle the common
|
400
345
|
# case of an empty array.
|
@@ -76,10 +76,9 @@ module ActiveRecord
|
|
76
76
|
self
|
77
77
|
end
|
78
78
|
|
79
|
-
# TODO: reset or no reset?
|
80
|
-
|
81
79
|
def show_create
|
82
|
-
|
80
|
+
quoted_table = connection.quote_table_name self.table_name
|
81
|
+
connection.select_one("show create table #{quoted_table}")["create_statement"]
|
83
82
|
end
|
84
83
|
|
85
84
|
private
|
data/lib/version.rb
CHANGED
data/setup.sql
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
-- https://www.cockroachlabs.com/docs/stable/local-testing.html
|
2
|
+
SET CLUSTER SETTING kv.range_merge.queue_interval = '50ms';
|
3
|
+
SET CLUSTER SETTING jobs.registry.interval.gc = '30s';
|
4
|
+
SET CLUSTER SETTING jobs.registry.interval.cancel = '180s';
|
5
|
+
SET CLUSTER SETTING jobs.retention_time = '15s';
|
6
|
+
SET CLUSTER SETTING sql.stats.automatic_collection.enabled = false;
|
7
|
+
SET CLUSTER SETTING kv.range_split.by_load_merge_delay = '5s';
|
8
|
+
ALTER RANGE default CONFIGURE ZONE USING "gc.ttlseconds" = 600;
|
9
|
+
ALTER DATABASE system CONFIGURE ZONE USING "gc.ttlseconds" = 600;
|
10
|
+
|
11
|
+
CREATE DATABASE activerecord_unittest;
|
12
|
+
CREATE DATABASE activerecord_unittest2;
|
13
|
+
|
14
|
+
SET CLUSTER SETTING sql.stats.automatic_collection.enabled = false;
|
15
|
+
SET CLUSTER SETTING sql.stats.histogram_collection.enabled = false;
|
16
|
+
|
17
|
+
SET CLUSTER SETTING sql.defaults.experimental_alter_column_type.enabled = 'true';
|
18
|
+
SET CLUSTER SETTING sql.defaults.experimental_temporary_tables.enabled = 'true';
|
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: 7.1.
|
4
|
+
version: 7.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Cockroach Labs
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-
|
11
|
+
date: 2024-05-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -106,7 +106,6 @@ files:
|
|
106
106
|
- lib/active_record/connection_adapters/cockroachdb/oid/date_time.rb
|
107
107
|
- lib/active_record/connection_adapters/cockroachdb/oid/interval.rb
|
108
108
|
- lib/active_record/connection_adapters/cockroachdb/oid/spatial.rb
|
109
|
-
- lib/active_record/connection_adapters/cockroachdb/oid/type_map_initializer.rb
|
110
109
|
- lib/active_record/connection_adapters/cockroachdb/quoting.rb
|
111
110
|
- lib/active_record/connection_adapters/cockroachdb/referential_integrity.rb
|
112
111
|
- lib/active_record/connection_adapters/cockroachdb/schema_creation.rb
|
@@ -123,6 +122,7 @@ files:
|
|
123
122
|
- lib/activerecord-cockroachdb-adapter.rb
|
124
123
|
- lib/arel/nodes/join_source_ext.rb
|
125
124
|
- lib/version.rb
|
125
|
+
- setup.sql
|
126
126
|
homepage: https://github.com/cockroachdb/activerecord-cockroachdb-adapter
|
127
127
|
licenses:
|
128
128
|
- Apache-2.0
|
@@ -143,7 +143,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
143
143
|
- !ruby/object:Gem::Version
|
144
144
|
version: '0'
|
145
145
|
requirements: []
|
146
|
-
rubygems_version: 3.4.
|
146
|
+
rubygems_version: 3.4.9
|
147
147
|
signing_key:
|
148
148
|
specification_version: 4
|
149
149
|
summary: CockroachDB adapter for ActiveRecord.
|
@@ -1,26 +0,0 @@
|
|
1
|
-
module ActiveRecord
|
2
|
-
module ConnectionAdapters
|
3
|
-
module CockroachDB
|
4
|
-
module OID
|
5
|
-
module TypeMapInitializer
|
6
|
-
# override
|
7
|
-
# Replaces the query with a faster version that doesn't rely on the
|
8
|
-
# use of 'array_in(cstring,oid,integer)'::regprocedure.
|
9
|
-
def query_conditions_for_initial_load
|
10
|
-
known_type_names = @store.keys.map { |n| "'#{n}'" }
|
11
|
-
known_type_types = %w('r' 'e' 'd')
|
12
|
-
<<~SQL % [known_type_names.join(", "), known_type_types.join(", ")]
|
13
|
-
WHERE
|
14
|
-
t.typname IN (%s)
|
15
|
-
OR t.typtype IN (%s)
|
16
|
-
OR (t.typarray = 0 AND t.typcategory='A')
|
17
|
-
OR t.typelem != 0
|
18
|
-
SQL
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
PostgreSQL::OID::TypeMapInitializer.prepend(TypeMapInitializer)
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|