activerecord 6.0.1 → 6.1.0

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 (268) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +843 -626
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +3 -3
  5. data/lib/active_record/aggregations.rb +1 -2
  6. data/lib/active_record/association_relation.rb +18 -17
  7. data/lib/active_record/associations/alias_tracker.rb +19 -16
  8. data/lib/active_record/associations/association.rb +49 -37
  9. data/lib/active_record/associations/association_scope.rb +17 -15
  10. data/lib/active_record/associations/belongs_to_association.rb +15 -5
  11. data/lib/active_record/associations/belongs_to_polymorphic_association.rb +1 -1
  12. data/lib/active_record/associations/builder/association.rb +9 -3
  13. data/lib/active_record/associations/builder/belongs_to.rb +10 -7
  14. data/lib/active_record/associations/builder/collection_association.rb +5 -4
  15. data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +0 -3
  16. data/lib/active_record/associations/builder/has_many.rb +6 -2
  17. data/lib/active_record/associations/builder/has_one.rb +11 -14
  18. data/lib/active_record/associations/builder/singular_association.rb +1 -1
  19. data/lib/active_record/associations/collection_association.rb +25 -8
  20. data/lib/active_record/associations/collection_proxy.rb +14 -7
  21. data/lib/active_record/associations/foreign_association.rb +13 -0
  22. data/lib/active_record/associations/has_many_association.rb +24 -3
  23. data/lib/active_record/associations/has_many_through_association.rb +10 -4
  24. data/lib/active_record/associations/has_one_association.rb +15 -1
  25. data/lib/active_record/associations/join_dependency/join_association.rb +36 -14
  26. data/lib/active_record/associations/join_dependency/join_part.rb +3 -3
  27. data/lib/active_record/associations/join_dependency.rb +73 -42
  28. data/lib/active_record/associations/preloader/association.rb +51 -25
  29. data/lib/active_record/associations/preloader/through_association.rb +2 -2
  30. data/lib/active_record/associations/preloader.rb +12 -7
  31. data/lib/active_record/associations/singular_association.rb +1 -1
  32. data/lib/active_record/associations/through_association.rb +1 -1
  33. data/lib/active_record/associations.rb +115 -12
  34. data/lib/active_record/attribute_assignment.rb +10 -9
  35. data/lib/active_record/attribute_methods/before_type_cast.rb +13 -10
  36. data/lib/active_record/attribute_methods/dirty.rb +3 -13
  37. data/lib/active_record/attribute_methods/primary_key.rb +6 -4
  38. data/lib/active_record/attribute_methods/query.rb +3 -6
  39. data/lib/active_record/attribute_methods/read.rb +8 -12
  40. data/lib/active_record/attribute_methods/serialization.rb +11 -6
  41. data/lib/active_record/attribute_methods/time_zone_conversion.rb +12 -15
  42. data/lib/active_record/attribute_methods/write.rb +12 -21
  43. data/lib/active_record/attribute_methods.rb +64 -54
  44. data/lib/active_record/attributes.rb +32 -8
  45. data/lib/active_record/autosave_association.rb +56 -41
  46. data/lib/active_record/base.rb +2 -14
  47. data/lib/active_record/callbacks.rb +153 -24
  48. data/lib/active_record/coders/yaml_column.rb +1 -2
  49. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +190 -136
  50. data/lib/active_record/connection_adapters/abstract/database_limits.rb +2 -44
  51. data/lib/active_record/connection_adapters/abstract/database_statements.rb +82 -37
  52. data/lib/active_record/connection_adapters/abstract/query_cache.rb +2 -8
  53. data/lib/active_record/connection_adapters/abstract/quoting.rb +34 -34
  54. data/lib/active_record/connection_adapters/abstract/savepoints.rb +3 -3
  55. data/lib/active_record/connection_adapters/abstract/schema_creation.rb +152 -116
  56. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +137 -52
  57. data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +3 -3
  58. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +263 -107
  59. data/lib/active_record/connection_adapters/abstract/transaction.rb +82 -35
  60. data/lib/active_record/connection_adapters/abstract_adapter.rb +60 -73
  61. data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +136 -111
  62. data/lib/active_record/connection_adapters/column.rb +15 -1
  63. data/lib/active_record/connection_adapters/deduplicable.rb +29 -0
  64. data/lib/active_record/connection_adapters/legacy_pool_manager.rb +31 -0
  65. data/lib/active_record/connection_adapters/mysql/column.rb +1 -1
  66. data/lib/active_record/connection_adapters/mysql/database_statements.rb +28 -36
  67. data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +1 -2
  68. data/lib/active_record/connection_adapters/mysql/quoting.rb +1 -1
  69. data/lib/active_record/connection_adapters/mysql/schema_creation.rb +32 -7
  70. data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +8 -0
  71. data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +1 -1
  72. data/lib/active_record/connection_adapters/mysql/schema_statements.rb +17 -13
  73. data/lib/active_record/connection_adapters/mysql/type_metadata.rb +10 -1
  74. data/lib/active_record/connection_adapters/mysql2_adapter.rb +31 -13
  75. data/lib/active_record/connection_adapters/pool_config.rb +63 -0
  76. data/lib/active_record/connection_adapters/pool_manager.rb +43 -0
  77. data/lib/active_record/connection_adapters/postgresql/column.rb +24 -1
  78. data/lib/active_record/connection_adapters/postgresql/database_statements.rb +19 -56
  79. data/lib/active_record/connection_adapters/postgresql/oid/array.rb +0 -1
  80. data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +3 -5
  81. data/lib/active_record/connection_adapters/postgresql/oid/date.rb +2 -2
  82. data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +10 -2
  83. data/lib/active_record/connection_adapters/postgresql/oid/enum.rb +0 -1
  84. data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +0 -1
  85. data/lib/active_record/connection_adapters/postgresql/oid/interval.rb +49 -0
  86. data/lib/active_record/connection_adapters/postgresql/oid/legacy_point.rb +2 -3
  87. data/lib/active_record/connection_adapters/postgresql/oid/macaddr.rb +25 -0
  88. data/lib/active_record/connection_adapters/postgresql/oid/oid.rb +1 -1
  89. data/lib/active_record/connection_adapters/postgresql/oid/point.rb +2 -3
  90. data/lib/active_record/connection_adapters/postgresql/oid/range.rb +24 -6
  91. data/lib/active_record/connection_adapters/postgresql/oid/specialized_string.rb +1 -1
  92. data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +11 -2
  93. data/lib/active_record/connection_adapters/postgresql/oid.rb +2 -0
  94. data/lib/active_record/connection_adapters/postgresql/quoting.rb +4 -4
  95. data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +2 -2
  96. data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +7 -3
  97. data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +1 -1
  98. data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +0 -1
  99. data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +72 -54
  100. data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +8 -0
  101. data/lib/active_record/connection_adapters/postgresql/utils.rb +0 -1
  102. data/lib/active_record/connection_adapters/postgresql_adapter.rb +77 -57
  103. data/lib/active_record/connection_adapters/schema_cache.rb +98 -15
  104. data/lib/active_record/connection_adapters/sql_type_metadata.rb +10 -0
  105. data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +36 -12
  106. data/lib/active_record/connection_adapters/sqlite3/quoting.rb +1 -2
  107. data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +5 -1
  108. data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +38 -5
  109. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +57 -57
  110. data/lib/active_record/connection_adapters/statement_pool.rb +0 -1
  111. data/lib/active_record/connection_adapters.rb +50 -0
  112. data/lib/active_record/connection_handling.rb +210 -87
  113. data/lib/active_record/core.rb +229 -65
  114. data/lib/active_record/counter_cache.rb +4 -1
  115. data/lib/active_record/database_configurations/connection_url_resolver.rb +98 -0
  116. data/lib/active_record/database_configurations/database_config.rb +52 -9
  117. data/lib/active_record/database_configurations/hash_config.rb +54 -8
  118. data/lib/active_record/database_configurations/url_config.rb +15 -41
  119. data/lib/active_record/database_configurations.rb +124 -85
  120. data/lib/active_record/delegated_type.rb +209 -0
  121. data/lib/active_record/destroy_association_async_job.rb +36 -0
  122. data/lib/active_record/dynamic_matchers.rb +2 -3
  123. data/lib/active_record/enum.rb +40 -16
  124. data/lib/active_record/errors.rb +47 -12
  125. data/lib/active_record/explain.rb +9 -5
  126. data/lib/active_record/explain_subscriber.rb +1 -1
  127. data/lib/active_record/fixture_set/file.rb +10 -17
  128. data/lib/active_record/fixture_set/model_metadata.rb +1 -2
  129. data/lib/active_record/fixture_set/render_context.rb +1 -1
  130. data/lib/active_record/fixture_set/table_row.rb +2 -3
  131. data/lib/active_record/fixture_set/table_rows.rb +0 -1
  132. data/lib/active_record/fixtures.rb +54 -11
  133. data/lib/active_record/gem_version.rb +2 -2
  134. data/lib/active_record/inheritance.rb +40 -21
  135. data/lib/active_record/insert_all.rb +38 -9
  136. data/lib/active_record/integration.rb +3 -5
  137. data/lib/active_record/internal_metadata.rb +16 -7
  138. data/lib/active_record/legacy_yaml_adapter.rb +7 -3
  139. data/lib/active_record/locking/optimistic.rb +22 -17
  140. data/lib/active_record/locking/pessimistic.rb +6 -2
  141. data/lib/active_record/log_subscriber.rb +27 -9
  142. data/lib/active_record/middleware/database_selector/resolver/session.rb +3 -0
  143. data/lib/active_record/middleware/database_selector/resolver.rb +6 -2
  144. data/lib/active_record/middleware/database_selector.rb +4 -2
  145. data/lib/active_record/migration/command_recorder.rb +53 -45
  146. data/lib/active_record/migration/compatibility.rb +70 -20
  147. data/lib/active_record/migration/join_table.rb +0 -1
  148. data/lib/active_record/migration.rb +114 -84
  149. data/lib/active_record/model_schema.rb +117 -15
  150. data/lib/active_record/nested_attributes.rb +2 -5
  151. data/lib/active_record/no_touching.rb +1 -1
  152. data/lib/active_record/null_relation.rb +0 -1
  153. data/lib/active_record/persistence.rb +50 -46
  154. data/lib/active_record/query_cache.rb +15 -5
  155. data/lib/active_record/querying.rb +12 -7
  156. data/lib/active_record/railtie.rb +65 -45
  157. data/lib/active_record/railties/databases.rake +267 -93
  158. data/lib/active_record/readonly_attributes.rb +4 -0
  159. data/lib/active_record/reflection.rb +77 -63
  160. data/lib/active_record/relation/batches/batch_enumerator.rb +25 -9
  161. data/lib/active_record/relation/batches.rb +38 -32
  162. data/lib/active_record/relation/calculations.rb +102 -45
  163. data/lib/active_record/relation/delegation.rb +9 -7
  164. data/lib/active_record/relation/finder_methods.rb +45 -16
  165. data/lib/active_record/relation/from_clause.rb +5 -1
  166. data/lib/active_record/relation/merger.rb +27 -26
  167. data/lib/active_record/relation/predicate_builder/array_handler.rb +8 -9
  168. data/lib/active_record/relation/predicate_builder/association_query_value.rb +4 -5
  169. data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +3 -3
  170. data/lib/active_record/relation/predicate_builder/relation_handler.rb +1 -1
  171. data/lib/active_record/relation/predicate_builder.rb +55 -35
  172. data/lib/active_record/relation/query_methods.rb +335 -187
  173. data/lib/active_record/relation/record_fetch_warning.rb +3 -3
  174. data/lib/active_record/relation/spawn_methods.rb +8 -8
  175. data/lib/active_record/relation/where_clause.rb +104 -58
  176. data/lib/active_record/relation.rb +108 -68
  177. data/lib/active_record/result.rb +41 -34
  178. data/lib/active_record/runtime_registry.rb +2 -2
  179. data/lib/active_record/sanitization.rb +6 -17
  180. data/lib/active_record/schema_dumper.rb +34 -4
  181. data/lib/active_record/schema_migration.rb +2 -8
  182. data/lib/active_record/scoping/default.rb +0 -1
  183. data/lib/active_record/scoping/named.rb +7 -18
  184. data/lib/active_record/scoping.rb +0 -1
  185. data/lib/active_record/secure_token.rb +16 -8
  186. data/lib/active_record/serialization.rb +5 -3
  187. data/lib/active_record/signed_id.rb +116 -0
  188. data/lib/active_record/statement_cache.rb +20 -4
  189. data/lib/active_record/store.rb +3 -3
  190. data/lib/active_record/suppressor.rb +2 -2
  191. data/lib/active_record/table_metadata.rb +39 -36
  192. data/lib/active_record/tasks/database_tasks.rb +139 -113
  193. data/lib/active_record/tasks/mysql_database_tasks.rb +34 -36
  194. data/lib/active_record/tasks/postgresql_database_tasks.rb +24 -27
  195. data/lib/active_record/tasks/sqlite_database_tasks.rb +13 -10
  196. data/lib/active_record/test_databases.rb +5 -4
  197. data/lib/active_record/test_fixtures.rb +38 -16
  198. data/lib/active_record/timestamp.rb +4 -7
  199. data/lib/active_record/touch_later.rb +20 -21
  200. data/lib/active_record/transactions.rb +21 -70
  201. data/lib/active_record/type/adapter_specific_registry.rb +2 -5
  202. data/lib/active_record/type/hash_lookup_type_map.rb +0 -1
  203. data/lib/active_record/type/serialized.rb +6 -3
  204. data/lib/active_record/type/time.rb +10 -0
  205. data/lib/active_record/type/type_map.rb +0 -1
  206. data/lib/active_record/type/unsigned_integer.rb +0 -1
  207. data/lib/active_record/type.rb +8 -2
  208. data/lib/active_record/type_caster/connection.rb +0 -1
  209. data/lib/active_record/type_caster/map.rb +8 -5
  210. data/lib/active_record/validations/associated.rb +1 -2
  211. data/lib/active_record/validations/numericality.rb +35 -0
  212. data/lib/active_record/validations/uniqueness.rb +24 -4
  213. data/lib/active_record/validations.rb +3 -3
  214. data/lib/active_record.rb +7 -13
  215. data/lib/arel/attributes/attribute.rb +4 -0
  216. data/lib/arel/collectors/bind.rb +5 -0
  217. data/lib/arel/collectors/composite.rb +8 -0
  218. data/lib/arel/collectors/sql_string.rb +7 -0
  219. data/lib/arel/collectors/substitute_binds.rb +7 -0
  220. data/lib/arel/nodes/binary.rb +82 -8
  221. data/lib/arel/nodes/bind_param.rb +8 -0
  222. data/lib/arel/nodes/casted.rb +21 -9
  223. data/lib/arel/nodes/equality.rb +6 -9
  224. data/lib/arel/nodes/grouping.rb +3 -0
  225. data/lib/arel/nodes/homogeneous_in.rb +72 -0
  226. data/lib/arel/nodes/in.rb +8 -1
  227. data/lib/arel/nodes/infix_operation.rb +13 -1
  228. data/lib/arel/nodes/join_source.rb +1 -1
  229. data/lib/arel/nodes/node.rb +7 -6
  230. data/lib/arel/nodes/ordering.rb +27 -0
  231. data/lib/arel/nodes/sql_literal.rb +3 -0
  232. data/lib/arel/nodes/table_alias.rb +7 -3
  233. data/lib/arel/nodes/unary.rb +0 -1
  234. data/lib/arel/nodes.rb +3 -1
  235. data/lib/arel/predications.rb +17 -24
  236. data/lib/arel/select_manager.rb +1 -2
  237. data/lib/arel/table.rb +13 -5
  238. data/lib/arel/visitors/dot.rb +14 -3
  239. data/lib/arel/visitors/mysql.rb +11 -1
  240. data/lib/arel/visitors/postgresql.rb +15 -5
  241. data/lib/arel/visitors/sqlite.rb +0 -1
  242. data/lib/arel/visitors/to_sql.rb +89 -79
  243. data/lib/arel/visitors/visitor.rb +0 -1
  244. data/lib/arel/visitors.rb +0 -7
  245. data/lib/arel.rb +5 -9
  246. data/lib/rails/generators/active_record/application_record/application_record_generator.rb +0 -1
  247. data/lib/rails/generators/active_record/migration/migration_generator.rb +1 -0
  248. data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb.tt +2 -0
  249. data/lib/rails/generators/active_record/migration/templates/migration.rb.tt +4 -4
  250. data/lib/rails/generators/active_record/migration.rb +6 -2
  251. data/lib/rails/generators/active_record/model/model_generator.rb +38 -2
  252. data/lib/rails/generators/active_record/model/templates/abstract_base_class.rb.tt +7 -0
  253. metadata +26 -26
  254. data/lib/active_record/attribute_decorators.rb +0 -90
  255. data/lib/active_record/connection_adapters/connection_specification.rb +0 -297
  256. data/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb +0 -29
  257. data/lib/active_record/define_callbacks.rb +0 -22
  258. data/lib/active_record/railties/collection_cache_association_loading.rb +0 -34
  259. data/lib/active_record/relation/predicate_builder/base_handler.rb +0 -18
  260. data/lib/active_record/relation/where_clause_factory.rb +0 -33
  261. data/lib/arel/attributes.rb +0 -22
  262. data/lib/arel/visitors/depth_first.rb +0 -204
  263. data/lib/arel/visitors/ibm_db.rb +0 -34
  264. data/lib/arel/visitors/informix.rb +0 -62
  265. data/lib/arel/visitors/mssql.rb +0 -157
  266. data/lib/arel/visitors/oracle.rb +0 -159
  267. data/lib/arel/visitors/oracle12.rb +0 -66
  268. data/lib/arel/visitors/where_sql.rb +0 -23
