File tree 2 files changed +28
-3
lines changed
2 files changed +28
-3
lines changed Original file line number Diff line number Diff line change @@ -26,11 +26,22 @@ def visit_Arel_Nodes_SelectStatement o, collector
26
26
FROM ("
27
27
28
28
collector = super ( o , collector )
29
- collector << ") raw_sql_
29
+
30
+ if offset . expr . is_a? Nodes ::BindParam
31
+ offset_bind = nil
32
+ collector << ') raw_sql_ WHERE rownum <= ('
33
+ collector . add_bind ( offset . expr ) { |i | offset_bind = ":a#{ i } " }
34
+ collector << ' + '
35
+ collector . add_bind ( limit ) { |i | ":a#{ i } " }
36
+ collector << ") ) WHERE raw_rnum_ > #{ offset_bind } "
37
+ return collector
38
+ else
39
+ collector << ") raw_sql_
30
40
WHERE rownum <= #{ offset . expr . to_i + limit }
31
41
)
32
42
WHERE "
33
- return visit ( offset , collector )
43
+ return visit ( offset , collector )
44
+ end
34
45
end
35
46
36
47
if o . limit
Original file line number Diff line number Diff line change @@ -124,6 +124,21 @@ def compile node
124
124
}
125
125
end
126
126
127
+ it 'creates a subquery when there is limit and offset with BindParams' do
128
+ stmt = Nodes ::SelectStatement . new
129
+ stmt . limit = Nodes ::Limit . new ( Nodes ::BindParam . new )
130
+ stmt . offset = Nodes ::Offset . new ( Nodes ::BindParam . new )
131
+ sql = compile stmt
132
+ sql . must_be_like %{
133
+ SELECT * FROM (
134
+ SELECT raw_sql_.*, rownum raw_rnum_
135
+ FROM (SELECT ) raw_sql_
136
+ WHERE rownum <= (:a1 + :a2)
137
+ )
138
+ WHERE raw_rnum_ > :a1
139
+ }
140
+ end
141
+
127
142
it 'is idempotent with different subquery' do
128
143
stmt = Nodes ::SelectStatement . new
129
144
stmt . limit = Nodes ::Limit . new ( 10 )
@@ -148,7 +163,6 @@ def compile node
148
163
}
149
164
end
150
165
end
151
-
152
166
end
153
167
154
168
it 'modified except to be minus' do
You can’t perform that action at this time.
0 commit comments