arel_extensions 0.9.5 → 0.9.6

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: dcccab4309b1eb71b208b052216c353ce6e1257c
4
- data.tar.gz: 9d338f67a997f0d580df1802d271be8c35969305
3
+ metadata.gz: 709b543bdf84952b555236ce66c94f37e33b4183
4
+ data.tar.gz: 053561c6aa304247471bf9effb7712eb913ec281
5
5
  SHA512:
6
- metadata.gz: c1ae31c4de5716f431b0619b2067d9d94b3f7daa2c73ef41b9d534a7da8448e148d9f3f28ab56fd5f580feb1722aa1b5e4b11545c71ea9ee22ed557f62b984b1
7
- data.tar.gz: 73358836832cb8fac27fab5220530da5c3379430098bf7325900748d926f3c6de6fe9248f6c69a105c1fdbd20d08e682b76c77a86e9169192df00a465d5ba1e6
6
+ metadata.gz: 72d08bc341ea513e51f0650cc1677b781929f4af3a2aff55af45c5044643cecd9d7fd82caaa353e4cf8a807477d46c8c2fe394d741d607df9726eb29c623c0a9
7
+ data.tar.gz: 647156dfc77c72a0bef98112815ed16b050a7523402608c439ddbb704345bea69d990a4df8bc08600426bf92de24f2358cdd0196e1c423166d59378ea20719da
data/Gemfile CHANGED
@@ -3,17 +3,19 @@ source "https://rubygems.org"
3
3
  gemspec
4
4
 
5
5
  group :development, :test do
6
- gem "sqlite3", :platforms => [:mri, :mswin, :mingw, :x64_mingw]
7
- gem "mysql2", :platforms => [:mri, :mswin, :mingw, :x64_mingw]
8
- gem "pg", :platforms => [:mri, :mingw, :x64_mingw]
6
+ gem "sqlite3", :platforms => [:mri, :mswin, :mingw]
7
+ gem "mysql2", :platforms => [:mri, :mswin, :mingw]
8
+ gem "pg", :platforms => [:mri, :mingw, :mswin]
9
9
 
10
10
  gem "jdbc-sqlite3", :platforms => :jruby
11
11
  gem "activerecord-jdbcsqlite3-adapter", :platforms => :jruby
12
12
  gem "activerecord-jdbcmysql-adapter", :platforms => :jruby
13
13
  gem "activerecord-jdbcpostgresql-adapter", :platforms => :jruby
14
14
 
15
- gem "tiny_tds", :platforms => [:mri, :mingw, :x64_mingw]
16
- gem "activerecord-sqlserver-adapter", '~> 4.2.0', :platforms => [:mri, :mingw, :x64_mingw]
15
+ if RUBY_PLATFORM =~ /[^r]win\d\d/
16
+ gem "tiny_tds", :require => false, :platforms => [:mri, :mingw, :mswin]
17
+ gem "activerecord-sqlserver-adapter", '~> 4.2.0', :platforms => [:mri, :mingw, :mswin]
18
+ end
17
19
 
18
20
  gem 'activesupport', '~> 4.0'
19
21
  gem 'activemodel', '~> 4.0'
data/README.md CHANGED
@@ -73,7 +73,7 @@ Other functions : ABS, RAND, ROUND, FLOOR, CEIL, FORMAT
73
73
  # => my_table.name REGEXP '\^[a-d_]+'