@@ -1,34 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module ActiveRecord
4
- module Railties # :nodoc:
5
- module CollectionCacheAssociationLoading #:nodoc:
6
- def setup(context, options, as, block)
7
- @relation = relation_from_options(options)
8
-
9
- super
10
- end
11
-
12
- def relation_from_options(cached: nil, partial: nil, collection: nil, **_)
13
- return unless cached
14
-
15
- relation = partial if partial.is_a?(ActiveRecord::Relation)
16
- relation ||= collection if collection.is_a?(ActiveRecord::Relation)
17
-
18
- if relation && !relation.loaded?
19
- relation.skip_preloading!
20
- end
21
- end
22
-
23
- def collection_without_template(*)
24
- @relation.preload_associations(@collection) if @relation
25
- super
26
- end
27
-
28
- def collection_with_template(*)
29
- @relation.preload_associations(@collection) if @relation
30
- super
31
- end
32
- end
33
- end
34
- end
@@ -1,18 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module ActiveRecord
4
- class PredicateBuilder
5
- class BaseHandler # :nodoc:
6
- def initialize(predicate_builder)
7
- @predicate_builder = predicate_builder
8
- end
9
-
10
- def call(attribute, value)
11
- predicate_builder.build(attribute, value.id)
12
- end
13
-
14
- private
15
- attr_reader :predicate_builder
16
- end
17
- end
18
- end
@@ -1,33 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module ActiveRecord
4
- class Relation
5
- class WhereClauseFactory # :nodoc:
6
- def initialize(klass, predicate_builder)
7
- @klass = klass
8
- @predicate_builder = predicate_builder
9
- end
10
-
11
- def build(opts, other)
12
- case opts
13
- when String, Array
14
- parts = [klass.sanitize_sql(other.empty? ? opts : ([opts] + other))]
15
- when Hash
16
- attributes = predicate_builder.resolve_column_aliases(opts)
17
- attributes.stringify_keys!
18
-
19
- parts = predicate_builder.build_from_hash(attributes)
20
- when Arel::Nodes::Node
21
- parts = [opts]
22
- else
23
- raise ArgumentError, "Unsupported argument type: #{opts} (#{opts.class})"
24
- end
25
-
26
- WhereClause.new(parts)
27
- end
28
-
29
- private
30
- attr_reader :klass, :predicate_builder
31
- end
32
- end
33
- end
@@ -1,22 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "arel/attributes/attribute"
4
-
5
- module Arel # :nodoc: all
6
- module Attributes
7
- ###
8
- # Factory method to wrap a raw database +column+ to an Arel Attribute.
9
- def self.for(column)
10
- case column.type
11
- when :string, :text, :binary then String
12
- when :integer then Integer
13
- when :float then Float
14
- when :decimal then Decimal
15
- when :date, :datetime, :timestamp, :time then Time
16
- when :boolean then Boolean
17
- else
18
- Undefined
19
- end
20
- end
21
- end
22
- end
@@ -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