Class: ActiveRecord::ConnectionAdapters::CockroachDBAdapter
- Inherits:
-
PostgreSQLAdapter
- Object
- PostgreSQLAdapter
- ActiveRecord::ConnectionAdapters::CockroachDBAdapter
- Defined in:
- lib/active_record/connection_adapters/cockroachdb_adapter.rb
Constant Summary collapse
- ADAPTER_NAME =
"CockroachDB".freeze
- Utils =
Note that in the migration from ActiveRecord 5.0 to 5.1, the ‘extract_schema_qualified_name` method was aliased in the PostgreSQLAdapter. To ensure backward compatibility with both <5.1 and 5.1, we rename it here to use the same original `Utils` module.
ActiveRecord::ConnectionAdapters::PostgreSQL::Utils
Instance Method Summary collapse
-
#indexes(table_name, name = nil) ⇒ Object
:nodoc:.
- #primary_keys(table_name) ⇒ Object
- #supports_ddl_transactions? ⇒ Boolean
- #supports_extensions? ⇒ Boolean
- #supports_json? ⇒ Boolean
- #supports_materialized_views? ⇒ Boolean
- #supports_pg_crypto_uuid? ⇒ Boolean
- #supports_ranges? ⇒ Boolean
-
#table_alias_length ⇒ Object
(also: #index_name_length)
This is hardcoded to 63 (as previously was in ActiveRecord 5.0) to aid in migration from PostgreSQL to Cockroachdb.
Instance Method Details
#indexes(table_name, name = nil) ⇒ Object
:nodoc:
60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 |
# File 'lib/active_record/connection_adapters/cockroachdb_adapter.rb', line 60 def indexes(table_name, name = nil) # :nodoc: # The PostgreSQL adapter uses a correlated subquery in the following query, # which CockroachDB does not yet support. That portion of the query fetches # any non-standard opclasses that each index uses. CockroachDB also doesn't # support opclasses at this time, so the query is modified to just remove # the section about opclasses entirely. if name ActiveSupport::Deprecation.warn(<<-MSG.squish) Passing name to #indexes is deprecated without replacement. MSG end table = Utils.extract_schema_qualified_name(table_name.to_s) result = query(<<-SQL, "SCHEMA") SELECT distinct i.relname, d.indisunique, d.indkey, pg_get_indexdef(d.indexrelid), t.oid, pg_catalog.obj_description(i.oid, 'pg_class') AS comment FROM pg_class t INNER JOIN pg_index d ON t.oid = d.indrelid INNER JOIN pg_class i ON d.indexrelid = i.oid LEFT JOIN pg_namespace n ON n.oid = i.relnamespace WHERE i.relkind = 'i' AND d.indisprimary = 'f' AND t.relname = '#{table.identifier}' AND n.nspname = #{table.schema ? "'#{table.schema}'" : 'ANY (current_schemas(false))'} ORDER BY i.relname SQL result.map do |row| index_name = row[0] unique = row[1] indkey = row[2].split(" ").map(&:to_i) inddef = row[3] oid = row[4] comment = row[5] expressions, where = inddef.scan(/\((.+?)\)(?: WHERE (.+))?\z/).flatten if indkey.include?(0) columns = expressions else columns = Hash[query(<<-SQL.strip_heredoc, "SCHEMA")].values_at(*indkey).compact SELECT a.attnum, a.attname FROM pg_attribute a WHERE a.attrelid = #{oid} AND a.attnum IN (#{indkey.join(",")}) SQL # add info on sort order for columns (only desc order is explicitly specified, asc is the default) orders = Hash[ expressions.scan(/(\w+) DESC/).flatten.map { |order_column| [order_column, :desc] } ] end ActiveRecord::ConnectionAdapters::IndexDefinition.new(table_name, index_name, unique, columns, [], orders, where, nil, nil, comment.presence) end.compact end |
#primary_keys(table_name) ⇒ Object
119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 |
# File 'lib/active_record/connection_adapters/cockroachdb_adapter.rb', line 119 def primary_keys(table_name) name = Utils.extract_schema_qualified_name(table_name.to_s) select_values(<<-SQL.strip_heredoc, "SCHEMA") SELECT column_name FROM information_schema.key_column_usage kcu JOIN information_schema.table_constraints tc ON kcu.table_name = tc.table_name AND kcu.table_schema = tc.table_schema AND kcu.constraint_name = tc.constraint_name WHERE constraint_type = 'PRIMARY KEY' AND kcu.table_name = #{quote(name.identifier)} AND kcu.table_schema = #{name.schema ? quote(name.schema) : "ANY (current_schemas(false))"} ORDER BY kcu.ordinal_position SQL end |
#supports_ddl_transactions? ⇒ Boolean
40 41 42 |
# File 'lib/active_record/connection_adapters/cockroachdb_adapter.rb', line 40 def supports_ddl_transactions? false end |
#supports_extensions? ⇒ Boolean
44 45 46 |
# File 'lib/active_record/connection_adapters/cockroachdb_adapter.rb', line 44 def supports_extensions? false end |
#supports_json? ⇒ Boolean
36 37 38 |
# File 'lib/active_record/connection_adapters/cockroachdb_adapter.rb', line 36 def supports_json? false end |
#supports_materialized_views? ⇒ Boolean
52 53 54 |
# File 'lib/active_record/connection_adapters/cockroachdb_adapter.rb', line 52 def supports_materialized_views? false end |
#supports_pg_crypto_uuid? ⇒ Boolean
56 57 58 |
# File 'lib/active_record/connection_adapters/cockroachdb_adapter.rb', line 56 def supports_pg_crypto_uuid? false end |
#supports_ranges? ⇒ Boolean
48 49 50 |
# File 'lib/active_record/connection_adapters/cockroachdb_adapter.rb', line 48 def supports_ranges? false end |
#table_alias_length ⇒ Object Also known as: index_name_length
This is hardcoded to 63 (as previously was in ActiveRecord 5.0) to aid in migration from PostgreSQL to Cockroachdb. In practice, this limitation is arbitrary since CockroachDB supports index name lengths and table alias lengths far greater than this value. For the time being though, we match the original behavior for PostgreSQL to simplify migrations.
Note that in the migration to ActiveRecord 5.1, this was changed in PostgreSQLAdapter to use ‘SHOW max_identifier_length` (which does not exist in CockroachDB). Therefore, we have to redefine this here.
144 145 146 |
# File 'lib/active_record/connection_adapters/cockroachdb_adapter.rb', line 144 def table_alias_length 63 end |