activerecord 6.0.0 → 7.2.3

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.
Files changed (376) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +996 -594
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +34 -34
  5. data/examples/performance.rb +2 -2
  6. data/lib/active_record/aggregations.rb +22 -20
  7. data/lib/active_record/association_relation.rb +22 -12
  8. data/lib/active_record/associations/alias_tracker.rb +41 -30
  9. data/lib/active_record/associations/association.rb +106 -41
  10. data/lib/active_record/associations/association_scope.rb +30 -21
  11. data/lib/active_record/associations/belongs_to_association.rb +69 -14
  12. data/lib/active_record/associations/belongs_to_polymorphic_association.rb +20 -6
  13. data/lib/active_record/associations/builder/association.rb +39 -6
  14. data/lib/active_record/associations/builder/belongs_to.rb +47 -17
  15. data/lib/active_record/associations/builder/collection_association.rb +14 -6
  16. data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +3 -10
  17. data/lib/active_record/associations/builder/has_many.rb +7 -3
  18. data/lib/active_record/associations/builder/has_one.rb +13 -16
  19. data/lib/active_record/associations/builder/singular_association.rb +7 -3
  20. data/lib/active_record/associations/collection_association.rb +90 -53
  21. data/lib/active_record/associations/collection_proxy.rb +54 -19
  22. data/lib/active_record/associations/disable_joins_association_scope.rb +59 -0
  23. data/lib/active_record/associations/errors.rb +265 -0
  24. data/lib/active_record/associations/foreign_association.rb +21 -1
  25. data/lib/active_record/associations/has_many_association.rb +41 -10
  26. data/lib/active_record/associations/has_many_through_association.rb +29 -12
  27. data/lib/active_record/associations/has_one_association.rb +33 -9
  28. data/lib/active_record/associations/has_one_through_association.rb +1 -1
  29. data/lib/active_record/associations/join_dependency/join_association.rb +41 -17
  30. data/lib/active_record/associations/join_dependency/join_part.rb +3 -3
  31. data/lib/active_record/associations/join_dependency.rb +97 -54
  32. data/lib/active_record/associations/nested_error.rb +47 -0
  33. data/lib/active_record/associations/preloader/association.rb +237 -54
  34. data/lib/active_record/associations/preloader/batch.rb +48 -0
  35. data/lib/active_record/associations/preloader/branch.rb +153 -0
  36. data/lib/active_record/associations/preloader/through_association.rb +51 -17
  37. data/lib/active_record/associations/preloader.rb +55 -121
  38. data/lib/active_record/associations/singular_association.rb +16 -4
  39. data/lib/active_record/associations/through_association.rb +26 -15
  40. data/lib/active_record/associations.rb +454 -440
  41. data/lib/active_record/asynchronous_queries_tracker.rb +60 -0
  42. data/lib/active_record/attribute_assignment.rb +11 -14
  43. data/lib/active_record/attribute_methods/before_type_cast.rb +36 -11
  44. data/lib/active_record/attribute_methods/composite_primary_key.rb +84 -0
  45. data/lib/active_record/attribute_methods/dirty.rb +75 -34
  46. data/lib/active_record/attribute_methods/primary_key.rb +53 -31
  47. data/lib/active_record/attribute_methods/query.rb +31 -22
  48. data/lib/active_record/attribute_methods/read.rb +16 -17
  49. data/lib/active_record/attribute_methods/serialization.rb +177 -35
  50. data/lib/active_record/attribute_methods/time_zone_conversion.rb +18 -15
  51. data/lib/active_record/attribute_methods/write.rb +16 -28
  52. data/lib/active_record/attribute_methods.rb +227 -100
  53. data/lib/active_record/attributes.rb +94 -56
  54. data/lib/active_record/autosave_association.rb +119 -73
  55. data/lib/active_record/base.rb +31 -21
  56. data/lib/active_record/callbacks.rb +168 -55
  57. data/lib/active_record/coders/column_serializer.rb +61 -0
  58. data/lib/active_record/coders/json.rb +1 -1
  59. data/lib/active_record/coders/yaml_column.rb +70 -25
  60. data/lib/active_record/connection_adapters/abstract/connection_handler.rb +284 -0
  61. data/lib/active_record/connection_adapters/abstract/connection_pool/queue.rb +211 -0
  62. data/lib/active_record/connection_adapters/abstract/connection_pool/reaper.rb +79 -0
  63. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +367 -565
  64. data/lib/active_record/connection_adapters/abstract/database_limits.rb +3 -57
  65. data/lib/active_record/connection_adapters/abstract/database_statements.rb +277 -89
  66. data/lib/active_record/connection_adapters/abstract/query_cache.rb +241 -69
  67. data/lib/active_record/connection_adapters/abstract/quoting.rb +122 -134
  68. data/lib/active_record/connection_adapters/abstract/savepoints.rb +4 -3
  69. data/lib/active_record/connection_adapters/abstract/schema_creation.rb +153 -116
  70. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +324 -72
  71. data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +17 -4
  72. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +611 -211
  73. data/lib/active_record/connection_adapters/abstract/transaction.rb +425 -82
  74. data/lib/active_record/connection_adapters/abstract_adapter.rb +698 -211
  75. data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +464 -239
  76. data/lib/active_record/connection_adapters/column.rb +28 -1
  77. data/lib/active_record/connection_adapters/deduplicable.rb +29 -0
  78. data/lib/active_record/connection_adapters/mysql/column.rb +2 -1
  79. data/lib/active_record/connection_adapters/mysql/database_statements.rb +32 -137
  80. data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +1 -2
  81. data/lib/active_record/connection_adapters/mysql/quoting.rb +90 -43
  82. data/lib/active_record/connection_adapters/mysql/schema_creation.rb +41 -7
  83. data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +18 -1
  84. data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +13 -4
  85. data/lib/active_record/connection_adapters/mysql/schema_statements.rb +53 -15
  86. data/lib/active_record/connection_adapters/mysql/type_metadata.rb +10 -1
  87. data/lib/active_record/connection_adapters/mysql2/database_statements.rb +152 -0
  88. data/lib/active_record/connection_adapters/mysql2_adapter.rb +127 -63
  89. data/lib/active_record/connection_adapters/pool_config.rb +83 -0
  90. data/lib/active_record/connection_adapters/pool_manager.rb +57 -0
  91. data/lib/active_record/connection_adapters/postgresql/column.rb +54 -2
  92. data/lib/active_record/connection_adapters/postgresql/database_statements.rb +127 -100
  93. data/lib/active_record/connection_adapters/postgresql/oid/array.rb +1 -2
  94. data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +9 -5
  95. data/lib/active_record/connection_adapters/postgresql/oid/date.rb +10 -2
  96. data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +15 -2
  97. data/lib/active_record/connection_adapters/postgresql/oid/enum.rb +0 -1
  98. data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +53 -15
  99. data/lib/active_record/connection_adapters/postgresql/oid/interval.rb +49 -0
  100. data/lib/active_record/connection_adapters/postgresql/oid/legacy_point.rb +2 -3
  101. data/lib/active_record/connection_adapters/postgresql/oid/macaddr.rb +25 -0
  102. data/lib/active_record/connection_adapters/postgresql/oid/money.rb +5 -4
  103. data/lib/active_record/connection_adapters/postgresql/oid/oid.rb +1 -1
  104. data/lib/active_record/connection_adapters/postgresql/oid/point.rb +2 -3
  105. data/lib/active_record/connection_adapters/postgresql/oid/range.rb +35 -8
  106. data/lib/active_record/connection_adapters/postgresql/oid/specialized_string.rb +1 -1
  107. data/lib/active_record/connection_adapters/postgresql/oid/timestamp.rb +15 -0
  108. data/lib/active_record/connection_adapters/postgresql/oid/timestamp_with_time_zone.rb +30 -0
  109. data/lib/active_record/connection_adapters/postgresql/oid/type_map_initializer.rb +18 -6
  110. data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +23 -4
  111. data/lib/active_record/connection_adapters/postgresql/oid.rb +4 -0
  112. data/lib/active_record/connection_adapters/postgresql/quoting.rb +139 -106
  113. data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +30 -2
  114. data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +98 -4
  115. data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +176 -4
  116. data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +78 -1
  117. data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +462 -118
  118. data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +8 -0
  119. data/lib/active_record/connection_adapters/postgresql/utils.rb +9 -11
  120. data/lib/active_record/connection_adapters/postgresql_adapter.rb +585 -295
  121. data/lib/active_record/connection_adapters/schema_cache.rb +399 -60
  122. data/lib/active_record/connection_adapters/sql_type_metadata.rb +8 -0
  123. data/lib/active_record/connection_adapters/sqlite3/column.rb +62 -0
  124. data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +99 -48
  125. data/lib/active_record/connection_adapters/sqlite3/quoting.rb +80 -54
  126. data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +27 -1
  127. data/lib/active_record/connection_adapters/sqlite3/schema_definitions.rb +20 -0
  128. data/lib/active_record/connection_adapters/sqlite3/schema_dumper.rb +16 -0
  129. data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +102 -24
  130. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +425 -174
  131. data/lib/active_record/connection_adapters/statement_pool.rb +7 -1
  132. data/lib/active_record/connection_adapters/trilogy/database_statements.rb +99 -0
  133. data/lib/active_record/connection_adapters/trilogy_adapter.rb +229 -0
  134. data/lib/active_record/connection_adapters.rb +176 -0
  135. data/lib/active_record/connection_handling.rb +243 -115
  136. data/lib/active_record/core.rb +481 -199
  137. data/lib/active_record/counter_cache.rb +69 -32
  138. data/lib/active_record/database_configurations/connection_url_resolver.rb +107 -0
  139. data/lib/active_record/database_configurations/database_config.rb +77 -10
  140. data/lib/active_record/database_configurations/hash_config.rb +148 -26
  141. data/lib/active_record/database_configurations/url_config.rb +44 -45
  142. data/lib/active_record/database_configurations.rb +190 -114
  143. data/lib/active_record/delegated_type.rb +279 -0
  144. data/lib/active_record/deprecator.rb +7 -0
  145. data/lib/active_record/destroy_association_async_job.rb +38 -0
  146. data/lib/active_record/disable_joins_association_relation.rb +39 -0
  147. data/lib/active_record/dynamic_matchers.rb +5 -6
  148. data/lib/active_record/encryption/auto_filtered_parameters.rb +66 -0
  149. data/lib/active_record/encryption/cipher/aes256_gcm.rb +101 -0
  150. data/lib/active_record/encryption/cipher.rb +53 -0
  151. data/lib/active_record/encryption/config.rb +68 -0
  152. data/lib/active_record/encryption/configurable.rb +60 -0
  153. data/lib/active_record/encryption/context.rb +42 -0
  154. data/lib/active_record/encryption/contexts.rb +76 -0
  155. data/lib/active_record/encryption/derived_secret_key_provider.rb +18 -0
  156. data/lib/active_record/encryption/deterministic_key_provider.rb +14 -0
  157. data/lib/active_record/encryption/encryptable_record.rb +230 -0
  158. data/lib/active_record/encryption/encrypted_attribute_type.rb +175 -0
  159. data/lib/active_record/encryption/encrypted_fixtures.rb +38 -0
  160. data/lib/active_record/encryption/encrypting_only_encryptor.rb +12 -0
  161. data/lib/active_record/encryption/encryptor.rb +171 -0
  162. data/lib/active_record/encryption/envelope_encryption_key_provider.rb +55 -0
  163. data/lib/active_record/encryption/errors.rb +15 -0
  164. data/lib/active_record/encryption/extended_deterministic_queries.rb +157 -0
  165. data/lib/active_record/encryption/extended_deterministic_uniqueness_validator.rb +28 -0
  166. data/lib/active_record/encryption/key.rb +28 -0
  167. data/lib/active_record/encryption/key_generator.rb +53 -0
  168. data/lib/active_record/encryption/key_provider.rb +46 -0
  169. data/lib/active_record/encryption/message.rb +33 -0
  170. data/lib/active_record/encryption/message_pack_message_serializer.rb +76 -0
  171. data/lib/active_record/encryption/message_serializer.rb +96 -0
  172. data/lib/active_record/encryption/null_encryptor.rb +25 -0
  173. data/lib/active_record/encryption/properties.rb +76 -0
  174. data/lib/active_record/encryption/read_only_null_encryptor.rb +28 -0
  175. data/lib/active_record/encryption/scheme.rb +100 -0
  176. data/lib/active_record/encryption.rb +58 -0
  177. data/lib/active_record/enum.rb +224 -73
  178. data/lib/active_record/errors.rb +254 -36
  179. data/lib/active_record/explain.rb +30 -17
  180. data/lib/active_record/explain_registry.rb +11 -6
  181. data/lib/active_record/explain_subscriber.rb +2 -2
  182. data/lib/active_record/fixture_set/file.rb +22 -15
  183. data/lib/active_record/fixture_set/model_metadata.rb +15 -6
  184. data/lib/active_record/fixture_set/render_context.rb +3 -1
  185. data/lib/active_record/fixture_set/table_row.rb +88 -16
  186. data/lib/active_record/fixture_set/table_rows.rb +4 -5
  187. data/lib/active_record/fixtures.rb +229 -116
  188. data/lib/active_record/future_result.rb +178 -0
  189. data/lib/active_record/gem_version.rb +4 -4
  190. data/lib/active_record/inheritance.rb +121 -48
  191. data/lib/active_record/insert_all.rb +178 -29
  192. data/lib/active_record/integration.rb +16 -14
  193. data/lib/active_record/internal_metadata.rb +132 -21
  194. data/lib/active_record/legacy_yaml_adapter.rb +3 -36
  195. data/lib/active_record/locking/optimistic.rb +64 -33
  196. data/lib/active_record/locking/pessimistic.rb +21 -8
  197. data/lib/active_record/log_subscriber.rb +61 -30
  198. data/lib/active_record/marshalling.rb +59 -0
  199. data/lib/active_record/message_pack.rb +124 -0
  200. data/lib/active_record/middleware/database_selector/resolver/session.rb +3 -0
  201. data/lib/active_record/middleware/database_selector/resolver.rb +19 -19
  202. data/lib/active_record/middleware/database_selector.rb +25 -13
  203. data/lib/active_record/middleware/shard_selector.rb +62 -0
  204. data/lib/active_record/migration/command_recorder.rb +160 -55
  205. data/lib/active_record/migration/compatibility.rb +286 -43
  206. data/lib/active_record/migration/default_strategy.rb +22 -0
  207. data/lib/active_record/migration/execution_strategy.rb +19 -0
  208. data/lib/active_record/migration/join_table.rb +1 -2
  209. data/lib/active_record/migration/pending_migration_connection.rb +21 -0
  210. data/lib/active_record/migration.rb +421 -193
  211. data/lib/active_record/model_schema.rb +217 -125
  212. data/lib/active_record/nested_attributes.rb +62 -27
  213. data/lib/active_record/no_touching.rb +4 -4
  214. data/lib/active_record/normalization.rb +163 -0
  215. data/lib/active_record/persistence.rb +322 -319
  216. data/lib/active_record/promise.rb +84 -0
  217. data/lib/active_record/query_cache.rb +18 -15
  218. data/lib/active_record/query_logs.rb +193 -0
  219. data/lib/active_record/query_logs_formatter.rb +41 -0
  220. data/lib/active_record/querying.rb +54 -14
  221. data/lib/active_record/railtie.rb +250 -72
  222. data/lib/active_record/railties/console_sandbox.rb +2 -4
  223. data/lib/active_record/railties/controller_runtime.rb +25 -11
  224. data/lib/active_record/railties/databases.rake +312 -197
  225. data/lib/active_record/railties/job_runtime.rb +23 -0
  226. data/lib/active_record/readonly_attributes.rb +45 -3
  227. data/lib/active_record/reflection.rb +389 -146
  228. data/lib/active_record/relation/batches/batch_enumerator.rb +61 -16
  229. data/lib/active_record/relation/batches.rb +214 -73
  230. data/lib/active_record/relation/calculations.rb +379 -124
  231. data/lib/active_record/relation/delegation.rb +36 -23
  232. data/lib/active_record/relation/finder_methods.rb +159 -49
  233. data/lib/active_record/relation/from_clause.rb +5 -1
  234. data/lib/active_record/relation/merger.rb +41 -33
  235. data/lib/active_record/relation/predicate_builder/array_handler.rb +10 -11
  236. data/lib/active_record/relation/predicate_builder/association_query_value.rb +42 -7
  237. data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +20 -13
  238. data/lib/active_record/relation/predicate_builder/relation_handler.rb +5 -1
  239. data/lib/active_record/relation/predicate_builder.rb +79 -53
  240. data/lib/active_record/relation/query_attribute.rb +30 -12
  241. data/lib/active_record/relation/query_methods.rb +1156 -279
  242. data/lib/active_record/relation/record_fetch_warning.rb +12 -11
  243. data/lib/active_record/relation/spawn_methods.rb +10 -9
  244. data/lib/active_record/relation/where_clause.rb +100 -66
  245. data/lib/active_record/relation.rb +829 -194
  246. data/lib/active_record/result.rb +76 -56
  247. data/lib/active_record/runtime_registry.rb +71 -13
  248. data/lib/active_record/sanitization.rb +86 -47
  249. data/lib/active_record/schema.rb +39 -23
  250. data/lib/active_record/schema_dumper.rb +140 -33
  251. data/lib/active_record/schema_migration.rb +74 -29
  252. data/lib/active_record/scoping/default.rb +73 -19
  253. data/lib/active_record/scoping/named.rb +10 -28
  254. data/lib/active_record/scoping.rb +65 -35
  255. data/lib/active_record/secure_password.rb +60 -0
  256. data/lib/active_record/secure_token.rb +34 -8
  257. data/lib/active_record/serialization.rb +11 -4
  258. data/lib/active_record/signed_id.rb +138 -0
  259. data/lib/active_record/statement_cache.rb +26 -10
  260. data/lib/active_record/store.rb +19 -14
  261. data/lib/active_record/suppressor.rb +15 -17
  262. data/lib/active_record/table_metadata.rb +46 -36
  263. data/lib/active_record/tasks/database_tasks.rb +371 -205
  264. data/lib/active_record/tasks/mysql_database_tasks.rb +43 -36
  265. data/lib/active_record/tasks/postgresql_database_tasks.rb +54 -41
  266. data/lib/active_record/tasks/sqlite_database_tasks.rb +25 -13
  267. data/lib/active_record/test_databases.rb +5 -4
  268. data/lib/active_record/test_fixtures.rb +189 -104
  269. data/lib/active_record/testing/query_assertions.rb +121 -0
  270. data/lib/active_record/timestamp.rb +35 -25
  271. data/lib/active_record/token_for.rb +123 -0
  272. data/lib/active_record/touch_later.rb +31 -27
  273. data/lib/active_record/transaction.rb +132 -0
  274. data/lib/active_record/transactions.rb +131 -99
  275. data/lib/active_record/translation.rb +3 -5
  276. data/lib/active_record/type/adapter_specific_registry.rb +33 -18
  277. data/lib/active_record/type/hash_lookup_type_map.rb +34 -2
  278. data/lib/active_record/type/internal/timezone.rb +7 -2
  279. data/lib/active_record/type/serialized.rb +11 -6
  280. data/lib/active_record/type/time.rb +14 -0
  281. data/lib/active_record/type/type_map.rb +17 -21
  282. data/lib/active_record/type/unsigned_integer.rb +0 -1
  283. data/lib/active_record/type.rb +7 -2
  284. data/lib/active_record/type_caster/connection.rb +4 -5
  285. data/lib/active_record/type_caster/map.rb +8 -5
  286. data/lib/active_record/validations/absence.rb +1 -1
  287. data/lib/active_record/validations/associated.rb +13 -8
  288. data/lib/active_record/validations/numericality.rb +36 -0
  289. data/lib/active_record/validations/presence.rb +5 -28
  290. data/lib/active_record/validations/uniqueness.rb +88 -18
  291. data/lib/active_record/validations.rb +15 -8
  292. data/lib/active_record/version.rb +1 -1
  293. data/lib/active_record.rb +446 -40
  294. data/lib/arel/alias_predication.rb +1 -1
  295. data/lib/arel/attributes/attribute.rb +4 -8
  296. data/lib/arel/collectors/bind.rb +8 -1
  297. data/lib/arel/collectors/composite.rb +15 -0
  298. data/lib/arel/collectors/sql_string.rb +7 -0
  299. data/lib/arel/collectors/substitute_binds.rb +7 -0
  300. data/lib/arel/crud.rb +30 -22
  301. data/lib/arel/delete_manager.rb +23 -4
  302. data/lib/arel/errors.rb +10 -0
  303. data/lib/arel/factory_methods.rb +4 -0
  304. data/lib/arel/filter_predications.rb +9 -0
  305. data/lib/arel/insert_manager.rb +2 -3
  306. data/lib/arel/nodes/binary.rb +82 -9
  307. data/lib/arel/nodes/bind_param.rb +8 -0
  308. data/lib/arel/nodes/bound_sql_literal.rb +65 -0
  309. data/lib/arel/nodes/casted.rb +22 -10
  310. data/lib/arel/nodes/cte.rb +36 -0
  311. data/lib/arel/nodes/delete_statement.rb +14 -13
  312. data/lib/arel/nodes/equality.rb +6 -9
  313. data/lib/arel/nodes/filter.rb +10 -0
  314. data/lib/arel/nodes/fragments.rb +35 -0
  315. data/lib/arel/nodes/function.rb +1 -0
  316. data/lib/arel/nodes/grouping.rb +3 -0
  317. data/lib/arel/nodes/homogeneous_in.rb +68 -0
  318. data/lib/arel/nodes/in.rb +8 -1
  319. data/lib/arel/nodes/infix_operation.rb +13 -1
  320. data/lib/arel/nodes/insert_statement.rb +2 -2
  321. data/lib/arel/nodes/join_source.rb +1 -1
  322. data/lib/arel/nodes/leading_join.rb +8 -0
  323. data/lib/arel/nodes/{and.rb → nary.rb} +9 -2
  324. data/lib/arel/nodes/node.rb +122 -11
  325. data/lib/arel/nodes/ordering.rb +27 -0
  326. data/lib/arel/nodes/select_core.rb +2 -2
  327. data/lib/arel/nodes/select_statement.rb +2 -2
  328. data/lib/arel/nodes/sql_literal.rb +16 -0
  329. data/lib/arel/nodes/table_alias.rb +11 -3
  330. data/lib/arel/nodes/unary.rb +0 -1
  331. data/lib/arel/nodes/update_statement.rb +11 -4
  332. data/lib/arel/nodes.rb +10 -3
  333. data/lib/arel/predications.rb +31 -28
  334. data/lib/arel/select_manager.rb +18 -9
  335. data/lib/arel/table.rb +21 -10
  336. data/lib/arel/tree_manager.rb +8 -15
  337. data/lib/arel/update_manager.rb +25 -5
  338. data/lib/arel/visitors/dot.rb +94 -90
  339. data/lib/arel/visitors/mysql.rb +34 -6
  340. data/lib/arel/visitors/postgresql.rb +5 -16
  341. data/lib/arel/visitors/sqlite.rb +25 -1
  342. data/lib/arel/visitors/to_sql.rb +227 -81
  343. data/lib/arel/visitors/visitor.rb +2 -3
  344. data/lib/arel/visitors.rb +0 -7
  345. data/lib/arel.rb +37 -15
  346. data/lib/rails/generators/active_record/application_record/USAGE +8 -0
  347. data/lib/rails/generators/active_record/application_record/application_record_generator.rb +0 -1
  348. data/lib/rails/generators/active_record/application_record/templates/application_record.rb.tt +1 -1
  349. data/lib/rails/generators/active_record/migration/migration_generator.rb +1 -0
  350. data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb.tt +6 -1
  351. data/lib/rails/generators/active_record/migration/templates/migration.rb.tt +4 -4
  352. data/lib/rails/generators/active_record/migration.rb +9 -3
  353. data/lib/rails/generators/active_record/model/USAGE +113 -0
  354. data/lib/rails/generators/active_record/model/model_generator.rb +49 -4
  355. data/lib/rails/generators/active_record/model/templates/abstract_base_class.rb.tt +7 -0
  356. data/lib/rails/generators/active_record/model/templates/model.rb.tt +1 -1
  357. data/lib/rails/generators/active_record/model/templates/module.rb.tt +2 -2
  358. data/lib/rails/generators/active_record/multi_db/multi_db_generator.rb +16 -0
  359. data/lib/rails/generators/active_record/multi_db/templates/multi_db.rb.tt +44 -0
  360. metadata +117 -30
  361. data/lib/active_record/attribute_decorators.rb +0 -90
  362. data/lib/active_record/connection_adapters/connection_specification.rb +0 -297
  363. data/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb +0 -29
  364. data/lib/active_record/define_callbacks.rb +0 -22
  365. data/lib/active_record/null_relation.rb +0 -68
  366. data/lib/active_record/railties/collection_cache_association_loading.rb +0 -34
  367. data/lib/active_record/relation/predicate_builder/base_handler.rb +0 -18
  368. data/lib/active_record/relation/where_clause_factory.rb +0 -33
  369. data/lib/arel/attributes.rb +0 -22
  370. data/lib/arel/visitors/depth_first.rb +0 -204
  371. data/lib/arel/visitors/ibm_db.rb +0 -34
  372. data/lib/arel/visitors/informix.rb +0 -62
  373. data/lib/arel/visitors/mssql.rb +0 -157
  374. data/lib/arel/visitors/oracle.rb +0 -159
  375. data/lib/arel/visitors/oracle12.rb +0 -66
  376. data/lib/arel/visitors/where_sql.rb +0 -23
