arel_extensions 1.2.25 → 2.0.0.rc3

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.
Files changed (108) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +4 -7
  3. data/.travis.yml +91 -61
  4. data/Gemfile +20 -15
  5. data/README.md +12 -17
  6. data/Rakefile +29 -40
  7. data/appveyor.yml +1 -1
  8. data/arel_extensions.gemspec +3 -3
  9. data/functions.html +3 -3
  10. data/gemfiles/rails3.gemfile +9 -9
  11. data/gemfiles/rails4.gemfile +13 -13
  12. data/gemfiles/rails5_0.gemfile +13 -13
  13. data/gemfiles/rails5_1_4.gemfile +13 -13
  14. data/gemfiles/rails5_2.gemfile +13 -13
  15. data/init/mssql.sql +4 -4
  16. data/init/mysql.sql +38 -38
  17. data/init/postgresql.sql +21 -21
  18. data/lib/arel_extensions/attributes.rb +1 -0
  19. data/lib/arel_extensions/boolean_functions.rb +14 -55
  20. data/lib/arel_extensions/common_sql_functions.rb +8 -7
  21. data/lib/arel_extensions/comparators.rb +15 -14
  22. data/lib/arel_extensions/date_duration.rb +5 -4
  23. data/lib/arel_extensions/insert_manager.rb +16 -17
  24. data/lib/arel_extensions/math.rb +12 -11
  25. data/lib/arel_extensions/math_functions.rb +22 -29
  26. data/lib/arel_extensions/nodes/abs.rb +1 -0
  27. data/lib/arel_extensions/nodes/blank.rb +1 -0
  28. data/lib/arel_extensions/nodes/case.rb +8 -11
  29. data/lib/arel_extensions/nodes/cast.rb +2 -4
  30. data/lib/arel_extensions/nodes/ceil.rb +1 -1
  31. data/lib/arel_extensions/nodes/change_case.rb +0 -0
  32. data/lib/arel_extensions/nodes/coalesce.rb +3 -2
  33. data/lib/arel_extensions/nodes/collate.rb +2 -1
  34. data/lib/arel_extensions/nodes/concat.rb +16 -7
  35. data/lib/arel_extensions/nodes/date_diff.rb +13 -10
  36. data/lib/arel_extensions/nodes/duration.rb +3 -0
  37. data/lib/arel_extensions/nodes/find_in_set.rb +1 -0
  38. data/lib/arel_extensions/nodes/floor.rb +1 -1
  39. data/lib/arel_extensions/nodes/format.rb +8 -34
  40. data/lib/arel_extensions/nodes/formatted_number.rb +23 -22
  41. data/lib/arel_extensions/nodes/function.rb +16 -25
  42. data/lib/arel_extensions/nodes/json.rb +36 -43
  43. data/lib/arel_extensions/nodes/length.rb +0 -5
  44. data/lib/arel_extensions/nodes/levenshtein_distance.rb +0 -0
  45. data/lib/arel_extensions/nodes/locate.rb +1 -0
  46. data/lib/arel_extensions/nodes/log10.rb +2 -1
  47. data/lib/arel_extensions/nodes/matches.rb +6 -4
  48. data/lib/arel_extensions/nodes/md5.rb +1 -0
  49. data/lib/arel_extensions/nodes/power.rb +5 -5
  50. data/lib/arel_extensions/nodes/rand.rb +1 -0
  51. data/lib/arel_extensions/nodes/repeat.rb +4 -2
  52. data/lib/arel_extensions/nodes/replace.rb +6 -22
  53. data/lib/arel_extensions/nodes/round.rb +6 -5
  54. data/lib/arel_extensions/nodes/soundex.rb +15 -15
  55. data/lib/arel_extensions/nodes/std.rb +21 -18
  56. data/lib/arel_extensions/nodes/substring.rb +16 -8
  57. data/lib/arel_extensions/nodes/then.rb +0 -0
  58. data/lib/arel_extensions/nodes/trim.rb +5 -3
  59. data/lib/arel_extensions/nodes/union.rb +5 -2
  60. data/lib/arel_extensions/nodes/union_all.rb +3 -0
  61. data/lib/arel_extensions/nodes/wday.rb +4 -0
  62. data/lib/arel_extensions/nodes.rb +1 -1
  63. data/lib/arel_extensions/null_functions.rb +7 -5
  64. data/lib/arel_extensions/predications.rb +34 -35
  65. data/lib/arel_extensions/railtie.rb +5 -5
  66. data/lib/arel_extensions/set_functions.rb +4 -2
  67. data/lib/arel_extensions/string_functions.rb +23 -52
  68. data/lib/arel_extensions/tasks.rb +5 -5
  69. data/lib/arel_extensions/version.rb +1 -1
  70. data/lib/arel_extensions/visitors/ibm_db.rb +12 -5
  71. data/lib/arel_extensions/visitors/mssql.rb +58 -64
  72. data/lib/arel_extensions/visitors/mysql.rb +98 -149
  73. data/lib/arel_extensions/visitors/oracle.rb +70 -73
  74. data/lib/arel_extensions/visitors/oracle12.rb +15 -2
  75. data/lib/arel_extensions/visitors/postgresql.rb +63 -116
  76. data/lib/arel_extensions/visitors/sqlite.rb +70 -83
  77. data/lib/arel_extensions/visitors/to_sql.rb +110 -142
  78. data/lib/arel_extensions/visitors.rb +60 -68
  79. data/lib/arel_extensions.rb +19 -81
  80. data/test/database.yml +0 -2
  81. data/test/helper.rb +18 -0
  82. data/test/real_db_test.rb +43 -28
  83. data/test/support/fake_record.rb +2 -2
  84. data/test/test_comparators.rb +12 -9
  85. data/test/visitors/test_bulk_insert_oracle.rb +8 -8
  86. data/test/visitors/test_bulk_insert_sqlite.rb +10 -9
  87. data/test/visitors/test_bulk_insert_to_sql.rb +10 -8
  88. data/test/visitors/test_oracle.rb +42 -42
  89. data/test/visitors/test_to_sql.rb +196 -361
  90. data/test/with_ar/all_agnostic_test.rb +160 -195
  91. data/test/with_ar/insert_agnostic_test.rb +4 -3
  92. data/test/with_ar/test_bulk_sqlite.rb +9 -6
  93. data/test/with_ar/test_math_sqlite.rb +12 -8
  94. data/test/with_ar/test_string_mysql.rb +11 -5
  95. data/test/with_ar/test_string_sqlite.rb +12 -4
  96. metadata +11 -22
  97. data/.github/workflows/ruby.yml +0 -102
  98. data/gemfiles/rails6.gemfile +0 -30
  99. data/gemfiles/rails6_1.gemfile +0 -30
  100. data/gemspecs/arel_extensions-v1.gemspec +0 -28
  101. data/gemspecs/arel_extensions-v2.gemspec +0 -28
  102. data/generate_gems.sh +0 -15
  103. data/lib/arel_extensions/nodes/aggregate_function.rb +0 -13
  104. data/lib/arel_extensions/nodes/sum.rb +0 -7
  105. data/lib/arel_extensions/visitors/convert_format.rb +0 -37
  106. data/test/arelx_test_helper.rb +0 -26
  107. data/version_v1.rb +0 -3
  108. data/version_v2.rb +0 -3
