activerecord-cockroachdb-adapter 6.0.0beta3 → 6.0.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a2fb5df1ff24503630d2700365d1c6e9b8b8f84306ce5d2b331712f86adea1f5
4
- data.tar.gz: ffa086c2093b8e80424e5b85847d6f0a7a3503437df8168e72c1abab0a042528
3
+ metadata.gz: 872261a41d4e766a58bd7ea377e28d7dd9507031cfb88288843c5ef0484b8773
4
+ data.tar.gz: 9c56d0bb58eccc334d3ab5657226bb397076c3bf363a22b339fda0e92a5a99bc
5
5
  SHA512:
6
- metadata.gz: b8e3520c981683e242469bcef709c715aa5fe9240b1b6a49fb930dfb8d9f9f395ee4acfae615d06b477e70fc10f8ba1c98bf4bb3489484ea4a2a7f4ec4f5fd54
7
- data.tar.gz: 6368fb8ed0c73348538dc978585beb495838002cea456071ddd4026c2435d3ff146626c19f3101070c1d2fba84efc222aab17a57bba3410130e213eb6379b2ea
6
+ metadata.gz: 6ff0ba0686a110f4f23621ca68474763122933e4611111fa4d5d87a67cf96364e08b09d393b980598424e4507fd2834e98b43c40aab8945551c52317c60f91fe
7
+ data.tar.gz: 7369deb96883410baca55b5c2464efc38f36ce291eb4a20eebac6bfe6a1b0304aa0f2e4174baa5608f099695c0742d27898ba9e8a16e07a4e5b68663f9d8d5db
data/CHANGELOG.md ADDED
@@ -0,0 +1,39 @@
1
+ # Changelog
2
+
3
+ ## 6.0.2 - 2021-05-20
4
+
5
+ - Fix a bug where starting the driver can result in a ConnectionNotEstablished error.
6
+
7
+ ## 6.0.1 - 2021-05-14
8
+
9
+ - Fix a bug where starting the driver can result in a NoDatabaseError.
10
+
11
+ ## 6.0.0 - 2021-04-26
12
+
13
+ - Add a telemetry query on start-up. This helps the Cockroach Labs team
14
+ prioritize support for the adapter. It can be disabled by setting the
15
+ `disable_cockroachdb_telemetry` configuration option to false.
16
+
17
+ ## 6.0.0-beta.5 - 2021-04-02
18
+
19
+ - Added a configuration option named `use_follower_reads_for_type_introspection`.
20
+ If true, it improves the speed of type introspection by allowing potentially stale
21
+ type metadata to be read. Defaults to false.
22
+
23
+ ## 6.0.0-beta.4 - 2021-03-06
24
+
25
+ - Improved connection performance by refactoring an introspection
26
+ that loads types.
27
+ - Changed version numbers to semver.
28
+
29
+ ## 6.0.0beta3
30
+
31
+ - Added support for spatial features.
32
+
33
+ ## 6.0.0beta2
34
+
35
+ - Updated transaction retry logic to work with Rails 6.
36
+
37
+ ## 6.0.0beta1
38
+
39
+ - Initial support for Rails 6.
data/README.md CHANGED
@@ -22,6 +22,13 @@ development:
22
22
  user: <username>
