activerecord 5.1.5 → 5.2.1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of activerecord might be problematic. Click here for more details.

Files changed (261) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +450 -699
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +5 -5
  5. data/examples/performance.rb +2 -0
  6. data/examples/simple.rb +2 -0
  7. data/lib/active_record/aggregations.rb +6 -5
  8. data/lib/active_record/association_relation.rb +4 -2
  9. data/lib/active_record/associations/alias_tracker.rb +19 -27
  10. data/lib/active_record/associations/association.rb +33 -37
  11. data/lib/active_record/associations/association_scope.rb +38 -50
  12. data/lib/active_record/associations/belongs_to_association.rb +28 -9
  13. data/lib/active_record/associations/belongs_to_polymorphic_association.rb +8 -8
  14. data/lib/active_record/associations/builder/association.rb +4 -7
  15. data/lib/active_record/associations/builder/belongs_to.rb +14 -5
  16. data/lib/active_record/associations/builder/collection_association.rb +1 -1
  17. data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +3 -1
  18. data/lib/active_record/associations/builder/has_many.rb +2 -0
  19. data/lib/active_record/associations/builder/has_one.rb +2 -0
  20. data/lib/active_record/associations/builder/singular_association.rb +2 -0
  21. data/lib/active_record/associations/collection_association.rb +52 -41
  22. data/lib/active_record/associations/collection_proxy.rb +12 -15
  23. data/lib/active_record/associations/foreign_association.rb +2 -0
  24. data/lib/active_record/associations/has_many_association.rb +3 -1
  25. data/lib/active_record/associations/has_many_through_association.rb +8 -19
  26. data/lib/active_record/associations/has_one_association.rb +12 -1
  27. data/lib/active_record/associations/has_one_through_association.rb +13 -8
  28. data/lib/active_record/associations/join_dependency/join_association.rb +22 -67
  29. data/lib/active_record/associations/join_dependency/join_base.rb +9 -8
  30. data/lib/active_record/associations/join_dependency/join_part.rb +9 -9
  31. data/lib/active_record/associations/join_dependency.rb +48 -93
  32. data/lib/active_record/associations/preloader/association.rb +45 -61
  33. data/lib/active_record/associations/preloader/through_association.rb +71 -79
  34. data/lib/active_record/associations/preloader.rb +17 -37
  35. data/lib/active_record/associations/singular_association.rb +14 -16
  36. data/lib/active_record/associations/through_association.rb +26 -11
  37. data/lib/active_record/associations.rb +40 -63
  38. data/lib/active_record/attribute_assignment.rb +2 -5
  39. data/lib/active_record/attribute_decorators.rb +3 -2
  40. data/lib/active_record/attribute_methods/before_type_cast.rb +2 -0
  41. data/lib/active_record/attribute_methods/dirty.rb +25 -214
  42. data/lib/active_record/attribute_methods/primary_key.rb +7 -6
  43. data/lib/active_record/attribute_methods/query.rb +2 -0
  44. data/lib/active_record/attribute_methods/read.rb +9 -3
  45. data/lib/active_record/attribute_methods/serialization.rb +23 -0
  46. data/lib/active_record/attribute_methods/time_zone_conversion.rb +6 -8
  47. data/lib/active_record/attribute_methods/write.rb +21 -9
  48. data/lib/active_record/attribute_methods.rb +65 -24
  49. data/lib/active_record/attributes.rb +7 -6
  50. data/lib/active_record/autosave_association.rb +16 -14
  51. data/lib/active_record/base.rb +2 -0
  52. data/lib/active_record/callbacks.rb +12 -6
  53. data/lib/active_record/coders/json.rb +2 -0
  54. data/lib/active_record/coders/yaml_column.rb +2 -0
  55. data/lib/active_record/collection_cache_key.rb +11 -7
  56. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +110 -35
  57. data/lib/active_record/connection_adapters/abstract/database_limits.rb +2 -0
  58. data/lib/active_record/connection_adapters/abstract/database_statements.rb +157 -29
  59. data/lib/active_record/connection_adapters/abstract/query_cache.rb +7 -2
  60. data/lib/active_record/connection_adapters/abstract/quoting.rb +15 -32
  61. data/lib/active_record/connection_adapters/abstract/savepoints.rb +2 -0
  62. data/lib/active_record/connection_adapters/abstract/schema_creation.rb +14 -5
  63. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +64 -6
  64. data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +31 -53
  65. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +149 -78
  66. data/lib/active_record/connection_adapters/abstract/transaction.rb +66 -21
  67. data/lib/active_record/connection_adapters/abstract_adapter.rb +81 -96
  68. data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +92 -165
  69. data/lib/active_record/connection_adapters/column.rb +3 -1
  70. data/lib/active_record/connection_adapters/connection_specification.rb +17 -3
  71. data/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb +2 -0
  72. data/lib/active_record/connection_adapters/mysql/column.rb +2 -0
  73. data/lib/active_record/connection_adapters/mysql/database_statements.rb +47 -2
  74. data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +2 -0
  75. data/lib/active_record/connection_adapters/mysql/quoting.rb +9 -10
  76. data/lib/active_record/connection_adapters/mysql/schema_creation.rb +5 -3
  77. data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +7 -10
  78. data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +30 -30
  79. data/lib/active_record/connection_adapters/mysql/schema_statements.rb +106 -1
  80. data/lib/active_record/connection_adapters/mysql/type_metadata.rb +2 -0
  81. data/lib/active_record/connection_adapters/mysql2_adapter.rb +8 -2
  82. data/lib/active_record/connection_adapters/postgresql/column.rb +2 -0
  83. data/lib/active_record/connection_adapters/postgresql/database_statements.rb +6 -0
  84. data/lib/active_record/connection_adapters/postgresql/explain_pretty_printer.rb +2 -0
  85. data/lib/active_record/connection_adapters/postgresql/oid/array.rb +6 -0
  86. data/lib/active_record/connection_adapters/postgresql/oid/bit.rb +2 -0
  87. data/lib/active_record/connection_adapters/postgresql/oid/bit_varying.rb +2 -0
  88. data/lib/active_record/connection_adapters/postgresql/oid/bytea.rb +2 -0
  89. data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +2 -0
  90. data/lib/active_record/connection_adapters/postgresql/oid/date.rb +23 -0
  91. data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +2 -0
  92. data/lib/active_record/connection_adapters/postgresql/oid/decimal.rb +3 -1
  93. data/lib/active_record/connection_adapters/postgresql/oid/enum.rb +2 -0
  94. data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +2 -0
  95. data/lib/active_record/connection_adapters/postgresql/oid/inet.rb +2 -0
  96. data/lib/active_record/connection_adapters/postgresql/oid/jsonb.rb +3 -1
  97. data/lib/active_record/connection_adapters/postgresql/oid/legacy_point.rb +2 -0
  98. data/lib/active_record/connection_adapters/postgresql/oid/money.rb +3 -1
  99. data/lib/active_record/connection_adapters/postgresql/oid/oid.rb +2 -0
  100. data/lib/active_record/connection_adapters/postgresql/oid/point.rb +2 -0
  101. data/lib/active_record/connection_adapters/postgresql/oid/range.rb +8 -2
  102. data/lib/active_record/connection_adapters/postgresql/oid/specialized_string.rb +2 -0
  103. data/lib/active_record/connection_adapters/postgresql/oid/type_map_initializer.rb +4 -2
  104. data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +3 -1
  105. data/lib/active_record/connection_adapters/postgresql/oid/vector.rb +2 -0
  106. data/lib/active_record/connection_adapters/postgresql/oid/xml.rb +2 -0
  107. data/lib/active_record/connection_adapters/postgresql/oid.rb +3 -1
  108. data/lib/active_record/connection_adapters/postgresql/quoting.rb +18 -0
  109. data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +19 -25
  110. data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +14 -0
  111. data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +24 -11
  112. data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +20 -13
  113. data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +248 -112
  114. data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +2 -0
  115. data/lib/active_record/connection_adapters/postgresql/utils.rb +2 -0
  116. data/lib/active_record/connection_adapters/postgresql_adapter.rb +57 -73
  117. data/lib/active_record/connection_adapters/schema_cache.rb +4 -2
  118. data/lib/active_record/connection_adapters/sql_type_metadata.rb +2 -0
  119. data/lib/active_record/connection_adapters/sqlite3/explain_pretty_printer.rb +2 -0
  120. data/lib/active_record/connection_adapters/sqlite3/quoting.rb +20 -1
  121. data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +2 -0
  122. data/lib/active_record/connection_adapters/sqlite3/schema_definitions.rb +6 -15
  123. data/lib/active_record/connection_adapters/sqlite3/schema_dumper.rb +3 -2
  124. data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +75 -1
  125. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +79 -92
  126. data/lib/active_record/connection_adapters/statement_pool.rb +2 -0
  127. data/lib/active_record/connection_handling.rb +4 -2
  128. data/lib/active_record/core.rb +39 -60
  129. data/lib/active_record/counter_cache.rb +20 -15
  130. data/lib/active_record/define_callbacks.rb +5 -3
  131. data/lib/active_record/dynamic_matchers.rb +9 -9
  132. data/lib/active_record/enum.rb +17 -13
  133. data/lib/active_record/errors.rb +42 -3
  134. data/lib/active_record/explain.rb +3 -1
  135. data/lib/active_record/explain_registry.rb +2 -0
  136. data/lib/active_record/explain_subscriber.rb +2 -0
  137. data/lib/active_record/fixture_set/file.rb +2 -0
  138. data/lib/active_record/fixtures.rb +67 -60
  139. data/lib/active_record/gem_version.rb +4 -2
  140. data/lib/active_record/inheritance.rb +49 -19
  141. data/lib/active_record/integration.rb +58 -19
  142. data/lib/active_record/internal_metadata.rb +2 -0
  143. data/lib/active_record/legacy_yaml_adapter.rb +3 -1
  144. data/lib/active_record/locking/optimistic.rb +30 -42
  145. data/lib/active_record/locking/pessimistic.rb +9 -6
  146. data/lib/active_record/log_subscriber.rb +43 -0
  147. data/lib/active_record/migration/command_recorder.rb +11 -9
  148. data/lib/active_record/migration/compatibility.rb +40 -2
  149. data/lib/active_record/migration/join_table.rb +2 -0
  150. data/lib/active_record/migration.rb +189 -139
  151. data/lib/active_record/model_schema.rb +19 -24
  152. data/lib/active_record/nested_attributes.rb +18 -6
  153. data/lib/active_record/no_touching.rb +3 -1
  154. data/lib/active_record/null_relation.rb +2 -0
  155. data/lib/active_record/persistence.rb +196 -48
  156. data/lib/active_record/query_cache.rb +12 -14
  157. data/lib/active_record/querying.rb +3 -1
  158. data/lib/active_record/railtie.rb +61 -3
  159. data/lib/active_record/railties/console_sandbox.rb +2 -0
  160. data/lib/active_record/railties/controller_runtime.rb +2 -0
  161. data/lib/active_record/railties/databases.rake +46 -36
  162. data/lib/active_record/readonly_attributes.rb +3 -2
  163. data/lib/active_record/reflection.rb +110 -192
  164. data/lib/active_record/relation/batches/batch_enumerator.rb +2 -0
  165. data/lib/active_record/relation/batches.rb +20 -5
  166. data/lib/active_record/relation/calculations.rb +31 -9
  167. data/lib/active_record/relation/delegation.rb +15 -27
  168. data/lib/active_record/relation/finder_methods.rb +71 -76
  169. data/lib/active_record/relation/from_clause.rb +2 -8
  170. data/lib/active_record/relation/merger.rb +47 -20
  171. data/lib/active_record/relation/predicate_builder/array_handler.rb +10 -7
  172. data/lib/active_record/relation/predicate_builder/association_query_value.rb +46 -0
  173. data/lib/active_record/relation/predicate_builder/base_handler.rb +2 -2
  174. data/lib/active_record/relation/predicate_builder/basic_object_handler.rb +12 -1
  175. data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +56 -0
  176. data/lib/active_record/relation/predicate_builder/range_handler.rb +26 -9
  177. data/lib/active_record/relation/predicate_builder/relation_handler.rb +6 -0
  178. data/lib/active_record/relation/predicate_builder.rb +55 -79
  179. data/lib/active_record/relation/query_attribute.rb +26 -2
  180. data/lib/active_record/relation/query_methods.rb +95 -91
  181. data/lib/active_record/relation/record_fetch_warning.rb +2 -0
  182. data/lib/active_record/relation/spawn_methods.rb +3 -1
  183. data/lib/active_record/relation/where_clause.rb +65 -68
  184. data/lib/active_record/relation/where_clause_factory.rb +5 -48
  185. data/lib/active_record/relation.rb +106 -219
  186. data/lib/active_record/result.rb +2 -0
  187. data/lib/active_record/runtime_registry.rb +2 -0
  188. data/lib/active_record/sanitization.rb +129 -121
  189. data/lib/active_record/schema.rb +4 -2
  190. data/lib/active_record/schema_dumper.rb +36 -26
  191. data/lib/active_record/schema_migration.rb +2 -0
  192. data/lib/active_record/scoping/default.rb +6 -7
  193. data/lib/active_record/scoping/named.rb +21 -7
  194. data/lib/active_record/scoping.rb +9 -8
  195. data/lib/active_record/secure_token.rb +2 -0
  196. data/lib/active_record/serialization.rb +2 -0
  197. data/lib/active_record/statement_cache.rb +22 -12
  198. data/lib/active_record/store.rb +3 -1
  199. data/lib/active_record/suppressor.rb +2 -0
  200. data/lib/active_record/table_metadata.rb +12 -3
  201. data/lib/active_record/tasks/database_tasks.rb +25 -14
  202. data/lib/active_record/tasks/mysql_database_tasks.rb +9 -48
  203. data/lib/active_record/tasks/postgresql_database_tasks.rb +10 -2
  204. data/lib/active_record/tasks/sqlite_database_tasks.rb +25 -3
  205. data/lib/active_record/timestamp.rb +13 -6
  206. data/lib/active_record/touch_later.rb +2 -0
  207. data/lib/active_record/transactions.rb +32 -27
  208. data/lib/active_record/translation.rb +2 -0
  209. data/lib/active_record/type/adapter_specific_registry.rb +2 -0
  210. data/lib/active_record/type/date.rb +2 -0
  211. data/lib/active_record/type/date_time.rb +2 -0
  212. data/lib/active_record/type/decimal_without_scale.rb +2 -0
  213. data/lib/active_record/type/hash_lookup_type_map.rb +2 -0
  214. data/lib/active_record/type/internal/timezone.rb +2 -0
  215. data/lib/active_record/type/json.rb +30 -0
  216. data/lib/active_record/type/serialized.rb +6 -0
  217. data/lib/active_record/type/text.rb +2 -0
  218. data/lib/active_record/type/time.rb +2 -0
  219. data/lib/active_record/type/type_map.rb +2 -0
  220. data/lib/active_record/type/unsigned_integer.rb +2 -0
  221. data/lib/active_record/type.rb +4 -1
  222. data/lib/active_record/type_caster/connection.rb +2 -0
  223. data/lib/active_record/type_caster/map.rb +3 -1
  224. data/lib/active_record/type_caster.rb +2 -0
  225. data/lib/active_record/validations/absence.rb +2 -0
  226. data/lib/active_record/validations/associated.rb +2 -0
  227. data/lib/active_record/validations/length.rb +2 -0
  228. data/lib/active_record/validations/presence.rb +2 -0
  229. data/lib/active_record/validations/uniqueness.rb +36 -6
  230. data/lib/active_record/validations.rb +2 -0
  231. data/lib/active_record/version.rb +2 -0
  232. data/lib/active_record.rb +11 -4
  233. data/lib/rails/generators/active_record/application_record/application_record_generator.rb +27 -0
  234. data/lib/rails/generators/active_record/{model/templates/application_record.rb → application_record/templates/application_record.rb.tt} +0 -0
  235. data/lib/rails/generators/active_record/migration/migration_generator.rb +3 -1
  236. data/lib/rails/generators/active_record/migration/templates/{create_table_migration.rb → create_table_migration.rb.tt} +0 -0
  237. data/lib/rails/generators/active_record/migration/templates/{migration.rb → migration.rb.tt} +0 -0
  238. data/lib/rails/generators/active_record/migration.rb +2 -0
  239. data/lib/rails/generators/active_record/model/model_generator.rb +2 -23
  240. data/lib/rails/generators/active_record/model/templates/{model.rb → model.rb.tt} +0 -0
  241. data/lib/rails/generators/active_record/model/templates/{module.rb → module.rb.tt} +0 -0
  242. data/lib/rails/generators/active_record.rb +3 -1
  243. metadata +23 -36
  244. data/lib/active_record/associations/preloader/belongs_to.rb +0 -15
  245. data/lib/active_record/associations/preloader/collection_association.rb +0 -17
  246. data/lib/active_record/associations/preloader/has_many.rb +0 -15
  247. data/lib/active_record/associations/preloader/has_many_through.rb +0 -19
  248. data/lib/active_record/associations/preloader/has_one.rb +0 -15
  249. data/lib/active_record/associations/preloader/has_one_through.rb +0 -9
  250. data/lib/active_record/associations/preloader/singular_association.rb +0 -18
  251. data/lib/active_record/attribute/user_provided_default.rb +0 -30
  252. data/lib/active_record/attribute.rb +0 -240
  253. data/lib/active_record/attribute_mutation_tracker.rb +0 -114
  254. data/lib/active_record/attribute_set/builder.rb +0 -124
  255. data/lib/active_record/attribute_set/yaml_encoder.rb +0 -41
  256. data/lib/active_record/attribute_set.rb +0 -113
  257. data/lib/active_record/connection_adapters/postgresql/oid/json.rb +0 -10
  258. data/lib/active_record/railties/jdbcmysql_error.rb +0 -16
  259. data/lib/active_record/relation/predicate_builder/association_query_handler.rb +0 -88
  260. data/lib/active_record/relation/predicate_builder/polymorphic_array_handler.rb +0 -59
  261. data/lib/active_record/type/internal/abstract_json.rb +0 -37
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # Make sure we're using pg high enough for type casts and Ruby 2.2+ compatibility
2
4
  gem "pg", ">= 0.18", "< 2.0"
