arel 4.0.0 → 4.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/History.txt +15 -3
- data/Manifest.txt +1 -0
- data/README.markdown +71 -34
- data/Rakefile +1 -0
- data/arel.gemspec +16 -15
- data/lib/arel.rb +1 -1
- data/lib/arel/nodes/and.rb +1 -0
- data/lib/arel/nodes/binary.rb +1 -0
- data/lib/arel/nodes/function.rb +1 -0
- data/lib/arel/nodes/insert_statement.rb +1 -0
- data/lib/arel/nodes/node.rb +10 -0
- data/lib/arel/nodes/select_core.rb +1 -0
- data/lib/arel/nodes/select_statement.rb +1 -0
- data/lib/arel/nodes/unary.rb +1 -0
- data/lib/arel/table.rb +4 -1
- data/lib/arel/visitors/bind_visitor.rb +4 -4
- data/lib/arel/visitors/depth_first.rb +56 -56
- data/lib/arel/visitors/dot.rb +75 -75
- data/lib/arel/visitors/ibm_db.rb +2 -2
- data/lib/arel/visitors/informix.rb +17 -17
- data/lib/arel/visitors/join_sql.rb +2 -2
- data/lib/arel/visitors/mssql.rb +12 -12
- data/lib/arel/visitors/mysql.rb +15 -15
- data/lib/arel/visitors/oracle.rb +19 -19
- data/lib/arel/visitors/order_clauses.rb +2 -2
- data/lib/arel/visitors/postgresql.rb +6 -6
- data/lib/arel/visitors/sqlite.rb +2 -2
- data/lib/arel/visitors/to_sql.rb +172 -168
- data/lib/arel/visitors/visitor.rb +8 -5
- data/lib/arel/visitors/where_sql.rb +2 -2
- data/test/test_update_manager.rb +1 -0
- data/test/visitors/test_dispatch_contamination.rb +22 -0
- data/test/visitors/test_oracle.rb +2 -1
- data/test/visitors/test_to_sql.rb +1 -1
- metadata +18 -27
@@ -3,16 +3,16 @@ module Arel
|
|
3
3
|
class PostgreSQL < Arel::Visitors::ToSql
|
4
4
|
private
|
5
5
|
|
6
|
-
def visit_Arel_Nodes_Matches o
|
7
|
-
"#{visit o.left} ILIKE #{visit o.right}"
|
6
|
+
def visit_Arel_Nodes_Matches o, a
|
7
|
+
"#{visit o.left, a} ILIKE #{visit o.right, a}"
|
8
8
|
end
|
9
9
|
|
10
|
-
def visit_Arel_Nodes_DoesNotMatch o
|
11
|
-
"#{visit o.left} NOT ILIKE #{visit o.right}"
|
10
|
+
def visit_Arel_Nodes_DoesNotMatch o, a
|
11
|
+
"#{visit o.left, a} NOT ILIKE #{visit o.right, a}"
|
12
12
|
end
|
13
13
|
|
14
|
-
def visit_Arel_Nodes_DistinctOn o
|
15
|
-
"DISTINCT ON ( #{visit o.expr} )"
|
14
|
+
def visit_Arel_Nodes_DistinctOn o, a
|
15
|
+
"DISTINCT ON ( #{visit o.expr, a} )"
|
16
16
|
end
|
17
17
|
end
|
18
18
|
end
|
data/lib/arel/visitors/sqlite.rb
CHANGED
@@ -4,10 +4,10 @@ module Arel
|
|
4
4
|
private
|
5
5
|
|
6
6
|
# Locks are not supported in SQLite
|
7
|
-
def visit_Arel_Nodes_Lock o
|
7
|
+
def visit_Arel_Nodes_Lock o, a
|
8
8
|
end
|
9
9
|
|
10
|
-
def visit_Arel_Nodes_SelectStatement o
|
10
|
+
def visit_Arel_Nodes_SelectStatement o, a
|
11
11
|
o.limit = Arel::Nodes::Limit.new(-1) if o.offset && !o.limit
|
12
12
|
super
|
13
13
|
end
|
data/lib/arel/visitors/to_sql.rb
CHANGED
@@ -53,23 +53,16 @@ module Arel
|
|
53
53
|
|
54
54
|
DISTINCT = 'DISTINCT' # :nodoc:
|
55
55
|
|
56
|
-
attr_accessor :last_column
|
57
|
-
|
58
56
|
def initialize connection
|
59
57
|
@connection = connection
|
60
58
|
@schema_cache = connection.schema_cache
|
61
59
|
@quoted_tables = {}
|
62
60
|
@quoted_columns = {}
|
63
|
-
@last_column = nil
|
64
|
-
end
|
65
|
-
|
66
|
-
def accept object
|
67
|
-
self.last_column = nil
|
68
|
-
super
|
69
61
|
end
|
70
62
|
|
71
63
|
private
|
72
|
-
|
64
|
+
|
65
|
+
def visit_Arel_Nodes_DeleteStatement o, a
|
73
66
|
[
|
74
67
|
"DELETE FROM #{visit o.relation}",
|
75
68
|
("WHERE #{o.wheres.map { |x| visit x }.join AND}" unless o.wheres.empty?)
|
@@ -88,7 +81,7 @@ module Arel
|
|
88
81
|
stmt
|
89
82
|
end
|
90
83
|
|
91
|
-
def visit_Arel_Nodes_UpdateStatement o
|
84
|
+
def visit_Arel_Nodes_UpdateStatement o, a
|
92
85
|
if o.orders.empty? && o.limit.nil?
|
93
86
|
wheres = o.wheres
|
94
87
|
else
|
@@ -97,7 +90,7 @@ module Arel
|
|
97
90
|
warn(<<-eowarn) if $VERBOSE
|
98
91
|
(#{caller.first}) Using UpdateManager without setting UpdateManager#key is
|
99
92
|
deprecated and support will be removed in Arel 4.0.0. Please set the primary
|
100
|
-
key on UpdateManager using UpdateManager#key=
|
93
|
+
key on UpdateManager using UpdateManager#key= '#{key.inspect}'
|
101
94
|
eowarn
|
102
95
|
key = o.relation.primary_key
|
103
96
|
end
|
@@ -106,34 +99,34 @@ key on UpdateManager using UpdateManager#key=
|
|
106
99
|
end
|
107
100
|
|
108
101
|
[
|
109
|
-
"UPDATE #{visit o.relation}",
|
110
|
-
("SET #{o.values.map { |value| visit value }.join ', '}" unless o.values.empty?),
|
111
|
-
("WHERE #{wheres.map { |x| visit x }.join ' AND '}" unless wheres.empty?),
|
102
|
+
"UPDATE #{visit o.relation, a}",
|
103
|
+
("SET #{o.values.map { |value| visit value, a }.join ', '}" unless o.values.empty?),
|
104
|
+
("WHERE #{wheres.map { |x| visit x, a }.join ' AND '}" unless wheres.empty?),
|
112
105
|
].compact.join ' '
|
113
106
|
end
|
114
107
|
|
115
|
-
def visit_Arel_Nodes_InsertStatement o
|
108
|
+
def visit_Arel_Nodes_InsertStatement o, a
|
116
109
|
[
|
117
|
-
"INSERT INTO #{visit o.relation}",
|
110
|
+
"INSERT INTO #{visit o.relation, a}",
|
118
111
|
|
119
112
|
("(#{o.columns.map { |x|
|
120
113
|
quote_column_name x.name
|
121
114
|
}.join ', '})" unless o.columns.empty?),
|
122
115
|
|
123
|
-
(visit o.values if o.values),
|
116
|
+
(visit o.values, a if o.values),
|
124
117
|
].compact.join ' '
|
125
118
|
end
|
126
119
|
|
127
|
-
def visit_Arel_Nodes_Exists o
|
128
|
-
"EXISTS (#{visit o.expressions})#{
|
129
|
-
o.alias ? " AS #{visit o.alias}" : ''}"
|
120
|
+
def visit_Arel_Nodes_Exists o, a
|
121
|
+
"EXISTS (#{visit o.expressions, a})#{
|
122
|
+
o.alias ? " AS #{visit o.alias, a}" : ''}"
|
130
123
|
end
|
131
124
|
|
132
|
-
def visit_Arel_Nodes_True o
|
125
|
+
def visit_Arel_Nodes_True o, a
|
133
126
|
"TRUE"
|
134
127
|
end
|
135
128
|
|
136
|
-
def visit_Arel_Nodes_False o
|
129
|
+
def visit_Arel_Nodes_False o, a
|
137
130
|
"FALSE"
|
138
131
|
end
|
139
132
|
|
@@ -142,6 +135,7 @@ key on UpdateManager using UpdateManager#key=
|
|
142
135
|
end
|
143
136
|
|
144
137
|
def column_for attr
|
138
|
+
return unless attr
|
145
139
|
name = attr.name.to_s
|
146
140
|
table = attr.relation.table_name
|
147
141
|
|
@@ -154,66 +148,66 @@ key on UpdateManager using UpdateManager#key=
|
|
154
148
|
@schema_cache.columns_hash(table)
|
155
149
|
end
|
156
150
|
|
157
|
-
def visit_Arel_Nodes_Values o
|
151
|
+
def visit_Arel_Nodes_Values o, a
|
158
152
|
"VALUES (#{o.expressions.zip(o.columns).map { |value, attr|
|
159
153
|
if Nodes::SqlLiteral === value
|
160
|
-
visit value
|
154
|
+
visit value, a
|
161
155
|
else
|
162
156
|
quote(value, attr && column_for(attr))
|
163
157
|
end
|
164
158
|
}.join ', '})"
|
165
159
|
end
|
166
160
|
|
167
|
-
def visit_Arel_Nodes_SelectStatement o
|
161
|
+
def visit_Arel_Nodes_SelectStatement o, a
|
168
162
|
str = ''
|
169
163
|
|
170
164
|
if o.with
|
171
|
-
str << visit(o.with)
|
165
|
+
str << visit(o.with, a)
|
172
166
|
str << SPACE
|
173
167
|
end
|
174
168
|
|
175
|
-
o.cores.each { |x| str << visit_Arel_Nodes_SelectCore(x) }
|
169
|
+
o.cores.each { |x| str << visit_Arel_Nodes_SelectCore(x, a) }
|
176
170
|
|
177
171
|
unless o.orders.empty?
|
178
172
|
str << SPACE
|
179
173
|
str << ORDER_BY
|
180
174
|
len = o.orders.length - 1
|
181
175
|
o.orders.each_with_index { |x, i|
|
182
|
-
str << visit(x)
|
176
|
+
str << visit(x, a)
|
183
177
|
str << COMMA unless len == i
|
184
178
|
}
|
185
179
|
end
|
186
180
|
|
187
|
-
str << " #{visit(o.limit)}" if o.limit
|
188
|
-
str << " #{visit(o.offset)}" if o.offset
|
189
|
-
str << " #{visit(o.lock)}" if o.lock
|
181
|
+
str << " #{visit(o.limit, a)}" if o.limit
|
182
|
+
str << " #{visit(o.offset, a)}" if o.offset
|
183
|
+
str << " #{visit(o.lock, a)}" if o.lock
|
190
184
|
|
191
185
|
str.strip!
|
192
186
|
str
|
193
187
|
end
|
194
188
|
|
195
|
-
def visit_Arel_Nodes_SelectCore o
|
189
|
+
def visit_Arel_Nodes_SelectCore o, a
|
196
190
|
str = "SELECT"
|
197
191
|
|
198
|
-
str << " #{visit(o.top)}" if o.top
|
199
|
-
str << " #{visit(o.set_quantifier)}" if o.set_quantifier
|
192
|
+
str << " #{visit(o.top, a)}" if o.top
|
193
|
+
str << " #{visit(o.set_quantifier, a)}" if o.set_quantifier
|
200
194
|
|
201
195
|
unless o.projections.empty?
|
202
196
|
str << SPACE
|
203
197
|
len = o.projections.length - 1
|
204
198
|
o.projections.each_with_index do |x, i|
|
205
|
-
str << visit(x)
|
199
|
+
str << visit(x, a)
|
206
200
|
str << COMMA unless len == i
|
207
201
|
end
|
208
202
|
end
|
209
203
|
|
210
|
-
str << " FROM #{visit(o.source)}" if o.source && !o.source.empty?
|
204
|
+
str << " FROM #{visit(o.source, a)}" if o.source && !o.source.empty?
|
211
205
|
|
212
206
|
unless o.wheres.empty?
|
213
207
|
str << WHERE
|
214
208
|
len = o.wheres.length - 1
|
215
209
|
o.wheres.each_with_index do |x, i|
|
216
|
-
str << visit(x)
|
210
|
+
str << visit(x, a)
|
217
211
|
str << AND unless len == i
|
218
212
|
end
|
219
213
|
end
|
@@ -222,18 +216,18 @@ key on UpdateManager using UpdateManager#key=
|
|
222
216
|
str << GROUP_BY
|
223
217
|
len = o.groups.length - 1
|
224
218
|
o.groups.each_with_index do |x, i|
|
225
|
-
str << visit(x)
|
219
|
+
str << visit(x, a)
|
226
220
|
str << COMMA unless len == i
|
227
221
|
end
|
228
222
|
end
|
229
223
|
|
230
|
-
str << " #{visit(o.having)}" if o.having
|
224
|
+
str << " #{visit(o.having, a)}" if o.having
|
231
225
|
|
232
226
|
unless o.windows.empty?
|
233
227
|
str << WINDOW
|
234
228
|
len = o.windows.length - 1
|
235
229
|
o.windows.each_with_index do |x, i|
|
236
|
-
str << visit(x)
|
230
|
+
str << visit(x, a)
|
237
231
|
str << COMMA unless len == i
|
238
232
|
end
|
239
233
|
end
|
@@ -241,237 +235,244 @@ key on UpdateManager using UpdateManager#key=
|
|
241
235
|
str
|
242
236
|
end
|
243
237
|
|
244
|
-
def visit_Arel_Nodes_Bin o
|
245
|
-
visit o.expr
|
238
|
+
def visit_Arel_Nodes_Bin o, a
|
239
|
+
visit o.expr, a
|
246
240
|
end
|
247
241
|
|
248
|
-
def visit_Arel_Nodes_Distinct o
|
242
|
+
def visit_Arel_Nodes_Distinct o, a
|
249
243
|
DISTINCT
|
250
244
|
end
|
251
245
|
|
252
|
-
def visit_Arel_Nodes_DistinctOn o
|
246
|
+
def visit_Arel_Nodes_DistinctOn o, a
|
253
247
|
raise NotImplementedError, 'DISTINCT ON not implemented for this db'
|
254
248
|
end
|
255
249
|
|
256
|
-
def visit_Arel_Nodes_With o
|
257
|
-
"WITH #{o.children.map { |x| visit x }.join(', ')}"
|
250
|
+
def visit_Arel_Nodes_With o, a
|
251
|
+
"WITH #{o.children.map { |x| visit x, a }.join(', ')}"
|
258
252
|
end
|
259
253
|
|
260
|
-
def visit_Arel_Nodes_WithRecursive o
|
261
|
-
"WITH RECURSIVE #{o.children.map { |x| visit x }.join(', ')}"
|
254
|
+
def visit_Arel_Nodes_WithRecursive o, a
|
255
|
+
"WITH RECURSIVE #{o.children.map { |x| visit x, a }.join(', ')}"
|
262
256
|
end
|
263
257
|
|
264
|
-
def visit_Arel_Nodes_Union o
|
265
|
-
"( #{visit o.left} UNION #{visit o.right} )"
|
258
|
+
def visit_Arel_Nodes_Union o, a
|
259
|
+
"( #{visit o.left, a} UNION #{visit o.right, a} )"
|
266
260
|
end
|
267
261
|
|
268
|
-
def visit_Arel_Nodes_UnionAll o
|
269
|
-
"( #{visit o.left} UNION ALL #{visit o.right} )"
|
262
|
+
def visit_Arel_Nodes_UnionAll o, a
|
263
|
+
"( #{visit o.left, a} UNION ALL #{visit o.right, a} )"
|
270
264
|
end
|
271
265
|
|
272
|
-
def visit_Arel_Nodes_Intersect o
|
273
|
-
"( #{visit o.left} INTERSECT #{visit o.right} )"
|
266
|
+
def visit_Arel_Nodes_Intersect o, a
|
267
|
+
"( #{visit o.left, a} INTERSECT #{visit o.right, a} )"
|
274
268
|
end
|
275
269
|
|
276
|
-
def visit_Arel_Nodes_Except o
|
277
|
-
"( #{visit o.left} EXCEPT #{visit o.right} )"
|
270
|
+
def visit_Arel_Nodes_Except o, a
|
271
|
+
"( #{visit o.left, a} EXCEPT #{visit o.right, a} )"
|
278
272
|
end
|
279
273
|
|
280
|
-
def visit_Arel_Nodes_NamedWindow o
|
281
|
-
"#{quote_column_name o.name} AS #{visit_Arel_Nodes_Window o}"
|
274
|
+
def visit_Arel_Nodes_NamedWindow o, a
|
275
|
+
"#{quote_column_name o.name} AS #{visit_Arel_Nodes_Window o, a}"
|
282
276
|
end
|
283
277
|
|
284
|
-
def visit_Arel_Nodes_Window o
|
278
|
+
def visit_Arel_Nodes_Window o, a
|
285
279
|
s = [
|
286
|
-
("ORDER BY #{o.orders.map { |x| visit(x) }.join(', ')}" unless o.orders.empty?),
|
287
|
-
(visit o.framing if o.framing)
|
280
|
+
("ORDER BY #{o.orders.map { |x| visit(x, a) }.join(', ')}" unless o.orders.empty?),
|
281
|
+
(visit o.framing, a if o.framing)
|
288
282
|
].compact.join ' '
|
289
283
|
"(#{s})"
|
290
284
|
end
|
291
285
|
|
292
|
-
def visit_Arel_Nodes_Rows o
|
286
|
+
def visit_Arel_Nodes_Rows o, a
|
293
287
|
if o.expr
|
294
|
-
"ROWS #{visit o.expr}"
|
288
|
+
"ROWS #{visit o.expr, a}"
|
295
289
|
else
|
296
290
|
"ROWS"
|
297
291
|
end
|
298
292
|
end
|
299
293
|
|
300
|
-
def visit_Arel_Nodes_Range o
|
294
|
+
def visit_Arel_Nodes_Range o, a
|
301
295
|
if o.expr
|
302
|
-
"RANGE #{visit o.expr}"
|
296
|
+
"RANGE #{visit o.expr, a}"
|
303
297
|
else
|
304
298
|
"RANGE"
|
305
299
|
end
|
306
300
|
end
|
307
301
|
|
308
|
-
def visit_Arel_Nodes_Preceding o
|
309
|
-
"#{o.expr ? visit(o.expr) : 'UNBOUNDED'} PRECEDING"
|
302
|
+
def visit_Arel_Nodes_Preceding o, a
|
303
|
+
"#{o.expr ? visit(o.expr, a) : 'UNBOUNDED'} PRECEDING"
|
310
304
|
end
|
311
305
|
|
312
|
-
def visit_Arel_Nodes_Following o
|
313
|
-
"#{o.expr ? visit(o.expr) : 'UNBOUNDED'} FOLLOWING"
|
306
|
+
def visit_Arel_Nodes_Following o, a
|
307
|
+
"#{o.expr ? visit(o.expr, a) : 'UNBOUNDED'} FOLLOWING"
|
314
308
|
end
|
315
309
|
|
316
|
-
def visit_Arel_Nodes_CurrentRow o
|
310
|
+
def visit_Arel_Nodes_CurrentRow o, a
|
317
311
|
"CURRENT ROW"
|
318
312
|
end
|
319
313
|
|
320
|
-
def visit_Arel_Nodes_Over o
|
314
|
+
def visit_Arel_Nodes_Over o, a
|
321
315
|
case o.right
|
322
316
|
when nil
|
323
|
-
"#{visit o.left} OVER ()"
|
317
|
+
"#{visit o.left, a} OVER ()"
|
324
318
|
when Arel::Nodes::SqlLiteral
|
325
|
-
"#{visit o.left} OVER #{visit o.right}"
|
319
|
+
"#{visit o.left, a} OVER #{visit o.right, a}"
|
326
320
|
when String, Symbol
|
327
|
-
"#{visit o.left} OVER #{quote_column_name o.right.to_s}"
|
321
|
+
"#{visit o.left, a} OVER #{quote_column_name o.right.to_s}"
|
328
322
|
else
|
329
|
-
"#{visit o.left} OVER #{visit o.right}"
|
323
|
+
"#{visit o.left, a} OVER #{visit o.right, a}"
|
330
324
|
end
|
331
325
|
end
|
332
326
|
|
333
|
-
def visit_Arel_Nodes_Having o
|
334
|
-
"HAVING #{visit o.expr}"
|
327
|
+
def visit_Arel_Nodes_Having o, a
|
328
|
+
"HAVING #{visit o.expr, a}"
|
335
329
|
end
|
336
330
|
|
337
|
-
def visit_Arel_Nodes_Offset o
|
338
|
-
"OFFSET #{visit o.expr}"
|
331
|
+
def visit_Arel_Nodes_Offset o, a
|
332
|
+
"OFFSET #{visit o.expr, a}"
|
339
333
|
end
|
340
334
|
|
341
|
-
def visit_Arel_Nodes_Limit o
|
342
|
-
"LIMIT #{visit o.expr}"
|
335
|
+
def visit_Arel_Nodes_Limit o, a
|
336
|
+
"LIMIT #{visit o.expr, a}"
|
343
337
|
end
|
344
338
|
|
345
339
|
# FIXME: this does nothing on most databases, but does on MSSQL
|
346
|
-
def visit_Arel_Nodes_Top o
|
340
|
+
def visit_Arel_Nodes_Top o, a
|
347
341
|
""
|
348
342
|
end
|
349
343
|
|
350
|
-
def visit_Arel_Nodes_Lock o
|
351
|
-
visit o.expr
|
344
|
+
def visit_Arel_Nodes_Lock o, a
|
345
|
+
visit o.expr, a
|
352
346
|
end
|
353
347
|
|
354
|
-
def visit_Arel_Nodes_Grouping o
|
355
|
-
"(#{visit o.expr})"
|
348
|
+
def visit_Arel_Nodes_Grouping o, a
|
349
|
+
"(#{visit o.expr, a})"
|
356
350
|
end
|
357
351
|
|
358
|
-
def visit_Arel_SelectManager o
|
352
|
+
def visit_Arel_SelectManager o, a
|
359
353
|
"(#{o.to_sql.rstrip})"
|
360
354
|
end
|
361
355
|
|
362
|
-
def visit_Arel_Nodes_Ascending o
|
363
|
-
"#{visit o.expr} ASC"
|
356
|
+
def visit_Arel_Nodes_Ascending o, a
|
357
|
+
"#{visit o.expr, a} ASC"
|
364
358
|
end
|
365
359
|
|
366
|
-
def visit_Arel_Nodes_Descending o
|
367
|
-
"#{visit o.expr} DESC"
|
360
|
+
def visit_Arel_Nodes_Descending o, a
|
361
|
+
"#{visit o.expr, a} DESC"
|
368
362
|
end
|
369
363
|
|
370
|
-
def visit_Arel_Nodes_Group o
|
371
|
-
visit o.expr
|
364
|
+
def visit_Arel_Nodes_Group o, a
|
365
|
+
visit o.expr, a
|
372
366
|
end
|
373
367
|
|
374
|
-
def visit_Arel_Nodes_NamedFunction o
|
368
|
+
def visit_Arel_Nodes_NamedFunction o, a
|
375
369
|
"#{o.name}(#{o.distinct ? 'DISTINCT ' : ''}#{o.expressions.map { |x|
|
376
|
-
visit x
|
377
|
-
}.join(', ')})#{o.alias ? " AS #{visit o.alias}" : ''}"
|
370
|
+
visit x, a
|
371
|
+
}.join(', ')})#{o.alias ? " AS #{visit o.alias, a}" : ''}"
|
378
372
|
end
|
379
373
|
|
380
|
-
def visit_Arel_Nodes_Extract o
|
381
|
-
"EXTRACT(#{o.field.to_s.upcase} FROM #{visit o.expr})#{o.alias ? " AS #{visit o.alias}" : ''}"
|
374
|
+
def visit_Arel_Nodes_Extract o, a
|
375
|
+
"EXTRACT(#{o.field.to_s.upcase} FROM #{visit o.expr, a})#{o.alias ? " AS #{visit o.alias, a}" : ''}"
|
382
376
|
end
|
383
377
|
|
384
|
-
def visit_Arel_Nodes_Count o
|
378
|
+
def visit_Arel_Nodes_Count o, a
|
385
379
|
"COUNT(#{o.distinct ? 'DISTINCT ' : ''}#{o.expressions.map { |x|
|
386
|
-
visit x
|
387
|
-
}.join(', ')})#{o.alias ? " AS #{visit o.alias}" : ''}"
|
380
|
+
visit x, a
|
381
|
+
}.join(', ')})#{o.alias ? " AS #{visit o.alias, a}" : ''}"
|
388
382
|
end
|
389
383
|
|
390
|
-
def visit_Arel_Nodes_Sum o
|
384
|
+
def visit_Arel_Nodes_Sum o, a
|
391
385
|
"SUM(#{o.distinct ? 'DISTINCT ' : ''}#{o.expressions.map { |x|
|
392
|
-
visit x }.join(', ')})#{o.alias ? " AS #{visit o.alias}" : ''}"
|
386
|
+
visit x, a }.join(', ')})#{o.alias ? " AS #{visit o.alias, a}" : ''}"
|
393
387
|
end
|
394
388
|
|
395
|
-
def visit_Arel_Nodes_Max o
|
389
|
+
def visit_Arel_Nodes_Max o, a
|
396
390
|
"MAX(#{o.distinct ? 'DISTINCT ' : ''}#{o.expressions.map { |x|
|
397
|
-
visit x }.join(', ')})#{o.alias ? " AS #{visit o.alias}" : ''}"
|
391
|
+
visit x, a }.join(', ')})#{o.alias ? " AS #{visit o.alias, a}" : ''}"
|
398
392
|
end
|
399
393
|
|
400
|
-
def visit_Arel_Nodes_Min o
|
394
|
+
def visit_Arel_Nodes_Min o, a
|
401
395
|
"MIN(#{o.distinct ? 'DISTINCT ' : ''}#{o.expressions.map { |x|
|
402
|
-
visit x }.join(', ')})#{o.alias ? " AS #{visit o.alias}" : ''}"
|
396
|
+
visit x, a }.join(', ')})#{o.alias ? " AS #{visit o.alias, a}" : ''}"
|
403
397
|
end
|
404
398
|
|
405
|
-
def visit_Arel_Nodes_Avg o
|
399
|
+
def visit_Arel_Nodes_Avg o, a
|
406
400
|
"AVG(#{o.distinct ? 'DISTINCT ' : ''}#{o.expressions.map { |x|
|
407
|
-
visit x }.join(', ')})#{o.alias ? " AS #{visit o.alias}" : ''}"
|
401
|
+
visit x, a }.join(', ')})#{o.alias ? " AS #{visit o.alias, a}" : ''}"
|
408
402
|
end
|
409
403
|
|
410
|
-
def visit_Arel_Nodes_TableAlias o
|
411
|
-
"#{visit o.relation} #{quote_table_name o.name}"
|
404
|
+
def visit_Arel_Nodes_TableAlias o, a
|
405
|
+
"#{visit o.relation, a} #{quote_table_name o.name}"
|
412
406
|
end
|
413
407
|
|
414
|
-
def visit_Arel_Nodes_Between o
|
415
|
-
|
408
|
+
def visit_Arel_Nodes_Between o, a
|
409
|
+
a = o.left if Arel::Attributes::Attribute === o.left
|
410
|
+
"#{visit o.left, a} BETWEEN #{visit o.right, a}"
|
416
411
|
end
|
417
412
|
|
418
|
-
def visit_Arel_Nodes_GreaterThanOrEqual o
|
419
|
-
|
413
|
+
def visit_Arel_Nodes_GreaterThanOrEqual o, a
|
414
|
+
a = o.left if Arel::Attributes::Attribute === o.left
|
415
|
+
"#{visit o.left, a} >= #{visit o.right, a}"
|
420
416
|
end
|
421
417
|
|
422
|
-
def visit_Arel_Nodes_GreaterThan o
|
423
|
-
|
418
|
+
def visit_Arel_Nodes_GreaterThan o, a
|
419
|
+
a = o.left if Arel::Attributes::Attribute === o.left
|
420
|
+
"#{visit o.left, a} > #{visit o.right, a}"
|
424
421
|
end
|
425
422
|
|
426
|
-
def visit_Arel_Nodes_LessThanOrEqual o
|
427
|
-
|
423
|
+
def visit_Arel_Nodes_LessThanOrEqual o, a
|
424
|
+
a = o.left if Arel::Attributes::Attribute === o.left
|
425
|
+
"#{visit o.left, a} <= #{visit o.right, a}"
|
428
426
|
end
|
429
427
|
|
430
|
-
def visit_Arel_Nodes_LessThan o
|
431
|
-
|
428
|
+
def visit_Arel_Nodes_LessThan o, a
|
429
|
+
a = o.left if Arel::Attributes::Attribute === o.left
|
430
|
+
"#{visit o.left, a} < #{visit o.right, a}"
|
432
431
|
end
|
433
432
|
|
434
|
-
def visit_Arel_Nodes_Matches o
|
435
|
-
|
433
|
+
def visit_Arel_Nodes_Matches o, a
|
434
|
+
a = o.left if Arel::Attributes::Attribute === o.left
|
435
|
+
"#{visit o.left, a} LIKE #{visit o.right, a}"
|
436
436
|
end
|
437
437
|
|
438
|
-
def visit_Arel_Nodes_DoesNotMatch o
|
439
|
-
|
438
|
+
def visit_Arel_Nodes_DoesNotMatch o, a
|
439
|
+
a = o.left if Arel::Attributes::Attribute === o.left
|
440
|
+
"#{visit o.left, a} NOT LIKE #{visit o.right, a}"
|
440
441
|
end
|
441
442
|
|
442
|
-
def visit_Arel_Nodes_JoinSource o
|
443
|
+
def visit_Arel_Nodes_JoinSource o, a
|
443
444
|
[
|
444
|
-
(visit(o.left) if o.left),
|
445
|
-
o.right.map { |j| visit j }.join(' ')
|
445
|
+
(visit(o.left, a) if o.left),
|
446
|
+
o.right.map { |j| visit j, a }.join(' ')
|
446
447
|
].compact.join ' '
|
447
448
|
end
|
448
449
|
|
449
|
-
def visit_Arel_Nodes_StringJoin o
|
450
|
-
visit o.left
|
450
|
+
def visit_Arel_Nodes_StringJoin o, a
|
451
|
+
visit o.left, a
|
451
452
|
end
|
452
453
|
|
453
|
-
def visit_Arel_Nodes_OuterJoin o
|
454
|
-
"LEFT OUTER JOIN #{visit o.left} #{visit o.right}"
|
454
|
+
def visit_Arel_Nodes_OuterJoin o, a
|
455
|
+
"LEFT OUTER JOIN #{visit o.left, a} #{visit o.right, a}"
|
455
456
|
end
|
456
457
|
|
457
|
-
def visit_Arel_Nodes_InnerJoin o
|
458
|
-
s = "INNER JOIN #{visit o.left}"
|
458
|
+
def visit_Arel_Nodes_InnerJoin o, a
|
459
|
+
s = "INNER JOIN #{visit o.left, a}"
|
459
460
|
if o.right
|
460
461
|
s << SPACE
|
461
|
-
s << visit(o.right)
|
462
|
+
s << visit(o.right, a)
|
462
463
|
end
|
463
464
|
s
|
464
465
|
end
|
465
466
|
|
466
|
-
def visit_Arel_Nodes_On o
|
467
|
-
"ON #{visit o.expr}"
|
467
|
+
def visit_Arel_Nodes_On o, a
|
468
|
+
"ON #{visit o.expr, a}"
|
468
469
|
end
|
469
470
|
|
470
|
-
def visit_Arel_Nodes_Not o
|
471
|
-
"NOT (#{visit o.expr})"
|
471
|
+
def visit_Arel_Nodes_Not o, a
|
472
|
+
"NOT (#{visit o.expr, a})"
|
472
473
|
end
|
473
474
|
|
474
|
-
def visit_Arel_Table o
|
475
|
+
def visit_Arel_Table o, a
|
475
476
|
if o.table_alias
|
476
477
|
"#{quote_table_name o.name} #{quote_table_name o.table_alias}"
|
477
478
|
else
|
@@ -479,65 +480,68 @@ key on UpdateManager using UpdateManager#key=
|
|
479
480
|
end
|
480
481
|
end
|
481
482
|
|
482
|
-
def visit_Arel_Nodes_In o
|
483
|
+
def visit_Arel_Nodes_In o, a
|
483
484
|
if Array === o.right && o.right.empty?
|
484
485
|
'1=0'
|
485
486
|
else
|
486
|
-
|
487
|
+
a = o.left if Arel::Attributes::Attribute === o.left
|
488
|
+
"#{visit o.left, a} IN (#{visit o.right, a})"
|
487
489
|
end
|
488
490
|
end
|
489
491
|
|
490
|
-
def visit_Arel_Nodes_NotIn o
|
492
|
+
def visit_Arel_Nodes_NotIn o, a
|
491
493
|
if Array === o.right && o.right.empty?
|
492
494
|
'1=1'
|
493
495
|
else
|
494
|
-
|
496
|
+
a = o.left if Arel::Attributes::Attribute === o.left
|
497
|
+
"#{visit o.left, a} NOT IN (#{visit o.right, a})"
|
495
498
|
end
|
496
499
|
end
|
497
500
|
|
498
|
-
def visit_Arel_Nodes_And o
|
499
|
-
o.children.map { |x| visit x }.join ' AND '
|
501
|
+
def visit_Arel_Nodes_And o, a
|
502
|
+
o.children.map { |x| visit x, a }.join ' AND '
|
500
503
|
end
|
501
504
|
|
502
|
-
def visit_Arel_Nodes_Or o
|
503
|
-
"#{visit o.left} OR #{visit o.right}"
|
505
|
+
def visit_Arel_Nodes_Or o, a
|
506
|
+
"#{visit o.left, a} OR #{visit o.right, a}"
|
504
507
|
end
|
505
508
|
|
506
|
-
def visit_Arel_Nodes_Assignment o
|
509
|
+
def visit_Arel_Nodes_Assignment o, a
|
507
510
|
right = quote(o.right, column_for(o.left))
|
508
|
-
"#{visit o.left} = #{right}"
|
511
|
+
"#{visit o.left, a} = #{right}"
|
509
512
|
end
|
510
513
|
|
511
|
-
def visit_Arel_Nodes_Equality o
|
514
|
+
def visit_Arel_Nodes_Equality o, a
|
512
515
|
right = o.right
|
513
516
|
|
517
|
+
a = o.left if Arel::Attributes::Attribute === o.left
|
514
518
|
if right.nil?
|
515
|
-
"#{visit o.left} IS NULL"
|
519
|
+
"#{visit o.left, a} IS NULL"
|
516
520
|
else
|
517
|
-
"#{visit o.left} = #{visit right}"
|
521
|
+
"#{visit o.left, a} = #{visit right, a}"
|
518
522
|
end
|
519
523
|
end
|
520
524
|
|
521
|
-
def visit_Arel_Nodes_NotEqual o
|
525
|
+
def visit_Arel_Nodes_NotEqual o, a
|
522
526
|
right = o.right
|
523
527
|
|
528
|
+
a = o.left if Arel::Attributes::Attribute === o.left
|
524
529
|
if right.nil?
|
525
|
-
"#{visit o.left} IS NOT NULL"
|
530
|
+
"#{visit o.left, a} IS NOT NULL"
|
526
531
|
else
|
527
|
-
"#{visit o.left} != #{visit right}"
|
532
|
+
"#{visit o.left, a} != #{visit right, a}"
|
528
533
|
end
|
529
534
|
end
|
530
535
|
|
531
|
-
def visit_Arel_Nodes_As o
|
532
|
-
"#{visit o.left} AS #{visit o.right}"
|
536
|
+
def visit_Arel_Nodes_As o, a
|
537
|
+
"#{visit o.left, a} AS #{visit o.right, a}"
|
533
538
|
end
|
534
539
|
|
535
|
-
def visit_Arel_Nodes_UnqualifiedColumn o
|
540
|
+
def visit_Arel_Nodes_UnqualifiedColumn o, a
|
536
541
|
"#{quote_column_name o.name}"
|
537
542
|
end
|
538
543
|
|
539
|
-
def visit_Arel_Attributes_Attribute o
|
540
|
-
self.last_column = column_for o
|
544
|
+
def visit_Arel_Attributes_Attribute o, a
|
541
545
|
join_name = o.relation.table_alias || o.relation.name
|
542
546
|
"#{quote_table_name join_name}.#{quote_column_name o.name}"
|
543
547
|
end
|
@@ -548,7 +552,7 @@ key on UpdateManager using UpdateManager#key=
|
|
548
552
|
alias :visit_Arel_Attributes_Time :visit_Arel_Attributes_Attribute
|
549
553
|
alias :visit_Arel_Attributes_Boolean :visit_Arel_Attributes_Attribute
|
550
554
|
|
551
|
-
def literal o; o end
|
555
|
+
def literal o, a; o end
|
552
556
|
|
553
557
|
alias :visit_Arel_Nodes_BindParam :literal
|
554
558
|
alias :visit_Arel_Nodes_SqlLiteral :literal
|
@@ -556,8 +560,8 @@ key on UpdateManager using UpdateManager#key=
|
|
556
560
|
alias :visit_Bignum :literal
|
557
561
|
alias :visit_Fixnum :literal
|
558
562
|
|
559
|
-
def quoted o
|
560
|
-
quote(o,
|
563
|
+
def quoted o, a
|
564
|
+
quote(o, column_for(a))
|
561
565
|
end
|
562
566
|
|
563
567
|
alias :visit_ActiveSupport_Multibyte_Chars :quoted
|
@@ -575,8 +579,8 @@ key on UpdateManager using UpdateManager#key=
|
|
575
579
|
alias :visit_Time :quoted
|
576
580
|
alias :visit_TrueClass :quoted
|
577
581
|
|
578
|
-
def visit_Arel_Nodes_InfixOperation o
|
579
|
-
"#{visit o.left} #{o.operator} #{visit o.right}"
|
582
|
+
def visit_Arel_Nodes_InfixOperation o, a
|
583
|
+
"#{visit o.left, a} #{o.operator} #{visit o.right, a}"
|
580
584
|
end
|
581
585
|
|
582
586
|
alias :visit_Arel_Nodes_Addition :visit_Arel_Nodes_InfixOperation
|
@@ -584,8 +588,8 @@ key on UpdateManager using UpdateManager#key=
|
|
584
588
|
alias :visit_Arel_Nodes_Multiplication :visit_Arel_Nodes_InfixOperation
|
585
589
|
alias :visit_Arel_Nodes_Division :visit_Arel_Nodes_InfixOperation
|
586
590
|
|
587
|
-
def visit_Array o
|
588
|
-
o.map { |x| visit x }.join(', ')
|
591
|
+
def visit_Array o, a
|
592
|
+
o.map { |x| visit x, a }.join(', ')
|
589
593
|
end
|
590
594
|
|
591
595
|
def quote value, column = nil
|