activerecord 6.0.3.4 → 6.1.2

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 (245) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +891 -695
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +3 -3
  5. data/lib/active_record.rb +7 -14
  6. data/lib/active_record/aggregations.rb +5 -5
  7. data/lib/active_record/association_relation.rb +30 -12
  8. data/lib/active_record/associations.rb +118 -11
  9. data/lib/active_record/associations/alias_tracker.rb +19 -15
  10. data/lib/active_record/associations/association.rb +44 -28
  11. data/lib/active_record/associations/association_scope.rb +19 -15
  12. data/lib/active_record/associations/belongs_to_association.rb +22 -8
  13. data/lib/active_record/associations/belongs_to_polymorphic_association.rb +8 -3
  14. data/lib/active_record/associations/builder/association.rb +32 -5
  15. data/lib/active_record/associations/builder/belongs_to.rb +10 -7
  16. data/lib/active_record/associations/builder/collection_association.rb +5 -4
  17. data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +0 -1
  18. data/lib/active_record/associations/builder/has_many.rb +6 -2
  19. data/lib/active_record/associations/builder/has_one.rb +11 -14
  20. data/lib/active_record/associations/builder/singular_association.rb +1 -1
  21. data/lib/active_record/associations/collection_association.rb +19 -6
  22. data/lib/active_record/associations/collection_proxy.rb +13 -5
  23. data/lib/active_record/associations/foreign_association.rb +13 -0
  24. data/lib/active_record/associations/has_many_association.rb +24 -2
  25. data/lib/active_record/associations/has_many_through_association.rb +10 -4
  26. data/lib/active_record/associations/has_one_association.rb +15 -1
  27. data/lib/active_record/associations/join_dependency.rb +72 -50
  28. data/lib/active_record/associations/join_dependency/join_association.rb +39 -16
  29. data/lib/active_record/associations/join_dependency/join_part.rb +3 -3
  30. data/lib/active_record/associations/preloader.rb +11 -5
  31. data/lib/active_record/associations/preloader/association.rb +51 -25
  32. data/lib/active_record/associations/preloader/through_association.rb +2 -2
  33. data/lib/active_record/associations/singular_association.rb +1 -1
  34. data/lib/active_record/associations/through_association.rb +1 -1
  35. data/lib/active_record/attribute_assignment.rb +10 -8
  36. data/lib/active_record/attribute_methods.rb +64 -54
  37. data/lib/active_record/attribute_methods/before_type_cast.rb +13 -9
  38. data/lib/active_record/attribute_methods/dirty.rb +1 -11
  39. data/lib/active_record/attribute_methods/primary_key.rb +6 -2
  40. data/lib/active_record/attribute_methods/query.rb +3 -6
  41. data/lib/active_record/attribute_methods/read.rb +8 -11
  42. data/lib/active_record/attribute_methods/serialization.rb +11 -5
  43. data/lib/active_record/attribute_methods/time_zone_conversion.rb +12 -13
  44. data/lib/active_record/attribute_methods/write.rb +12 -20
  45. data/lib/active_record/attributes.rb +33 -8
  46. data/lib/active_record/autosave_association.rb +57 -40
  47. data/lib/active_record/base.rb +2 -14
  48. data/lib/active_record/callbacks.rb +152 -22
  49. data/lib/active_record/coders/yaml_column.rb +1 -1
  50. data/lib/active_record/connection_adapters.rb +50 -0
  51. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +191 -134
  52. data/lib/active_record/connection_adapters/abstract/database_limits.rb +2 -44
  53. data/lib/active_record/connection_adapters/abstract/database_statements.rb +65 -22
  54. data/lib/active_record/connection_adapters/abstract/query_cache.rb +3 -8
  55. data/lib/active_record/connection_adapters/abstract/quoting.rb +34 -34
  56. data/lib/active_record/connection_adapters/abstract/savepoints.rb +3 -3
  57. data/lib/active_record/connection_adapters/abstract/schema_creation.rb +153 -116
  58. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +116 -27
  59. data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +3 -3
  60. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +228 -83
  61. data/lib/active_record/connection_adapters/abstract/transaction.rb +80 -32
  62. data/lib/active_record/connection_adapters/abstract_adapter.rb +54 -72
  63. data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +133 -96
  64. data/lib/active_record/connection_adapters/column.rb +15 -1
  65. data/lib/active_record/connection_adapters/deduplicable.rb +29 -0
  66. data/lib/active_record/connection_adapters/legacy_pool_manager.rb +31 -0
  67. data/lib/active_record/connection_adapters/mysql/database_statements.rb +23 -25
  68. data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +1 -1
  69. data/lib/active_record/connection_adapters/mysql/quoting.rb +1 -1
  70. data/lib/active_record/connection_adapters/mysql/schema_creation.rb +32 -6
  71. data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +8 -0
  72. data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +5 -2
  73. data/lib/active_record/connection_adapters/mysql/schema_statements.rb +11 -7
  74. data/lib/active_record/connection_adapters/mysql/type_metadata.rb +10 -1
  75. data/lib/active_record/connection_adapters/mysql2_adapter.rb +31 -12
  76. data/lib/active_record/connection_adapters/pool_config.rb +73 -0
  77. data/lib/active_record/connection_adapters/pool_manager.rb +43 -0
  78. data/lib/active_record/connection_adapters/postgresql/column.rb +24 -1
  79. data/lib/active_record/connection_adapters/postgresql/database_statements.rb +13 -54
  80. data/lib/active_record/connection_adapters/postgresql/oid.rb +2 -0
  81. data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +3 -5
  82. data/lib/active_record/connection_adapters/postgresql/oid/date.rb +2 -2
  83. data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +10 -2
  84. data/lib/active_record/connection_adapters/postgresql/oid/interval.rb +49 -0
  85. data/lib/active_record/connection_adapters/postgresql/oid/legacy_point.rb +2 -2
  86. data/lib/active_record/connection_adapters/postgresql/oid/macaddr.rb +25 -0
  87. data/lib/active_record/connection_adapters/postgresql/oid/point.rb +2 -2
  88. data/lib/active_record/connection_adapters/postgresql/oid/range.rb +24 -5
  89. data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +11 -1
  90. data/lib/active_record/connection_adapters/postgresql/quoting.rb +4 -4
  91. data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +1 -1
  92. data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +5 -1
  93. data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +61 -29
  94. data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +8 -0
  95. data/lib/active_record/connection_adapters/postgresql_adapter.rb +73 -58
  96. data/lib/active_record/connection_adapters/schema_cache.rb +98 -15
  97. data/lib/active_record/connection_adapters/sql_type_metadata.rb +10 -0
  98. data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +31 -6
  99. data/lib/active_record/connection_adapters/sqlite3/quoting.rb +1 -1
  100. data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +5 -1
  101. data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +37 -4
  102. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +49 -50
  103. data/lib/active_record/connection_handling.rb +218 -71
  104. data/lib/active_record/core.rb +245 -61
  105. data/lib/active_record/database_configurations.rb +124 -85
  106. data/lib/active_record/database_configurations/connection_url_resolver.rb +98 -0
  107. data/lib/active_record/database_configurations/database_config.rb +52 -9
  108. data/lib/active_record/database_configurations/hash_config.rb +54 -8
  109. data/lib/active_record/database_configurations/url_config.rb +15 -40
  110. data/lib/active_record/delegated_type.rb +209 -0
  111. data/lib/active_record/destroy_association_async_job.rb +36 -0
  112. data/lib/active_record/enum.rb +82 -38
  113. data/lib/active_record/errors.rb +47 -12
  114. data/lib/active_record/explain.rb +9 -4
  115. data/lib/active_record/explain_subscriber.rb +1 -1
  116. data/lib/active_record/fixture_set/file.rb +10 -17
  117. data/lib/active_record/fixture_set/model_metadata.rb +1 -2
  118. data/lib/active_record/fixture_set/render_context.rb +1 -1
  119. data/lib/active_record/fixture_set/table_row.rb +2 -2
  120. data/lib/active_record/fixtures.rb +58 -9
  121. data/lib/active_record/gem_version.rb +3 -3
  122. data/lib/active_record/inheritance.rb +40 -18
  123. data/lib/active_record/insert_all.rb +35 -6
  124. data/lib/active_record/integration.rb +3 -5
  125. data/lib/active_record/internal_metadata.rb +16 -7
  126. data/lib/active_record/legacy_yaml_adapter.rb +7 -3
  127. data/lib/active_record/locking/optimistic.rb +33 -17
  128. data/lib/active_record/locking/pessimistic.rb +6 -2
  129. data/lib/active_record/log_subscriber.rb +27 -8
  130. data/lib/active_record/middleware/database_selector.rb +4 -1
  131. data/lib/active_record/middleware/database_selector/resolver.rb +5 -0
  132. data/lib/active_record/middleware/database_selector/resolver/session.rb +3 -0
  133. data/lib/active_record/migration.rb +113 -83
  134. data/lib/active_record/migration/command_recorder.rb +47 -27
  135. data/lib/active_record/migration/compatibility.rb +68 -17
  136. data/lib/active_record/model_schema.rb +117 -13
  137. data/lib/active_record/nested_attributes.rb +2 -3
  138. data/lib/active_record/no_touching.rb +1 -1
  139. data/lib/active_record/persistence.rb +50 -45
  140. data/lib/active_record/query_cache.rb +15 -5
  141. data/lib/active_record/querying.rb +11 -6
  142. data/lib/active_record/railtie.rb +64 -44
  143. data/lib/active_record/railties/console_sandbox.rb +2 -4
  144. data/lib/active_record/railties/databases.rake +276 -99
  145. data/lib/active_record/readonly_attributes.rb +4 -0
  146. data/lib/active_record/reflection.rb +71 -57
  147. data/lib/active_record/relation.rb +96 -67
  148. data/lib/active_record/relation/batches.rb +38 -31
  149. data/lib/active_record/relation/batches/batch_enumerator.rb +25 -9
  150. data/lib/active_record/relation/calculations.rb +101 -44
  151. data/lib/active_record/relation/delegation.rb +2 -1
  152. data/lib/active_record/relation/finder_methods.rb +45 -15
  153. data/lib/active_record/relation/from_clause.rb +1 -1
  154. data/lib/active_record/relation/merger.rb +27 -25
  155. data/lib/active_record/relation/predicate_builder.rb +59 -38
  156. data/lib/active_record/relation/predicate_builder/array_handler.rb +8 -9
  157. data/lib/active_record/relation/predicate_builder/association_query_value.rb +4 -5
  158. data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +10 -6
  159. data/lib/active_record/relation/predicate_builder/relation_handler.rb +1 -1
  160. data/lib/active_record/relation/query_methods.rb +333 -195
  161. data/lib/active_record/relation/record_fetch_warning.rb +3 -3
  162. data/lib/active_record/relation/spawn_methods.rb +8 -7
  163. data/lib/active_record/relation/where_clause.rb +104 -57
  164. data/lib/active_record/result.rb +41 -33
  165. data/lib/active_record/runtime_registry.rb +2 -2
  166. data/lib/active_record/sanitization.rb +6 -17
  167. data/lib/active_record/schema_dumper.rb +34 -4
  168. data/lib/active_record/schema_migration.rb +2 -8
  169. data/lib/active_record/scoping/named.rb +6 -17
  170. data/lib/active_record/secure_token.rb +16 -8
  171. data/lib/active_record/serialization.rb +5 -3
  172. data/lib/active_record/signed_id.rb +116 -0
  173. data/lib/active_record/statement_cache.rb +20 -4
  174. data/lib/active_record/store.rb +2 -2
  175. data/lib/active_record/suppressor.rb +2 -2
  176. data/lib/active_record/table_metadata.rb +42 -51
  177. data/lib/active_record/tasks/database_tasks.rb +140 -113
  178. data/lib/active_record/tasks/mysql_database_tasks.rb +34 -35
  179. data/lib/active_record/tasks/postgresql_database_tasks.rb +24 -26
  180. data/lib/active_record/tasks/sqlite_database_tasks.rb +13 -9
  181. data/lib/active_record/test_databases.rb +5 -4
  182. data/lib/active_record/test_fixtures.rb +37 -16
  183. data/lib/active_record/timestamp.rb +4 -6
  184. data/lib/active_record/touch_later.rb +21 -21
  185. data/lib/active_record/transactions.rb +19 -66
  186. data/lib/active_record/type.rb +8 -1
  187. data/lib/active_record/type/serialized.rb +6 -2
  188. data/lib/active_record/type/time.rb +10 -0
  189. data/lib/active_record/type_caster/connection.rb +0 -1
  190. data/lib/active_record/type_caster/map.rb +8 -5
  191. data/lib/active_record/validations.rb +1 -0
  192. data/lib/active_record/validations/numericality.rb +35 -0
  193. data/lib/active_record/validations/uniqueness.rb +24 -4
  194. data/lib/arel.rb +5 -13
  195. data/lib/arel/attributes/attribute.rb +4 -0
  196. data/lib/arel/collectors/bind.rb +5 -0
  197. data/lib/arel/collectors/composite.rb +8 -0
  198. data/lib/arel/collectors/sql_string.rb +7 -0
  199. data/lib/arel/collectors/substitute_binds.rb +7 -0
  200. data/lib/arel/nodes.rb +3 -1
  201. data/lib/arel/nodes/binary.rb +82 -8
  202. data/lib/arel/nodes/bind_param.rb +8 -0
  203. data/lib/arel/nodes/casted.rb +21 -9
  204. data/lib/arel/nodes/equality.rb +6 -9
  205. data/lib/arel/nodes/grouping.rb +3 -0
  206. data/lib/arel/nodes/homogeneous_in.rb +72 -0
  207. data/lib/arel/nodes/in.rb +8 -1
  208. data/lib/arel/nodes/infix_operation.rb +13 -1
  209. data/lib/arel/nodes/join_source.rb +1 -1
  210. data/lib/arel/nodes/node.rb +7 -6
  211. data/lib/arel/nodes/ordering.rb +27 -0
  212. data/lib/arel/nodes/sql_literal.rb +3 -0
  213. data/lib/arel/nodes/table_alias.rb +7 -3
  214. data/lib/arel/nodes/unary.rb +0 -1
  215. data/lib/arel/predications.rb +12 -18
  216. data/lib/arel/select_manager.rb +1 -2
  217. data/lib/arel/table.rb +13 -5
  218. data/lib/arel/visitors.rb +0 -7
  219. data/lib/arel/visitors/dot.rb +14 -2
  220. data/lib/arel/visitors/mysql.rb +11 -1
  221. data/lib/arel/visitors/postgresql.rb +15 -4
  222. data/lib/arel/visitors/to_sql.rb +89 -78
  223. data/lib/rails/generators/active_record/migration.rb +6 -1
  224. data/lib/rails/generators/active_record/migration/migration_generator.rb +1 -0
  225. data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb.tt +2 -0
  226. data/lib/rails/generators/active_record/migration/templates/migration.rb.tt +3 -3
  227. data/lib/rails/generators/active_record/model/model_generator.rb +39 -2
  228. data/lib/rails/generators/active_record/model/templates/abstract_base_class.rb.tt +7 -0
  229. metadata +25 -26
  230. data/lib/active_record/advisory_lock_base.rb +0 -18
  231. data/lib/active_record/attribute_decorators.rb +0 -88
  232. data/lib/active_record/connection_adapters/connection_specification.rb +0 -296
  233. data/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb +0 -29
  234. data/lib/active_record/define_callbacks.rb +0 -22
  235. data/lib/active_record/railties/collection_cache_association_loading.rb +0 -34
  236. data/lib/active_record/relation/predicate_builder/base_handler.rb +0 -18
  237. data/lib/active_record/relation/where_clause_factory.rb +0 -33
  238. data/lib/arel/attributes.rb +0 -22
  239. data/lib/arel/visitors/depth_first.rb +0 -203
  240. data/lib/arel/visitors/ibm_db.rb +0 -34
  241. data/lib/arel/visitors/informix.rb +0 -62
  242. data/lib/arel/visitors/mssql.rb +0 -156
  243. data/lib/arel/visitors/oracle.rb +0 -158
  244. data/lib/arel/visitors/oracle12.rb +0 -65
  245. data/lib/arel/visitors/where_sql.rb +0 -22