3
5
  require "pg"
@@ -62,11 +64,11 @@ module ActiveRecord
62
64
  # defaults to true.
63
65
  #
64
66
  # Any further options are used as connection parameters to libpq. See
65
- # http://www.postgresql.org/docs/current/static/libpq-connect.html for the
67
+ # https://www.postgresql.org/docs/current/static/libpq-connect.html for the
66
68
  # list of parameters.
67
69
  #
68
70
  # In addition, default connection parameters of libpq can be set per environment variables.
69
- # See http://www.postgresql.org/docs/current/static/libpq-envars.html .
71
+ # See https://www.postgresql.org/docs/current/static/libpq-envars.html .
70
72
  class PostgreSQLAdapter < AbstractAdapter
71
73
  ADAPTER_NAME = "PostgreSQL".freeze
72
74
 
@@ -74,7 +76,7 @@ module ActiveRecord
74
76
  primary_key: "bigserial primary key",
75
77
  string: { name: "character varying" },
76
78
  text: { name: "text" },
77
- integer: { name: "integer" },
79
+ integer: { name: "integer", limit: 4 },
78
80
  float: { name: "float" },
79
81
  decimal: { name: "decimal" },
80
82
  datetime: { name: "timestamp" },
@@ -119,19 +121,8 @@ module ActiveRecord
119
121
  include PostgreSQL::ReferentialIntegrity