@@ -1,21 +1,22 @@
1
- # require 'oracle_visitor'
1
+ #require 'oracle_visitor'
2
2
  module ArelExtensions
3
3
  module Visitors
4
- class Arel::Visitors::Oracle
4
+ Arel::Visitors::Oracle.class_eval do
5
+
5
6
  SPECIAL_CHARS = {"\t" => 'CHR(9)', "\n" => 'CHR(10)', "\r" => 'CHR(13)'}
6
- DATE_MAPPING = {'d' => 'DAY', 'm' => 'MONTH', 'w' => 'IW', 'y' => 'YEAR', 'wd' => 'D', 'h' => 'HOUR', 'mn' => 'MINUTE', 's' => 'SECOND'}
7
- DATE_FORMAT_DIRECTIVES = {
8
- '%Y' => 'YYYY', '%C' => 'CC', '%y' => 'YY', '%m' => 'MM', '%B' => 'Month', '%^B' => 'MONTH', '%b' => 'Mon', '%^b' => 'MON',
7
+ Arel::Visitors::Oracle::DATE_MAPPING = {'d' => 'DAY', 'm' => 'MONTH', 'w' => 'IW', 'y' => 'YEAR', 'wd' => 'D', 'h' => 'HOUR', 'mn' => 'MINUTE', 's' => 'SECOND'}
8
+ Arel::Visitors::Oracle::DATE_FORMAT_DIRECTIVES = {
9
+ '%Y' => 'IYYY', '%C' => 'CC', '%y' => 'YY', '%m' => 'MM', '%B' => 'Month', '%^B' => 'MONTH', '%b' => 'Mon', '%^b' => 'MON',
9
10
  '%d' => 'DD', '%e' => 'FMDD', '%j' => 'DDD', '%w' => '', '%A' => 'Day', # day, weekday
10
11
  '%H' => 'HH24', '%k' => '', '%I' => 'HH', '%l' => '', '%P' => 'am', '%p' => 'AM', # hours
11
12
  '%M' => 'MI', '%S' => 'SS', '%L' => 'MS', '%N' => 'US', '%z' => 'tz' # seconds, subseconds
12
13
  }
13
- NUMBER_COMMA_MAPPING = { 'en_US' => '.,', 'fr_FR' => ',', 'sv_SE' => ', ' }
14
+ Arel::Visitors::Oracle::NUMBER_COMMA_MAPPING = { 'en_US' => '.,', 'fr_FR' => ',', 'sv_SE' => ', ' }
14
15
 
15
16
  def visit_ArelExtensions_Nodes_Log10 o, collector
16
17
  collector << "LOG("
17
18
  o.expressions.each_with_index { |arg, i|
18
- collector << Arel::Visitors::ToSql::COMMA if i != 0
19
+ collector << Arel::Visitors::ToSql::COMMA unless i == 0
19
20
  collector = visit arg, collector
20
21
  }
21
22
  collector << ",10)"
@@ -25,7 +26,7 @@ module ArelExtensions
25
26
  def visit_ArelExtensions_Nodes_Power o, collector
26
27
  collector << "POWER("
27
28
  o.expressions.each_with_index { |arg, i|
28
- collector << Arel::Visitors::ToSql::COMMA if i != 0
29
+ collector << Arel::Visitors::ToSql::COMMA unless i == 0
29
30
  collector = visit arg, collector
30
31
  }
31
32
  collector << ")"
@@ -92,6 +93,7 @@ module ArelExtensions
92
93
  end
93
94
  end
94
95
 
96
+
95
97
  def visit_ArelExtensions_Nodes_IDoesNotMatch o, collector
96
98
  collector << 'LOWER('
97
99
  collector = visit o.left, collector
@@ -110,35 +112,34 @@ module ArelExtensions
110
112
  if o.ai
111
113
  collector << "NLSSORT("
112
114
  collector = visit o.expressions.first, collector
113
- collector << COMMA
115
+ collector << Arel::Visitors::Oracle::COMMA
114
116
  collector << "'NLS_SORT = BINARY_AI NLS_COMP = LINGUISTIC'"
115
117
  collector << ")"
116
118
  elsif o.ci
117
119
  collector << "NLSSORT("
118
120
  collector = visit o.expressions.first, collector
119
- collector << COMMA
121
+ collector << Arel::Visitors::Oracle::COMMA
120
122
  collector << "'NLS_SORT = BINARY_CI NLS_COMP = LINGUISTIC'"
121
123
  collector << ")"
122
124
  else
123
125
  collector = visit o.expressions.first, collector
124
126
  end
125
- collector
127
+ collector
126
128
  end
127
129
 
128
130
  def visit_ArelExtensions_Nodes_GroupConcat o, collector
129
131
  collector << "(LISTAGG("
130
132
  collector = visit o.left, collector
131
- collector << COMMA
132
- collector =
133
- if o.separator && o.separator != 'NULL'
134
- visit o.separator, collector
135
- else
136
- visit Arel::Nodes.build_quoted(','), collector
137
- end
133
+ collector << Arel::Visitors::Oracle::COMMA
134
+ if o.right && o.right != 'NULL'
135
+ collector = visit o.right, collector
136
+ else
137
+ collector = visit Arel::Nodes.build_quoted(','), collector
138
+ end
138
139
  collector << ") WITHIN GROUP (ORDER BY "
139
- if !o.order.blank?
140
- o.order.each_with_index do |order,i|
141
- collector << COMMA if i != 0
140
+ if !o.orders.blank?
141
+ o.orders.each_with_index do |order,i|
142
+ collector << Arel::Visitors::Oracle::COMMA unless i == 0
142
143
  collector = visit order, collector
143
144
  end
144
145
  else
@@ -151,9 +152,9 @@ module ArelExtensions
151
152
  def visit_ArelExtensions_Nodes_Coalesce o, collector
152
153
  collector << "COALESCE("
153
154
  o.expressions.each_with_index { |arg, i|
154
- collector << COMMA if i != 0
155
+ collector << Arel::Visitors::Oracle::COMMA unless i == 0
155
156
  if i > 0 && o.left_node_type == :text
156
- if arg == '' || (arg.is_a?(Arel::Nodes::Quoted) && (arg.expr == ''))
157
+ if arg == '' || (arg.is_a?(Arel::Nodes::Quoted) && (arg.expr == ''))
157
158
  collector << "NULL"
158
159
  else
159
160
  collector << 'TO_CLOB('
@@ -194,7 +195,7 @@ module ArelExtensions
194
195
  collector << 'TO_DATE(' if lc
195
196
  collector = visit o.left, collector
196
197
  collector << ')' if lc
197
- collector << COMMA
198
+ collector << Arel::Visitors::Oracle::COMMA
198
199
  collector << "'DDD') = "
199
200
  collector << 'TO_DATE(' if lc
200
201
  collector = visit o.left, collector
@@ -220,8 +221,8 @@ module ArelExtensions
220
221
  when 'wd', 'w'
221
222
  collector << "TO_CHAR("
222
223
  collector = visit o.right, collector
223
- collector << COMMA
224
- collector = visit Arel::Nodes.build_quoted(DATE_MAPPING[o.left]), collector
224
+ collector << Arel::Visitors::Oracle::COMMA
225
+ collector = visit Arel::Nodes.build_quoted(Arel::Visitors::Oracle::DATE_MAPPING[o.left]), collector
225
226
  else
226
227
  right = case o.left
227
228
  when 'd','m','y'
@@ -231,7 +232,7 @@ module ArelExtensions
231
232
  interval = 'SECOND'
232
233
  o.right.cast(:datetime)
233
234
  when /i\z/
234
- interval = DATE_MAPPING[o.left[0..-2]]
235
+ interval = Arel::Visitors::Oracle::DATE_MAPPING[o.left[0..-2]]
235
236
  collector << '('
236
237
  collector = visit o.right, collector
237
238
  collector << ") * (INTERVAL '1' #{interval})"
@@ -240,7 +241,7 @@ module ArelExtensions
240
241
  interval = nil
241
242
  o.right
242
243
  end
243
- collector << "EXTRACT(#{DATE_MAPPING[o.left]} FROM "
244
+ collector << "EXTRACT(#{Arel::Visitors::Oracle::DATE_MAPPING[o.left]} FROM "
244
245
  collector = visit right, collector
245
246
  end
246
247
  collector << ")"
@@ -255,16 +256,6 @@ module ArelExtensions
255
256
  collector = visit o.left, collector
256
257
  collector << ")"
257
258
  return collector
258
- when :text
259
- collector << "TO_CLOB("
260
- collector = visit o.left, collector
261
- collector << ")"
262
- return collector
263
- when :ntext
264
- collector << "TO_NCLOB("
265
- collector = visit o.left, collector
266
- collector << ")"
267
- return collector
268
259
  when :time
269
260
  if (o.left.respond_to?(:return_type) && o.left.return_type == :string) || o.left.is_a?(Arel::Nodes::Quoted)
270
261
  collector << "TO_DATE("
@@ -308,7 +299,7 @@ module ArelExtensions
308
299
  end
309
300
 
310
301
  def visit_ArelExtensions_Nodes_Length o, collector
311
- collector << "LENGTH#{o.bytewise ? 'B' : ''}("
302
+ collector << "LENGTH("
312
303
  collector = visit o.expr, collector
313
304
  collector << ")"
314
305
  collector
@@ -330,7 +321,7 @@ module ArelExtensions
330
321
  collector << "DBMS_RANDOM.VALUE("
331
322
  if o.left && o.right
332
323
  collector = visit o.left, collector
333
- collector << COMMA
324
+ collector << Arel::Visitors::Oracle::COMMA
334
325
  collector = visit o.right, collector
335
326
  end
336
327
  collector << ")"
@@ -340,7 +331,7 @@ module ArelExtensions
340
331
  def visit_Arel_Nodes_Regexp o, collector
341
332
  collector << " REGEXP_LIKE("
342
333
  collector = visit o.left, collector
343
- collector << COMMA
334
+ collector << Arel::Visitors::Oracle::COMMA
344
335
  collector = visit o.right, collector
345
336
  collector << ')'
346
337
  collector
@@ -349,7 +340,7 @@ module ArelExtensions
349
340
  def visit_Arel_Nodes_NotRegexp o, collector
350
341
  collector << " NOT REGEXP_LIKE("
351
342
  collector = visit o.left, collector
352
- collector << COMMA
343
+ collector << Arel::Visitors::Oracle::COMMA
353
344
  collector = visit o.right, collector
354
345
  collector << ')'
355
346
  collector
@@ -358,7 +349,7 @@ module ArelExtensions
358
349
  def visit_ArelExtensions_Nodes_Locate o, collector
359
350
  collector << "INSTR("
360
351
  o.expressions.each_with_index { |arg, i|
361
- collector << COMMA if i != 0
352
+ collector << Arel::Visitors::Oracle::COMMA unless i == 0
362
353
  collector = visit arg, collector
363
354
  }
364
355
  collector << ")"
@@ -368,7 +359,7 @@ module ArelExtensions
368
359
  def visit_ArelExtensions_Nodes_Substring o, collector
369
360
  collector << "SUBSTR("
370
361
  o.expressions.each_with_index { |arg, i|
371
- collector << COMMA if i != 0
362
+ collector << Arel::Visitors::Oracle::COMMA unless i == 0
372
363
  collector = visit arg, collector
373
364
  }
374
365
  collector << ")"
@@ -387,11 +378,11 @@ module ArelExtensions
387
378
  if o.type_of_attribute(o.left) == :text
388
379
  collector << 'dbms_lob.SUBSTR('
389
380
  collector = visit o.left, collector
390
- collector << COMMA
381
+ collector << Arel::Visitors::Oracle::COMMA
391
382
  collector << 'COALESCE(dbms_lob.GETLENGTH('
392
383
  collector = visit o.left, collector
393
384
  collector << "), 0)"
394
- collector << COMMA
385
+ collector << Arel::Visitors::Oracle::COMMA
395
386
  collector << '1)'
396
387
  else
397
388
  collector = visit o.left, collector
@@ -438,25 +429,28 @@ module ArelExtensions
438
429
  def visit_ArelExtensions_Nodes_DateAdd o, collector
439
430
  collector << '('
440
431
  collector = visit o.left, collector
441
- collector << ' + ' # (o.right.value >= 0 ? ' + ' : ' - ')
432
+ collector << ' + '# (o.right.value >= 0 ? ' + ' : ' - ')
442
433
  collector = visit o.oracle_value(o.right), collector
443
434
  collector << ')'
444
435
  collector
445
436
  end
446
437
 
447
438
  def visit_ArelExtensions_Nodes_Format o, collector
448
- fmt = ArelExtensions::Visitors::strftime_to_format(o.iso_format, DATE_FORMAT_DIRECTIVES)
449
439
  collector << "TO_CHAR("
450
440
  collector = visit o.left, collector
451
- collector << COMMA
452
- collector = visit Arel::Nodes.build_quoted(fmt), collector
441
+ collector << Arel::Visitors::Oracle::COMMA
442
+
443
+ f = o.iso_format.gsub(/\ (\w+)/, ' "\1"')
444
+ Arel::Visitors::Oracle::DATE_FORMAT_DIRECTIVES.each { |d, r| f.gsub!(d, r) }
445
+ collector = visit Arel::Nodes.build_quoted(f), collector
446
+
453
447
  collector << ")"
454
448
  collector
455
449
  end
456
450
 
457
451
  def visit_ArelExtensions_Nodes_Repeat o, collector
458
452
  collector << "LPAD("
459
- collector = visit o.expressions[0], collector # can't put empty string, otherwise it wouldn't work
453
+ collector = visit o.expressions[0], collector #can't put empty string, otherwise it wouldn't work
460
454
  collector << Arel::Visitors::ToSql::COMMA
461
455
  collector = visit o.expressions[1], collector
462
456
  collector << Arel::Visitors::ToSql::COMMA
@@ -465,24 +459,26 @@ module ArelExtensions
465
459
  collector
466
460
  end
467
461
 
468
- # add primary_key if not present, avoid zip
462
+ # add primary_key if not present, avoid zip
469
463
  if Arel::VERSION.to_i < 7
470
464
  def visit_ArelExtensions_InsertManager_BulkValues o, collector
471
465
  collector << "("
472
466
  o.left.each_with_index do |row, idx| # values
473
467
  collector << " UNION ALL " if idx != 0
474
- collector << "(SELECT "
475
- len = row.length - 1
476
- row.zip(o.cols).each_with_index { |(value, attr), i|
477
- case value
478
- when Arel::Nodes::SqlLiteral, Arel::Nodes::BindParam
479
- collector = visit value, collector
480
- else
481
- collector << quote(value, attr && column_for(attr)).to_s
482
- end
483
- collector << COMMA unless i == len
484
- }
485
- collector << ' FROM DUAL)'
468
+ collector << "(SELECT "
469
+ v = Arel::Nodes::Values.new(row, o.cols)
470
+ len = v.expressions.length - 1
471
+ v.expressions.each_with_index { |value, i|
472
+ case value
473
+ when Arel::Nodes::SqlLiteral, Arel::Nodes::BindParam
474
+ collector = visit value, collector
475
+ else
476
+ attr = v.columns[i]
477
+ collector << quote(value, attr && column_for(attr)).to_s
478
+ end
479
+ collector << Arel::Visitors::Oracle::COMMA unless i == len
480
+ }
481
+ collector << ' FROM DUAL)'
486
482
  end
487
483
  collector << ")"
488
484
  collector
@@ -494,16 +490,15 @@ module ArelExtensions
494
490
  collector << " UNION ALL " if idx != 0
495
491
  collector << "(SELECT "
496
492
  len = row.length - 1
497
- row.zip(o.cols).each_with_index { |(value, attr), i|
493
+ row.each_with_index { |value, i|
494
+ attr = o.cols[i]
498
495
  case value
499
496
  when Arel::Nodes::SqlLiteral, Arel::Nodes::BindParam
500
497
  collector = visit value, collector
501
- when Integer
502
- collector << value.to_s
503
498
  else
504
499
  collector << (attr && attr.able_to_type_cast? ? quote(attr.type_cast_for_database(value)) : quote(value).to_s)
505
500
  end
506
- collector << COMMA unless i == len
501
+ collector << Arel::Visitors::Oracle::COMMA unless i == len
507
502
  }
508
503
  collector << ' FROM DUAL)'
509
504
  end
@@ -562,7 +557,7 @@ module ArelExtensions
562
557
  end
563
558
 
564
559
 
565
- alias_method(:old_visit_Arel_Nodes_SelectStatement, :visit_Arel_Nodes_SelectStatement) rescue nil
560
+ alias_method :old_visit_Arel_Nodes_SelectStatement, :visit_Arel_Nodes_SelectStatement
566
561
  def visit_Arel_Nodes_SelectStatement o, collector
567
562
  if !(collector.value.blank? || (collector.value.is_a?(Array) && collector.value[0].blank?)) && o.limit.blank? && o.offset.blank?
568
563
  o = o.dup
@@ -571,7 +566,7 @@ module ArelExtensions
571
566
  old_visit_Arel_Nodes_SelectStatement(o,collector)
572
567
  end
573
568
 
574
- alias_method(:old_visit_Arel_Nodes_TableAlias, :visit_Arel_Nodes_TableAlias) rescue nil
569
+ alias_method :old_visit_Arel_Nodes_TableAlias, :visit_Arel_Nodes_TableAlias
575
570
  def visit_Arel_Nodes_TableAlias o, collector
576
571
  if o.name.length > 30
577
572
  o = Arel::Table.new(o.table_name).alias(Base64.urlsafe_encode64(Digest::MD5.new.digest(o.name)).tr('=', '').tr('-', '_'))
@@ -579,7 +574,7 @@ module ArelExtensions
579
574
  old_visit_Arel_Nodes_TableAlias(o,collector)
580
575
  end
581
576
 
582
- alias_method(:old_visit_Arel_Nodes_As, :visit_Arel_Nodes_As) rescue nil
577
+ alias_method :old_visit_Arel_Nodes_As, :visit_Arel_Nodes_As
583
578
  def visit_Arel_Nodes_As o, collector
584
579
  if o.left.is_a?(Arel::Nodes::Binary)
585
580
  collector << '('
@@ -599,7 +594,7 @@ module ArelExtensions
599
594
  visit_Arel_Nodes_As o, collector
600
595
  end
601
596
 
602
- alias_method(:old_visit_Arel_Attributes_Attribute, :visit_Arel_Attributes_Attribute) rescue nil
597
+ alias_method :old_visit_Arel_Attributes_Attribute, :visit_Arel_Attributes_Attribute
603
598
  def visit_Arel_Attributes_Attribute o, collector
604
599
  join_name = o.relation.table_alias || o.relation.name
605
600
  if join_name.length > 30
@@ -608,9 +603,10 @@ module ArelExtensions
608
603
  collector << "#{quote_table_name join_name}.#{quote_column_name o.name}"
609
604
  end
610
605
 
606
+
611
607
  def visit_ArelExtensions_Nodes_FormattedNumber o, collector
612
608
  col = o.left.coalesce(0)
613
- comma = NUMBER_COMMA_MAPPING[o.locale] || '.,'
609
+ comma = Arel::Visitors::Oracle::NUMBER_COMMA_MAPPING[o.locale] || '.,'
614
610
  comma_in_format = o.precision == 0 ? '' : 'D'
615
611
  nines_after = (1..o.precision-1).map{'9'}.join('')+'0'
616
612
  if comma.length == 1
@@ -687,6 +683,7 @@ module ArelExtensions
687
683
  collector << ')'
688
684
  collector
689
685
  end
686
+
690
687
  end
691
688
  end
692
689
  end
@@ -1,7 +1,19 @@
1
1
  module ArelExtensions
2
2
  module Visitors
3
+
3
4
  Arel::Visitors.send(:remove_const,'Oracle12') if Arel::Visitors.const_defined?('Oracle12')
4
5
  Arel::Visitors.const_set('Oracle12',Class.new(Arel::Visitors::Oracle)).class_eval do
6
+ def visit_Arel_Nodes_SelectStatement(o, collector)
7
+ # Oracle does not allow LIMIT clause with select for update
8
+ if o.limit && o.lock
9
+ raise ArgumentError, <<-MSG
10
+ 'Combination of limit and lock is not supported.
11
+ because generated SQL statements
12
+ `SELECT FOR UPDATE and FETCH FIRST n ROWS` generates ORA-02014.`
13
+ MSG
14
+ end
15
+ super
16
+ end
5
17
 
6
18
  def visit_Arel_Nodes_SelectOptions(o, collector)
7
19
  collector = maybe_visit o.offset, collector
@@ -56,7 +68,7 @@ module ArelExtensions
56
68
  if i != 0
57
69
  collector << Arel::Visitors::MySQL::COMMA
58
70
  end
59
- collector = visit v, collector
71
+ collector = visit v, collector
60
72
  end
61
73
  collector << ')'
62
74
  when Hash
@@ -72,7 +84,7 @@ module ArelExtensions
72
84
  collector << 'FORMAT JSON'
73
85
  end
74
86
  collector << ')'
75
- when String, Numeric, TrueClass, FalseClass
87
+ when String,Numeric,TrueClass,FalseClass
76
88
  collector = visit Arel::Nodes.build_quoted("#{o.dict}"), collector
77
89
  collector << ' FORMAT JSON'
78
90
  when NilClass
@@ -85,6 +97,7 @@ module ArelExtensions
85
97
  end
86
98
  collector
87
99
  end
100
+
88
101
  end
89
102
  end
90
103
  end