Class: ActiveRecord::ConnectionAdapters::CockroachDBAdapter
Constant Summary
collapse
- ADAPTER_NAME =
"CockroachDB".freeze
- DEFAULT_PRIMARY_KEY =
"rowid"
- SPATIAL_COLUMN_OPTIONS =
{
geography: { geographic: true },
geometry: {},
geometry_collection: {},
line_string: {},
multi_line_string: {},
multi_point: {},
multi_polygon: {},
spatial: {},
st_point: {},
st_polygon: {},
}
- DEFAULT_SRID =
0
Class Method Summary
collapse
Instance Method Summary
collapse
#insert_fixtures_set, #transaction_isolation_levels
#disable_referential_integrity
#add_index, #columns, #create_table_definition, #default_sequence_name, #native_database_types, #new_column, #primary_key, #spatial_column_info, #type_to_sql
Constructor Details
#initialize(connection, logger, conn_params, config) ⇒ CockroachDBAdapter
Returns a new instance of CockroachDBAdapter.
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
|
# File 'lib/active_record/connection_adapters/cockroachdb_adapter.rb', line 234
def initialize(connection, logger, conn_params, config)
super(connection, logger, conn_params, config)
crdb_version_string = query_value("SHOW crdb_version")
if crdb_version_string.include? "v1."
version_num = 1
elsif crdb_version_string.include? "v2."
version_num 2
elsif crdb_version_string.include? "v19.1."
version_num = 191
elsif crdb_version_string.include? "v19.2."
version_num = 192
elsif crdb_version_string.include? "v20.1."
version_num = 201
else
version_num = 202
end
@crdb_version = version_num
end
|
Class Method Details
.spatial_column_options(key) ⇒ Object
123
124
125
|
# File 'lib/active_record/connection_adapters/cockroachdb_adapter.rb', line 123
def self.spatial_column_options(key)
SPATIAL_COLUMN_OPTIONS[key]
end
|
Instance Method Details
#arel_visitor ⇒ Object
119
120
121
|
# File 'lib/active_record/connection_adapters/cockroachdb_adapter.rb', line 119
def arel_visitor
Arel::Visitors::CockroachDB.new(self)
end
|
#column_definitions(table_name) ⇒ Object
override This method makes a sql query to gather information about columns in a table. It returns an array of arrays (one for each col) and is mapped to columns in the SchemaStatements#columns method.
The issue with the default method is that the sql_type field is retrieved with the ‘format_type` function, but this is implemented differently in CockroachDB than PostGIS, so geometry/geography types are missing information which makes parsing them impossible. Below is an example of what `format_type` returns for a geometry column.
column_type: geometry(POINT, 4326) Expected: geometry(POINT, 4326) Actual: geometry
The solution is to make the default query with super, then iterate through the columns and if it is a spatial type, access the proper column_type with the information_schema.columns table.
@see: github.com/rails/rails/blob/8695b028261bdd244e254993255c6641bdbc17a5/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb#L829
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
|
# File 'lib/active_record/connection_adapters/cockroachdb_adapter.rb', line 97
def column_definitions(table_name)
fields = super
fields.map do |field|
dtype = field[1]
if dtype == 'geometry' || dtype == 'geography'
col_name = field[0]
data_type = \
query(" SELECT c.data_type\n FROM information_schema.columns c\n WHERE c.table_name = \#{quote(table_name)}\n AND c.column_name = \#{quote(col_name)}\n SQL\n field[1] = data_type[0][0]\n end\n field\n end\nend\n", "SCHEMA")
|
#debugging? ⇒ Boolean
144
145
146
|
# File 'lib/active_record/connection_adapters/cockroachdb_adapter.rb', line 144
def debugging?
!!ENV["DEBUG_COCKROACHDB_ADAPTER"]
end
|
#default_srid ⇒ Object
131
132
133
|
# File 'lib/active_record/connection_adapters/cockroachdb_adapter.rb', line 131
def default_srid
DEFAULT_SRID
end
|
#max_identifier_length ⇒ Object
Also known as:
index_name_length, table_alias_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.
228
229
230
|
# File 'lib/active_record/connection_adapters/cockroachdb_adapter.rb', line 228
def max_identifier_length
63
end
|
#max_transaction_retries ⇒ Object
148
149
150
|
# File 'lib/active_record/connection_adapters/cockroachdb_adapter.rb', line 148
def max_transaction_retries
@max_transaction_retries ||= @config.fetch(:max_transaction_retries, 3)
end
|
#postgis_lib_version ⇒ Object
127
128
129
|
# File 'lib/active_record/connection_adapters/cockroachdb_adapter.rb', line 127
def postgis_lib_version
@postgis_lib_version ||= select_value("SELECT PostGIS_Lib_Version()")
end
|
#postgresql_version ⇒ Object
CockroachDB 20.1 can run queries that work against PostgreSQL 10+.
153
154
155
|
# File 'lib/active_record/connection_adapters/cockroachdb_adapter.rb', line 153
def postgresql_version
100000
end
|
#srs_database_columns ⇒ Object
135
136
137
138
139
140
141
142
|
# File 'lib/active_record/connection_adapters/cockroachdb_adapter.rb', line 135
def srs_database_columns
{
auth_name_column: "auth_name",
auth_srid_column: "auth_srid",
proj4text_column: "proj4text",
srtext_column: "srtext",
}
end
|
#supports_advisory_locks? ⇒ Boolean
206
207
208
|
# File 'lib/active_record/connection_adapters/cockroachdb_adapter.rb', line 206
def supports_advisory_locks?
false
end
|
#supports_bulk_alter? ⇒ Boolean
157
158
159
|
# File 'lib/active_record/connection_adapters/cockroachdb_adapter.rb', line 157
def supports_bulk_alter?
false
end
|
196
197
198
199
|
# File 'lib/active_record/connection_adapters/cockroachdb_adapter.rb', line 196
def
false
end
|
201
202
203
204
|
# File 'lib/active_record/connection_adapters/cockroachdb_adapter.rb', line 201
def
false
end
|
#supports_datetime_with_precision? ⇒ Boolean
192
193
194
|
# File 'lib/active_record/connection_adapters/cockroachdb_adapter.rb', line 192
def supports_datetime_with_precision?
false
end
|
#supports_ddl_transactions? ⇒ Boolean
166
167
168
|
# File 'lib/active_record/connection_adapters/cockroachdb_adapter.rb', line 166
def supports_ddl_transactions?
false
end
|
#supports_expression_index? ⇒ Boolean
187
188
189
190
|
# File 'lib/active_record/connection_adapters/cockroachdb_adapter.rb', line 187
def supports_expression_index?
false
end
|
#supports_extensions? ⇒ Boolean
170
171
172
|
# File 'lib/active_record/connection_adapters/cockroachdb_adapter.rb', line 170
def supports_extensions?
false
end
|
#supports_json? ⇒ Boolean
161
162
163
164
|
# File 'lib/active_record/connection_adapters/cockroachdb_adapter.rb', line 161
def supports_json?
true
end
|
#supports_materialized_views? ⇒ Boolean
179
180
181
|
# File 'lib/active_record/connection_adapters/cockroachdb_adapter.rb', line 179
def supports_materialized_views?
false
end
|
#supports_partial_index? ⇒ Boolean
183
184
185
|
# File 'lib/active_record/connection_adapters/cockroachdb_adapter.rb', line 183
def supports_partial_index?
@crdb_version >= 202
end
|
#supports_ranges? ⇒ Boolean
174
175
176
177
|
# File 'lib/active_record/connection_adapters/cockroachdb_adapter.rb', line 174
def supports_ranges?
false
end
|
#supports_string_to_array_coercion? ⇒ Boolean
215
216
217
|
# File 'lib/active_record/connection_adapters/cockroachdb_adapter.rb', line 215
def supports_string_to_array_coercion?
@crdb_version >= 202
end
|
#supports_virtual_columns? ⇒ Boolean
210
211
212
213
|
# File 'lib/active_record/connection_adapters/cockroachdb_adapter.rb', line 210
def supports_virtual_columns?
false
end
|