120
122
  include PostgreSQL::SchemaStatements
121
123
  include PostgreSQL::DatabaseStatements
122
- include PostgreSQL::ColumnDumper
123
-
124
- def schema_creation # :nodoc:
125
- PostgreSQL::SchemaCreation.new self
126
- end
127
-
128
- def arel_visitor # :nodoc:
129
- Arel::Visitors::PostgreSQL.new(self)
130
- end
131
124
 
132
- # Returns true, since this connection adapter supports prepared statement
133
- # caching.
134
- def supports_statement_cache?
125
+ def supports_bulk_alter?
135
126
  true
136
127
  end
137
128
 
@@ -155,6 +146,10 @@ module ActiveRecord
155
146
  true
156
147
  end
157
148
 
149
+ def supports_validate_constraints?
150
+ true
151
+ end
152
+
158
153
  def supports_views?
159
154
  true
160
155
  end
@@ -179,7 +174,7 @@ module ActiveRecord
179
174
  { concurrently: "CONCURRENTLY" }
180
175
  end
181
176
 
182
- class StatementPool < ConnectionAdapters::StatementPool
177
+ class StatementPool < ConnectionAdapters::StatementPool # :nodoc:
183
178
  def initialize(connection, max)
184
179
  super(max)
185
180
  @connection = connection
