activerecord 6.0.0.beta1 → 6.0.1.rc1
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 +529 -10
- data/README.rdoc +3 -1
- data/lib/active_record.rb +7 -1
- data/lib/active_record/association_relation.rb +15 -6
- data/lib/active_record/associations.rb +4 -3
- data/lib/active_record/associations/association.rb +27 -2
- data/lib/active_record/associations/builder/association.rb +14 -18
- data/lib/active_record/associations/builder/belongs_to.rb +5 -2
- data/lib/active_record/associations/builder/collection_association.rb +5 -15
- data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +1 -1
- data/lib/active_record/associations/builder/has_many.rb +2 -0
- data/lib/active_record/associations/builder/has_one.rb +35 -1
- data/lib/active_record/associations/builder/singular_association.rb +2 -0
- data/lib/active_record/associations/collection_association.rb +5 -6
- data/lib/active_record/associations/collection_proxy.rb +13 -42
- data/lib/active_record/associations/has_many_association.rb +1 -9
- data/lib/active_record/associations/has_many_through_association.rb +4 -11
- data/lib/active_record/associations/join_dependency.rb +14 -9
- data/lib/active_record/associations/join_dependency/join_association.rb +21 -7
- data/lib/active_record/associations/preloader.rb +12 -7
- data/lib/active_record/associations/preloader/association.rb +37 -34
- data/lib/active_record/associations/preloader/through_association.rb +48 -39
- data/lib/active_record/attribute_methods.rb +3 -53
- data/lib/active_record/attribute_methods/before_type_cast.rb +4 -1
- data/lib/active_record/attribute_methods/dirty.rb +47 -14
- data/lib/active_record/attribute_methods/primary_key.rb +7 -15
- data/lib/active_record/attribute_methods/query.rb +2 -3
- data/lib/active_record/attribute_methods/read.rb +3 -9
- data/lib/active_record/attribute_methods/write.rb +6 -12
- data/lib/active_record/attributes.rb +13 -0
- data/lib/active_record/autosave_association.rb +21 -7
- data/lib/active_record/base.rb +0 -1
- data/lib/active_record/callbacks.rb +3 -3
- data/lib/active_record/connection_adapters/abstract/connection_pool.rb +134 -23
- data/lib/active_record/connection_adapters/abstract/database_limits.rb +8 -4
- data/lib/active_record/connection_adapters/abstract/database_statements.rb +105 -70
- data/lib/active_record/connection_adapters/abstract/query_cache.rb +12 -5
- data/lib/active_record/connection_adapters/abstract/quoting.rb +63 -6
- data/lib/active_record/connection_adapters/abstract/schema_creation.rb +5 -2
- data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +51 -40
- data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +1 -1
- data/lib/active_record/connection_adapters/abstract/schema_statements.rb +95 -30
- data/lib/active_record/connection_adapters/abstract/transaction.rb +17 -6
- data/lib/active_record/connection_adapters/abstract_adapter.rb +115 -35
- data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +106 -138
- data/lib/active_record/connection_adapters/column.rb +17 -13
- data/lib/active_record/connection_adapters/connection_specification.rb +2 -2
- data/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb +3 -3
- data/lib/active_record/connection_adapters/mysql/database_statements.rb +48 -8
- data/lib/active_record/connection_adapters/mysql/quoting.rb +44 -7
- data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +40 -32
- data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +14 -6
- data/lib/active_record/connection_adapters/mysql/schema_statements.rb +66 -5
- data/lib/active_record/connection_adapters/mysql/type_metadata.rb +6 -10
- data/lib/active_record/connection_adapters/mysql2_adapter.rb +18 -5
- data/lib/active_record/connection_adapters/postgresql/column.rb +17 -30
- data/lib/active_record/connection_adapters/postgresql/database_statements.rb +8 -2
- data/lib/active_record/connection_adapters/postgresql/oid/money.rb +2 -2
- data/lib/active_record/connection_adapters/postgresql/oid/range.rb +1 -1
- data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +6 -3
- data/lib/active_record/connection_adapters/postgresql/quoting.rb +40 -3
- data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +36 -0
- data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +98 -89
- data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +47 -63
- data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +23 -27
- data/lib/active_record/connection_adapters/postgresql_adapter.rb +95 -24
- data/lib/active_record/connection_adapters/schema_cache.rb +32 -14
- data/lib/active_record/connection_adapters/sql_type_metadata.rb +11 -8
- data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +120 -0
- data/lib/active_record/connection_adapters/sqlite3/quoting.rb +38 -2
- data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +28 -2
- data/lib/active_record/connection_adapters/sqlite3_adapter.rb +73 -118
- data/lib/active_record/connection_handling.rb +40 -17
- data/lib/active_record/core.rb +35 -24
- data/lib/active_record/database_configurations.rb +99 -50
- data/lib/active_record/database_configurations/hash_config.rb +11 -11
- data/lib/active_record/database_configurations/url_config.rb +21 -16
- data/lib/active_record/dynamic_matchers.rb +1 -1
- data/lib/active_record/enum.rb +15 -0
- data/lib/active_record/errors.rb +18 -13
- data/lib/active_record/fixtures.rb +11 -6
- data/lib/active_record/gem_version.rb +2 -2
- data/lib/active_record/inheritance.rb +1 -1
- data/lib/active_record/insert_all.rb +179 -0
- data/lib/active_record/integration.rb +13 -1
- data/lib/active_record/internal_metadata.rb +5 -1
- data/lib/active_record/locking/optimistic.rb +3 -4
- data/lib/active_record/log_subscriber.rb +1 -1
- data/lib/active_record/middleware/database_selector.rb +75 -0
- data/lib/active_record/middleware/database_selector/resolver.rb +88 -0
- data/lib/active_record/middleware/database_selector/resolver/session.rb +45 -0
- data/lib/active_record/migration.rb +62 -44
- data/lib/active_record/migration/command_recorder.rb +28 -14
- data/lib/active_record/migration/compatibility.rb +72 -63
- data/lib/active_record/model_schema.rb +3 -0
- data/lib/active_record/persistence.rb +212 -19
- data/lib/active_record/querying.rb +18 -14
- data/lib/active_record/railtie.rb +9 -1
- data/lib/active_record/railties/collection_cache_association_loading.rb +3 -3
- data/lib/active_record/railties/databases.rake +124 -25
- data/lib/active_record/reflection.rb +18 -32
- data/lib/active_record/relation.rb +185 -35
- data/lib/active_record/relation/calculations.rb +40 -44
- data/lib/active_record/relation/delegation.rb +23 -31
- data/lib/active_record/relation/finder_methods.rb +23 -14
- data/lib/active_record/relation/merger.rb +11 -16
- data/lib/active_record/relation/query_attribute.rb +5 -3
- data/lib/active_record/relation/query_methods.rb +230 -69
- data/lib/active_record/relation/spawn_methods.rb +1 -1
- data/lib/active_record/relation/where_clause.rb +10 -10
- data/lib/active_record/sanitization.rb +33 -4
- data/lib/active_record/schema.rb +1 -1
- data/lib/active_record/schema_dumper.rb +10 -1
- data/lib/active_record/schema_migration.rb +1 -1
- data/lib/active_record/scoping.rb +6 -7
- data/lib/active_record/scoping/default.rb +7 -15
- data/lib/active_record/scoping/named.rb +10 -2
- data/lib/active_record/statement_cache.rb +2 -2
- data/lib/active_record/store.rb +48 -0
- data/lib/active_record/table_metadata.rb +9 -13
- data/lib/active_record/tasks/database_tasks.rb +109 -6
- data/lib/active_record/tasks/mysql_database_tasks.rb +3 -1
- data/lib/active_record/test_databases.rb +1 -16
- data/lib/active_record/test_fixtures.rb +2 -2
- data/lib/active_record/timestamp.rb +35 -19
- data/lib/active_record/touch_later.rb +4 -2
- data/lib/active_record/transactions.rb +56 -46
- data/lib/active_record/type_caster/connection.rb +16 -10
- data/lib/active_record/validations.rb +1 -0
- data/lib/active_record/validations/uniqueness.rb +4 -4
- data/lib/arel.rb +18 -4
- data/lib/arel/insert_manager.rb +3 -3
- data/lib/arel/nodes.rb +2 -1
- data/lib/arel/nodes/and.rb +1 -1
- data/lib/arel/nodes/case.rb +1 -1
- data/lib/arel/nodes/comment.rb +29 -0
- data/lib/arel/nodes/select_core.rb +16 -12
- data/lib/arel/nodes/unary.rb +1 -0
- data/lib/arel/nodes/values_list.rb +2 -17
- data/lib/arel/select_manager.rb +10 -10
- data/lib/arel/visitors/depth_first.rb +7 -2
- data/lib/arel/visitors/dot.rb +7 -2
- data/lib/arel/visitors/ibm_db.rb +13 -0
- data/lib/arel/visitors/informix.rb +6 -0
- data/lib/arel/visitors/mssql.rb +15 -1
- data/lib/arel/visitors/oracle12.rb +4 -5
- data/lib/arel/visitors/postgresql.rb +4 -10
- data/lib/arel/visitors/to_sql.rb +107 -131
- data/lib/arel/visitors/visitor.rb +9 -5
- data/lib/rails/generators/active_record/migration/migration_generator.rb +1 -1
- data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb.tt +1 -1
- data/lib/rails/generators/active_record/migration/templates/migration.rb.tt +4 -2
- data/lib/rails/generators/active_record/model/model_generator.rb +1 -1
- data/lib/rails/generators/active_record/model/templates/model.rb.tt +10 -1
- metadata +19 -12
- data/lib/active_record/collection_cache_key.rb +0 -53
- data/lib/arel/nodes/values.rb +0 -16
data/lib/arel.rb
CHANGED
@@ -24,21 +24,35 @@ require "arel/update_manager"
|
|
24
24
|
require "arel/delete_manager"
|
25
25
|
require "arel/nodes"
|
26
26
|
|
27
|
-
module Arel
|
27
|
+
module Arel
|
28
28
|
VERSION = "10.0.0"
|
29
29
|
|
30
|
+
# Wrap a known-safe SQL string for passing to query methods, e.g.
|
31
|
+
#
|
32
|
+
# Post.order(Arel.sql("length(title)")).last
|
33
|
+
#
|
34
|
+
# Great caution should be taken to avoid SQL injection vulnerabilities.
|
35
|
+
# This method should not be used with unsafe values such as request
|
36
|
+
# parameters or model attributes.
|
30
37
|
def self.sql(raw_sql)
|
31
38
|
Arel::Nodes::SqlLiteral.new raw_sql
|
32
39
|
end
|
33
40
|
|
34
|
-
def self.star
|
41
|
+
def self.star # :nodoc:
|
35
42
|
sql "*"
|
36
43
|
end
|
37
44
|
|
38
|
-
def self.arel_node?(value)
|
45
|
+
def self.arel_node?(value) # :nodoc:
|
39
46
|
value.is_a?(Arel::Node) || value.is_a?(Arel::Attribute) || value.is_a?(Arel::Nodes::SqlLiteral)
|
40
47
|
end
|
41
48
|
|
49
|
+
def self.fetch_attribute(value) # :nodoc:
|
50
|
+
case value
|
51
|
+
when Arel::Nodes::Between, Arel::Nodes::In, Arel::Nodes::NotIn, Arel::Nodes::Equality, Arel::Nodes::NotEqual, Arel::Nodes::LessThan, Arel::Nodes::LessThanOrEqual, Arel::Nodes::GreaterThan, Arel::Nodes::GreaterThanOrEqual
|
52
|
+
yield value.left.is_a?(Arel::Attributes::Attribute) ? value.left : value.right
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
42
56
|
## Convenience Alias
|
43
|
-
Node = Arel::Nodes::Node
|
57
|
+
Node = Arel::Nodes::Node # :nodoc:
|
44
58
|
end
|
data/lib/arel/insert_manager.rb
CHANGED
@@ -33,13 +33,13 @@ module Arel # :nodoc: all
|
|
33
33
|
@ast.columns << column
|
34
34
|
values << value
|
35
35
|
end
|
36
|
-
@ast.values = create_values
|
36
|
+
@ast.values = create_values(values)
|
37
37
|
end
|
38
38
|
self
|
39
39
|
end
|
40
40
|
|
41
|
-
def create_values(values
|
42
|
-
Nodes::
|
41
|
+
def create_values(values)
|
42
|
+
Nodes::ValuesList.new([values])
|
43
43
|
end
|
44
44
|
|
45
45
|
def create_values_list(rows)
|
data/lib/arel/nodes.rb
CHANGED
@@ -45,7 +45,6 @@ require "arel/nodes/and"
|
|
45
45
|
require "arel/nodes/function"
|
46
46
|
require "arel/nodes/count"
|
47
47
|
require "arel/nodes/extract"
|
48
|
-
require "arel/nodes/values"
|
49
48
|
require "arel/nodes/values_list"
|
50
49
|
require "arel/nodes/named_function"
|
51
50
|
|
@@ -62,6 +61,8 @@ require "arel/nodes/outer_join"
|
|
62
61
|
require "arel/nodes/right_outer_join"
|
63
62
|
require "arel/nodes/string_join"
|
64
63
|
|
64
|
+
require "arel/nodes/comment"
|
65
|
+
|
65
66
|
require "arel/nodes/sql_literal"
|
66
67
|
|
67
68
|
require "arel/nodes/casted"
|
data/lib/arel/nodes/and.rb
CHANGED
data/lib/arel/nodes/case.rb
CHANGED
@@ -0,0 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Arel # :nodoc: all
|
4
|
+
module Nodes
|
5
|
+
class Comment < Arel::Nodes::Node
|
6
|
+
attr_reader :values
|
7
|
+
|
8
|
+
def initialize(values)
|
9
|
+
super()
|
10
|
+
@values = values
|
11
|
+
end
|
12
|
+
|
13
|
+
def initialize_copy(other)
|
14
|
+
super
|
15
|
+
@values = @values.clone
|
16
|
+
end
|
17
|
+
|
18
|
+
def hash
|
19
|
+
[@values].hash
|
20
|
+
end
|
21
|
+
|
22
|
+
def eql?(other)
|
23
|
+
self.class == other.class &&
|
24
|
+
self.values == other.values
|
25
|
+
end
|
26
|
+
alias :== :eql?
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -3,20 +3,22 @@
|
|
3
3
|
module Arel # :nodoc: all
|
4
4
|
module Nodes
|
5
5
|
class SelectCore < Arel::Nodes::Node
|
6
|
-
attr_accessor :projections, :wheres, :groups, :windows
|
7
|
-
attr_accessor :havings, :source, :set_quantifier
|
6
|
+
attr_accessor :projections, :wheres, :groups, :windows, :comment
|
7
|
+
attr_accessor :havings, :source, :set_quantifier, :optimizer_hints
|
8
8
|
|
9
9
|
def initialize
|
10
10
|
super()
|
11
|
-
@source
|
11
|
+
@source = JoinSource.new nil
|
12
12
|
|
13
13
|
# https://ronsavage.github.io/SQL/sql-92.bnf.html#set%20quantifier
|
14
|
-
@set_quantifier
|
15
|
-
@
|
16
|
-
@
|
17
|
-
@
|
18
|
-
@
|
19
|
-
@
|
14
|
+
@set_quantifier = nil
|
15
|
+
@optimizer_hints = nil
|
16
|
+
@projections = []
|
17
|
+
@wheres = []
|
18
|
+
@groups = []
|
19
|
+
@havings = []
|
20
|
+
@windows = []
|
21
|
+
@comment = nil
|
20
22
|
end
|
21
23
|
|
22
24
|
def from
|
@@ -42,8 +44,8 @@ module Arel # :nodoc: all
|
|
42
44
|
|
43
45
|
def hash
|
44
46
|
[
|
45
|
-
@source, @set_quantifier, @projections,
|
46
|
-
@wheres, @groups, @havings, @windows
|
47
|
+
@source, @set_quantifier, @projections, @optimizer_hints,
|
48
|
+
@wheres, @groups, @havings, @windows, @comment
|
47
49
|
].hash
|
48
50
|
end
|
49
51
|
|
@@ -51,11 +53,13 @@ module Arel # :nodoc: all
|
|
51
53
|
self.class == other.class &&
|
52
54
|
self.source == other.source &&
|
53
55
|
self.set_quantifier == other.set_quantifier &&
|
56
|
+
self.optimizer_hints == other.optimizer_hints &&
|
54
57
|
self.projections == other.projections &&
|
55
58
|
self.wheres == other.wheres &&
|
56
59
|
self.groups == other.groups &&
|
57
60
|
self.havings == other.havings &&
|
58
|
-
self.windows == other.windows
|
61
|
+
self.windows == other.windows &&
|
62
|
+
self.comment == other.comment
|
59
63
|
end
|
60
64
|
alias :== :eql?
|
61
65
|
end
|
data/lib/arel/nodes/unary.rb
CHANGED
@@ -2,23 +2,8 @@
|
|
2
2
|
|
3
3
|
module Arel # :nodoc: all
|
4
4
|
module Nodes
|
5
|
-
class ValuesList <
|
6
|
-
|
7
|
-
|
8
|
-
def initialize(rows)
|
9
|
-
@rows = rows
|
10
|
-
super()
|
11
|
-
end
|
12
|
-
|
13
|
-
def hash
|
14
|
-
@rows.hash
|
15
|
-
end
|
16
|
-
|
17
|
-
def eql?(other)
|
18
|
-
self.class == other.class &&
|
19
|
-
self.rows == other.rows
|
20
|
-
end
|
21
|
-
alias :== :eql?
|
5
|
+
class ValuesList < Unary
|
6
|
+
alias :rows :expr
|
22
7
|
end
|
23
8
|
end
|
24
9
|
end
|
data/lib/arel/select_manager.rb
CHANGED
@@ -146,6 +146,13 @@ module Arel # :nodoc: all
|
|
146
146
|
@ctx.projections = projections
|
147
147
|
end
|
148
148
|
|
149
|
+
def optimizer_hints(*hints)
|
150
|
+
unless hints.empty?
|
151
|
+
@ctx.optimizer_hints = Arel::Nodes::OptimizerHints.new(hints)
|
152
|
+
end
|
153
|
+
self
|
154
|
+
end
|
155
|
+
|
149
156
|
def distinct(value = true)
|
150
157
|
if value
|
151
158
|
@ctx.set_quantifier = Arel::Nodes::Distinct.new
|
@@ -237,16 +244,9 @@ module Arel # :nodoc: all
|
|
237
244
|
@ctx.source
|
238
245
|
end
|
239
246
|
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
end
|
244
|
-
|
245
|
-
def method_missing(name, *args)
|
246
|
-
name = name.to_s
|
247
|
-
return data[name] if data.key?(name)
|
248
|
-
super
|
249
|
-
end
|
247
|
+
def comment(*values)
|
248
|
+
@ctx.comment = Nodes::Comment.new(values)
|
249
|
+
self
|
250
250
|
end
|
251
251
|
|
252
252
|
private
|
@@ -10,7 +10,7 @@ module Arel # :nodoc: all
|
|
10
10
|
|
11
11
|
private
|
12
12
|
|
13
|
-
def visit(o)
|
13
|
+
def visit(o, _ = nil)
|
14
14
|
super
|
15
15
|
@block.call o
|
16
16
|
end
|
@@ -35,6 +35,8 @@ module Arel # :nodoc: all
|
|
35
35
|
alias :visit_Arel_Nodes_Ascending :unary
|
36
36
|
alias :visit_Arel_Nodes_Descending :unary
|
37
37
|
alias :visit_Arel_Nodes_UnqualifiedColumn :unary
|
38
|
+
alias :visit_Arel_Nodes_OptimizerHints :unary
|
39
|
+
alias :visit_Arel_Nodes_ValuesList :unary
|
38
40
|
|
39
41
|
def function(o)
|
40
42
|
visit o.expressions
|
@@ -102,7 +104,6 @@ module Arel # :nodoc: all
|
|
102
104
|
alias :visit_Arel_Nodes_Regexp :binary
|
103
105
|
alias :visit_Arel_Nodes_RightOuterJoin :binary
|
104
106
|
alias :visit_Arel_Nodes_TableAlias :binary
|
105
|
-
alias :visit_Arel_Nodes_Values :binary
|
106
107
|
alias :visit_Arel_Nodes_When :binary
|
107
108
|
|
108
109
|
def visit_Arel_Nodes_StringJoin(o)
|
@@ -180,6 +181,10 @@ module Arel # :nodoc: all
|
|
180
181
|
visit o.limit
|
181
182
|
end
|
182
183
|
|
184
|
+
def visit_Arel_Nodes_Comment(o)
|
185
|
+
visit o.values
|
186
|
+
end
|
187
|
+
|
183
188
|
def visit_Array(o)
|
184
189
|
o.each { |i| visit i }
|
185
190
|
end
|
data/lib/arel/visitors/dot.rb
CHANGED
@@ -46,8 +46,8 @@ module Arel # :nodoc: all
|
|
46
46
|
visit_edge o, "distinct"
|
47
47
|
end
|
48
48
|
|
49
|
-
def
|
50
|
-
visit_edge o, "
|
49
|
+
def visit_Arel_Nodes_ValuesList(o)
|
50
|
+
visit_edge o, "rows"
|
51
51
|
end
|
52
52
|
|
53
53
|
def visit_Arel_Nodes_StringJoin(o)
|
@@ -82,6 +82,7 @@ module Arel # :nodoc: all
|
|
82
82
|
alias :visit_Arel_Nodes_Offset :unary
|
83
83
|
alias :visit_Arel_Nodes_On :unary
|
84
84
|
alias :visit_Arel_Nodes_UnqualifiedColumn :unary
|
85
|
+
alias :visit_Arel_Nodes_OptimizerHints :unary
|
85
86
|
alias :visit_Arel_Nodes_Preceding :unary
|
86
87
|
alias :visit_Arel_Nodes_Following :unary
|
87
88
|
alias :visit_Arel_Nodes_Rows :unary
|
@@ -233,6 +234,10 @@ module Arel # :nodoc: all
|
|
233
234
|
end
|
234
235
|
alias :visit_Set :visit_Array
|
235
236
|
|
237
|
+
def visit_Arel_Nodes_Comment(o)
|
238
|
+
visit_edge(o, "values")
|
239
|
+
end
|
240
|
+
|
236
241
|
def visit_edge(o, method)
|
237
242
|
edge(method) { visit o.send(method) }
|
238
243
|
end
|
data/lib/arel/visitors/ibm_db.rb
CHANGED
@@ -4,6 +4,15 @@ module Arel # :nodoc: all
|
|
4
4
|
module Visitors
|
5
5
|
class IBM_DB < Arel::Visitors::ToSql
|
6
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
|
7
16
|
|
8
17
|
def visit_Arel_Nodes_Limit(o, collector)
|
9
18
|
collector << "FETCH FIRST "
|
@@ -16,6 +25,10 @@ module Arel # :nodoc: all
|
|
16
25
|
collector = visit [o.left, o.right, 0, 1], collector
|
17
26
|
collector << ")"
|
18
27
|
end
|
28
|
+
|
29
|
+
def collect_optimizer_hints(o, collector)
|
30
|
+
collector
|
31
|
+
end
|
19
32
|
end
|
20
33
|
end
|
21
34
|
end
|
@@ -42,10 +42,16 @@ module Arel # :nodoc: all
|
|
42
42
|
collector
|
43
43
|
end
|
44
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
|
+
|
45
50
|
def visit_Arel_Nodes_Offset(o, collector)
|
46
51
|
collector << "SKIP "
|
47
52
|
visit o.expr, collector
|
48
53
|
end
|
54
|
+
|
49
55
|
def visit_Arel_Nodes_Limit(o, collector)
|
50
56
|
collector << "FIRST "
|
51
57
|
visit o.expr, collector
|
data/lib/arel/visitors/mssql.rb
CHANGED
@@ -76,6 +76,16 @@ module Arel # :nodoc: all
|
|
76
76
|
end
|
77
77
|
end
|
78
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
|
+
|
79
89
|
def get_offset_limit_clause(o)
|
80
90
|
first_row = o.offset ? o.offset.expr.to_i + 1 : 1
|
81
91
|
last_row = o.limit ? o.limit.expr.to_i - 1 + first_row : nil
|
@@ -97,12 +107,16 @@ module Arel # :nodoc: all
|
|
97
107
|
collector = visit o.relation, collector
|
98
108
|
if o.wheres.any?
|
99
109
|
collector << " WHERE "
|
100
|
-
inject_join o.wheres, collector, AND
|
110
|
+
inject_join o.wheres, collector, " AND "
|
101
111
|
else
|
102
112
|
collector
|
103
113
|
end
|
104
114
|
end
|
105
115
|
|
116
|
+
def collect_optimizer_hints(o, collector)
|
117
|
+
collector
|
118
|
+
end
|
119
|
+
|
106
120
|
def determine_order_by(orders, x)
|
107
121
|
if orders.any?
|
108
122
|
orders
|
@@ -8,11 +8,10 @@ module Arel # :nodoc: all
|
|
8
8
|
def visit_Arel_Nodes_SelectStatement(o, collector)
|
9
9
|
# Oracle does not allow LIMIT clause with select for update
|
10
10
|
if o.limit && o.lock
|
11
|
-
raise ArgumentError,
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
MSG
|
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
|
16
15
|
end
|
17
16
|
super
|
18
17
|
end
|
@@ -3,11 +3,6 @@
|
|
3
3
|
module Arel # :nodoc: all
|
4
4
|
module Visitors
|
5
5
|
class PostgreSQL < Arel::Visitors::ToSql
|
6
|
-
CUBE = "CUBE"
|
7
|
-
ROLLUP = "ROLLUP"
|
8
|
-
GROUPING_SETS = "GROUPING SETS"
|
9
|
-
LATERAL = "LATERAL"
|
10
|
-
|
11
6
|
private
|
12
7
|
|
13
8
|
def visit_Arel_Nodes_Matches(o, collector)
|
@@ -57,23 +52,22 @@ module Arel # :nodoc: all
|
|
57
52
|
end
|
58
53
|
|
59
54
|
def visit_Arel_Nodes_Cube(o, collector)
|
60
|
-
collector << CUBE
|
55
|
+
collector << "CUBE"
|
61
56
|
grouping_array_or_grouping_element o, collector
|
62
57
|
end
|
63
58
|
|
64
59
|
def visit_Arel_Nodes_RollUp(o, collector)
|
65
|
-
collector << ROLLUP
|
60
|
+
collector << "ROLLUP"
|
66
61
|
grouping_array_or_grouping_element o, collector
|
67
62
|
end
|
68
63
|
|
69
64
|
def visit_Arel_Nodes_GroupingSet(o, collector)
|
70
|
-
collector <<
|
65
|
+
collector << "GROUPING SETS"
|
71
66
|
grouping_array_or_grouping_element o, collector
|
72
67
|
end
|
73
68
|
|
74
69
|
def visit_Arel_Nodes_Lateral(o, collector)
|
75
|
-
collector << LATERAL
|
76
|
-
collector << SPACE
|
70
|
+
collector << "LATERAL "
|
77
71
|
grouping_parentheses o, collector
|
78
72
|
end
|
79
73
|
|