@@ -1,204 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Arel # :nodoc: all
4
- module Visitors
5
- class DepthFirst < Arel::Visitors::Visitor
6
- def initialize(block = nil)
7
- @block = block || Proc.new
8
- super()
9
- end
10
-
11
- private
12
-
13
- def visit(o, _ = nil)
14
- super
15
- @block.call o
16
- end
17
-
18
- def unary(o)
19
- visit o.expr
20
- end
21
- alias :visit_Arel_Nodes_Else :unary
22
- alias :visit_Arel_Nodes_Group :unary
23
- alias :visit_Arel_Nodes_Cube :unary
24
- alias :visit_Arel_Nodes_RollUp :unary
25
- alias :visit_Arel_Nodes_GroupingSet :unary
26
- alias :visit_Arel_Nodes_GroupingElement :unary
27
- alias :visit_Arel_Nodes_Grouping :unary
28
- alias :visit_Arel_Nodes_Having :unary
29
- alias :visit_Arel_Nodes_Lateral :unary
30
- alias :visit_Arel_Nodes_Limit :unary
31
- alias :visit_Arel_Nodes_Not :unary
32
- alias :visit_Arel_Nodes_Offset :unary
33
- alias :visit_Arel_Nodes_On :unary
34
- alias :visit_Arel_Nodes_Ordering :unary
35
- alias :visit_Arel_Nodes_Ascending :unary
36
- alias :visit_Arel_Nodes_Descending :unary
37
- alias :visit_Arel_Nodes_UnqualifiedColumn :unary
38
- alias :visit_Arel_Nodes_OptimizerHints :unary
39
- alias :visit_Arel_Nodes_ValuesList :unary
40
-
41
- def function(o)
42
- visit o.expressions
43
- visit o.alias
44
- visit o.distinct
45
- end
46
- alias :visit_Arel_Nodes_Avg :function
47
- alias :visit_Arel_Nodes_Exists :function
48
- alias :visit_Arel_Nodes_Max :function
49
- alias :visit_Arel_Nodes_Min :function
50
- alias :visit_Arel_Nodes_Sum :function
51
-
52
- def visit_Arel_Nodes_NamedFunction(o)
53
- visit o.name
54
- visit o.expressions
55
- visit o.distinct
56
- visit o.alias
57
- end
58
-
59
- def visit_Arel_Nodes_Count(o)
60
- visit o.expressions
61
- visit o.alias
62
- visit o.distinct
63
- end
64
-
65
- def visit_Arel_Nodes_Case(o)
66
- visit o.case
67
- visit o.conditions
68
- visit o.default
69
- end
70
-
71
- def nary(o)
72
- o.children.each { |child| visit child }
73
- end
74
- alias :visit_Arel_Nodes_And :nary
75
-
76
- def binary(o)
77
- visit o.left
78
- visit o.right
79
- end
80
- alias :visit_Arel_Nodes_As :binary
81
- alias :visit_Arel_Nodes_Assignment :binary
82
- alias :visit_Arel_Nodes_Between :binary
83
- alias :visit_Arel_Nodes_Concat :binary
84
- alias :visit_Arel_Nodes_DeleteStatement :binary
85
- alias :visit_Arel_Nodes_DoesNotMatch :binary
86
- alias :visit_Arel_Nodes_Equality :binary
87
- alias :visit_Arel_Nodes_FullOuterJoin :binary
88
- alias :visit_Arel_Nodes_GreaterThan :binary
89
- alias :visit_Arel_Nodes_GreaterThanOrEqual :binary
90
- alias :visit_Arel_Nodes_In :binary
91
- alias :visit_Arel_Nodes_InfixOperation :binary
92
- alias :visit_Arel_Nodes_JoinSource :binary
93
- alias :visit_Arel_Nodes_InnerJoin :binary
94
- alias :visit_Arel_Nodes_LessThan :binary
95
- alias :visit_Arel_Nodes_LessThanOrEqual :binary
96
- alias :visit_Arel_Nodes_Matches :binary
97
- alias :visit_Arel_Nodes_NotEqual :binary
98
- alias :visit_Arel_Nodes_NotIn :binary
99
- alias :visit_Arel_Nodes_NotRegexp :binary
100
- alias :visit_Arel_Nodes_IsNotDistinctFrom :binary
101
- alias :visit_Arel_Nodes_IsDistinctFrom :binary
102
- alias :visit_Arel_Nodes_Or :binary
103
- alias :visit_Arel_Nodes_OuterJoin :binary
104
- alias :visit_Arel_Nodes_Regexp :binary
105
- alias :visit_Arel_Nodes_RightOuterJoin :binary
106
- alias :visit_Arel_Nodes_TableAlias :binary
107
- alias :visit_Arel_Nodes_When :binary
108
-
109
- def visit_Arel_Nodes_StringJoin(o)
110
- visit o.left
111
- end
112
-
113
- def visit_Arel_Attribute(o)
114
- visit o.relation
115
- visit o.name
116
- end
117
- alias :visit_Arel_Attributes_Integer :visit_Arel_Attribute
118
- alias :visit_Arel_Attributes_Float :visit_Arel_Attribute
119
- alias :visit_Arel_Attributes_String :visit_Arel_Attribute
120
- alias :visit_Arel_Attributes_Time :visit_Arel_Attribute
121
- alias :visit_Arel_Attributes_Boolean :visit_Arel_Attribute
122
- alias :visit_Arel_Attributes_Attribute :visit_Arel_Attribute
123
- alias :visit_Arel_Attributes_Decimal :visit_Arel_Attribute
124
-
125
- def visit_Arel_Table(o)
126
- visit o.name
127
- end
128
-
129
- def terminal(o)
130
- end
131
- alias :visit_ActiveSupport_Multibyte_Chars :terminal
132
- alias :visit_ActiveSupport_StringInquirer :terminal
133
- alias :visit_Arel_Nodes_Lock :terminal
134
- alias :visit_Arel_Nodes_Node :terminal
135
- alias :visit_Arel_Nodes_SqlLiteral :terminal
136
- alias :visit_Arel_Nodes_BindParam :terminal
137
- alias :visit_Arel_Nodes_Window :terminal
138
- alias :visit_Arel_Nodes_True :terminal
139
- alias :visit_Arel_Nodes_False :terminal
140
- alias :visit_BigDecimal :terminal
141
- alias :visit_Class :terminal
142
- alias :visit_Date :terminal
143
- alias :visit_DateTime :terminal
144
- alias :visit_FalseClass :terminal
145
- alias :visit_Float :terminal
146
- alias :visit_Integer :terminal
147
- alias :visit_NilClass :terminal
148
- alias :visit_String :terminal
149
- alias :visit_Symbol :terminal
150
- alias :visit_Time :terminal
151
- alias :visit_TrueClass :terminal
152
-
153
- def visit_Arel_Nodes_InsertStatement(o)
154
- visit o.relation
155
- visit o.columns
156
- visit o.values
157
- end
158
-
159
- def visit_Arel_Nodes_SelectCore(o)
160
- visit o.projections
161
- visit o.source
162
- visit o.wheres
163
- visit o.groups
164
- visit o.windows
165
- visit o.havings
166
- end
167
-
168
- def visit_Arel_Nodes_SelectStatement(o)
169
- visit o.cores
170
- visit o.orders
171
- visit o.limit
172
- visit o.lock
173
- visit o.offset
174
- end
175
-
176
- def visit_Arel_Nodes_UpdateStatement(o)
177
- visit o.relation
178
- visit o.values
179
- visit o.wheres
180
- visit o.orders
181
- visit o.limit
182
- end
183
-
184
- def visit_Arel_Nodes_Comment(o)
185
- visit o.values
186
- end
187
-
188
- def visit_Array(o)
189
- o.each { |i| visit i }
190
- end
191
- alias :visit_Set :visit_Array
192
-
193
- def visit_Hash(o)
194
- o.each { |k, v| visit(k); visit(v) }
195
- end
196
-
197
- DISPATCH = dispatch_cache
198
-
199
- def get_dispatch_cache
200
- DISPATCH
201
- end
202
- end
203
- end
204
- end
@@ -1,34 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Arel # :nodoc: all
4
- module Visitors
5
- class IBM_DB < Arel::Visitors::ToSql
6
- private
7
- def visit_Arel_Nodes_SelectCore(o, collector)
8
- collector = super
9
- maybe_visit o.optimizer_hints, collector
10
- end
11
-
12
- def visit_Arel_Nodes_OptimizerHints(o, collector)
13
- hints = o.expr.map { |v| sanitize_as_sql_comment(v) }.join
14
- collector << "/* <OPTGUIDELINES>#{hints}</OPTGUIDELINES> */"
15
- end
16
-
17
- def visit_Arel_Nodes_Limit(o, collector)
18
- collector << "FETCH FIRST "
19
- collector = visit o.expr, collector
20
- collector << " ROWS ONLY"
21
- end
22
-
23
- def is_distinct_from(o, collector)
24
- collector << "DECODE("
25
- collector = visit [o.left, o.right, 0, 1], collector
26
- collector << ")"
27
- end
28
-
29
- def collect_optimizer_hints(o, collector)
30
- collector
31
- end
32
- end
33
- end
34
- end
@@ -1,62 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Arel # :nodoc: all
4
- module Visitors
5
- class Informix < Arel::Visitors::ToSql
6
- private
7
- def visit_Arel_Nodes_SelectStatement(o, collector)
8
- collector << "SELECT "
9
- collector = maybe_visit o.offset, collector
10
- collector = maybe_visit o.limit, collector
11
- collector = o.cores.inject(collector) { |c, x|
12
- visit_Arel_Nodes_SelectCore x, c
13
- }
14
- if o.orders.any?
15
- collector << "ORDER BY "
16
- collector = inject_join o.orders, collector, ", "
17
- end
18
- maybe_visit o.lock, collector
19
- end
20
-
21
- def visit_Arel_Nodes_SelectCore(o, collector)
22
- collector = inject_join o.projections, collector, ", "
23
- if o.source && !o.source.empty?
24
- collector << " FROM "
25
- collector = visit o.source, collector
26
- end
27
-
28
- if o.wheres.any?
29
- collector << " WHERE "
30
- collector = inject_join o.wheres, collector, " AND "
31
- end
32
-
33
- if o.groups.any?
34
- collector << "GROUP BY "
35
- collector = inject_join o.groups, collector, ", "
36
- end
37
-
38
- if o.havings.any?
39
- collector << " HAVING "
40
- collector = inject_join o.havings, collector, " AND "
41
- end
42
- collector
43
- end
44
-
45
- def visit_Arel_Nodes_OptimizerHints(o, collector)
46
- hints = o.expr.map { |v| sanitize_as_sql_comment(v) }.join(", ")
47
- collector << "/*+ #{hints} */"
48
- end
49
-
50
- def visit_Arel_Nodes_Offset(o, collector)
51
- collector << "SKIP "
52
- visit o.expr, collector
53
- end
54
-
55
- def visit_Arel_Nodes_Limit(o, collector)
56
- collector << "FIRST "
57
- visit o.expr, collector
58
- collector << " "
59
- end
60
- end
61
- end
62
- end
@@ -1,157 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Arel # :nodoc: all
4
- module Visitors
5
- class MSSQL < Arel::Visitors::ToSql
6
- RowNumber = Struct.new :children
7
-
8
- def initialize(*)
9
- @primary_keys = {}
10
- super
11
- end
12
-
13
- private
14
-
15
- def visit_Arel_Nodes_IsNotDistinctFrom(o, collector)
16
- right = o.right
17
-
18
- if right.nil?
19
- collector = visit o.left, collector
20
- collector << " IS NULL"
21
- else
22
- collector << "EXISTS (VALUES ("
23
- collector = visit o.left, collector
24
- collector << ") INTERSECT VALUES ("
25
- collector = visit right, collector
26
- collector << "))"
27
- end
28
- end
29
-
30
- def visit_Arel_Nodes_IsDistinctFrom(o, collector)
31
- if o.right.nil?
32
- collector = visit o.left, collector
33
- collector << " IS NOT NULL"
34
- else
35
- collector << "NOT "
36
- visit_Arel_Nodes_IsNotDistinctFrom o, collector
37
- end
38
- end
39
-
40
- def visit_Arel_Visitors_MSSQL_RowNumber(o, collector)
41
- collector << "ROW_NUMBER() OVER (ORDER BY "
42
- inject_join(o.children, collector, ", ") << ") as _row_num"
43
- end
44
-
45
- def visit_Arel_Nodes_SelectStatement(o, collector)
46
- if !o.limit && !o.offset
47
- return super
48
- end
49
-
50
- is_select_count = false
51
- o.cores.each { |x|
52
- core_order_by = row_num_literal determine_order_by(o.orders, x)
53
- if select_count? x
54
- x.projections = [core_order_by]
55
- is_select_count = true
56
- else
57
- x.projections << core_order_by
58
- end
59
- }
60
-
61
- if is_select_count
62
- # fixme count distinct wouldn't work with limit or offset
63
- collector << "SELECT COUNT(1) as count_id FROM ("
64
- end
65
-
66
- collector << "SELECT _t.* FROM ("
67
- collector = o.cores.inject(collector) { |c, x|
68
- visit_Arel_Nodes_SelectCore x, c
69
- }
70
- collector << ") as _t WHERE #{get_offset_limit_clause(o)}"
71
-
72
- if is_select_count
73
- collector << ") AS subquery"
74
- else
75
- collector
76
- end
77
- end
78
-
79
- def visit_Arel_Nodes_SelectCore(o, collector)
80
- collector = super
81
- maybe_visit o.optimizer_hints, collector
82
- end
83
-
84
- def visit_Arel_Nodes_OptimizerHints(o, collector)
85
- hints = o.expr.map { |v| sanitize_as_sql_comment(v) }.join(", ")
86
- collector << "OPTION (#{hints})"
87
- end
88
-
89
- def get_offset_limit_clause(o)
90
- first_row = o.offset ? o.offset.expr.to_i + 1 : 1
91
- last_row = o.limit ? o.limit.expr.to_i - 1 + first_row : nil
92
- if last_row
93
- " _row_num BETWEEN #{first_row} AND #{last_row}"
94
- else
95
- " _row_num >= #{first_row}"
96
- end
97
- end
98
-
99
- def visit_Arel_Nodes_DeleteStatement(o, collector)
100
- collector << "DELETE "
101
- if o.limit
102
- collector << "TOP ("
103
- visit o.limit.expr, collector
104
- collector << ") "
105
- end
106
- collector << "FROM "
107
- collector = visit o.relation, collector
108
- if o.wheres.any?
109
- collector << " WHERE "
110
- inject_join o.wheres, collector, " AND "
111
- else
112
- collector
113
- end
114
- end
115
-
116
- def collect_optimizer_hints(o, collector)
117
- collector
118
- end
119
-
120
- def determine_order_by(orders, x)
121
- if orders.any?
122
- orders
123
- elsif x.groups.any?
124
- x.groups
125
- else
126
- pk = find_left_table_pk(x.froms)
127
- pk ? [pk] : []
128
- end
129
- end
130
-
131
- def row_num_literal(order_by)
132
- RowNumber.new order_by
133
- end
134
-
135
- def select_count?(x)
136
- x.projections.length == 1 && Arel::Nodes::Count === x.projections.first
137
- end
138
-
139
- # FIXME raise exception of there is no pk?
140
- def find_left_table_pk(o)
141
- if o.kind_of?(Arel::Nodes::Join)
142
- find_left_table_pk(o.left)
143
- elsif o.instance_of?(Arel::Table)
144
- find_primary_key(o)
145
- end
146
- end
147
-
148
- def find_primary_key(o)
149
- @primary_keys[o.name] ||= begin
150
- primary_key_name = @connection.primary_key(o.name)
151
- # some tables might be without primary key
152
- primary_key_name && o[primary_key_name]
153
- end
154
- end
155
- end
156
- end
157
- end
@@ -1,159 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Arel # :nodoc: all
4
- module Visitors
5
- class Oracle < Arel::Visitors::ToSql
6
- private
7
-
8
- def visit_Arel_Nodes_SelectStatement(o, collector)
9
- o = order_hacks(o)
10
-
11
- # if need to select first records without ORDER BY and GROUP BY and without DISTINCT
12
- # then can use simple ROWNUM in WHERE clause
13
- if o.limit && o.orders.empty? && o.cores.first.groups.empty? && !o.offset && o.cores.first.set_quantifier.class.to_s !~ /Distinct/
14
- o.cores.last.wheres.push Nodes::LessThanOrEqual.new(
15
- Nodes::SqlLiteral.new("ROWNUM"), o.limit.expr
16
- )
17
- return super
18
- end
19
-
20
- if o.limit && o.offset
21
- o = o.dup
22
- limit = o.limit.expr
23
- offset = o.offset
24
- o.offset = nil
25
- collector << "
26
- SELECT * FROM (
27
- SELECT raw_sql_.*, rownum raw_rnum_
28
- FROM ("
29
-
30
- collector = super(o, collector)
31
-
32
- if offset.expr.is_a? Nodes::BindParam
33
- collector << ") raw_sql_ WHERE rownum <= ("
34
- collector = visit offset.expr, collector
35
- collector << " + "
36
- collector = visit limit, collector
37
- collector << ") ) WHERE raw_rnum_ > "
38
- collector = visit offset.expr, collector
39
- return collector
40
- else
41
- collector << ") raw_sql_
42
- WHERE rownum <= #{offset.expr.to_i + limit}
43
- )
44
- WHERE "
45
- return visit(offset, collector)
46
- end
47
- end
48
-
49
- if o.limit
50
- o = o.dup
51
- limit = o.limit.expr
52
- collector << "SELECT * FROM ("
53
- collector = super(o, collector)
54
- collector << ") WHERE ROWNUM <= "
55
- return visit limit, collector
56
- end
57
-
58
- if o.offset
59
- o = o.dup
60
- offset = o.offset
61
- o.offset = nil
62
- collector << "SELECT * FROM (
63
- SELECT raw_sql_.*, rownum raw_rnum_
64
- FROM ("
65
- collector = super(o, collector)
66
- collector << ") raw_sql_
67
- )
68
- WHERE "
69
- return visit offset, collector
70
- end
71
-
72
- super
73
- end
74
-
75
- def visit_Arel_Nodes_Limit(o, collector)
76
- collector
77
- end
78
-
79
- def visit_Arel_Nodes_Offset(o, collector)
80
- collector << "raw_rnum_ > "
81
- visit o.expr, collector
82
- end
83
-
84
- def visit_Arel_Nodes_Except(o, collector)
85
- collector << "( "
86
- collector = infix_value o, collector, " MINUS "
87
- collector << " )"
88
- end
89
-
90
- def visit_Arel_Nodes_UpdateStatement(o, collector)
91
- # Oracle does not allow ORDER BY/LIMIT in UPDATEs.
92
- if o.orders.any? && o.limit.nil?
93
- # However, there is no harm in silently eating the ORDER BY clause if no LIMIT has been provided,
94
- # otherwise let the user deal with the error
95
- o = o.dup
96
- o.orders = []
97
- end
98
-
99
- super
100
- end
101
-
102
- ###
103
- # Hacks for the order clauses specific to Oracle
104
- def order_hacks(o)
105
- return o if o.orders.empty?
106
- return o unless o.cores.any? do |core|
107
- core.projections.any? do |projection|
108
- /FIRST_VALUE/ === projection
109
- end
110
- end
111
- # Previous version with join and split broke ORDER BY clause
112
- # if it contained functions with several arguments (separated by ',').
113
- #
114
- # orders = o.orders.map { |x| visit x }.join(', ').split(',')
115
- orders = o.orders.map do |x|
116
- string = visit(x, Arel::Collectors::SQLString.new).value
117
- if string.include?(",")
118
- split_order_string(string)
119
- else
120
- string
121
- end
122
- end.flatten
123
- o.orders = []
124
- orders.each_with_index do |order, i|
125
- o.orders <<
126
- Nodes::SqlLiteral.new("alias_#{i}__#{' DESC' if /\bdesc$/i === order}")
127
- end
128
- o
129
- end
130
-
131
- # Split string by commas but count opening and closing brackets
132
- # and ignore commas inside brackets.
133
- def split_order_string(string)
134
- array = []
135
- i = 0
136
- string.split(",").each do |part|
137
- if array[i]
138
- array[i] << "," << part
139
- else
140
- # to ensure that array[i] will be String and not Arel::Nodes::SqlLiteral
141
- array[i] = part.to_s
142
- end
143
- i += 1 if array[i].count("(") == array[i].count(")")
144
- end
145
- array
146
- end
147
-
148
- def visit_Arel_Nodes_BindParam(o, collector)
149
- collector.add_bind(o.value) { |i| ":a#{i}" }
150
- end
151
-
152
- def is_distinct_from(o, collector)
153
- collector << "DECODE("
154
- collector = visit [o.left, o.right, 0, 1], collector
155
- collector << ")"
156
- end
157
- end
158
- end
159
- end
@@ -1,66 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Arel # :nodoc: all
4
- module Visitors
5
- class Oracle12 < Arel::Visitors::ToSql
6
- private
7
-
8
- def visit_Arel_Nodes_SelectStatement(o, collector)
9
- # Oracle does not allow LIMIT clause with select for update
10
- if o.limit && o.lock
11
- raise ArgumentError, <<~MSG
12
- Combination of limit and lock is not supported. Because generated SQL statements
13
- `SELECT FOR UPDATE and FETCH FIRST n ROWS` generates ORA-02014.
14
- MSG
15
- end
16
- super
17
- end
18
-
19
- def visit_Arel_Nodes_SelectOptions(o, collector)
20
- collector = maybe_visit o.offset, collector
21
- collector = maybe_visit o.limit, collector
22
- maybe_visit o.lock, collector
23
- end
24
-
25
- def visit_Arel_Nodes_Limit(o, collector)
26
- collector << "FETCH FIRST "
27
- collector = visit o.expr, collector
28
- collector << " ROWS ONLY"
29
- end
30
-
31
- def visit_Arel_Nodes_Offset(o, collector)
32
- collector << "OFFSET "
33
- visit o.expr, collector
34
- collector << " ROWS"
35
- end
36
-
37
- def visit_Arel_Nodes_Except(o, collector)
38
- collector << "( "
39
- collector = infix_value o, collector, " MINUS "
40
- collector << " )"
41
- end
42
-
43
- def visit_Arel_Nodes_UpdateStatement(o, collector)
44
- # Oracle does not allow ORDER BY/LIMIT in UPDATEs.
45
- if o.orders.any? && o.limit.nil?
46
- # However, there is no harm in silently eating the ORDER BY clause if no LIMIT has been provided,
47
- # otherwise let the user deal with the error
48
- o = o.dup
49
- o.orders = []
50
- end
51
-
52
- super
53
- end
54
-
55
- def visit_Arel_Nodes_BindParam(o, collector)
56
- collector.add_bind(o.value) { |i| ":a#{i}" }
57
- end
58
-
59
- def is_distinct_from(o, collector)
60
- collector << "DECODE("
61
- collector = visit [o.left, o.right, 0, 1], collector
62
- collector << ")"
63
- end
64
- end
65
- end
66
- end
@@ -1,23 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Arel # :nodoc: all
4
- module Visitors
5
- class WhereSql < Arel::Visitors::ToSql
6
- def initialize(inner_visitor, *args, &block)
7
- @inner_visitor = inner_visitor
8
- super(*args, &block)
9
- end
10
-
11
- private
12
-
13
- def visit_Arel_Nodes_SelectCore(o, collector)
14
- collector << "WHERE "
15
- wheres = o.wheres.map do |where|
16
- Nodes::SqlLiteral.new(@inner_visitor.accept(where, collector.class.new).value)
17
- end
18
-
19
- inject_join wheres, collector, " AND "
20
- end
21
- end
22
- end
23
- end