@@ -195,7 +190,6 @@ module ActiveRecord
195
190
  end
196
191
 
197
192
  private
198
-
199
193
  def dealloc(key)
200
194
  @connection.query "DEALLOCATE #{key}" if connection_active?
201
195
  rescue PG::Error
@@ -230,7 +224,7 @@ module ActiveRecord
230
224
  add_pg_decoders
231
225
 
232
226
  @type_map = Type::HashLookupTypeMap.new
233
- initialize_type_map(type_map)
227
+ initialize_type_map
234
228
  @local_tz = execute("SHOW TIME ZONE", "SCHEMA").first["TimeZone"]
235
229
  @use_insert_returning = @config.key?(:insert_returning) ? self.class.type_cast_config_to_boolean(@config[:insert_returning]) : true
236
230
  end
@@ -286,6 +280,11 @@ module ActiveRecord
286
280
  end
287
281
  end
288
282
 
283
+ def discard! # :nodoc:
284
+ @connection.socket_io.reopen(IO::NULL) rescue nil
285
+ @connection = nil
286
+ end
287
+
289
288
  def native_database_types #:nodoc:
290
289
  NATIVE_DATABASE_TYPES
291
290
  end
@@ -310,8 +309,8 @@ module ActiveRecord
310
309
  true
311
310
  end