74
74
  ```
75
75
 
76
- Other functions : SOUNDEX, LENGTH, REPLACE, LOCATE, TRIM
76
+ Other functions : SOUNDEX, LENGTH, REPLACE, LOCATE, SUBSTRING, TRIM
77
77
 
78
78
  ### String Array operations
79
79
 
@@ -138,4 +138,353 @@ Arel Extensions improves InsertManager by adding bulk_insert method, which allow
138
138
  insert_manager = Arel::InsertManager.new(User).into(User.arel_table)
139
139
  insert_manager.bulk_insert(@cols, @data)
140
140
  User.connection.execute(insert_manager.to_sql)
141
- ```
141
+ ```
142
+
143
+ ## New Arel Functions
144
+
145
+ <table class="tg arel-functions" style="font-size:80%">
146
+ <thead>
147
+ <tr>
148
+ <th></th>
149
+ <th class="tg-by3v">Function / Example<br/>ToSql</th>
150
+ <th class="tg-pjz5">MySQL / MariaDB</th>
151
+ <th class="tg-pjz5">PostgreSQL</th>
152
+ <th class="tg-pjz5">SQLite</th>
153
+ <th class="tg-pjz5">Oracle</th>
154
+ <th class="tg-pjz5">MS SQL</th>
155
+ <th class="tg-pjz5">DB2<br/>(not tested on real DB)</th>
156
+ </tr>
157
+ </thead>
158
+ <tbody>
159
+ <tr>
160
+ <th class="tg-82sq" rowspan="6"><div>Number functions</div></th>
161
+ <td class="tg-yw4l">ABS<br>column.abs<br></td>
162
+ <td class="ok">✔</td>
163
+ <td class="ok">✔</td>
164
+ <td class="ok">✔</td>
165
+ <td class="ok">✔</td>
166
+ <td class="ok">✔</td>
167
+ <td class="ok">✔</td>
168
+ </tr>
169
+ <tr>
170
+ <td class="tg-yw4l">CEIL<br>column.ceil</td>
171
+ <td class="ok">✔</td>
172
+ <td class="ok">✔</td>
173
+ <td class="tg-j6lv">CASE + ROUND</td>
174
+ <td class="ok">✔</td>
175
+ <td class="tg-j6lv">CEILING()</td>
176
+ <td class="tg-j6lv">CEILING()</td>
177
+ </tr>
178
+ <tr>
179
+ <td class="tg-yw4l">FLOOR<br>column.floor</td>
180
+ <td class="ok">✔</td>
181
+ <td class="ok">✔</td>
182
+ <td class="tg-j6lv">CASE + ROUND</td>
183
+ <td class="ok">✔</td>
184
+ <td class="ok">✔</td>
185
+ <td class="ok">✔</td>
186
+ </tr>
187
+ <tr>
188
+ <td class="tg-yw4l">RAND<br>Arel.rand</td>
189
+ <td class="ok">✔</td>
190
+ <td class="ok">✔</td>
191
+ <td class="tg-j6lv">RANDOM()</td>
192
+ <td class="tg-j6lv">dbms_random.value()</td>
193
+ <td class="ok">✔</td>
194
+ <td class="ok">✔</td>
195
+ </tr>
196
+ <tr>
197
+ <td class="tg-yw4l">ROUND<br>column.round(precision = 0)</td>
198
+ <td class="ok">✔</td>
199
+ <td class="ok">✔</td>
200
+ <td class="ok">✔</td>
201
+ <td class="ok">✔</td>
202
+ <td class="ok">✔</td>
203
+ <td class="ok">✔</td>
204
+ </tr>
205
+ <tr>
206
+ <td class="tg-yw4l">SUM / AVG / MIN / MAX + x<br>column.sum + 42</td>
207
+ <td class="ok">✔</td>
208
+ <td class="ok">✔</td>
209
+ <td class="ok">✔</td>
210
+ <td class="ok">✔</td>
211
+ <td class="ok">✔</td>
212
+ <td class="ok">✔</td>
213
+ </tr>
214
+ <tr>
215
+ <th class="tg-ffjm" rowspan="12"><div>String functions</div></th>
216
+ <td class="tg-yw4l">CONCAT<br>column + "string"</td>
217
+ <td class="ok">✔</td>
218
+ <td class="ok">✔</td>
219
+ <td class="tg-j6lv"> ||</td>
220
+ <td class="ok">✔</td>
221
+ <td class="tg-j6lv">+</td>
222
+ <td class="ok">✔</td>
223
+ </tr>
224
+ <tr>
225
+ <td class="tg-yw4l">LENGTH<br>column.length</td>
226
+ <td class="ok">✔</td>
227
+ <td class="ok">✔</td>
228
+ <td class="ok">✔</td>
229
+ <td class="ok">✔</td>
230
+ <td class="tg-j6lv">LEN()</td>
231
+ <td class="ok">✔</td>
232
+ </tr>
233
+ <tr>
234
+ <td class="tg-yw4l">LOCATE<br>column.locate("string")</td>
235
+ <td class="ok">✔</td>
236
+ <td class="ok">✔</td>
237
+ <td class="tg-j6lv">INSTR()</td>
238
+ <td class="ok">✔</td>
239
+ <td class="tg-j6lv">CHARINDEX()</td>
240
+ <td class="ok">✔</td>
241
+ </tr>
242
+ <tr>
243
+ <td class="tg-yw4l">SUBSTRING<br/>column[1..2]<br/>column.substring(1)<br/>column.substring(1, 1)</td>
244
+ <td class="ok">✔</td>
245
+ <td class="tg-j6lv">SUBSTR()</td>
246
+ <td class="tg-j6lv">SUBSTR()</td>
247
+ <td class="tg-j6lv">SUBSTR()</td>
248
+ <td class="ok">✔</td>
249
+ <td class="ok">✔</td>
250
+ </tr>
251
+ <tr>
252
+ <td class="tg-yw4l">FIND_IN_SET<br>column &amp; ("l")</td>
253
+ <td class="ok">✔</td>
254
+ <td class="ok">✔</td>
255
+ <td class="tg-orpl">db.create_function( "find_in_set", 1 ) <br>do |func, value1, value2|,<br>func.result =value1.index(value2)<br>end <br></td>
256
+ <td class="ok">✔</td>
257
+ <td class="ok">✔</td>
258
+ <td class="ok">✔</td>
259
+ </tr>
260
+ <tr>
261
+ <td class="tg-yw4l">SOUNDEX<br>column.soundex</td>
262
+ <td class="ok">✔</td>
263
+ <td class="tg-3oug">require fuzzystrmatch</td>
264
+ <td class="ok">✔</td>
265
+ <td class="ok">✔</td>
266
+ <td class="ok">✔</td>
267
+ <td class="ok">✔</td>
268
+ </tr>
269
+ <tr>
270
+ <td class="tg-yw4l">REPLACE<br>column.replace("s","X")</td>
271
+ <td class="ok">✔</td>
272
+ <td class="ok">✔</td>
273
+ <td class="ok">✔</td>
274
+ <td class="ok">✔</td>
275
+ <td class="ok">✔</td>
276
+ <td class="ok">✔</td>
277
+ </tr>
278
+ <tr>
279
+ <td class="tg-yw4l">REGEXP<br>column =~ "pattern"<br></td>
280
+ <td class="ok">✔</td>
281
+ <td class="ok">✔</td>
282
+ <td class="tg-3oug">require pcre.so</td>
283
+ <td class="tg-j6lv">REGEXP_LIKE</td>
284
+ <td class="tg-j6lv">LIKE</td>
285
+ <td class="ok">✔</td>
286
+ </tr>
287
+ <tr>
288
+ <td class="tg-yw4l">NOT_REGEXP<br>column != "pattern"</td>
289
+ <td class="ok">✔</td>
290
+ <td class="ok">✔<br></td>
291
+ <td class="tg-3oug">require pcre.so</td>
292
+ <td class="tg-j6lv">NOT REGEXP_LIKE </td>
293
+ <td class="tg-j6lv">NOT LIKE</td>
294
+ <td class="ok">✔</td>
295
+ </tr>
296
+ <tr>
297
+ <td class="tg-yw4l">ILIKE (in Arel6)<br/>column.imatches('%pattern')</td>
298
+ <td class="tg-j6lv">LOWER() LIKE LOWER()</td>
299
+ <td class="ok">✔</td>
300
+ <td class="ok">✔</td>
301
+ <td class="tg-j6lv">LOWER() LIKE LOWER()</td>
302
+ <td class="tg-j6lv">LOWER() LIKE LOWER()</td>
303
+ <td class="tg-j6lv">LOWER() LIKE LOWER()</td>
304
+ </tr>
305
+ <tr>
306
+ <td class="tg-yw4l">TRIM (leading)<br>column.trim("LEADING","M")</td>
307
+ <td class="ok">✔</td>
308
+ <td class="tg-j6lv">LTRIM()</td>
309
+ <td class="tg-j6lv">LTRIM()</td>
310
+ <td class="ok">✔</td>
311
+ <td class="ok">✔</td>
312
+ <td class="tg-j6lv">LTRIM()</td>
313
+ </tr>
314
+ <tr>
315
+ <td class="tg-yw4l">TRIM (trailing)<br>column.trim("TRAILING","g")</td>
316
+ <td class="ok">✔</td>
317
+ <td class="tg-j6lv">RTRIM()</td>
318
+ <td class="tg-j6lv">RTRIM()</td>
319
+ <td class="ok">✔</td>
320
+ <td class="ok">✔</td>
321
+ <td class="tg-j6lv">Rtrim()</td>
322
+ </tr>
323
+ <tr>
324
+ <td class="tg-yw4l">TRIM (both)<br>column.trim("BOTH","e")</td>
325
+ <td class="ok">✔</td>
326
+ <td class="tg-j6lv">TRIM()<br></td>
327
+ <td class="tg-j6lv">TRIM()</td>
328
+ <td class="ok">✔</td>
329
+ <td class="tg-j6lv">LTRIM(RTRIM())</td>
330
+ <td class="tg-j6lv">TRIM()</td>
331
+ </tr>
332
+ <tr>
333
+ <th class="tg-4rp9" rowspan="6"><div>Date functions</div></th>
334
+ <td class="tg-yw4l">DATEADD<br>column + 2.year<br></td>
335
+ <td class="tg-j6lv">DATE_ADD()<br></td>
336
+ <td class="ok">✔</td>
337
+ <td class="ok">✔</td>
338
+ <td class="ok">✔</td>
339
+ <td class="ok">✔</td>
340
+ <td class="tg-j6lv">+</td>
341
+ </tr>
342
+ <tr>
343
+ <td class="tg-yw4l">DATEDIFF<br>column - date<br></td>
344
+ <td class="tg-j6lv">DATEDIFF()<br></td>
345
+ <td class="ok">✔</td>
346
+ <td class="tg-j6lv">JULIANDAY() - JULIANDAY()</td>
347
+ <td class="tg-j6lv"> -</td>
348
+ <td class="ok">✔</td>
349
+ <td class="tg-j6lv">DAY()</td>
350
+ </tr>
351
+ <tr>
352
+ <td class="tg-yw4l">DAY<br>column.day<br></td>
353
+ <td class="ok">✔</td>
354
+ <td class="ok">✔</td>
355
+ <td class="tg-j6lv">STRFTIME()</td>
356
+ <td class="ok">✔</td>
357
+ <td class="ok">✔</td>
358
+ <td class="ok">✔</td>
359
+ </tr>
360
+ <tr>
361
+ <td class="tg-yw4l">MONTH<br>column.month<br></td>
362
+ <td class="ok">✔</td>
363
+ <td class="ok">✔</td>
364
+ <td class="tg-j6lv">STRFTIME()</td>
365
+ <td class="ok">✔</td>
366
+ <td class="ok">✔</td>
367
+ <td class="ok">✔</td>
368
+ </tr>
369
+ <tr>
370
+ <td class="tg-yw4l">WEEK<br>column.week</td>
371
+ <td class="ok">✔</td>
372
+ <td class="ok">✔</td>
373
+ <td class="tg-j6lv">STRFTIME()</td>
374
+ <td class="ok">✔</td>
375
+ <td class="ok">✔</td>
376
+ <td class="ok">✔</td>
377
+ </tr>
378
+ <tr>
379
+ <td class="tg-yw4l">YEAR<br>column.year</td>
380
+ <td class="ok">✔</td>
381
+ <td class="ok">✔</td>
382
+ <td class="tg-j6lv">STRFTIME()</td>
383
+ <td class="ok">✔</td>
384
+ <td class="ok">✔</td>
385
+ <td class="ok">✔</td>
386
+ </tr>
387
+ <tr>
388
+ <th class="tg-72dn" rowspan="8"><div>Comparators functions</div></th>
389
+ <td class="tg-yw4l">COALESCE<br>column.coalesce(var)</td>
390
+ <td class="ok">✔</td>
391
+ <td class="ok">✔</td>
392
+ <td class="ok">✔</td>
393
+ <td class="ok">✔</td>
394
+ <td class="ok">✔</td>
395
+ <td class="ok">✔</td>
396
+ </tr>
397
+ <tr>
398
+ <td class="tg-yw4l">ISNULL<br>column.isnull()</td>
399
+ <td class="tg-j6lv">IFNULL()</td>
400
+ <td class="ok">✔</td>
401
+ <td class="ok">✔</td>
402
+ <td class="tg-j6lv">NVC()</td>
403
+ <td class="ok">✔</td>
404
+ <td class="ok">✔</td>
405
+ </tr>
406
+ <tr>
407
+ <td class="tg-yw4l">==<br>column == integer</td>
408
+ <td class="ok">✔</td>
409
+ <td class="ok">✔</td>
410
+ <td class="ok">✔</td>
411
+ <td class="ok">✔</td>
412
+ <td class="ok">✔</td>
413
+ <td class="ok">✔</td>
414
+ </tr>
415
+ <tr>
416
+ <td class="tg-yw4l">!=<br>column != integer</td>
417
+ <td class="ok">✔</td>
418
+ <td class="ok">✔</td>
419
+ <td class="ok">✔</td>
420
+ <td class="ok">✔</td>
421
+ <td class="ok">✔</td>
422
+ <td class="ok">✔</td>
423
+ </tr>
424
+ <tr>
425
+ <td class="tg-yw4l">&gt;<br>column &gt; integer</td>
426
+ <td class="ok">✔</td>
427
+ <td class="ok">✔</td>
428
+ <td class="ok">✔</td>
429
+ <td class="ok">✔</td>
430
+ <td class="ok">✔</td>
431
+ <td class="ok">✔</td>
432
+ </tr>
433
+ <tr>
434
+ <td class="tg-yw4l">&gt;=<br>column &gt;= integer</td>
435
+ <td class="ok">✔</td>
436
+ <td class="ok">✔</td>
437
+ <td class="ok">✔</td>
438
+ <td class="ok">✔</td>
439
+ <td class="ok">✔</td>
440
+ <td class="ok">✔</td>
441
+ </tr>
442
+ <tr>
443
+ <td class="tg-yw4l">&lt; <br>column &lt; integer</td>
444
+ <td class="ok">✔</td>
445
+ <td class="ok">✔</td>
446
+ <td class="ok">✔</td>
447
+ <td class="ok">✔</td>
448
+ <td class="ok">✔</td>
449
+ <td class="ok">✔</td>
450
+ </tr>
451
+ <tr>
452
+ <td class="tg-yw4l">&lt;=<br>column &lt;= integer</td>
453
+ <td class="ok">✔</td>
454
+ <td class="ok">✔</td>
455
+ <td class="ok">✔</td>
456
+ <td class="ok">✔</td>
457
+ <td class="ok">✔</td>
458
+ <td class="ok">✔</td>
459
+ </tr>
460
+ <tr>
461
+ <th class="tg-9hbo" rowspan="2"><div>Boolean <br/> functions</div></th>
462
+ <td class="tg-yw4l">OR ( ⋁ )<br>column.eq(var).⋁(column.eq(var))</td>
463
+ <td class="ok">✔</td>
464
+ <td class="ok">✔</td>
465
+ <td class="ok">✔</td>
466
+ <td class="ok">✔</td>
467
+ <td class="ok">✔</td>
468
+ <td class="ok">✔</td>
469
+ </tr>
470
+ <tr>
471
+ <td class="tg-yw4l">AND ( ⋀ )<br>column.eq(var).⋀(column.eq(var))</td>
472
+ <td class="ok">✔</td>
473
+ <td class="ok">✔</td>
474
+ <td class="ok">✔</td>
475
+ <td class="ok">✔</td>
476
+ <td class="ok">✔</td>
477
+ <td class="ok">✔</td>
478
+ </tr>
479
+ <tr>
480
+ <th class="bulk_insert" rowspan="1"><div>Bulk <br/> Insert</div></th>
481
+ <td class="tg-yw4l">insert_manager.bulk_insert(@cols, @data)</td>
482
+ <td class="ok">✔</td>
483
+ <td class="ok">✔</td>
484
+ <td class="ok">✔</td>
485
+ <td class="ok">✔</td>
486
+ <td class="ok">✔</td>
487
+ <td class="ok">✔</td>
488
+ </tr>
489
+ </tbody>
490
+ </table>
data/SQL_Challenges.md CHANGED
@@ -6,7 +6,6 @@ A good way could be to create user defined functions to ensure a total transpare
6
6
 
7
7
 
8
8
  ## SQLite (without extension)
9
- - CEIL and FLOOR without pcre
10
9
  - FIND_IN_SET
11
10
  - LOCATE
12
11
  - REGEXP
data/TODO CHANGED
@@ -17,9 +17,11 @@ Code quality:
17
17
 
18
18
 
19
19
  New features:
20
+ - UPCASE / DOWNCASE
20
21
  - POSIX format numbers (%.2f)
21
22
  - easy unions
22
23
  - cast, to_char
24
+ - rake tasks to load sql functions
23
25
 
24
26
  Tests improvements:
25
27
  - SQL Server
data/functions.html CHANGED
@@ -3,12 +3,10 @@
3
3
  <head>
4
4
  <meta charset="utf-8" />
5
5
  <title>Arel Extensions Features</title>
6
- <style type="text/css">
6
+ <style type="text/css">
7
7
  .tg {border-collapse:collapse;border-spacing:0;}
8
- .tg th { font-weight:bold; }
9
- .tg td{font-family:Arial, sans-serif;font-size:14px;padding:10px 5px;border-style:solid;border-width:1px;overflow:hidden;word-break:normal;}
10
- .tg th{font-family:Arial, sans-serif;font-size:14px;padding:10px 5px;border-style:solid;border-width:1px;overflow:hidden;word-break:normal;}
11
- .tg .tg-baqh{text-align:center;vertical-align:top}
8
+ .tg td{font-family:Arial, sans-serif;font-size:14px;padding:5px 5px;border-style:solid;border-width:1px;overflow:hidden;word-break:normal;}
9
+ .tg th{font-family:Arial, sans-serif;font-size:14px;padding:5px 5px;border-style:solid;border-width:1px;overflow:hidden;word-break:normal;}
12
10
  .tg .tg-3oug{background-color:#fd6864;text-align:center;vertical-align:top}
13
11
  .tg .tg-by3v{font-weight:bold;font-size:14px;text-align:center}
14
12
  .tg .tg-jogk{font-style:italic;vertical-align:top}
@@ -21,343 +19,347 @@
21
19
  .tg .tg-4rp9{font-weight:bold;background-color:#ffffc7;vertical-align:top}
22
20
  .tg .tg-72dn{font-weight:bold;background-color:#f7f6cd;vertical-align:top}
23
21
  .tg .tg-9hbo{font-weight:bold;vertical-align:top}
24
- </style>
22
+ .arel-functions th { font-weight:bold; }
23
+ .arel-functions th[rowspan] { vertical-align: middle; width:3em;}
24
+ .arel-functions th[rowspan] > div { transform:rotate(-90deg); transform-origin: center center; white-space: nowrap; }
25
+ .arel-functions td.ok { color:green; text-align:center; }
26
+ </style>
25
27
  </head>
26
28
  <body>
27
- <table class="tg">
29
+ <table class="tg arel-functions">
28
30
  <thead>
29
31
  <tr>
30
- <th class="tg-jogk"></th>
32
+ <th></th>
31
33
  <th class="tg-by3v">Function / Example<br/>ToSql</th>
32
- <th class="tg-pjz5">MySQL/MariaDB</th>
34
+ <th class="tg-pjz5">MySQL / MariaDB</th>
33
35
  <th class="tg-pjz5">PostgreSQL</th>
34
36
  <th class="tg-pjz5">SQLite</th>
35
37
  <th class="tg-pjz5">Oracle</th>
36
38
  <th class="tg-pjz5">MS SQL</th>
37
- <th class="tg-pjz5">DB2</th>
39
+ <th class="tg-pjz5">DB2<br/>(not tested on real DB)</th>
38
40
  </tr>
39
41
  </thead>
40
42
  <tbody>
41
43
  <tr>
42
- <th class="tg-82sq" rowspan="6"><br><br><br><br><br><br><br>Math<br>functions</th>
44
+ <th class="tg-82sq" rowspan="6"><div>Number functions</div></th>
43
45
  <td class="tg-yw4l">ABS<br>column.abs<br></td>
44
- <td class="tg-baqh">✔</td>
45
- <td class="tg-baqh">✔</td>
46
- <td class="tg-baqh">✔</td>
47
- <td class="tg-baqh">✔</td>
48
- <td class="tg-baqh">✔</td>
49
- <td class="tg-baqh">✔</td>
46
+ <td class="ok">✔</td>
47
+ <td class="ok">✔</td>
48
+ <td class="ok">✔</td>
49
+ <td class="ok">✔</td>
50
+ <td class="ok">✔</td>
51
+ <td class="ok">✔</td>
50
52
  </tr>
51
53
  <tr>
52
54
  <td class="tg-yw4l">CEIL<br>column.ceil</td>
53
- <td class="tg-baqh">✔</td>
54
- <td class="tg-baqh">✔</td>
55
- <td class="tg-3oug">require extension-functions.so</td>
56
- <td class="tg-baqh">✔</td>
55
+ <td class="ok">✔</td>
56
+ <td class="ok">✔</td>
57
+ <td class="tg-j6lv">CASE + ROUND</td>
58
+ <td class="ok">✔</td>
57
59
  <td class="tg-j6lv">CEILING()</td>
58
60
  <td class="tg-j6lv">CEILING()</td>
59
61
  </tr>
60
62
  <tr>
61
63
  <td class="tg-yw4l">FLOOR<br>column.floor</td>
62
- <td class="tg-baqh">✔</td>
63
- <td class="tg-baqh">✔</td>
64
- <td class="tg-3oug">require extension-functions.so</td>
65
- <td class="tg-baqh">✔</td>
66
- <td class="tg-baqh">✔</td>
67
- <td class="tg-baqh">✔</td>
64
+ <td class="ok">✔</td>
65
+ <td class="ok">✔</td>
66
+ <td class="tg-j6lv">CASE + ROUND</td>
67
+ <td class="ok">✔</td>
68
+ <td class="ok">✔</td>
69
+ <td class="ok">✔</td>
68
70
  </tr>
69
71
  <tr>
70
72
  <td class="tg-yw4l">RAND<br>Arel.rand</td>
71
- <td class="tg-baqh">✔</td>
72
- <td class="tg-baqh">✔</td>
73
+ <td class="ok">✔</td>
74
+ <td class="ok">✔</td>
73
75
  <td class="tg-j6lv">RANDOM()</td>
74
76
  <td class="tg-j6lv">dbms_random.value()</td>
75
- <td class="tg-baqh">✔</td>
76
- <td class="tg-baqh">✔</td>
77
+ <td class="ok">✔</td>
78
+ <td class="ok">✔</td>
77
79
  </tr>
78
80
  <tr>
79
81
  <td class="tg-yw4l">ROUND<br>column.round(precision = 0)</td>
80
- <td class="tg-baqh">✔</td>
81
- <td class="tg-baqh">✔</td>
82
- <td class="tg-baqh">✔</td>
83
- <td class="tg-baqh">✔</td>
84
- <td class="tg-baqh">✔</td>
85
- <td class="tg-baqh">✔</td>
82
+ <td class="ok">✔</td>
83
+ <td class="ok">✔</td>
84
+ <td class="ok">✔</td>
85
+ <td class="ok">✔</td>
86
+ <td class="ok">✔</td>
87
+ <td class="ok">✔</td>
86
88
  </tr>
87
89
  <tr>
88
90
  <td class="tg-yw4l">SUM / AVG / MIN / MAX + x<br>column.sum + 42</td>
89
- <td class="tg-baqh">✔</td>
90
- <td class="tg-baqh">✔</td>
91
- <td class="tg-baqh">✔</td>
92
- <td class="tg-baqh">✔</td>
93
- <td class="tg-baqh">✔</td>
94
- <td class="tg-baqh">✔</td>
91
+ <td class="ok">✔</td>
92
+ <td class="ok">✔</td>
93
+ <td class="ok">✔</td>
94
+ <td class="ok">✔</td>
95
+ <td class="ok">✔</td>
96
+ <td class="ok">✔</td>
95
97
  </tr>
96
98
  <tr>
97
- <th class="tg-ffjm" rowspan="12"><br><br><br><br><br><br><br><br><br>String <br>functions</th>
99
+ <th class="tg-ffjm" rowspan="12"><div>String functions</div></th>
98
100
  <td class="tg-yw4l">CONCAT<br>column + "string"</td>
99
- <td class="tg-baqh">✔</td>
100
- <td class="tg-baqh">✔</td>
101
+ <td class="ok">✔</td>
102
+ <td class="ok">✔</td>
101
103
  <td class="tg-j6lv"> ||</td>
102
- <td class="tg-baqh">✔</td>
104
+ <td class="ok">✔</td>
103
105
  <td class="tg-j6lv">+</td>
104
- <td class="tg-baqh">✔</td>
106
+ <td class="ok">✔</td>
105
107
  </tr>
106
108
  <tr>
107
109
  <td class="tg-yw4l">LENGTH<br>column.length</td>
108
- <td class="tg-baqh">✔</td>
109
- <td class="tg-baqh">✔</td>
110
- <td class="tg-baqh">✔</td>
111
- <td class="tg-baqh">✔</td>
110
+ <td class="ok">✔</td>
111
+ <td class="ok">✔</td>
112
+ <td class="ok">✔</td>
113
+ <td class="ok">✔</td>
112
114
  <td class="tg-j6lv">LEN()</td>
113
- <td class="tg-baqh">✔</td>
115
+ <td class="ok">✔</td>
114
116
  </tr>
115
117
  <tr>
116
118
  <td class="tg-yw4l">LOCATE<br>column.locate("string")</td>
117
- <td class="tg-baqh">✔</td>
118
- <td class="tg-baqh">✔</td>
119
+ <td class="ok">✔</td>
120
+ <td class="ok">✔</td>
119
121
  <td class="tg-j6lv">INSTR()</td>
120
- <td class="tg-baqh">✔</td>
122
+ <td class="ok">✔</td>
121
123
  <td class="tg-j6lv">CHARINDEX()</td>
122
- <td class="tg-baqh">✔</td>
124
+ <td class="ok">✔</td>
123
125
  </tr>
124
126
  <tr>
125
127
  <td class="tg-yw4l">FIND_IN_SET<br>column &amp; ("l")</td>
126
- <td class="tg-baqh">✔</td>
127
- <td class="tg-baqh">✔</td>
128
+ <td class="ok">✔</td>
129
+ <td class="ok">✔</td>
128
130
  <td class="tg-orpl">db.create_function( "find_in_set", 1 ) <br>do |func, value1, value2|,<br>func.result =value1.index(value2)<br>end <br></td>
129
- <td class="tg-baqh">✔</td>
130
- <td class="tg-baqh">✔</td>
131
- <td class="tg-baqh">✔</td>
131
+ <td class="ok">✔</td>
132
+ <td class="ok">✔</td>
133
+ <td class="ok">✔</td>
132
134
  </tr>
133
135
  <tr>
134
136
  <td class="tg-yw4l">SOUNDEX<br>column.soundex</td>
135
- <td class="tg-baqh">✔</td>
137
+ <td class="ok">✔</td>
136
138
  <td class="tg-3oug">require fuzzystrmatch</td>
137
- <td class="tg-baqh">✔</td>
138
- <td class="tg-baqh">✔</td>
139
- <td class="tg-baqh">✔</td>
140
- <td class="tg-baqh">✔</td>
139
+ <td class="ok">✔</td>
140
+ <td class="ok">✔</td>
141
+ <td class="ok">✔</td>
142
+ <td class="ok">✔</td>
141
143
  </tr>
142
144
  <tr>
143
145
  <td class="tg-yw4l">REPLACE<br>column.replace("s","X")</td>
144
- <td class="tg-baqh">✔</td>
145
- <td class="tg-baqh">✔</td>
146
- <td class="tg-baqh">✔</td>
147
- <td class="tg-baqh">✔</td>
148
- <td class="tg-baqh">✔</td>
149
- <td class="tg-baqh">✔</td>
146
+ <td class="ok">✔</td>
147
+ <td class="ok">✔</td>
148
+ <td class="ok">✔</td>
149
+ <td class="ok">✔</td>
150
+ <td class="ok">✔</td>
151
+ <td class="ok">✔</td>
150
152
  </tr>
151
153
  <tr>
152
154
  <td class="tg-yw4l">REGEXP<br>column =~ "pattern"<br></td>
153
- <td class="tg-baqh">✔</td>
154
- <td class="tg-baqh">✔</td>
155
+ <td class="ok">✔</td>
156
+ <td class="ok">✔</td>
155
157
  <td class="tg-3oug">require pcre.so</td>
156
158
  <td class="tg-j6lv">REGEXP_LIKE</td>
157
159
  <td class="tg-j6lv">LIKE</td>
158
- <td class="tg-baqh">✔</td>
160
+ <td class="ok">✔</td>
159
161
  </tr>
160
162
  <tr>
161
163
  <td class="tg-yw4l">NOT_REGEXP<br>column != "pattern"</td>
162
- <td class="tg-baqh">✔</td>
163
- <td class="tg-baqh">✔<br></td>
164
+ <td class="ok">✔</td>
165
+ <td class="ok">✔<br></td>
164
166
  <td class="tg-3oug">require pcre.so</td>
165
167
  <td class="tg-j6lv">NOT REGEXP_LIKE </td>
166
168
  <td class="tg-j6lv">NOT LIKE</td>
167
- <td class="tg-baqh">✔</td>
169
+ <td class="ok">✔</td>
168
170
  </tr>
169
171
  <tr>
170
172
  <td class="tg-yw4l">ILIKE (in Arel6)<br/>column.imatches('%pattern')</td>
171
173
  <td class="tg-j6lv">LOWER() LIKE LOWER()</td>
172
- <td class="tg-baqh">✔</td>
173
- <td class="tg-baqh">✔</td>
174
+ <td class="ok">✔</td>
175
+ <td class="ok">✔</td>
174
176
  <td class="tg-j6lv">LOWER() LIKE LOWER()</td>
175
177
  <td class="tg-j6lv">LOWER() LIKE LOWER()</td>
176
178
  <td class="tg-j6lv">LOWER() LIKE LOWER()</td>
177
179
  </tr>
178
180
  <tr>
179
181
  <td class="tg-yw4l">TRIM (leading)<br>column.trim("LEADING","M")</td>
180
- <td class="tg-baqh">✔</td>
182
+ <td class="ok">✔</td>
181
183
  <td class="tg-j6lv">LTRIM()</td>
182
184
  <td class="tg-j6lv">LTRIM()</td>
183
- <td class="tg-baqh">✔</td>
184
- <td class="tg-baqh">✔</td>
185
+ <td class="ok">✔</td>
186
+ <td class="ok">✔</td>
185
187
  <td class="tg-j6lv">LTRIM()</td>
186
188
  </tr>
187
189
  <tr>
188
190
  <td class="tg-yw4l">TRIM (trailing)<br>column.trim("TRAILING","g")</td>
189
- <td class="tg-baqh">✔</td>
191
+ <td class="ok">✔</td>
190
192
  <td class="tg-j6lv">RTRIM()</td>
191
193
  <td class="tg-j6lv">RTRIM()</td>
192
- <td class="tg-baqh">✔</td>
193
- <td class="tg-baqh">✔</td>
194
+ <td class="ok">✔</td>
195
+ <td class="ok">✔</td>
194
196
  <td class="tg-j6lv">Rtrim()</td>
195
197
  </tr>
196
198
  <tr>
197
199
  <td class="tg-yw4l">TRIM (both)<br>column.trim("BOTH","e")</td>
198
- <td class="tg-baqh">✔</td>
200
+ <td class="ok">✔</td>
199
201
  <td class="tg-j6lv">TRIM()<br></td>
200
202
  <td class="tg-j6lv">TRIM()</td>
201
- <td class="tg-baqh">✔</td>
202
- <td class="tg-baqh">LTRIM(RTRIM())</td>
203
+ <td class="ok">✔</td>
204
+ <td class="tg-j6lv">LTRIM(RTRIM())</td>
203
205
  <td class="tg-j6lv">TRIM()</td>
204
206
  </tr>
205
207
  <tr>
206
- <th class="tg-4rp9" rowspan="6"><br><br><br><br><br><br><br>Date <br>functions</th>
208
+ <th class="tg-4rp9" rowspan="6"><div>Date functions</div></th>
207
209
  <td class="tg-yw4l">DATEADD<br>column + 2.year<br></td>
208
210
  <td class="tg-j6lv">DATE_ADD()<br></td>
209
- <td class="tg-baqh">✔</td>
210
- <td class="tg-baqh">✔</td>
211
- <td class="tg-baqh">✔</td>
212
- <td class="tg-baqh">✔</td>
211
+ <td class="ok">✔</td>
212
+ <td class="ok">✔</td>
213
+ <td class="ok">✔</td>
214
+ <td class="ok">✔</td>
213
215
  <td class="tg-j6lv">+</td>
214
216
  </tr>
215
217
  <tr>
216
218
  <td class="tg-yw4l">DATEDIFF<br>column - date<br></td>
217
219
  <td class="tg-j6lv">DATEDIFF()<br></td>
218
- <td class="tg-baqh">✔</td>
220
+ <td class="ok">✔</td>
219
221
  <td class="tg-j6lv">JULIANDAY() - JULIANDAY()</td>
220
222
  <td class="tg-j6lv"> -</td>
221
- <td class="tg-baqh">✔</td>
223
+ <td class="ok">✔</td>
222
224
  <td class="tg-j6lv">DAY()</td>
223
225
  </tr>
224
226
  <tr>
225
227
  <td class="tg-yw4l">DAY<br>column.day<br></td>
226
- <td class="tg-baqh">✔</td>
227
- <td class="tg-baqh">✔</td>
228
+ <td class="ok">✔</td>
229
+ <td class="ok">✔</td>
228
230
  <td class="tg-j6lv">STRFTIME()</td>
229
- <td class="tg-baqh">✔</td>
230
- <td class="tg-baqh">✔</td>
231
- <td class="tg-baqh">✔</td>
231
+ <td class="ok">✔</td>
232
+ <td class="ok">✔</td>
233
+ <td class="ok">✔</td>
232
234
  </tr>
233
235
  <tr>
234
236
  <td class="tg-yw4l">MONTH<br>column.month<br></td>
235
- <td class="tg-baqh">✔</td>
236
- <td class="tg-baqh">✔</td>
237
+ <td class="ok">✔</td>
238
+ <td class="ok">✔</td>
237
239
  <td class="tg-j6lv">STRFTIME()</td>
238
- <td class="tg-baqh">✔</td>
239
- <td class="tg-baqh">✔</td>
240
- <td class="tg-baqh">✔</td>
240
+ <td class="ok">✔</td>
241
+ <td class="ok">✔</td>
242
+ <td class="ok">✔</td>
241
243
  </tr>
242
244
  <tr>
243
245
  <td class="tg-yw4l">WEEK<br>column.week</td>
244
- <td class="tg-baqh">✔</td>
245
- <td class="tg-baqh">✔</td>
246
+ <td class="ok">✔</td>
247
+ <td class="ok">✔</td>
246
248
  <td class="tg-j6lv">STRFTIME()</td>
247
- <td class="tg-baqh">✔</td>
248
- <td class="tg-baqh">✔</td>
249
- <td class="tg-baqh">✔</td>
249
+ <td class="ok">✔</td>
250
+ <td class="ok">✔</td>
251
+ <td class="ok">✔</td>
250
252
  </tr>
251
253
  <tr>
252
254
  <td class="tg-yw4l">YEAR<br>column.year</td>
253
- <td class="tg-baqh">✔</td>
254
- <td class="tg-baqh">✔</td>
255
+ <td class="ok">✔</td>
256
+ <td class="ok">✔</td>
255
257
  <td class="tg-j6lv">STRFTIME()</td>
256
- <td class="tg-baqh">✔</td>
257
- <td class="tg-baqh">✔</td>
258
- <td class="tg-baqh">✔</td>
258
+ <td class="ok">✔</td>
259
+ <td class="ok">✔</td>
260
+ <td class="ok">✔</td>
259
261
  </tr>
260
262
  <tr>
261
- <th class="tg-72dn" rowspan="8"><br><br><br><br><br><br>Comparators<br>functions</th>
263
+ <th class="tg-72dn" rowspan="8"><div>Comparators functions</div></th>
262
264
  <td class="tg-yw4l">COALESCE<br>column.coalesce(var)</td>
263
- <td class="tg-baqh">✔</td>
264
- <td class="tg-baqh">✔</td>
265
- <td class="tg-baqh">✔</td>
266
- <td class="tg-baqh">✔</td>
267
- <td class="tg-baqh">✔</td>
268
- <td class="tg-baqh">✔</td>
265
+ <td class="ok">✔</td>
266
+ <td class="ok">✔</td>
267
+ <td class="ok">✔</td>
268
+ <td class="ok">✔</td>
269
+ <td class="ok">✔</td>
270
+ <td class="ok">✔</td>
269
271
  </tr>
270
272
  <tr>
271
273
  <td class="tg-yw4l">ISNULL<br>column.isnull()</td>
272
274
  <td class="tg-j6lv">IFNULL()</td>
273
- <td class="tg-baqh">✔</td>
274
- <td class="tg-baqh">✔</td>
275
+ <td class="ok">✔</td>
276
+ <td class="ok">✔</td>
275
277
  <td class="tg-j6lv">NVC()</td>
276
- <td class="tg-baqh">✔</td>
277
- <td class="tg-baqh">✔</td>
278
+ <td class="ok">✔</td>
279
+ <td class="ok">✔</td>
278
280
  </tr>
279
281
  <tr>
280
282
  <td class="tg-yw4l">==<br>column == integer</td>
281
- <td class="tg-baqh">✔</td>
282
- <td class="tg-baqh">✔</td>
283
- <td class="tg-baqh">✔</td>
284
- <td class="tg-baqh">✔</td>
285
- <td class="tg-baqh">✔</td>
286
- <td class="tg-baqh">✔</td>
283
+ <td class="ok">✔</td>
284
+ <td class="ok">✔</td>
285
+ <td class="ok">✔</td>
286
+ <td class="ok">✔</td>
287
+ <td class="ok">✔</td>
288
+ <td class="ok">✔</td>
287
289
  </tr>
288
290
  <tr>
289
291
  <td class="tg-yw4l">!=<br>column != integer</td>
290
- <td class="tg-baqh">✔</td>
291
- <td class="tg-baqh">✔</td>
292
- <td class="tg-baqh">✔</td>
293
- <td class="tg-baqh">✔</td>
294
- <td class="tg-baqh">✔</td>
295
- <td class="tg-baqh">✔</td>
292
+ <td class="ok">✔</td>
293
+ <td class="ok">✔</td>
294
+ <td class="ok">✔</td>
295
+ <td class="ok">✔</td>
296
+ <td class="ok">✔</td>
297
+ <td class="ok">✔</td>
296
298
  </tr>
297
299
  <tr>
298
300
  <td class="tg-yw4l">&gt;<br>column &gt; integer</td>
299
- <td class="tg-baqh">✔</td>
300
- <td class="tg-baqh">✔</td>
301
- <td class="tg-baqh">✔</td>
302
- <td class="tg-baqh">✔</td>
303
- <td class="tg-baqh">✔</td>
304
- <td class="tg-baqh">✔</td>
301
+ <td class="ok">✔</td>
302
+ <td class="ok">✔</td>
303
+ <td class="ok">✔</td>
304
+ <td class="ok">✔</td>
305
+ <td class="ok">✔</td>
306
+ <td class="ok">✔</td>
305
307
  </tr>
306
308
  <tr>
307
309
  <td class="tg-yw4l">&gt;=<br>column &gt;= integer</td>
308
- <td class="tg-baqh">✔</td>
309
- <td class="tg-baqh">✔</td>
310
- <td class="tg-baqh">✔</td>
311
- <td class="tg-baqh">✔</td>
312
- <td class="tg-baqh">✔</td>
313
- <td class="tg-baqh">✔</td>
310
+ <td class="ok">✔</td>
311
+ <td class="ok">✔</td>
312
+ <td class="ok">✔</td>
313
+ <td class="ok">✔</td>
314
+ <td class="ok">✔</td>
315
+ <td class="ok">✔</td>
314
316
  </tr>
315
317
  <tr>
316
318
  <td class="tg-yw4l">&lt; <br>column &lt; integer</td>
317
- <td class="tg-baqh">✔</td>
318
- <td class="tg-baqh">✔</td>
319
- <td class="tg-baqh">✔</td>
320
- <td class="tg-baqh">✔</td>
321
- <td class="tg-baqh">✔</td>
322
- <td class="tg-baqh">✔</td>
319
+ <td class="ok">✔</td>
320
+ <td class="ok">✔</td>
321
+ <td class="ok">✔</td>
322
+ <td class="ok">✔</td>
323
+ <td class="ok">✔</td>
324
+ <td class="ok">✔</td>
323
325
  </tr>
324
326
  <tr>
325
327
  <td class="tg-yw4l">&lt;=<br>column &lt;= integer</td>
326
- <td class="tg-baqh">✔</td>
327
- <td class="tg-baqh">✔</td>
328
- <td class="tg-baqh">✔</td>
329
- <td class="tg-baqh">✔</td>
330
- <td class="tg-baqh">✔</td>
331
- <td class="tg-baqh">✔</td>
328
+ <td class="ok">✔</td>
329
+ <td class="ok">✔</td>
330
+ <td class="ok">✔</td>
331
+ <td class="ok">✔</td>
332
+ <td class="ok">✔</td>
333
+ <td class="ok">✔</td>
332
334
  </tr>
333
335
  <tr>
334
- <th class="tg-9hbo" rowspan="2">Boolean <br>functions</th>
336
+ <th class="tg-9hbo" rowspan="2"><div>Boolean <br/> functions</div></th>
335
337
  <td class="tg-yw4l">OR ( ⋁ )<br>column.eq(var).⋁(column.eq(var))</td>
336
- <td class="tg-baqh">✔</td>
337
- <td class="tg-baqh">✔</td>
338
- <td class="tg-baqh">✔</td>
339
- <td class="tg-baqh">✔</td>
340
- <td class="tg-baqh">✔</td>
341
- <td class="tg-baqh">✔</td>
338
+ <td class="ok">✔</td>
339
+ <td class="ok">✔</td>
340
+ <td class="ok">✔</td>
341
+ <td class="ok">✔</td>
342
+ <td class="ok">✔</td>
343
+ <td class="ok">✔</td>
342
344
  </tr>
343
345
  <tr>
344
346
  <td class="tg-yw4l">AND ( ⋀ )<br>column.eq(var).⋀(column.eq(var))</td>
345
- <td class="tg-baqh">✔</td>
346
- <td class="tg-baqh">✔</td>
347
- <td class="tg-baqh">✔</td>
348
- <td class="tg-baqh">✔</td>
349
- <td class="tg-baqh">✔</td>
350
- <td class="tg-baqh">✔</td>
347
+ <td class="ok">✔</td>
348
+ <td class="ok">✔</td>
349
+ <td class="ok">✔</td>
350
+ <td class="ok">✔</td>
351
+ <td class="ok">✔</td>
352
+ <td class="ok">✔</td>
351
353
  </tr>
352
354
  <tr>
353
- <th class="bulk_insert">Bulk Insert</th>
355
+ <th class="bulk_insert" rowspan="1"><div>Bulk <br/> Insert</div></th>
354
356
  <td class="tg-yw4l">insert_manager.bulk_insert(@cols, @data)</td>
355
- <td class="tg-baqh">✔</td>
356
- <td class="tg-baqh">✔</td>
357
- <td class="tg-baqh">✔</td>
358
- <td class="tg-baqh">✔</td>
359
- <td class="tg-baqh">✔</td>
360
- <td class="tg-baqh">✔</td>
357
+ <td class="ok">✔</td>
358
+ <td class="ok">✔</td>
359
+ <td class="ok">✔</td>
360
+ <td class="ok">✔</td>
361
+ <td class="ok">✔</td>
362
+ <td class="ok">✔</td>
361
363
  </tr>
362
364
  </tbody>
363
365
  </table>