@@ -1,203 +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
- def visit(o, _ = nil)
13
- super
14
- @block.call o
15
- end
16
-
17
- def unary(o)
18
- visit o.expr
19
- end
20
- alias :visit_Arel_Nodes_Else :unary
21
- alias :visit_Arel_Nodes_Group :unary
22
- alias :visit_Arel_Nodes_Cube :unary
23
- alias :visit_Arel_Nodes_RollUp :unary
24
- alias :visit_Arel_Nodes_GroupingSet :unary
25
- alias :visit_Arel_Nodes_GroupingElement :unary
26
- alias :visit_Arel_Nodes_Grouping :unary
27
- alias :visit_Arel_Nodes_Having :unary
28
- alias :visit_Arel_Nodes_Lateral :unary
29
- alias :visit_Arel_Nodes_Limit :unary
30
- alias :visit_Arel_Nodes_Not :unary
31
- alias :visit_Arel_Nodes_Offset :unary
32
- alias :visit_Arel_Nodes_On :unary
33
- alias :visit_Arel_Nodes_Ordering :unary
34
- alias :visit_Arel_Nodes_Ascending :unary
35
- alias :visit_Arel_Nodes_Descending :unary
36
- alias :visit_Arel_Nodes_UnqualifiedColumn :unary
37
- alias :visit_Arel_Nodes_OptimizerHints :unary
38
- alias :visit_Arel_Nodes_ValuesList :unary
39
-
40
- def function(o)
41
- visit o.expressions
42
- visit o.alias
43
- visit o.distinct
44
- end
45
- alias :visit_Arel_Nodes_Avg :function
46
- alias :visit_Arel_Nodes_Exists :function
47
- alias :visit_Arel_Nodes_Max :function
48
- alias :visit_Arel_Nodes_Min :function
49
- alias :visit_Arel_Nodes_Sum :function
50
-
51
- def visit_Arel_Nodes_NamedFunction(o)
52
- visit o.name
53
- visit o.expressions
54
- visit o.distinct
55
- visit o.alias
56
- end
57
-
58
- def visit_Arel_Nodes_Count(o)
59
- visit o.expressions
60
- visit o.alias
61
- visit o.distinct
62
- end
63
-
64
- def visit_Arel_Nodes_Case(o)
65
- visit o.case
66
- visit o.conditions
67
- visit o.default
68
- end
69
-
70
- def nary(o)
71
- o.children.each { |child| visit child }
72
- end
73
- alias :visit_Arel_Nodes_And :nary
74
-
75
- def binary(o)
76
- visit o.left
77
- visit o.right
78
- end
79
- alias :visit_Arel_Nodes_As :binary
80
- alias :visit_Arel_Nodes_Assignment :binary
81
- alias :visit_Arel_Nodes_Between :binary
82
- alias :visit_Arel_Nodes_Concat :binary
83
- alias :visit_Arel_Nodes_DeleteStatement :binary
84
- alias :visit_Arel_Nodes_DoesNotMatch :binary
85
- alias :visit_Arel_Nodes_Equality :binary
86
- alias :visit_Arel_Nodes_FullOuterJoin :binary
87
- alias :visit_Arel_Nodes_GreaterThan :binary
88
- alias :visit_Arel_Nodes_GreaterThanOrEqual :binary
89
- alias :visit_Arel_Nodes_In :binary
90
- alias :visit_Arel_Nodes_InfixOperation :binary
91
- alias :visit_Arel_Nodes_JoinSource :binary
92
- alias :visit_Arel_Nodes_InnerJoin :binary
93
- alias :visit_Arel_Nodes_LessThan :binary
94
- alias :visit_Arel_Nodes_LessThanOrEqual :binary
95
- alias :visit_Arel_Nodes_Matches :binary
96
- alias :visit_Arel_Nodes_NotEqual :binary
97
- alias :visit_Arel_Nodes_NotIn :binary
98
- alias :visit_Arel_Nodes_NotRegexp :binary
99
- alias :visit_Arel_Nodes_IsNotDistinctFrom :binary
100
- alias :visit_Arel_Nodes_IsDistinctFrom :binary
101
- alias :visit_Arel_Nodes_Or :binary
102
- alias :visit_Arel_Nodes_OuterJoin :binary
103
- alias :visit_Arel_Nodes_Regexp :binary
104
- alias :visit_Arel_Nodes_RightOuterJoin :binary
105
- alias :visit_Arel_Nodes_TableAlias :binary
106
- alias :visit_Arel_Nodes_When :binary
107
-
108
- def visit_Arel_Nodes_StringJoin(o)
109
- visit o.left
110
- end
111
-
112
- def visit_Arel_Attribute(o)
113
- visit o.relation
114
- visit o.name
115
- end
116
- alias :visit_Arel_Attributes_Integer :visit_Arel_Attribute
117
- alias :visit_Arel_Attributes_Float :visit_Arel_Attribute
118
- alias :visit_Arel_Attributes_String :visit_Arel_Attribute
119
- alias :visit_Arel_Attributes_Time :visit_Arel_Attribute
120
- alias :visit_Arel_Attributes_Boolean :visit_Arel_Attribute
121
- alias :visit_Arel_Attributes_Attribute :visit_Arel_Attribute
122
- alias :visit_Arel_Attributes_Decimal :visit_Arel_Attribute
123
-
124
- def visit_Arel_Table(o)
125
- visit o.name
126
- end
127
-
128
- def terminal(o)
129
- end
130
- alias :visit_ActiveSupport_Multibyte_Chars :terminal
131
- alias :visit_ActiveSupport_StringInquirer :terminal
132
- alias :visit_Arel_Nodes_Lock :terminal
133
- alias :visit_Arel_Nodes_Node :terminal
134
- alias :visit_Arel_Nodes_SqlLiteral :terminal
135
- alias :visit_Arel_Nodes_BindParam :terminal
136
- alias :visit_Arel_Nodes_Window :terminal
137
- alias :visit_Arel_Nodes_True :terminal
138
- alias :visit_Arel_Nodes_False :terminal
139
- alias :visit_BigDecimal :terminal
140
- alias :visit_Class :terminal
141
- alias :visit_Date :terminal
142
- alias :visit_DateTime :terminal
143
- alias :visit_FalseClass :terminal
144
- alias :visit_Float :terminal
145
- alias :visit_Integer :terminal
146
- alias :visit_NilClass :terminal
147
- alias :visit_String :terminal
148
- alias :visit_Symbol :terminal
149
- alias :visit_Time :terminal
150
- alias :visit_TrueClass :terminal
151
-
152
- def visit_Arel_Nodes_InsertStatement(o)
153
- visit o.relation
154
- visit o.columns
155
- visit o.values
156
- end
157
-
158
- def visit_Arel_Nodes_SelectCore(o)
159
- visit o.projections
160
- visit o.source
161
- visit o.wheres
162
- visit o.groups
163
- visit o.windows
164
- visit o.havings
165
- end
166
-
167
- def visit_Arel_Nodes_SelectStatement(o)
168
- visit o.cores
169
- visit o.orders
170
- visit o.limit
171
- visit o.lock
172
- visit o.offset
173
- end
174
-
175
- def visit_Arel_Nodes_UpdateStatement(o)
176
- visit o.relation
177
- visit o.values
178
- visit o.wheres
179
- visit o.orders
180
- visit o.limit
181
- end
182
-
183
- def visit_Arel_Nodes_Comment(o)
184
- visit o.values
185
- end
186
-
187
- def visit_Array(o)
188
- o.each { |i| visit i }
189
- end
190
- alias :visit_Set :visit_Array
191
-
192
- def visit_Hash(o)
193
- o.each { |k, v| visit(k); visit(v) }
194
- end
195
-
196
- DISPATCH = dispatch_cache
197
-
198
- def get_dispatch_cache
199
- DISPATCH
200
- end
201
- end
202
- end
203
- 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,156 +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
- def visit_Arel_Nodes_IsNotDistinctFrom(o, collector)
15
- right = o.right
16
-
17
- if right.nil?
18
- collector = visit o.left, collector
19
- collector << " IS NULL"
20
- else
21
- collector << "EXISTS (VALUES ("
22
- collector = visit o.left, collector
23
- collector << ") INTERSECT VALUES ("
24
- collector = visit right, collector
25
- collector << "))"
26
- end
27
- end
28
-
29
- def visit_Arel_Nodes_IsDistinctFrom(o, collector)
30
- if o.right.nil?
31
- collector = visit o.left, collector
32
- collector << " IS NOT NULL"
33
- else
34
- collector << "NOT "
35
- visit_Arel_Nodes_IsNotDistinctFrom o, collector
36
- end
37
- end
38
-
39
- def visit_Arel_Visitors_MSSQL_RowNumber(o, collector)
40
- collector << "ROW_NUMBER() OVER (ORDER BY "
41
- inject_join(o.children, collector, ", ") << ") as _row_num"
42
- end
43
-
44
- def visit_Arel_Nodes_SelectStatement(o, collector)
45
- if !o.limit && !o.offset
46
- return super
47
- end
48
-
49
- is_select_count = false
50
- o.cores.each { |x|
51
- core_order_by = row_num_literal determine_order_by(o.orders, x)
52
- if select_count? x
53
- x.projections = [core_order_by]
54
- is_select_count = true
55
- else
56
- x.projections << core_order_by
57
- end
58
- }
59
-
60
- if is_select_count
61
- # fixme count distinct wouldn't work with limit or offset
62
- collector << "SELECT COUNT(1) as count_id FROM ("
63
- end
64
-
65
- collector << "SELECT _t.* FROM ("
66
- collector = o.cores.inject(collector) { |c, x|
67
- visit_Arel_Nodes_SelectCore x, c
68
- }
69
- collector << ") as _t WHERE #{get_offset_limit_clause(o)}"
70
-
71
- if is_select_count
72
- collector << ") AS subquery"
73
- else
74
- collector
75
- end
76
- end
77
-
78
- def visit_Arel_Nodes_SelectCore(o, collector)
79
- collector = super
80
- maybe_visit o.optimizer_hints, collector
81
- end
82
-
83
- def visit_Arel_Nodes_OptimizerHints(o, collector)
84
- hints = o.expr.map { |v| sanitize_as_sql_comment(v) }.join(", ")
85
- collector << "OPTION (#{hints})"
86
- end
87
-
88
- def get_offset_limit_clause(o)
89
- first_row = o.offset ? o.offset.expr.to_i + 1 : 1
90
- last_row = o.limit ? o.limit.expr.to_i - 1 + first_row : nil
91
- if last_row
92
- " _row_num BETWEEN #{first_row} AND #{last_row}"
93
- else
94
- " _row_num >= #{first_row}"
95
- end
96
- end
97
-
98
- def visit_Arel_Nodes_DeleteStatement(o, collector)
99
- collector << "DELETE "
100
- if o.limit
101
- collector << "TOP ("
102
- visit o.limit.expr, collector
103
- collector << ") "
104
- end
105
- collector << "FROM "
106
- collector = visit o.relation, collector
107
- if o.wheres.any?
108
- collector << " WHERE "
109
- inject_join o.wheres, collector, " AND "
110
- else
111
- collector
112
- end
113
- end
114
-
115
- def collect_optimizer_hints(o, collector)
116
- collector
117
- end
118
-
119
- def determine_order_by(orders, x)
120
- if orders.any?
121
- orders
122
- elsif x.groups.any?
123
- x.groups
124
- else
125
- pk = find_left_table_pk(x.froms)
126
- pk ? [pk] : []
127
- end
128
- end
129
-
130
- def row_num_literal(order_by)
131
- RowNumber.new order_by
132
- end
133
-
134
- def select_count?(x)
135
- x.projections.length == 1 && Arel::Nodes::Count === x.projections.first
136
- end
137
-
138
- # FIXME raise exception of there is no pk?
139
- def find_left_table_pk(o)
140
- if o.kind_of?(Arel::Nodes::Join)
141
- find_left_table_pk(o.left)
142
- elsif o.instance_of?(Arel::Table)
143
- find_primary_key(o)
144
- end
145
- end
146
-
147
- def find_primary_key(o)
148
- @primary_keys[o.name] ||= begin
149
- primary_key_name = @connection.primary_key(o.name)
150
- # some tables might be without primary key
151
- primary_key_name && o[primary_key_name]
152
- end
153
- end
154
- end
155
- end
156
- end