312
311
 
313
- # Range datatypes weren't introduced until PostgreSQL 9.2
314
312
  def supports_ranges?
313
+ # Range datatypes weren't introduced until PostgreSQL 9.2
315
314
  postgresql_version >= 90200
316
315
  end
317
316
 
@@ -319,20 +318,24 @@ module ActiveRecord
319
318
  postgresql_version >= 90300
320
319
  end
321
320
 
321
+ def supports_foreign_tables?
322
+ postgresql_version >= 90300
323
+ end
324
+
322
325
  def supports_pgcrypto_uuid?
323
326
  postgresql_version >= 90400
324
327
  end
325
328
 
326
329
  def get_advisory_lock(lock_id) # :nodoc:
327
330
  unless lock_id.is_a?(Integer) && lock_id.bit_length <= 63
328
- raise(ArgumentError, "Postgres requires advisory lock ids to be a signed 64 bit integer")
331
+ raise(ArgumentError, "PostgreSQL requires advisory lock ids to be a signed 64 bit integer")
329
332
  end
330
333
  query_value("SELECT pg_try_advisory_lock(#{lock_id})")
331
334
  end
332
335
 
333
336
  def release_advisory_lock(lock_id) # :nodoc:
334
337
  unless lock_id.is_a?(Integer) && lock_id.bit_length <= 63
335
- raise(ArgumentError, "Postgres requires advisory lock ids to be a signed 64 bit integer")
338
+ raise(ArgumentError, "PostgreSQL requires advisory lock ids to be a signed 64 bit integer")
336
339
  end
337
340
  query_value("SELECT pg_advisory_unlock(#{lock_id})")
338
341
  end
@@ -350,18 +353,12 @@ module ActiveRecord
350
353
  end
351
354
 
352
355
  def extension_enabled?(name)
353
- if supports_extensions?
354
- res = exec_query("SELECT EXISTS(SELECT * FROM pg_available_extensions WHERE name = '#{name}' AND installed_version IS NOT NULL) as enabled", "SCHEMA")
355
- res.cast_values.first
356
- end
356
+ res = exec_query("SELECT EXISTS(SELECT * FROM pg_available_extensions WHERE name = '#{name}' AND installed_version IS NOT NULL) as enabled", "SCHEMA")
357
+ res.cast_values.first
357
358
  end
358
359
 
359
360
  def extensions
360
- if supports_extensions?
361
- exec_query("SELECT extname FROM pg_extension", "SCHEMA").cast_values
362
- else
363
- super
364
- end
361
+ exec_query("SELECT extname FROM pg_extension", "SCHEMA").cast_values
365
362
  end
366
363
 
367
364
  # Returns the configured supported identifier length supported by PostgreSQL
@@ -381,10 +378,6 @@ module ActiveRecord
381
378
  @use_insert_returning
382
379
  end
383
380
 
384
- def update_table_definition(table_name, base) #:nodoc:
385
- PostgreSQL::Table.new(table_name, base)
386
- end
387
-
388
381
  def column_name_for_operation(operation, node) # :nodoc:
389
382
  OPERATION_ALIASES.fetch(operation) { operation.downcase }
390
383
  end
@@ -405,8 +398,7 @@ module ActiveRecord
405
398
  end
406
399
 
407
400
  private
408
-
409
- # See http://www.postgresql.org/docs/current/static/errcodes-appendix.html
401
+ # See https://www.postgresql.org/docs/current/static/errcodes-appendix.html
410
402
  VALUE_LIMIT_VIOLATION = "22001"
411
403
  NUMERIC_VALUE_OUT_OF_RANGE = "22003"
412
404
  NOT_NULL_VIOLATION = "23502"
@@ -414,6 +406,8 @@ module ActiveRecord
414
406
  UNIQUE_VIOLATION = "23505"
415
407
  SERIALIZATION_FAILURE = "40001"
416
408
  DEADLOCK_DETECTED = "40P01"