23
23
  ```
24
24
 
25
+ ## Configuration
26
+
27
+ In addition to the standard adapter settings, CockroachDB also supports the following:
28
+
29
+ - `use_follower_reads_for_type_introspection`: Use follower reads on queries to the `pg_type` catalog when set to `true`. This helps to speed up initialization by reading historical data, but may not find recently created user-defined types.
30
+ - `disable_cockroachdb_telemetry`: Determines if a telemetry call is made to the database when the connection pool is initialized. Setting this to `true` will prevent the call from being made.
31
+
25
32
  ## Working with Spatial Data
26
33
 
27
34
  The adapter uses [RGeo](https://github.com/rgeo/rgeo) and [RGeo-ActiveRecord](https://github.com/rgeo/rgeo-activerecord) to represent geometric and geographic data as Ruby objects and easily interface them with the adapter. The following is a brief introduction to RGeo and tips to help setup your spatial application. More documentation about RGeo can be found in the [YARD Docs](https://rubydoc.info/github/rgeo/rgeo) and [wiki](https://github.com/rgeo/rgeo/wiki).
@@ -4,7 +4,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
4
 
5
5
  Gem::Specification.new do |spec|
6
6
  spec.name = "activerecord-cockroachdb-adapter"
7
- spec.version = "6.0.0beta3"
7
+ spec.version = "6.0.2"
8
8
  spec.licenses = ["Apache-2.0"]
9
9
  spec.authors = ["Cockroach Labs"]
10
10
  spec.email = ["cockroach-db@googlegroups.com"]
@@ -11,6 +11,7 @@ connections:
11
11
  user: root
12
12
  requiressl: disable
13
13
  min_messages: warning
14
+ disable_cockroachdb_telemetry: true
14
15
  arunit_without_prepared_statements:
15
16
  database: activerecord_unittest
16
17
  host: localhost
@@ -19,6 +20,7 @@ connections:
19
20
  requiressl: disable
20
21
  min_messages: warning
21
22
  prepared_statements: false
23
+ disable_cockroachdb_telemetry: true
22
24
  arunit2:
23
25
  database: activerecord_unittest2
24
26
  host: localhost
@@ -26,3 +28,4 @@ connections:
26
28
  user: root
27
29
  requiressl: disable
28
30
  min_messages: warning
31
+ disable_cockroachdb_telemetry: true
@@ -0,0 +1,26 @@
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
@@ -13,6 +13,7 @@ require "active_record/connection_adapters/cockroachdb/attribute_methods"
13
13
  require "active_record/connection_adapters/cockroachdb/column"
14
14
  require "active_record/connection_adapters/cockroachdb/spatial_column_info"
15
15
  require "active_record/connection_adapters/cockroachdb/setup"
16
+ require "active_record/connection_adapters/cockroachdb/oid/type_map_initializer"
16
17
  require "active_record/connection_adapters/cockroachdb/oid/spatial"
17
18
  require "active_record/connection_adapters/cockroachdb/arel_tosql"
18
19
 
@@ -50,6 +51,35 @@ end
50
51
 
51
52
  module ActiveRecord
52
53
  module ConnectionAdapters
54
+ module CockroachDBConnectionPool
55
+ def initialize(spec)
56
+ super(spec)
57
+ disable_telemetry = spec.config[:disable_cockroachdb_telemetry]
58
+ adapter = spec.config[:adapter]
59
+ return if disable_telemetry || adapter != "cockroachdb"
60
+
61
+
62
+ begin
63
+ with_connection do |conn|
64
+ if conn.active?
65
+ begin
66
+ query = "SELECT crdb_internal.increment_feature_counter('ActiveRecord %d.%d')"
67
+ conn.execute(query % [ActiveRecord::VERSION::MAJOR, ActiveRecord::VERSION::MINOR])
68
+ rescue ActiveRecord::StatementInvalid
69
+ # The increment_feature_counter built-in is not supported on this
70
+ # CockroachDB version. Ignore.
71
+ rescue StandardError => e
72
+ conn.logger.warn "Unexpected error when incrementing feature counter: #{e}"
73
+ end
74
+ end
75
+ end
76
+ rescue StandardError
77
+ # Prevent failures on db creation and parallel testing.
78
+ end
79
+ end
80
+ end
81
+ ConnectionPool.prepend(CockroachDBConnectionPool)
82
+
53
83
  class CockroachDBAdapter < PostgreSQLAdapter
54
84
  ADAPTER_NAME = "CockroachDB".freeze
55
85
  DEFAULT_PRIMARY_KEY = "rowid"
@@ -217,6 +247,10 @@ module ActiveRecord
217
247
  @crdb_version >= 202
218
248
  end
219
249
 
250
+ def supports_partitioned_indexes?
251
+ false
252
+ end
253
+
220
254
  # This is hardcoded to 63 (as previously was in ActiveRecord 5.0) to aid in
221
255
  # migration from PostgreSQL to CockroachDB. In practice, this limitation
222
256
  # is arbitrary since CockroachDB supports index name lengths and table alias
@@ -234,6 +268,7 @@ module ActiveRecord
234
268
 
235
269
  def initialize(connection, logger, conn_params, config)
236
270
  super(connection, logger, conn_params, config)
271
+
237
272
  crdb_version_string = query_value("SHOW crdb_version")
238
273
  if crdb_version_string.include? "v1."
239
274
  version_num = 1
@@ -398,6 +433,100 @@ module ActiveRecord
398
433
  return "{}"
399
434
  end
400
435
 
436
+ # override
437
+ # This method loads info about data types from the database to
438
+ # populate the TypeMap.
439
+ #
440
+ # Currently, querying from the pg_type catalog can be slow due to geo-partitioning
441
+ # so this modified query uses AS OF SYSTEM TIME '-10s' to read historical data.
442
+ def load_additional_types(oids = nil)
443
+ if @config[:use_follower_reads_for_type_introspection]
444
+ initializer = OID::TypeMapInitializer.new(type_map)
445
+
446
+ query = <<~SQL
447
+ SELECT t.oid, t.typname, t.typelem, t.typdelim, t.typinput, r.rngsubtype, t.typtype, t.typbasetype
448
+ FROM pg_type as t
449
+ LEFT JOIN pg_range as r ON oid = rngtypid AS OF SYSTEM TIME '-10s'
450
+ SQL
451
+
452
+ if oids
453
+ query += "WHERE t.oid IN (%s)" % oids.join(", ")
454
+ else
455
+ query += initializer.query_conditions_for_initial_load
456
+ end
457
+
458
+ execute_and_clear(query, "SCHEMA", []) do |records|
459
+ initializer.run(records)
460
+ end
461
+ else
462
+ super
463
+ end
464
+ rescue ActiveRecord::StatementInvalid => e
465
+ raise e unless e.cause.is_a? PG::InvalidCatalogName
466
+ # use original if database is younger than 10s
467
+ super
468
+ end
469
+
470
+ # override
471
+ # This method maps data types to their proper decoder.
472
+ #
473
+ # Currently, querying from the pg_type catalog can be slow due to geo-partitioning
474
+ # so this modified query uses AS OF SYSTEM TIME '-10s' to read historical data.
475
+ def add_pg_decoders
476
+ if @config[:use_follower_reads_for_type_introspection]
477
+ @default_timezone = nil
478
+ @timestamp_decoder = nil
479
+
480
+ coders_by_name = {
481
+ "int2" => PG::TextDecoder::Integer,
482
+ "int4" => PG::TextDecoder::Integer,
483
+ "int8" => PG::TextDecoder::Integer,
484
+ "oid" => PG::TextDecoder::Integer,
485
+ "float4" => PG::TextDecoder::Float,
486
+ "float8" => PG::TextDecoder::Float,
487
+ "numeric" => PG::TextDecoder::Numeric,
488
+ "bool" => PG::TextDecoder::Boolean,
489
+ "timestamp" => PG::TextDecoder::TimestampUtc,
490
+ "timestamptz" => PG::TextDecoder::TimestampWithTimeZone,
491
+ }
492
+
493
+ known_coder_types = coders_by_name.keys.map { |n| quote(n) }
494
+ query = <<~SQL % known_coder_types.join(", ")
495
+ SELECT t.oid, t.typname
496
+ FROM pg_type as t AS OF SYSTEM TIME '-10s'
497
+ WHERE t.typname IN (%s)
498
+ SQL
499
+
500
+ coders = execute_and_clear(query, "SCHEMA", []) do |result|
501
+ result
502
+ .map { |row| construct_coder(row, coders_by_name[row["typname"]]) }
503
+ .compact
504
+ end
505
+
506
+ map = PG::TypeMapByOid.new
507
+ coders.each { |coder| map.add_coder(coder) }
508
+ @connection.type_map_for_results = map
509
+
510
+ @type_map_for_results = PG::TypeMapByOid.new
511
+ @type_map_for_results.default_type_map = map
512
+ @type_map_for_results.add_coder(PG::TextDecoder::Bytea.new(oid: 17, name: "bytea"))
513
+
514
+ # extract timestamp decoder for use in update_typemap_for_default_timezone
515
+ @timestamp_decoder = coders.find { |coder| coder.name == "timestamp" }
516
+ update_typemap_for_default_timezone
517
+ else
518
+ super
519
+ end
520
+ rescue ActiveRecord::StatementInvalid => e
521
+ raise e unless e.cause.is_a? PG::InvalidCatalogName
522
+ # use original if database is younger than 10s
523
+ super
524
+ end
525
+
526
+ def arel_visitor
527
+ Arel::Visitors::CockroachDB.new(self)
528
+ end
529
+
401
530
  # end private
402
531
  end
403
532
  end
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: 6.0.0beta3
4
+ version: 6.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Cockroach Labs
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-01-20 00:00:00.000000000 Z
11
+ date: 2021-05-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -62,6 +62,7 @@ extra_rdoc_files: []
62
62
  files:
63
63
  - ".gitignore"
64
64
  - ".gitmodules"
65
+ - CHANGELOG.md
65
66
  - CONTRIBUTING.md
66
67
  - Gemfile
67
68
  - LICENSE
@@ -82,6 +83,7 @@ files:
82
83
  - lib/active_record/connection_adapters/cockroachdb/database_statements.rb
83
84
  - lib/active_record/connection_adapters/cockroachdb/database_tasks.rb
84
85
  - lib/active_record/connection_adapters/cockroachdb/oid/spatial.rb
86
+ - lib/active_record/connection_adapters/cockroachdb/oid/type_map_initializer.rb
85
87
  - lib/active_record/connection_adapters/cockroachdb/quoting.rb
86
88
  - lib/active_record/connection_adapters/cockroachdb/referential_integrity.rb
87
89
  - lib/active_record/connection_adapters/cockroachdb/schema_statements.rb
@@ -108,9 +110,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
108
110
  version: '0'
109
111
  required_rubygems_version: !ruby/object:Gem::Requirement
110
112
  requirements:
111
- - - ">"
113
+ - - ">="
112
114
  - !ruby/object:Gem::Version
113
- version: 1.3.1
115
+ version: '0'
114
116
  requirements: []
115
117
  rubygems_version: 3.0.3
116
118
  signing_key: