activerecord 6.1.4.1 → 7.0.0.alpha1
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +729 -1161
- data/MIT-LICENSE +1 -1
- data/README.rdoc +1 -1
- data/lib/active_record/aggregations.rb +1 -1
- data/lib/active_record/association_relation.rb +0 -10
- data/lib/active_record/associations/association.rb +31 -9
- data/lib/active_record/associations/association_scope.rb +1 -3
- data/lib/active_record/associations/belongs_to_association.rb +15 -4
- data/lib/active_record/associations/belongs_to_polymorphic_association.rb +10 -2
- data/lib/active_record/associations/builder/association.rb +8 -2
- data/lib/active_record/associations/builder/belongs_to.rb +19 -6
- data/lib/active_record/associations/builder/collection_association.rb +1 -1
- data/lib/active_record/associations/builder/has_many.rb +3 -2
- data/lib/active_record/associations/builder/has_one.rb +2 -1
- data/lib/active_record/associations/builder/singular_association.rb +2 -2
- data/lib/active_record/associations/collection_association.rb +24 -25
- data/lib/active_record/associations/collection_proxy.rb +8 -3
- data/lib/active_record/associations/disable_joins_association_scope.rb +59 -0
- data/lib/active_record/associations/has_many_association.rb +1 -1
- data/lib/active_record/associations/has_many_through_association.rb +2 -1
- data/lib/active_record/associations/has_one_association.rb +10 -7
- data/lib/active_record/associations/has_one_through_association.rb +1 -1
- data/lib/active_record/associations/preloader/association.rb +161 -49
- data/lib/active_record/associations/preloader/batch.rb +51 -0
- data/lib/active_record/associations/preloader/branch.rb +147 -0
- data/lib/active_record/associations/preloader/through_association.rb +37 -11
- data/lib/active_record/associations/preloader.rb +46 -110
- data/lib/active_record/associations/singular_association.rb +8 -2
- data/lib/active_record/associations/through_association.rb +1 -1
- data/lib/active_record/associations.rb +76 -81
- data/lib/active_record/asynchronous_queries_tracker.rb +57 -0
- data/lib/active_record/attribute_assignment.rb +1 -1
- data/lib/active_record/attribute_methods/before_type_cast.rb +7 -2
- data/lib/active_record/attribute_methods/dirty.rb +41 -16
- data/lib/active_record/attribute_methods/primary_key.rb +2 -2
- data/lib/active_record/attribute_methods/query.rb +2 -2
- data/lib/active_record/attribute_methods/read.rb +7 -5
- data/lib/active_record/attribute_methods/serialization.rb +66 -12
- data/lib/active_record/attribute_methods/time_zone_conversion.rb +4 -3
- data/lib/active_record/attribute_methods/write.rb +7 -10
- data/lib/active_record/attribute_methods.rb +6 -9
- data/lib/active_record/attributes.rb +24 -35
- data/lib/active_record/autosave_association.rb +3 -18
- data/lib/active_record/base.rb +19 -1
- data/lib/active_record/callbacks.rb +2 -2
- data/lib/active_record/connection_adapters/abstract/connection_handler.rb +312 -0
- data/lib/active_record/connection_adapters/abstract/connection_pool/queue.rb +209 -0
- data/lib/active_record/connection_adapters/abstract/connection_pool/reaper.rb +76 -0
- data/lib/active_record/connection_adapters/abstract/connection_pool.rb +31 -558
- data/lib/active_record/connection_adapters/abstract/database_statements.rb +45 -21
- data/lib/active_record/connection_adapters/abstract/query_cache.rb +24 -12
- data/lib/active_record/connection_adapters/abstract/quoting.rb +14 -7
- data/lib/active_record/connection_adapters/abstract/schema_creation.rb +4 -17
- data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +30 -9
- data/lib/active_record/connection_adapters/abstract/schema_statements.rb +60 -16
- data/lib/active_record/connection_adapters/abstract/transaction.rb +3 -3
- data/lib/active_record/connection_adapters/abstract_adapter.rb +112 -66
- data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +96 -81
- data/lib/active_record/connection_adapters/mysql/database_statements.rb +33 -21
- data/lib/active_record/connection_adapters/mysql/quoting.rb +16 -1
- data/lib/active_record/connection_adapters/mysql/schema_statements.rb +3 -0
- data/lib/active_record/connection_adapters/mysql2_adapter.rb +12 -6
- data/lib/active_record/connection_adapters/pool_config.rb +1 -3
- data/lib/active_record/connection_adapters/postgresql/database_statements.rb +19 -12
- data/lib/active_record/connection_adapters/postgresql/oid/date.rb +8 -0
- data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +5 -0
- data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +53 -14
- data/lib/active_record/connection_adapters/postgresql/oid/range.rb +1 -1
- data/lib/active_record/connection_adapters/postgresql/oid/timestamp.rb +15 -0
- data/lib/active_record/connection_adapters/postgresql/oid/timestamp_with_time_zone.rb +28 -0
- data/lib/active_record/connection_adapters/postgresql/oid/type_map_initializer.rb +18 -6
- data/lib/active_record/connection_adapters/postgresql/oid.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/quoting.rb +6 -6
- data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +32 -0
- data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +5 -1
- data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +12 -12
- data/lib/active_record/connection_adapters/postgresql_adapter.rb +157 -100
- data/lib/active_record/connection_adapters/schema_cache.rb +26 -3
- data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +23 -17
- data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +4 -2
- data/lib/active_record/connection_adapters/sqlite3_adapter.rb +61 -30
- data/lib/active_record/connection_adapters.rb +6 -5
- data/lib/active_record/connection_handling.rb +20 -38
- data/lib/active_record/core.rb +113 -112
- data/lib/active_record/database_configurations/database_config.rb +12 -0
- data/lib/active_record/database_configurations/hash_config.rb +27 -1
- data/lib/active_record/database_configurations/url_config.rb +2 -2
- data/lib/active_record/database_configurations.rb +18 -9
- data/lib/active_record/delegated_type.rb +33 -11
- data/lib/active_record/destroy_association_async_job.rb +1 -1
- data/lib/active_record/disable_joins_association_relation.rb +39 -0
- data/lib/active_record/dynamic_matchers.rb +1 -1
- data/lib/active_record/encryption/cipher/aes256_gcm.rb +98 -0
- data/lib/active_record/encryption/cipher.rb +53 -0
- data/lib/active_record/encryption/config.rb +44 -0
- data/lib/active_record/encryption/configurable.rb +61 -0
- data/lib/active_record/encryption/context.rb +35 -0
- data/lib/active_record/encryption/contexts.rb +72 -0
- data/lib/active_record/encryption/derived_secret_key_provider.rb +12 -0
- data/lib/active_record/encryption/deterministic_key_provider.rb +14 -0
- data/lib/active_record/encryption/encryptable_record.rb +208 -0
- data/lib/active_record/encryption/encrypted_attribute_type.rb +140 -0
- data/lib/active_record/encryption/encrypted_fixtures.rb +38 -0
- data/lib/active_record/encryption/encrypting_only_encryptor.rb +12 -0
- data/lib/active_record/encryption/encryptor.rb +155 -0
- data/lib/active_record/encryption/envelope_encryption_key_provider.rb +55 -0
- data/lib/active_record/encryption/errors.rb +15 -0
- data/lib/active_record/encryption/extended_deterministic_queries.rb +160 -0
- data/lib/active_record/encryption/extended_deterministic_uniqueness_validator.rb +29 -0
- data/lib/active_record/encryption/key.rb +28 -0
- data/lib/active_record/encryption/key_generator.rb +42 -0
- data/lib/active_record/encryption/key_provider.rb +46 -0
- data/lib/active_record/encryption/message.rb +33 -0
- data/lib/active_record/encryption/message_serializer.rb +80 -0
- data/lib/active_record/encryption/null_encryptor.rb +21 -0
- data/lib/active_record/encryption/properties.rb +76 -0
- data/lib/active_record/encryption/read_only_null_encryptor.rb +24 -0
- data/lib/active_record/encryption/scheme.rb +99 -0
- data/lib/active_record/encryption.rb +55 -0
- data/lib/active_record/enum.rb +41 -41
- data/lib/active_record/errors.rb +66 -3
- data/lib/active_record/fixture_set/file.rb +15 -1
- data/lib/active_record/fixture_set/table_row.rb +40 -5
- data/lib/active_record/fixture_set/table_rows.rb +4 -4
- data/lib/active_record/fixtures.rb +16 -11
- data/lib/active_record/future_result.rb +139 -0
- data/lib/active_record/gem_version.rb +4 -4
- data/lib/active_record/inheritance.rb +55 -17
- data/lib/active_record/insert_all.rb +34 -5
- data/lib/active_record/integration.rb +1 -1
- data/lib/active_record/internal_metadata.rb +3 -5
- data/lib/active_record/legacy_yaml_adapter.rb +1 -1
- data/lib/active_record/locking/optimistic.rb +10 -9
- data/lib/active_record/log_subscriber.rb +6 -2
- data/lib/active_record/middleware/database_selector/resolver.rb +6 -10
- data/lib/active_record/middleware/database_selector.rb +8 -3
- data/lib/active_record/migration/command_recorder.rb +4 -4
- data/lib/active_record/migration/compatibility.rb +83 -1
- data/lib/active_record/migration/join_table.rb +1 -1
- data/lib/active_record/migration.rb +109 -79
- data/lib/active_record/model_schema.rb +46 -32
- data/lib/active_record/nested_attributes.rb +3 -3
- data/lib/active_record/no_touching.rb +2 -2
- data/lib/active_record/null_relation.rb +2 -6
- data/lib/active_record/persistence.rb +134 -45
- data/lib/active_record/query_cache.rb +2 -2
- data/lib/active_record/query_logs.rb +203 -0
- data/lib/active_record/querying.rb +15 -5
- data/lib/active_record/railtie.rb +117 -17
- data/lib/active_record/railties/controller_runtime.rb +1 -1
- data/lib/active_record/railties/databases.rake +80 -56
- data/lib/active_record/readonly_attributes.rb +11 -0
- data/lib/active_record/reflection.rb +45 -44
- data/lib/active_record/relation/batches/batch_enumerator.rb +19 -5
- data/lib/active_record/relation/batches.rb +3 -3
- data/lib/active_record/relation/calculations.rb +41 -28
- data/lib/active_record/relation/delegation.rb +6 -6
- data/lib/active_record/relation/finder_methods.rb +32 -23
- data/lib/active_record/relation/merger.rb +20 -13
- data/lib/active_record/relation/predicate_builder.rb +1 -6
- data/lib/active_record/relation/query_attribute.rb +5 -11
- data/lib/active_record/relation/query_methods.rb +232 -49
- data/lib/active_record/relation/record_fetch_warning.rb +2 -2
- data/lib/active_record/relation/spawn_methods.rb +2 -2
- data/lib/active_record/relation/where_clause.rb +10 -6
- data/lib/active_record/relation.rb +166 -77
- data/lib/active_record/result.rb +17 -2
- data/lib/active_record/runtime_registry.rb +2 -4
- data/lib/active_record/sanitization.rb +11 -7
- data/lib/active_record/schema_dumper.rb +3 -3
- data/lib/active_record/schema_migration.rb +0 -4
- data/lib/active_record/scoping/default.rb +61 -12
- data/lib/active_record/scoping/named.rb +3 -11
- data/lib/active_record/scoping.rb +40 -22
- data/lib/active_record/serialization.rb +1 -1
- data/lib/active_record/signed_id.rb +1 -1
- data/lib/active_record/tasks/database_tasks.rb +107 -23
- data/lib/active_record/tasks/mysql_database_tasks.rb +1 -1
- data/lib/active_record/tasks/postgresql_database_tasks.rb +14 -11
- data/lib/active_record/test_databases.rb +1 -1
- data/lib/active_record/test_fixtures.rb +4 -4
- data/lib/active_record/timestamp.rb +3 -4
- data/lib/active_record/transactions.rb +9 -14
- data/lib/active_record/translation.rb +2 -2
- data/lib/active_record/type/adapter_specific_registry.rb +32 -7
- data/lib/active_record/type/hash_lookup_type_map.rb +34 -1
- data/lib/active_record/type/internal/timezone.rb +2 -2
- data/lib/active_record/type/serialized.rb +1 -1
- data/lib/active_record/type/type_map.rb +17 -20
- data/lib/active_record/type.rb +1 -2
- data/lib/active_record/validations/associated.rb +1 -1
- data/lib/active_record.rb +170 -2
- data/lib/arel/attributes/attribute.rb +0 -8
- data/lib/arel/crud.rb +18 -22
- data/lib/arel/delete_manager.rb +2 -4
- data/lib/arel/insert_manager.rb +2 -3
- data/lib/arel/nodes/casted.rb +1 -1
- data/lib/arel/nodes/delete_statement.rb +8 -13
- data/lib/arel/nodes/insert_statement.rb +2 -2
- data/lib/arel/nodes/select_core.rb +2 -2
- data/lib/arel/nodes/select_statement.rb +2 -2
- data/lib/arel/nodes/update_statement.rb +3 -2
- data/lib/arel/predications.rb +1 -1
- data/lib/arel/select_manager.rb +10 -4
- data/lib/arel/table.rb +0 -1
- data/lib/arel/tree_manager.rb +0 -12
- data/lib/arel/update_manager.rb +2 -4
- data/lib/arel/visitors/dot.rb +80 -90
- data/lib/arel/visitors/mysql.rb +6 -1
- data/lib/arel/visitors/postgresql.rb +0 -10
- data/lib/arel/visitors/to_sql.rb +43 -2
- data/lib/arel.rb +1 -1
- data/lib/rails/generators/active_record/application_record/templates/application_record.rb.tt +1 -1
- data/lib/rails/generators/active_record/model/templates/abstract_base_class.rb.tt +1 -1
- data/lib/rails/generators/active_record/model/templates/model.rb.tt +1 -1
- data/lib/rails/generators/active_record/model/templates/module.rb.tt +2 -2
- metadata +55 -16
data/lib/arel/select_manager.rb
CHANGED
@@ -7,10 +7,8 @@ module Arel # :nodoc: all
|
|
7
7
|
STRING_OR_SYMBOL_CLASS = [Symbol, String]
|
8
8
|
|
9
9
|
def initialize(table = nil)
|
10
|
-
|
11
|
-
@ast = Nodes::SelectStatement.new
|
10
|
+
@ast = Nodes::SelectStatement.new(table)
|
12
11
|
@ctx = @ast.cores.last
|
13
|
-
from table
|
14
12
|
end
|
15
13
|
|
16
14
|
def initialize_copy(other)
|
@@ -98,7 +96,7 @@ module Arel # :nodoc: all
|
|
98
96
|
end
|
99
97
|
|
100
98
|
def froms
|
101
|
-
@ast.cores.
|
99
|
+
@ast.cores.filter_map { |x| x.from }
|
102
100
|
end
|
103
101
|
|
104
102
|
def join(relation, klass = Nodes::InnerJoin)
|
@@ -183,6 +181,14 @@ module Arel # :nodoc: all
|
|
183
181
|
@ast.orders
|
184
182
|
end
|
185
183
|
|
184
|
+
def where(expr)
|
185
|
+
if Arel::TreeManager === expr
|
186
|
+
expr = expr.ast
|
187
|
+
end
|
188
|
+
@ctx.wheres << expr
|
189
|
+
self
|
190
|
+
end
|
191
|
+
|
186
192
|
def where_sql(engine = Table.engine)
|
187
193
|
return if @ctx.wheres.empty?
|
188
194
|
|
data/lib/arel/table.rb
CHANGED
data/lib/arel/tree_manager.rb
CHANGED
@@ -40,10 +40,6 @@ module Arel # :nodoc: all
|
|
40
40
|
|
41
41
|
attr_reader :ast
|
42
42
|
|
43
|
-
def initialize
|
44
|
-
@ctx = nil
|
45
|
-
end
|
46
|
-
|
47
43
|
def to_dot
|
48
44
|
collector = Arel::Collectors::PlainString.new
|
49
45
|
collector = Visitors::Dot.new.accept @ast, collector
|
@@ -60,13 +56,5 @@ module Arel # :nodoc: all
|
|
60
56
|
super
|
61
57
|
@ast = @ast.clone
|
62
58
|
end
|
63
|
-
|
64
|
-
def where(expr)
|
65
|
-
if Arel::TreeManager === expr
|
66
|
-
expr = expr.ast
|
67
|
-
end
|
68
|
-
@ctx.wheres << expr
|
69
|
-
self
|
70
|
-
end
|
71
59
|
end
|
72
60
|
end
|
data/lib/arel/update_manager.rb
CHANGED
@@ -4,10 +4,8 @@ module Arel # :nodoc: all
|
|
4
4
|
class UpdateManager < Arel::TreeManager
|
5
5
|
include TreeManager::StatementMethods
|
6
6
|
|
7
|
-
def initialize
|
8
|
-
|
9
|
-
@ast = Nodes::UpdateStatement.new
|
10
|
-
@ctx = @ast
|
7
|
+
def initialize(table = nil)
|
8
|
+
@ast = Nodes::UpdateStatement.new(table)
|
11
9
|
end
|
12
10
|
|
13
11
|
###
|
data/lib/arel/visitors/dot.rb
CHANGED
@@ -31,6 +31,40 @@ module Arel # :nodoc: all
|
|
31
31
|
end
|
32
32
|
|
33
33
|
private
|
34
|
+
def visit_Arel_Nodes_Function(o)
|
35
|
+
visit_edge o, "expressions"
|
36
|
+
visit_edge o, "distinct"
|
37
|
+
visit_edge o, "alias"
|
38
|
+
end
|
39
|
+
|
40
|
+
def visit_Arel_Nodes_Unary(o)
|
41
|
+
visit_edge o, "expr"
|
42
|
+
end
|
43
|
+
|
44
|
+
def visit_Arel_Nodes_Binary(o)
|
45
|
+
visit_edge o, "left"
|
46
|
+
visit_edge o, "right"
|
47
|
+
end
|
48
|
+
|
49
|
+
def visit_Arel_Nodes_UnaryOperation(o)
|
50
|
+
visit_edge o, "operator"
|
51
|
+
visit_edge o, "expr"
|
52
|
+
end
|
53
|
+
|
54
|
+
def visit_Arel_Nodes_InfixOperation(o)
|
55
|
+
visit_edge o, "operator"
|
56
|
+
visit_edge o, "left"
|
57
|
+
visit_edge o, "right"
|
58
|
+
end
|
59
|
+
|
60
|
+
def visit__regexp(o)
|
61
|
+
visit_edge o, "left"
|
62
|
+
visit_edge o, "right"
|
63
|
+
visit_edge o, "case_sensitive"
|
64
|
+
end
|
65
|
+
alias :visit_Arel_Nodes_Regexp :visit__regexp
|
66
|
+
alias :visit_Arel_Nodes_NotRegexp :visit__regexp
|
67
|
+
|
34
68
|
def visit_Arel_Nodes_Ordering(o)
|
35
69
|
visit_edge o, "expr"
|
36
70
|
end
|
@@ -53,71 +87,29 @@ module Arel # :nodoc: all
|
|
53
87
|
visit_edge o, "left"
|
54
88
|
end
|
55
89
|
|
56
|
-
def
|
57
|
-
visit_edge o, "left"
|
58
|
-
visit_edge o, "right"
|
59
|
-
end
|
60
|
-
alias :visit_Arel_Nodes_FullOuterJoin :visit_Arel_Nodes_InnerJoin
|
61
|
-
alias :visit_Arel_Nodes_OuterJoin :visit_Arel_Nodes_InnerJoin
|
62
|
-
alias :visit_Arel_Nodes_RightOuterJoin :visit_Arel_Nodes_InnerJoin
|
63
|
-
|
64
|
-
def visit_Arel_Nodes_DeleteStatement(o)
|
65
|
-
visit_edge o, "relation"
|
66
|
-
visit_edge o, "wheres"
|
67
|
-
end
|
68
|
-
|
69
|
-
def unary(o)
|
70
|
-
visit_edge o, "expr"
|
71
|
-
end
|
72
|
-
alias :visit_Arel_Nodes_Group :unary
|
73
|
-
alias :visit_Arel_Nodes_Cube :unary
|
74
|
-
alias :visit_Arel_Nodes_RollUp :unary
|
75
|
-
alias :visit_Arel_Nodes_GroupingSet :unary
|
76
|
-
alias :visit_Arel_Nodes_GroupingElement :unary
|
77
|
-
alias :visit_Arel_Nodes_Grouping :unary
|
78
|
-
alias :visit_Arel_Nodes_Having :unary
|
79
|
-
alias :visit_Arel_Nodes_Limit :unary
|
80
|
-
alias :visit_Arel_Nodes_Not :unary
|
81
|
-
alias :visit_Arel_Nodes_Offset :unary
|
82
|
-
alias :visit_Arel_Nodes_On :unary
|
83
|
-
alias :visit_Arel_Nodes_UnqualifiedColumn :unary
|
84
|
-
alias :visit_Arel_Nodes_OptimizerHints :unary
|
85
|
-
alias :visit_Arel_Nodes_Preceding :unary
|
86
|
-
alias :visit_Arel_Nodes_Following :unary
|
87
|
-
alias :visit_Arel_Nodes_Rows :unary
|
88
|
-
alias :visit_Arel_Nodes_Range :unary
|
89
|
-
|
90
|
-
def window(o)
|
90
|
+
def visit_Arel_Nodes_Window(o)
|
91
91
|
visit_edge o, "partitions"
|
92
92
|
visit_edge o, "orders"
|
93
93
|
visit_edge o, "framing"
|
94
94
|
end
|
95
|
-
alias :visit_Arel_Nodes_Window :window
|
96
95
|
|
97
|
-
def
|
96
|
+
def visit_Arel_Nodes_NamedWindow(o)
|
98
97
|
visit_edge o, "partitions"
|
99
98
|
visit_edge o, "orders"
|
100
99
|
visit_edge o, "framing"
|
101
100
|
visit_edge o, "name"
|
102
101
|
end
|
103
|
-
alias :visit_Arel_Nodes_NamedWindow :named_window
|
104
102
|
|
105
|
-
def
|
106
|
-
|
107
|
-
visit_edge o, "distinct"
|
108
|
-
visit_edge o, "alias"
|
103
|
+
def visit__no_edges(o)
|
104
|
+
# intentionally left blank
|
109
105
|
end
|
110
|
-
alias :
|
111
|
-
alias :
|
112
|
-
alias :visit_Arel_Nodes_Max :function
|
113
|
-
alias :visit_Arel_Nodes_Avg :function
|
114
|
-
alias :visit_Arel_Nodes_Sum :function
|
106
|
+
alias :visit_Arel_Nodes_CurrentRow :visit__no_edges
|
107
|
+
alias :visit_Arel_Nodes_Distinct :visit__no_edges
|
115
108
|
|
116
|
-
def
|
109
|
+
def visit_Arel_Nodes_Extract(o)
|
117
110
|
visit_edge o, "expressions"
|
118
111
|
visit_edge o, "alias"
|
119
112
|
end
|
120
|
-
alias :visit_Arel_Nodes_Extract :extract
|
121
113
|
|
122
114
|
def visit_Arel_Nodes_NamedFunction(o)
|
123
115
|
visit_edge o, "name"
|
@@ -130,13 +122,19 @@ module Arel # :nodoc: all
|
|
130
122
|
visit_edge o, "relation"
|
131
123
|
visit_edge o, "columns"
|
132
124
|
visit_edge o, "values"
|
125
|
+
visit_edge o, "select"
|
133
126
|
end
|
134
127
|
|
135
128
|
def visit_Arel_Nodes_SelectCore(o)
|
136
129
|
visit_edge o, "source"
|
137
130
|
visit_edge o, "projections"
|
138
131
|
visit_edge o, "wheres"
|
139
|
-
visit_edge o,
|
132
|
+
visit_edge o, "windows"
|
133
|
+
visit_edge o, "groups"
|
134
|
+
visit_edge o, "comment"
|
135
|
+
visit_edge o, "havings"
|
136
|
+
visit_edge o, "set_quantifier"
|
137
|
+
visit_edge o, "optimizer_hints"
|
140
138
|
end
|
141
139
|
|
142
140
|
def visit_Arel_Nodes_SelectStatement(o)
|
@@ -144,12 +142,27 @@ module Arel # :nodoc: all
|
|
144
142
|
visit_edge o, "limit"
|
145
143
|
visit_edge o, "orders"
|
146
144
|
visit_edge o, "offset"
|
145
|
+
visit_edge o, "lock"
|
146
|
+
visit_edge o, "with"
|
147
147
|
end
|
148
148
|
|
149
149
|
def visit_Arel_Nodes_UpdateStatement(o)
|
150
150
|
visit_edge o, "relation"
|
151
151
|
visit_edge o, "wheres"
|
152
152
|
visit_edge o, "values"
|
153
|
+
visit_edge o, "orders"
|
154
|
+
visit_edge o, "limit"
|
155
|
+
visit_edge o, "offset"
|
156
|
+
visit_edge o, "key"
|
157
|
+
end
|
158
|
+
|
159
|
+
def visit_Arel_Nodes_DeleteStatement(o)
|
160
|
+
visit_edge o, "relation"
|
161
|
+
visit_edge o, "wheres"
|
162
|
+
visit_edge o, "orders"
|
163
|
+
visit_edge o, "limit"
|
164
|
+
visit_edge o, "offset"
|
165
|
+
visit_edge o, "key"
|
153
166
|
end
|
154
167
|
|
155
168
|
def visit_Arel_Table(o)
|
@@ -167,47 +180,18 @@ module Arel # :nodoc: all
|
|
167
180
|
visit_edge o, "attribute"
|
168
181
|
end
|
169
182
|
|
170
|
-
def
|
183
|
+
def visit_Arel_Attributes_Attribute(o)
|
171
184
|
visit_edge o, "relation"
|
172
185
|
visit_edge o, "name"
|
173
186
|
end
|
174
|
-
alias :visit_Arel_Attributes_Integer :visit_Arel_Attribute
|
175
|
-
alias :visit_Arel_Attributes_Float :visit_Arel_Attribute
|
176
|
-
alias :visit_Arel_Attributes_String :visit_Arel_Attribute
|
177
|
-
alias :visit_Arel_Attributes_Time :visit_Arel_Attribute
|
178
|
-
alias :visit_Arel_Attributes_Boolean :visit_Arel_Attribute
|
179
|
-
alias :visit_Arel_Attributes_Attribute :visit_Arel_Attribute
|
180
187
|
|
181
|
-
def
|
182
|
-
o.children.each_with_index do |
|
183
|
-
edge(i) { visit
|
188
|
+
def visit__children(o)
|
189
|
+
o.children.each_with_index do |child, i|
|
190
|
+
edge(i) { visit child }
|
184
191
|
end
|
185
192
|
end
|
186
|
-
alias :visit_Arel_Nodes_And :
|
187
|
-
|
188
|
-
def binary(o)
|
189
|
-
visit_edge o, "left"
|
190
|
-
visit_edge o, "right"
|
191
|
-
end
|
192
|
-
alias :visit_Arel_Nodes_As :binary
|
193
|
-
alias :visit_Arel_Nodes_Assignment :binary
|
194
|
-
alias :visit_Arel_Nodes_Between :binary
|
195
|
-
alias :visit_Arel_Nodes_Concat :binary
|
196
|
-
alias :visit_Arel_Nodes_DoesNotMatch :binary
|
197
|
-
alias :visit_Arel_Nodes_Equality :binary
|
198
|
-
alias :visit_Arel_Nodes_GreaterThan :binary
|
199
|
-
alias :visit_Arel_Nodes_GreaterThanOrEqual :binary
|
200
|
-
alias :visit_Arel_Nodes_In :binary
|
201
|
-
alias :visit_Arel_Nodes_JoinSource :binary
|
202
|
-
alias :visit_Arel_Nodes_LessThan :binary
|
203
|
-
alias :visit_Arel_Nodes_LessThanOrEqual :binary
|
204
|
-
alias :visit_Arel_Nodes_IsNotDistinctFrom :binary
|
205
|
-
alias :visit_Arel_Nodes_IsDistinctFrom :binary
|
206
|
-
alias :visit_Arel_Nodes_Matches :binary
|
207
|
-
alias :visit_Arel_Nodes_NotEqual :binary
|
208
|
-
alias :visit_Arel_Nodes_NotIn :binary
|
209
|
-
alias :visit_Arel_Nodes_Or :binary
|
210
|
-
alias :visit_Arel_Nodes_Over :binary
|
193
|
+
alias :visit_Arel_Nodes_And :visit__children
|
194
|
+
alias :visit_Arel_Nodes_With :visit__children
|
211
195
|
|
212
196
|
def visit_String(o)
|
213
197
|
@node_stack.last.fields << o
|
@@ -225,22 +209,22 @@ module Arel # :nodoc: all
|
|
225
209
|
alias :visit_Arel_Nodes_SqlLiteral :visit_String
|
226
210
|
|
227
211
|
def visit_Arel_Nodes_BindParam(o)
|
228
|
-
|
212
|
+
visit_edge(o, "value")
|
229
213
|
end
|
230
214
|
|
231
215
|
def visit_ActiveModel_Attribute(o)
|
232
|
-
|
216
|
+
visit_edge(o, "value_before_type_cast")
|
233
217
|
end
|
234
218
|
|
235
219
|
def visit_Hash(o)
|
236
220
|
o.each_with_index do |pair, i|
|
237
|
-
edge("pair_#{i}")
|
221
|
+
edge("pair_#{i}") { visit pair }
|
238
222
|
end
|
239
223
|
end
|
240
224
|
|
241
225
|
def visit_Array(o)
|
242
|
-
o.each_with_index do |
|
243
|
-
edge(i) { visit
|
226
|
+
o.each_with_index do |member, i|
|
227
|
+
edge(i) { visit member }
|
244
228
|
end
|
245
229
|
end
|
246
230
|
alias :visit_Set :visit_Array
|
@@ -249,6 +233,12 @@ module Arel # :nodoc: all
|
|
249
233
|
visit_edge(o, "values")
|
250
234
|
end
|
251
235
|
|
236
|
+
def visit_Arel_Nodes_Case(o)
|
237
|
+
visit_edge(o, "case")
|
238
|
+
visit_edge(o, "conditions")
|
239
|
+
visit_edge(o, "default")
|
240
|
+
end
|
241
|
+
|
252
242
|
def visit_edge(o, method)
|
253
243
|
edge(method) { visit o.send(method) }
|
254
244
|
end
|
data/lib/arel/visitors/mysql.rb
CHANGED
@@ -58,6 +58,11 @@ module Arel # :nodoc: all
|
|
58
58
|
infix_value o, collector, " NOT REGEXP "
|
59
59
|
end
|
60
60
|
|
61
|
+
# no-op
|
62
|
+
def visit_Arel_Nodes_NullsFirst(o, collector)
|
63
|
+
visit o.expr, collector
|
64
|
+
end
|
65
|
+
|
61
66
|
# In the simple case, MySQL allows us to place JOINs directly into the UPDATE
|
62
67
|
# query. However, this does not allow for LIMIT, OFFSET and ORDER. To support
|
63
68
|
# these, we must use a subquery.
|
@@ -70,7 +75,7 @@ module Arel # :nodoc: all
|
|
70
75
|
end
|
71
76
|
alias :prepare_delete_statement :prepare_update_statement
|
72
77
|
|
73
|
-
# MySQL
|
78
|
+
# MySQL doesn't automatically create a temporary table for use subquery, so we have
|
74
79
|
# to give it some prompting in the form of a subsubquery.
|
75
80
|
def build_subselect(key, o)
|
76
81
|
subselect = super
|
@@ -78,16 +78,6 @@ module Arel # :nodoc: all
|
|
78
78
|
visit o.right, collector
|
79
79
|
end
|
80
80
|
|
81
|
-
def visit_Arel_Nodes_NullsFirst(o, collector)
|
82
|
-
visit o.expr, collector
|
83
|
-
collector << " NULLS FIRST"
|
84
|
-
end
|
85
|
-
|
86
|
-
def visit_Arel_Nodes_NullsLast(o, collector)
|
87
|
-
visit o.expr, collector
|
88
|
-
collector << " NULLS LAST"
|
89
|
-
end
|
90
|
-
|
91
81
|
BIND_BLOCK = proc { |i| "$#{i}" }
|
92
82
|
private_constant :BIND_BLOCK
|
93
83
|
|
data/lib/arel/visitors/to_sql.rb
CHANGED
@@ -103,7 +103,7 @@ module Arel # :nodoc: all
|
|
103
103
|
row.each_with_index do |value, k|
|
104
104
|
collector << ", " unless k == 0
|
105
105
|
case value
|
106
|
-
when Nodes::SqlLiteral, Nodes::BindParam
|
106
|
+
when Nodes::SqlLiteral, Nodes::BindParam, ActiveModel::Attribute
|
107
107
|
collector = visit(value, collector)
|
108
108
|
else
|
109
109
|
collector << quote(value).to_s
|
@@ -135,6 +135,8 @@ module Arel # :nodoc: all
|
|
135
135
|
visit_Arel_Nodes_SelectOptions(o, collector)
|
136
136
|
end
|
137
137
|
|
138
|
+
# The Oracle enhanced adapter uses this private method,
|
139
|
+
# see https://github.com/rsim/oracle-enhanced/issues/2186
|
138
140
|
def visit_Arel_Nodes_SelectOptions(o, collector)
|
139
141
|
collector = maybe_visit o.limit, collector
|
140
142
|
collector = maybe_visit o.offset, collector
|
@@ -357,6 +359,17 @@ module Arel # :nodoc: all
|
|
357
359
|
visit(o.expr, collector) << " DESC"
|
358
360
|
end
|
359
361
|
|
362
|
+
# NullsFirst is available on all but MySQL, where it is redefined.
|
363
|
+
def visit_Arel_Nodes_NullsFirst(o, collector)
|
364
|
+
visit o.expr, collector
|
365
|
+
collector << " NULLS FIRST"
|
366
|
+
end
|
367
|
+
|
368
|
+
def visit_Arel_Nodes_NullsLast(o, collector)
|
369
|
+
visit o.expr, collector
|
370
|
+
collector << " NULLS LAST"
|
371
|
+
end
|
372
|
+
|
360
373
|
def visit_Arel_Nodes_Group(o, collector)
|
361
374
|
visit o.expr, collector
|
362
375
|
end
|
@@ -412,24 +425,48 @@ module Arel # :nodoc: all
|
|
412
425
|
end
|
413
426
|
|
414
427
|
def visit_Arel_Nodes_GreaterThanOrEqual(o, collector)
|
428
|
+
case unboundable?(o.right)
|
429
|
+
when 1
|
430
|
+
return collector << "1=0"
|
431
|
+
when -1
|
432
|
+
return collector << "1=1"
|
433
|
+
end
|
415
434
|
collector = visit o.left, collector
|
416
435
|
collector << " >= "
|
417
436
|
visit o.right, collector
|
418
437
|
end
|
419
438
|
|
420
439
|
def visit_Arel_Nodes_GreaterThan(o, collector)
|
440
|
+
case unboundable?(o.right)
|
441
|
+
when 1
|
442
|
+
return collector << "1=0"
|
443
|
+
when -1
|
444
|
+
return collector << "1=1"
|
445
|
+
end
|
421
446
|
collector = visit o.left, collector
|
422
447
|
collector << " > "
|
423
448
|
visit o.right, collector
|
424
449
|
end
|
425
450
|
|
426
451
|
def visit_Arel_Nodes_LessThanOrEqual(o, collector)
|
452
|
+
case unboundable?(o.right)
|
453
|
+
when 1
|
454
|
+
return collector << "1=1"
|
455
|
+
when -1
|
456
|
+
return collector << "1=0"
|
457
|
+
end
|
427
458
|
collector = visit o.left, collector
|
428
459
|
collector << " <= "
|
429
460
|
visit o.right, collector
|
430
461
|
end
|
431
462
|
|
432
463
|
def visit_Arel_Nodes_LessThan(o, collector)
|
464
|
+
case unboundable?(o.right)
|
465
|
+
when 1
|
466
|
+
return collector << "1=1"
|
467
|
+
when -1
|
468
|
+
return collector << "1=0"
|
469
|
+
end
|
433
470
|
collector = visit o.left, collector
|
434
471
|
collector << " < "
|
435
472
|
visit o.right, collector
|
@@ -585,7 +622,7 @@ module Arel # :nodoc: all
|
|
585
622
|
|
586
623
|
def visit_Arel_Nodes_Assignment(o, collector)
|
587
624
|
case o.right
|
588
|
-
when Arel::Nodes::Node, Arel::Attributes::Attribute
|
625
|
+
when Arel::Nodes::Node, Arel::Attributes::Attribute, ActiveModel::Attribute
|
589
626
|
collector = visit o.left, collector
|
590
627
|
collector << " = "
|
591
628
|
visit o.right, collector
|
@@ -695,6 +732,10 @@ module Arel # :nodoc: all
|
|
695
732
|
|
696
733
|
def bind_block; BIND_BLOCK; end
|
697
734
|
|
735
|
+
def visit_ActiveModel_Attribute(o, collector)
|
736
|
+
collector.add_bind(o, &bind_block)
|
737
|
+
end
|
738
|
+
|
698
739
|
def visit_Arel_Nodes_BindParam(o, collector)
|
699
740
|
collector.add_bind(o.value, &bind_block)
|
700
741
|
end
|