409
+ LOCK_NOT_AVAILABLE = "55P03"
410
+ QUERY_CANCELED = "57014"
417
411
 
418
412
  def translate_exception(exception, message)
419
413
  return exception unless exception.respond_to?(:result)
@@ -433,6 +427,10 @@ module ActiveRecord
433
427
  SerializationFailure.new(message)
434
428
  when DEADLOCK_DETECTED
435
429
  Deadlocked.new(message)
430
+ when LOCK_NOT_AVAILABLE
431
+ LockWaitTimeout.new(message)
432
+ when QUERY_CANCELED
433
+ QueryCanceled.new(message)
436
434
  else
437
435
  super
438
436
  end
@@ -440,7 +438,7 @@ module ActiveRecord
440
438
 
441
439
  def get_oid_type(oid, fmod, column_name, sql_type = "".freeze)
442
440
  if !type_map.key?(oid)
443
- load_additional_types(type_map, [oid])
441
+ load_additional_types([oid])
444
442
  end
445
443
 
446
444
  type_map.fetch(oid, fmod, sql_type) {
@@ -451,10 +449,10 @@ module ActiveRecord
451
449
  }
452
450
  end
453
451
 
454
- def initialize_type_map(m)
455
- register_class_with_limit m, "int2", Type::Integer
456
- register_class_with_limit m, "int4", Type::Integer
457
- register_class_with_limit m, "int8", Type::Integer
452
+ def initialize_type_map(m = type_map)
453
+ m.register_type "int2", Type::Integer.new(limit: 2)
454
+ m.register_type "int4", Type::Integer.new(limit: 4)
455
+ m.register_type "int8", Type::Integer.new(limit: 8)
458
456
  m.register_type "oid", OID::Oid.new
459
457
  m.register_type "float4", Type::Float.new
460
458
  m.alias_type "float8", "float4"
@@ -467,13 +465,13 @@ module ActiveRecord
467
465
  register_class_with_limit m, "bit", OID::Bit
468
466
  register_class_with_limit m, "varbit", OID::BitVarying
469
467
  m.alias_type "timestamptz", "timestamp"
470
- m.register_type "date", Type::Date.new
468
+ m.register_type "date", OID::Date.new
471
469
 
472
470
  m.register_type "money", OID::Money.new
473
471
  m.register_type "bytea", OID::Bytea.new
474
472
  m.register_type "point", OID::Point.new
475
473
  m.register_type "hstore", OID::Hstore.new
476
- m.register_type "json", OID::Json.new
474
+ m.register_type "json", Type::Json.new
477
475
  m.register_type "jsonb", OID::Jsonb.new
478
476
  m.register_type "cidr", OID::Cidr.new
479
477
  m.register_type "inet", OID::Inet.new
@@ -518,18 +516,7 @@ module ActiveRecord
518
516
  end
519
517
  end
520
518
 
521
- load_additional_types(m)
522
- end
523
-
524
- def extract_limit(sql_type)
525
- case sql_type
526
- when /^bigint/i, /^int8/i
527
- 8
528
- when /^smallint/i
529
- 2
530
- else
531
- super
532
- end
519
+ load_additional_types
533
520
  end
534
521
 
535
522
  # Extracts the value from a PostgreSQL column default definition.
@@ -567,7 +554,7 @@ module ActiveRecord
567
554
  !default_value && %r{\w+\(.*\)|\(.*\)::\w+|CURRENT_DATE|CURRENT_TIMESTAMP}.match?(default)
568
555
  end
569
556
 
570
- def load_additional_types(type_map, oids = nil)
557
+ def load_additional_types(oids = nil)
571
558
  initializer = OID::TypeMapInitializer.new(type_map)
572
559
 
573
560
  if supports_ranges?
@@ -586,7 +573,7 @@ module ActiveRecord
586
573
  if oids
587
574
  query += "WHERE t.oid::integer IN (%s)" % oids.join(", ")
588
575
  else
589
- query += initializer.query_conditions_for_initial_load(type_map)
576
+ query += initializer.query_conditions_for_initial_load
590
577
  end
591
578
 
592
579
  execute_and_clear(query, "SCHEMA", []) do |records|
@@ -651,7 +638,7 @@ module ActiveRecord
651
638
  # ActiveRecord::PreparedStatementCacheExpired
652
639
  #
653
640
  # Check here for more details:
654
- # http://git.postgresql.org/gitweb/?p=postgresql.git;a=blob;f=src/backend/utils/cache/plancache.c#l573
641
+ # https://git.postgresql.org/gitweb/?p=postgresql.git;a=blob;f=src/backend/utils/cache/plancache.c#l573
655
642
  CACHED_PLAN_HEURISTIC = "cached plan must not change result type".freeze
656
643
  def is_cached_plan_failure?(e)
657
644
  pgerror = e.cause
@@ -716,18 +703,20 @@ module ActiveRecord
716
703
  # Use standard-conforming strings so we don't have to do the E'...' dance.
717
704
  set_standard_conforming_strings
718
705
 
706
+ variables = @config.fetch(:variables, {}).stringify_keys
707
+
719
708
  # If using Active Record's time zone support configure the connection to return
720
709
  # TIMESTAMP WITH ZONE types in UTC.
721
- # (SET TIME ZONE does not use an equals sign like other SET variables)
722
- if ActiveRecord::Base.default_timezone == :utc
723
- execute("SET time zone 'UTC'", "SCHEMA")
724
- elsif @local_tz
725
- execute("SET time zone '#{@local_tz}'", "SCHEMA")
710
+ unless variables["timezone"]
711
+ if ActiveRecord::Base.default_timezone == :utc
712
+ variables["timezone"] = "UTC"
713
+ elsif @local_tz
714
+ variables["timezone"] = @local_tz
715
+ end
726
716
  end
727
717
 
728
718
  # SET statements from :variables config hash
729
- # http://www.postgresql.org/docs/current/static/sql-set.html
730
- variables = @config[:variables] || {}
719
+ # https://www.postgresql.org/docs/current/static/sql-set.html
731
720
  variables.map do |k, v|
732
721
  if v == ":default" || v == :default
733
722
  # Sets the value to the global or compile default
@@ -738,11 +727,6 @@ module ActiveRecord
738
727
  end
739
728
  end
740
729
 
741
- # Returns the current ID of a table's sequence.
742
- def last_insert_id_result(sequence_name)
743
- exec_query("SELECT currval('#{sequence_name}')", "SQL")
744
- end
745
-
746
730
  # Returns the list of a table's column names, data types, and default values.
747
731
  #
748
732
  # The underlying query is roughly:
@@ -781,8 +765,8 @@ module ActiveRecord
781
765
  $1.strip if $1
782
766
  end
783
767
 
784
- def create_table_definition(*args)
785
- PostgreSQL::TableDefinition.new(*args)
768
+ def arel_visitor
769
+ Arel::Visitors::PostgreSQL.new(self)
786
770
  end
787
771
 
788
772
  def can_perform_case_insensitive_comparison_for?(column)
@@ -853,12 +837,12 @@ module ActiveRecord
853
837
  ActiveRecord::Type.register(:bit_varying, OID::BitVarying, adapter: :postgresql)
854
838
  ActiveRecord::Type.register(:binary, OID::Bytea, adapter: :postgresql)
855
839
  ActiveRecord::Type.register(:cidr, OID::Cidr, adapter: :postgresql)
840
+ ActiveRecord::Type.register(:date, OID::Date, adapter: :postgresql)
856
841
  ActiveRecord::Type.register(:datetime, OID::DateTime, adapter: :postgresql)
857
842
  ActiveRecord::Type.register(:decimal, OID::Decimal, adapter: :postgresql)
858
843
  ActiveRecord::Type.register(:enum, OID::Enum, adapter: :postgresql)
859
844
  ActiveRecord::Type.register(:hstore, OID::Hstore, adapter: :postgresql)
860
845
  ActiveRecord::Type.register(:inet, OID::Inet, adapter: :postgresql)
861
- ActiveRecord::Type.register(:json, OID::Json, adapter: :postgresql)
862
846
  ActiveRecord::Type.register(:jsonb, OID::Jsonb, adapter: :postgresql)
863
847
  ActiveRecord::Type.register(:money, OID::Money, adapter: :postgresql)
864
848
  ActiveRecord::Type.register(:point, OID::Point, adapter: :postgresql)
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ActiveRecord
2
4
  module ConnectionAdapters
3
5
  class SchemaCache
@@ -26,7 +28,7 @@ module ActiveRecord
26
28
  coder["columns_hash"] = @columns_hash
27
29
  coder["primary_keys"] = @primary_keys
28
30
  coder["data_sources"] = @data_sources
29
- coder["version"] = ActiveRecord::Migrator.current_version
31
+ coder["version"] = connection.migration_context.current_version
30
32
  end
31
33
 
32
34
  def init_with(coder)
@@ -98,7 +100,7 @@ module ActiveRecord
98
100
 
99
101
  def marshal_dump
100
102
  # if we get current version during initialization, it happens stack over flow.
101
- @version = ActiveRecord::Migrator.current_version
103
+ @version = connection.migration_context.current_version
102
104
  [@version, @columns, @columns_hash, @primary_keys, @data_sources]
103
105
  end
104
106
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ActiveRecord
2
4
  # :stopdoc:
3
5
  module ConnectionAdapters
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ActiveRecord
2
4
  module ConnectionAdapters
3
5
  module SQLite3
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ActiveRecord
2
4
  module ConnectionAdapters
3
5
  module SQLite3
@@ -15,13 +17,30 @@ module ActiveRecord
15
17
  end
16
18
 
17
19
  def quoted_time(value)
18
- quoted_date(value)
20
+ value = value.change(year: 2000, month: 1, day: 1)
21
+ quoted_date(value).sub(/\A\d\d\d\d-\d\d-\d\d /, "2000-01-01 ")
19
22
  end
20
23
 
21
24
  def quoted_binary(value)
22
25
  "x'#{value.hex}'"
23
26
  end
24
27
 
28
+ def quoted_true
29
+ ActiveRecord::ConnectionAdapters::SQLite3Adapter.represent_boolean_as_integer ? "1".freeze : "'t'".freeze
30
+ end
31
+
32
+ def unquoted_true
33
+ ActiveRecord::ConnectionAdapters::SQLite3Adapter.represent_boolean_as_integer ? 1 : "t".freeze
34
+ end
35
+
36
+ def quoted_false
37
+ ActiveRecord::ConnectionAdapters::SQLite3Adapter.represent_boolean_as_integer ? "0".freeze : "'f'".freeze
38
+ end
39
+
40
+ def unquoted_false
41
+ ActiveRecord::ConnectionAdapters::SQLite3Adapter.represent_boolean_as_integer ? 0 : "f".freeze
42
+ end
43
+
25
44
  private
26
45
 
27
46
  def _type_cast(value)
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ActiveRecord
2
4
  module ConnectionAdapters
3
5
  module SQLite3
@@ -1,27 +1,18 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ActiveRecord
2
4
  module ConnectionAdapters
3
5
  module SQLite3
4
- module ColumnMethods
5
- def primary_key(name, type = :primary_key, **options)
6
- if %i(integer bigint).include?(type) && (options.delete(:auto_increment) == true || !options.key?(:default))
7
- type = :primary_key
8
- end
9
-
10
- super
11
- end
12
- end
13
-
14
6
  class TableDefinition < ActiveRecord::ConnectionAdapters::TableDefinition
15
- include ColumnMethods
16
-
17
7
  def references(*args, **options)
18
8
  super(*args, type: :integer, **options)
19
9
  end
20
10
  alias :belongs_to :references
21
- end
22
11
 
23
- class Table < ActiveRecord::ConnectionAdapters::Table
24
- include ColumnMethods
12
+ private
13
+ def integer_like_primary_key_type(type, options)
14
+ :primary_key
15
+ end
25
16
  end
26
17
  end
27
18
  end
@@ -1,9 +1,10 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ActiveRecord
2
4
  module ConnectionAdapters
3
5
  module SQLite3
4
- module ColumnDumper # :nodoc:
6
+ class SchemaDumper < ConnectionAdapters::SchemaDumper # :nodoc:
5
7
  private
6
-
7
8
  def default_primary_key?(column)
8
9
  schema_type(column) == :integer
9
10
  end
@@ -1,13 +1,87 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ActiveRecord
2
4
  module ConnectionAdapters
3
5
  module SQLite3
4
6
  module SchemaStatements # :nodoc:
7
+ # Returns an array of indexes for the given table.
8
+ def indexes(table_name)
9
+ exec_query("PRAGMA index_list(#{quote_table_name(table_name)})", "SCHEMA").map do |row|
10
+ # Indexes SQLite creates implicitly for internal use start with "sqlite_".
11
+ # See https://www.sqlite.org/fileformat2.html#intschema
12
+ next if row["name"].starts_with?("sqlite_")
13
+
14
+ index_sql = query_value(<<-SQL, "SCHEMA")
15
+ SELECT sql
16
+ FROM sqlite_master
17
+ WHERE name = #{quote(row['name'])} AND type = 'index'
18
+ UNION ALL
19
+ SELECT sql
20
+ FROM sqlite_temp_master
21
+ WHERE name = #{quote(row['name'])} AND type = 'index'
22
+ SQL
23
+
24
+ /\sWHERE\s+(?<where>.+)$/i =~ index_sql
25
+
26
+ columns = exec_query("PRAGMA index_info(#{quote(row['name'])})", "SCHEMA").map do |col|
27
+ col["name"]
28
+ end
29
+
30
+ # Add info on sort order for columns (only desc order is explicitly specified, asc is
31
+ # the default)
32
+ orders = {}
33
+ if index_sql # index_sql can be null in case of primary key indexes
34
+ index_sql.scan(/"(\w+)" DESC/).flatten.each { |order_column|
35
+ orders[order_column] = :desc
36
+ }
37
+ end
38
+
39
+ IndexDefinition.new(
40
+ table_name,
41
+ row["name"],
42
+ row["unique"] != 0,
43
+ columns,
44
+ where: where,
45
+ orders: orders
46
+ )
47
+ end.compact
48
+ end
49
+
50
+ def create_schema_dumper(options)
51
+ SQLite3::SchemaDumper.create(self, options)
52
+ end
53
+
5
54
  private
55
+ def schema_creation
56
+ SQLite3::SchemaCreation.new(self)
57
+ end
58
+
59
+ def create_table_definition(*args)
60
+ SQLite3::TableDefinition.new(*args)
61
+ end
62
+
63
+ def new_column_from_field(table_name, field)
64
+ default = \
65
+ case field["dflt_value"]
66
+ when /^null$/i
67
+ nil
68
+ when /^'(.*)'$/m
69
+ $1.gsub("''", "'")
70
+ when /^"(.*)"$/m
71
+ $1.gsub('""', '"')
72
+ else
73
+ field["dflt_value"]
74
+ end
75
+
76
+ type_metadata = fetch_type_metadata(field["type"])
77
+ Column.new(field["name"], default, type_metadata, field["notnull"].to_i == 0, table_name, nil, field["collation"])
78
+ end
79
+
6
80
  def data_source_sql(name = nil, type: nil)
7
81
  scope = quoted_scope(name, type: type)
8
82
  scope[:type] ||= "'table','view'"
9
83
 
10
- sql = "SELECT name FROM sqlite_master WHERE name <> 'sqlite_sequence'"
84
+ sql = "SELECT name FROM sqlite_master WHERE name <> 'sqlite_sequence'".dup
11
85
  sql << " AND name = #{scope[:name]}" if scope[:name]
12
86
  sql << " AND type IN (#{scope[:type]})"
13
87
  sql