ronin-code-sql 2.0.0.beta1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (62) hide show
  1. checksums.yaml +7 -0
  2. data/.document +4 -0
  3. data/.editorconfig +11 -0
  4. data/.github/workflows/ruby.yml +27 -0
  5. data/.gitignore +11 -0
  6. data/.mailmap +1 -0
  7. data/.rspec +1 -0
  8. data/.ruby-version +1 -0
  9. data/.yardopts +1 -0
  10. data/COPYING.txt +165 -0
  11. data/ChangeLog.md +104 -0
  12. data/Gemfile +28 -0
  13. data/README.md +212 -0
  14. data/Rakefile +30 -0
  15. data/gemspec.yml +25 -0
  16. data/lib/ronin/code/sql/binary_expr.rb +53 -0
  17. data/lib/ronin/code/sql/clause.rb +74 -0
  18. data/lib/ronin/code/sql/clauses.rb +310 -0
  19. data/lib/ronin/code/sql/emittable.rb +88 -0
  20. data/lib/ronin/code/sql/emitter.rb +406 -0
  21. data/lib/ronin/code/sql/field.rb +110 -0
  22. data/lib/ronin/code/sql/fields.rb +82 -0
  23. data/lib/ronin/code/sql/function.rb +53 -0
  24. data/lib/ronin/code/sql/functions.rb +1265 -0
  25. data/lib/ronin/code/sql/injection.rb +168 -0
  26. data/lib/ronin/code/sql/injection_expr.rb +113 -0
  27. data/lib/ronin/code/sql/literal.rb +40 -0
  28. data/lib/ronin/code/sql/literals.rb +83 -0
  29. data/lib/ronin/code/sql/operators.rb +384 -0
  30. data/lib/ronin/code/sql/statement.rb +72 -0
  31. data/lib/ronin/code/sql/statement_list.rb +112 -0
  32. data/lib/ronin/code/sql/statements.rb +117 -0
  33. data/lib/ronin/code/sql/unary_expr.rb +38 -0
  34. data/lib/ronin/code/sql/version.rb +28 -0
  35. data/lib/ronin/code/sql.rb +96 -0
  36. data/ronin-code-sql.gemspec +62 -0
  37. data/spec/spec_helper.rb +3 -0
  38. data/spec/sql/binary_expr_examples.rb +25 -0
  39. data/spec/sql/binary_expr_spec.rb +5 -0
  40. data/spec/sql/clause_examples.rb +43 -0
  41. data/spec/sql/clause_spec.rb +31 -0
  42. data/spec/sql/clauses_spec.rb +47 -0
  43. data/spec/sql/emittable_spec.rb +41 -0
  44. data/spec/sql/emitter_spec.rb +533 -0
  45. data/spec/sql/field_spec.rb +103 -0
  46. data/spec/sql/fields_spec.rb +40 -0
  47. data/spec/sql/function_examples.rb +30 -0
  48. data/spec/sql/function_spec.rb +25 -0
  49. data/spec/sql/functions_spec.rb +113 -0
  50. data/spec/sql/injection_expr_spec.rb +98 -0
  51. data/spec/sql/injection_spec.rb +172 -0
  52. data/spec/sql/literal_spec.rb +5 -0
  53. data/spec/sql/literals_spec.rb +46 -0
  54. data/spec/sql/operators_spec.rb +44 -0
  55. data/spec/sql/statement_examples.rb +39 -0
  56. data/spec/sql/statement_list_spec.rb +48 -0
  57. data/spec/sql/statement_spec.rb +38 -0
  58. data/spec/sql/statements_spec.rb +22 -0
  59. data/spec/sql/unary_expr_examples.rb +20 -0
  60. data/spec/sql/unary_expr_spec.rb +5 -0
  61. data/spec/sql_spec.rb +18 -0
  62. metadata +157 -0
@@ -0,0 +1,1265 @@
1
+ # frozen_string_literal: true
2
+ #
3
+ # ronin-code-sql - A Ruby DSL for crafting SQL Injections.
4
+ #
5
+ # Copyright (c) 2007-2022 Hal Brodigan (postmodern.mod3 at gmail.com)
6
+ #
7
+ # ronin-code-sql is free software: you can redistribute it and/or modify
8
+ # it under the terms of the GNU Lesser General Public License as published
9
+ # by the Free Software Foundation, either version 3 of the License, or
10
+ # (at your option) any later version.
11
+ #
12
+ # ronin-code-sql is distributed in the hope that it will be useful,
13
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ # GNU Lesser General Public License for more details.
16
+ #
17
+ # You should have received a copy of the GNU Lesser General Public License
18
+ # along with ronin-code-sql. If not, see <https://www.gnu.org/licenses/>.
19
+ #
20
+
21
+ require 'ronin/code/sql/function'
22
+
23
+ module Ronin
24
+ module Code
25
+ module SQL
26
+ #
27
+ # Methods for creating common SQL {Function Functions}.
28
+ #
29
+ # @api public
30
+ #
31
+ module Functions
32
+ #
33
+ # @!group Aggregate Functions
34
+ #
35
+
36
+ #
37
+ # The `COUNT` function.
38
+ #
39
+ # @param [Field, Symbol] field
40
+ # The field to aggregate.
41
+ #
42
+ # @return [Function]
43
+ # The new function.
44
+ #
45
+ def count(field=:*)
46
+ Function.new(:COUNT,field)
47
+ end
48
+
49
+ #
50
+ # The `MAX` function.
51
+ #
52
+ # @param [Field, Symbol] field
53
+ # The field to aggregate.
54
+ #
55
+ # @return [Function]
56
+ # The new function.
57
+ #
58
+ def max(field)
59
+ Function.new(:MAX,field)
60
+ end
61
+
62
+ #
63
+ # The `MIN` function.
64
+ #
65
+ # @param [Field, Symbol] field
66
+ # The field to aggregate.
67
+ #
68
+ # @return [Function]
69
+ # The new function.
70
+ #
71
+ def min(field)
72
+ Function.new(:MIN,field)
73
+ end
74
+
75
+ #
76
+ # The `AVG` function.
77
+ #
78
+ # @param [Field, Symbol] field
79
+ # The field to aggregate.
80
+ #
81
+ # @return [Function]
82
+ # The new function.
83
+ #
84
+ def avg(field)
85
+ Function.new(:AVG,field)
86
+ end
87
+
88
+ #
89
+ # The `SUM` function.
90
+ #
91
+ # @param [Field, Symbol] field
92
+ # The field to aggregate.
93
+ #
94
+ # @return [Function]
95
+ # The new function.
96
+ #
97
+ def sum(field)
98
+ Function.new(:SUM,field)
99
+ end
100
+
101
+ #
102
+ # The `SQRT` function.
103
+ #
104
+ # @param [Field, Symbol] field
105
+ # The field to aggregate.
106
+ #
107
+ # @return [Function]
108
+ # The new function.
109
+ #
110
+ def sqrt(field)
111
+ Function.new(:SQRT,field)
112
+ end
113
+
114
+ #
115
+ # The `RAND` function.
116
+ #
117
+ # @param [Field, Symbol] field
118
+ # The field to aggregate.
119
+ #
120
+ # @return [Function]
121
+ # The new function.
122
+ #
123
+ def rand(field)
124
+ Function.new(:RAND,field)
125
+ end
126
+
127
+ #
128
+ # @!group Numeric Functions
129
+ #
130
+
131
+ #
132
+ # The `ABS` function.
133
+ #
134
+ # @param [Field, Function, Symbol, Numeric] x
135
+ #
136
+ # @return [Function]
137
+ # The new function.
138
+ #
139
+ def abs(x)
140
+ Function.new(:ABS,x)
141
+ end
142
+
143
+ #
144
+ # The `ACOS` function.
145
+ #
146
+ # @param [Field, Function, Symbol, Numeric] x
147
+ #
148
+ # @return [Function]
149
+ # The new function.
150
+ #
151
+ def acos(x)
152
+ Function.new(:ACOS,x)
153
+ end
154
+
155
+ #
156
+ # The `ASIN` function.
157
+ #
158
+ # @param [Field, Function, Symbol, Numeric] x
159
+ #
160
+ # @return [Function]
161
+ # The new function.
162
+ #
163
+ def asin(x)
164
+ Function.new(:ASIN,x)
165
+ end
166
+
167
+ #
168
+ # The `ATAN` function.
169
+ #
170
+ # @param [Field, Function, Symbol, Numeric] x
171
+ #
172
+ # @return [Function]
173
+ # The new function.
174
+ #
175
+ def atan(x)
176
+ Function.new(:ATAN,x)
177
+ end
178
+
179
+ #
180
+ # The `ATAN2` function.
181
+ #
182
+ # @param [Field, Function, Symbol, Numeric] x
183
+ #
184
+ # @param [Field, Function, Symbol, Numeric] y
185
+ #
186
+ # @return [Function]
187
+ # The new function.
188
+ #
189
+ def atan2(y,x)
190
+ Function.new(:ATAN2,y,x)
191
+ end
192
+
193
+ #
194
+ # The `BIT_AND` function.
195
+ #
196
+ # @param [Field, Function, Symbol, Numeric] x
197
+ #
198
+ # @return [Function]
199
+ # The new function.
200
+ #
201
+ def bit_and(x)
202
+ Function.new(:BIT_AND,x)
203
+ end
204
+
205
+ #
206
+ # The `BIT_COUNT` function.
207
+ #
208
+ # @param [Field, Function, Symbol, Numeric] x
209
+ #
210
+ # @return [Function]
211
+ # The new function.
212
+ #
213
+ def bit_count(x)
214
+ Function.new(:BIT_COUNT,x)
215
+ end
216
+
217
+ #
218
+ # The `BIT_OR` function.
219
+ #
220
+ # @param [Field, Function, Symbol, Numeric] x
221
+ #
222
+ # @return [Function]
223
+ # The new function.
224
+ #
225
+ def bit_or(x)
226
+ Function.new(:BIT_OR,x)
227
+ end
228
+
229
+ #
230
+ # The `CEIL` function.
231
+ #
232
+ # @param [Field, Function, Symbol, Numeric] x
233
+ #
234
+ # @return [Function]
235
+ # The new function.
236
+ #
237
+ def ceil(x)
238
+ Function.new(:CEIL,x)
239
+ end
240
+
241
+ #
242
+ # The `CEILING` function.
243
+ #
244
+ # @param [Field, Function, Symbol, Numeric] x
245
+ #
246
+ # @return [Function]
247
+ # The new function.
248
+ #
249
+ def ceiling(x)
250
+ Function.new(:CEILING,x)
251
+ end
252
+
253
+ #
254
+ # The `COS` function.
255
+ #
256
+ # @param [Field, Function, Symbol, Numeric] x
257
+ #
258
+ # @return [Function]
259
+ # The new function.
260
+ #
261
+ def cos(x)
262
+ Function.new(:COS,x)
263
+ end
264
+
265
+ #
266
+ # The `COT` function.
267
+ #
268
+ # @param [Field, Function, Symbol, Numeric] x
269
+ #
270
+ # @return [Function]
271
+ # The new function.
272
+ #
273
+ def cot(x)
274
+ Function.new(:COT,x)
275
+ end
276
+
277
+ #
278
+ # The `DEGREES` function.
279
+ #
280
+ # @param [Field, Function, Symbol, Numeric] x
281
+ #
282
+ # @return [Function]
283
+ # The new function.
284
+ #
285
+ def degrees(x)
286
+ Function.new(:DEGREES,x)
287
+ end
288
+
289
+ #
290
+ # The `EXP` function.
291
+ #
292
+ # @param [Field, Function, Symbol, Numeric] x
293
+ #
294
+ # @return [Function]
295
+ # The new function.
296
+ #
297
+ def exp(x)
298
+ Function.new(:EXP,x)
299
+ end
300
+
301
+ #
302
+ # The `FLOOR` function.
303
+ #
304
+ # @param [Field, Function, Symbol, Numeric] x
305
+ #
306
+ # @return [Function]
307
+ # The new function.
308
+ #
309
+ def floor(x)
310
+ Function.new(:FLOOR,x)
311
+ end
312
+
313
+ #
314
+ # The `FORMAT` function.
315
+ #
316
+ # @param [Field, Function, Symbol, String, Numeric] value
317
+ #
318
+ # @param [Field, Function, Symbol, String] pattern
319
+ #
320
+ # @return [Function]
321
+ # The new function.
322
+ #
323
+ def format(value,pattern)
324
+ Function.new(:FORMAT,value,pattern)
325
+ end
326
+
327
+ #
328
+ # The `GREATEST` function.
329
+ #
330
+ # @param [Array<Field, Function, Symbol, Numeric>] values
331
+ #
332
+ # @return [Function]
333
+ # The new function.
334
+ #
335
+ def greatest(*values)
336
+ Function.new(:GREATEST,*values)
337
+ end
338
+
339
+ #
340
+ # The `INTERVAL` function.
341
+ #
342
+ # @param [Array<Field, Function, Symbol, Numeric>] values
343
+ #
344
+ # @return [Function]
345
+ # The new function.
346
+ #
347
+ def interval(*values)
348
+ Function.new(:INTERVAL,*values)
349
+ end
350
+
351
+ #
352
+ # The `LEAST` function.
353
+ #
354
+ # @param [Array<Field, Function, Symbol, Numeric>] values
355
+ #
356
+ # @return [Function]
357
+ # The new function.
358
+ #
359
+ def least(*values)
360
+ Function.new(:LEAST,*values)
361
+ end
362
+
363
+ #
364
+ # The `LOG` function.
365
+ #
366
+ # @param [Field, Function, Symbol, Numeric, nil] b
367
+ #
368
+ # @param [Field, Function, Symbol, Numeric] x
369
+ #
370
+ # @return [Function]
371
+ # The new function.
372
+ #
373
+ def log(b=nil,x)
374
+ if b then Function.new(:LOG,b,x)
375
+ else Function.new(:LOG,x)
376
+ end
377
+ end
378
+
379
+ #
380
+ # The `LOG10` function.
381
+ #
382
+ # @param [Field, Function, Symbol, Numeric] x
383
+ #
384
+ # @return [Function]
385
+ # The new function.
386
+ #
387
+ def log10(x)
388
+ Function.new(:LOG10,x)
389
+ end
390
+
391
+ #
392
+ # The `MOD` function.
393
+ #
394
+ # @param [Field, Function, Symbol, Numeric] n
395
+ #
396
+ # @param [Field, Function, Symbol, Numeric] m
397
+ #
398
+ # @return [Function]
399
+ # The new function.
400
+ #
401
+ def mod(n,m)
402
+ Function.new(:MOD,n,m)
403
+ end
404
+
405
+ #
406
+ # The `PI` function.
407
+ #
408
+ # @return [Function]
409
+ # The new function.
410
+ #
411
+ def pi
412
+ Function.new(:PI)
413
+ end
414
+
415
+ #
416
+ # The `POW` function.
417
+ #
418
+ # @param [Field, Function, Symbol, Numeric] x
419
+ #
420
+ # @param [Field, Function, Symbol, Numeric] y
421
+ #
422
+ # @return [Function]
423
+ # The new function.
424
+ #
425
+ def pow(x,y)
426
+ Function.new(:POW,x,y)
427
+ end
428
+
429
+ #
430
+ # The `POWER` function.
431
+ #
432
+ # @param [Field, Function, Symbol, Numeric] x
433
+ #
434
+ # @param [Field, Function, Symbol, Numeric] y
435
+ #
436
+ # @return [Function]
437
+ # The new function.
438
+ #
439
+ def power(x,y)
440
+ Function.new(:POWER,x,y)
441
+ end
442
+
443
+ #
444
+ # The `RADIANS` function.
445
+ #
446
+ # @param [Field, Function, Symbol, Numeric] x
447
+ #
448
+ # @return [Function]
449
+ # The new function.
450
+ #
451
+ def radians(x)
452
+ Function.new(:RADIANS,x)
453
+ end
454
+
455
+ #
456
+ # The `RANDOM` function.
457
+ #
458
+ # @return [Function]
459
+ # The new function.
460
+ #
461
+ def random
462
+ Function.new(:RANDOM)
463
+ end
464
+
465
+ #
466
+ # The `ROUND` function.
467
+ #
468
+ # @param [Field, Function, Symbol, Numeric] x
469
+ #
470
+ # @param [Field, Function, Symbol, Numeric, nil] d
471
+ #
472
+ # @return [Function]
473
+ # The new function.
474
+ #
475
+ def round(x,d=nil)
476
+ if d then Function.new(:ROUND,x,d)
477
+ else Function.new(:ROUND,x)
478
+ end
479
+ end
480
+
481
+ #
482
+ # The `SIGN` function.
483
+ #
484
+ # @param [Field, Function, Symbol, Numeric] x
485
+ #
486
+ # @return [Function]
487
+ # The new function.
488
+ #
489
+ def sign(x)
490
+ Function.new(:SIGN,x)
491
+ end
492
+
493
+ #
494
+ # The `SIN` function.
495
+ #
496
+ # @param [Field, Function, Symbol, Numeric] x
497
+ #
498
+ # @return [Function]
499
+ # The new function.
500
+ #
501
+ def sin(x)
502
+ Function.new(:SIN,x)
503
+ end
504
+
505
+ #
506
+ # The `SQRT` function.
507
+ #
508
+ # @param [Field, Function, Symbol, Numeric] x
509
+ #
510
+ # @return [Function]
511
+ # The new function.
512
+ #
513
+ def sqrt(x)
514
+ Function.new(:SQRT,x)
515
+ end
516
+
517
+ #
518
+ # The `STD` function.
519
+ #
520
+ # @param [Field, Symbol] field
521
+ #
522
+ # @return [Function]
523
+ # The new function.
524
+ #
525
+ def std(field)
526
+ Function.new(:STD,field)
527
+ end
528
+
529
+ #
530
+ # The `STDDEV` function.
531
+ #
532
+ # @param [Field, Symbol] field
533
+ #
534
+ # @return [Function]
535
+ # The new function.
536
+ #
537
+ def stddev(field)
538
+ Function.new(:STDDEV,field)
539
+ end
540
+
541
+ #
542
+ # The `TAN` function.
543
+ #
544
+ # @param [Field, Function, Symbol, Numeric] x
545
+ #
546
+ # @return [Function]
547
+ # The new function.
548
+ #
549
+ def tan(x)
550
+ Function.new(:TAN,x)
551
+ end
552
+
553
+ #
554
+ # The `TRUNCATE` function.
555
+ #
556
+ # @param [Field, Function, Symbol, Numeric] x
557
+ #
558
+ # @param [Field, Function, Symbol, Numeric] d
559
+ #
560
+ # @return [Function]
561
+ # The new function.
562
+ #
563
+ def truncate(x,d)
564
+ Function.new(:TRUNCATE,x,d)
565
+ end
566
+
567
+ #
568
+ # @!group String Functions
569
+ #
570
+
571
+ #
572
+ # The `ASCII` function.
573
+ #
574
+ # @param [Field, Function, Symbol, String] string
575
+ #
576
+ # @return [Function]
577
+ # The new function.
578
+ #
579
+ def ascii(string)
580
+ Function.new(:ASCII,string)
581
+ end
582
+
583
+ #
584
+ # The `BIN` function.
585
+ #
586
+ # @param [Field, Function, Symbol, Numeric] n
587
+ #
588
+ # @return [Function]
589
+ # The new function.
590
+ #
591
+ def bin(n)
592
+ Function.new(:BIN,n)
593
+ end
594
+
595
+ #
596
+ # The `BIT_LENGTH` function.
597
+ #
598
+ # @param [Field, Function, Symbol, String] string
599
+ #
600
+ # @return [Function]
601
+ # The new function.
602
+ #
603
+ def bit_length(string)
604
+ Function.new(:BIT_LENGTH,string)
605
+ end
606
+
607
+ #
608
+ # The `CHAR` function.
609
+ #
610
+ # @param [Array<Numeric>] bytes
611
+ #
612
+ # @return [Function]
613
+ # The new function.
614
+ #
615
+ def char(*bytes)
616
+ Function.new(:CHAR,*bytes)
617
+ end
618
+
619
+ #
620
+ # The `CHAR_LENGTH` function.
621
+ #
622
+ # @param [Field, Function, Symbol, String] string
623
+ #
624
+ # @return [Function]
625
+ # The new function.
626
+ #
627
+ def char_length(string)
628
+ Function.new(:CHAR_LENGTH,string)
629
+ end
630
+
631
+ #
632
+ # The `CHARACTER_LENGTH` function.
633
+ #
634
+ # @param [Field, Function, Symbol, String] string
635
+ #
636
+ # @return [Function]
637
+ # The new function.
638
+ #
639
+ def character_length(string)
640
+ Function.new(:CHARACTER_LENGTH,string)
641
+ end
642
+
643
+ #
644
+ # The `CONCAT` function.
645
+ #
646
+ # @param [Array<Field, Function, Symbol, String>] strings
647
+ #
648
+ # @return [Function]
649
+ # The new function.
650
+ #
651
+ def concat(*strings)
652
+ Function.new(:CONCAT,*strings)
653
+ end
654
+
655
+ #
656
+ # The `CONCAT_WS` function.
657
+ #
658
+ # @param [Field, Function, Symbol, String] separator
659
+ #
660
+ # @param [Array<Field, Function, Symbol, String>] strings
661
+ #
662
+ # @return [Function]
663
+ # The new function.
664
+ #
665
+ def concat_ws(separator,*strings)
666
+ Function.new(:CONCAT_WS,separator,*strings)
667
+ end
668
+
669
+ #
670
+ # The `CONV` function.
671
+ #
672
+ # @param [Field, Function, Symbol, Numeric] number
673
+ #
674
+ # @param [Field, Function, Symbol, Numeric] from_base
675
+ #
676
+ # @param [Field, Function, Symbol, Numeric] to_base
677
+ #
678
+ # @return [Function]
679
+ # The new function.
680
+ #
681
+ def conv(number,from_base,to_base)
682
+ Function.new(:CONV,number,from_base,to_base)
683
+ end
684
+
685
+ #
686
+ # The `ELT` function.
687
+ #
688
+ # @param [Field, Function, Symbol, Numeric] index
689
+ #
690
+ # @param [Array<Field, Function, Symbol, String>] strings
691
+ #
692
+ # @return [Function]
693
+ # The new function.
694
+ #
695
+ def elt(index,*strings)
696
+ Function.new(:ELT,index,*strings)
697
+ end
698
+
699
+ #
700
+ # The `EXPORT_SET` function.
701
+ #
702
+ # @param [Field, Function, Symbol, Numeric] bits
703
+ #
704
+ # @param [Field, Function, Symbol, String] on
705
+ #
706
+ # @param [Field, Function, Symbol, String] off
707
+ #
708
+ # @param [Field, Function, Symbol, String, nil] separator
709
+ #
710
+ # @param [Field, Function, Symbol, Numeric, nil] number_of_bits
711
+ #
712
+ # @return [Function]
713
+ # The new function.
714
+ #
715
+ def export_set(bits,on,off,separator=nil,number_of_bits=nil)
716
+ if (separator && number_of_bits)
717
+ Function.new(:EXPORT_SET,bits,on,off,separator,number_of_bits)
718
+ elsif separator
719
+ Function.new(:EXPORT_SET,bits,on,off,separator)
720
+ else
721
+ Function.new(:EXPORT_SET,bits,on,off)
722
+ end
723
+ end
724
+
725
+ #
726
+ # The `FIELD` function.
727
+ #
728
+ # @param [Array<Field, Function, Symbol, String>] strings
729
+ #
730
+ # @return [Function]
731
+ # The new function.
732
+ #
733
+ def field(*strings)
734
+ Function.new(:FIELD,*strings)
735
+ end
736
+
737
+ #
738
+ # The `FIND_IN_SET` function.
739
+ #
740
+ # @param [Field, Function, Symbol, String] string
741
+ #
742
+ # @param [Array<Field, Function, Symbol, String>] set
743
+ #
744
+ # @return [Function]
745
+ # The new function.
746
+ #
747
+ def find_in_set(string,set)
748
+ Function.new(:FIND_IN_SET,string,set)
749
+ end
750
+
751
+ #
752
+ # The `GLOB` function.
753
+ #
754
+ # @param [Field, Function, Symbol, String] pattern
755
+ #
756
+ # @param [Field, Function, Symbol, String] string
757
+ #
758
+ # @return [Function]
759
+ # The new function.
760
+ #
761
+ def glob(pattern,string)
762
+ Function.new(:GLOB,pattern,string)
763
+ end
764
+
765
+ #
766
+ # The `HEX` function.
767
+ #
768
+ # @param [Field, Function, Symbol, Numeric, String] value
769
+ #
770
+ # @return [Function]
771
+ # The new function.
772
+ #
773
+ def hex(value)
774
+ Function.new(:HEX,value)
775
+ end
776
+
777
+ #
778
+ # The `INSERT` function.
779
+ #
780
+ # @param [Field, Function, Symbol, String] string
781
+ #
782
+ # @param [Field, Function, Symbol, Numeric] position
783
+ #
784
+ # @param [Field, Function, Symbol, Numeric] length
785
+ #
786
+ # @param [Field, Function, Symbol, String] new_string
787
+ #
788
+ # @return [Function]
789
+ # The new function.
790
+ #
791
+ def insert(string,position,length,new_string)
792
+ Function.new(:INSERT,string,position,length,new_string)
793
+ end
794
+
795
+ #
796
+ # The `INSTR` function.
797
+ #
798
+ # @param [Field, Function, Symbol, String] string
799
+ #
800
+ # @param [Field, Function, Symbol, String] sub_string
801
+ #
802
+ # @return [Function]
803
+ # The new function.
804
+ #
805
+ def instr(string,sub_string)
806
+ Function.new(:INSTR,string,sub_string)
807
+ end
808
+
809
+ #
810
+ # The `LCASE` function.
811
+ #
812
+ # @param [Field, Function, Symbol, String] string
813
+ #
814
+ # @return [Function]
815
+ # The new function.
816
+ #
817
+ def lcase(string)
818
+ Function.new(:LCASE,string)
819
+ end
820
+
821
+ #
822
+ # The `LEFT` function.
823
+ #
824
+ # @param [Field, Function, Symbol, String] string
825
+ #
826
+ # @param [Field, Function, Symbol, Numeric] length
827
+ #
828
+ # @return [Function]
829
+ # The new function.
830
+ #
831
+ def left(string,length)
832
+ Function.new(:LEFT,string,length)
833
+ end
834
+
835
+ #
836
+ # The `LENGTH` function.
837
+ #
838
+ # @param [Field, Function, Symbol, String] string
839
+ #
840
+ # @return [Function]
841
+ # The new function.
842
+ #
843
+ def length(string)
844
+ Function.new(:LENGTH,string)
845
+ end
846
+
847
+ #
848
+ # The `LIKE` function.
849
+ #
850
+ # @return [Function]
851
+ # The new function.
852
+ #
853
+ def like(x,y,options=nil)
854
+ if options then Function.new(:LIKE,x,y,options)
855
+ else Function.new(:LIKE,x,y)
856
+ end
857
+ end
858
+
859
+ #
860
+ # The `LOAD_FILE` function.
861
+ #
862
+ # @param [Field, Function, Symbol, String] file_name
863
+ #
864
+ # @return [Function]
865
+ # The new function.
866
+ #
867
+ def load_file(file_name)
868
+ Function.new(:LOAD_FILE,file_name)
869
+ end
870
+
871
+ #
872
+ # The `LOCATE` function.
873
+ #
874
+ # @param [Field, Function, Symbol, String] substring
875
+ #
876
+ # @param [Field, Function, Symbol, String] string
877
+ #
878
+ # @param [Field, Function, Symbol, Numeric, nil] pos
879
+ #
880
+ # @return [Function]
881
+ # The new function.
882
+ #
883
+ def locate(substring,string,pos=nil)
884
+ if pos then Function.new(:LOCATE,substring,string,pos)
885
+ else Function.new(:LOCATE,substring,string)
886
+ end
887
+ end
888
+
889
+ #
890
+ # The `LOWER` function.
891
+ #
892
+ # @param [Field, Function, Symbol, String] string
893
+ #
894
+ # @return [Function]
895
+ # The new function.
896
+ #
897
+ def lower(string)
898
+ Function.new(:LOWER,string)
899
+ end
900
+
901
+ #
902
+ # The `LPAD` function.
903
+ #
904
+ # @param [Field, Function, Symbol, String] string
905
+ #
906
+ # @param [Field, Function, Symbol, Numeric] length
907
+ #
908
+ # @param [Field, Function, Symbol, String] pad_string
909
+ #
910
+ # @return [Function]
911
+ # The new function.
912
+ #
913
+ def lpad(string,length,pad_string)
914
+ Function.new(:LPAD,string,length,pad_string)
915
+ end
916
+
917
+ #
918
+ # The `LTRIM` function.
919
+ #
920
+ # @param [Field, Function, Symbol, String] string
921
+ #
922
+ # @return [Function]
923
+ # The new function.
924
+ #
925
+ def ltrim(string)
926
+ Function.new(:LTRIM,string)
927
+ end
928
+
929
+ #
930
+ # The `MAKE_SET` function.
931
+ #
932
+ # @param [Field, Function, Symbol, Numeric] bits
933
+ #
934
+ # @param [Array<Field, Function, Symbol, String>] strings
935
+ #
936
+ # @return [Function]
937
+ # The new function.
938
+ #
939
+ def make_set(bits,*strings)
940
+ Function.new(:MAKE_SET,bits,*strings)
941
+ end
942
+
943
+ #
944
+ # The `MID` function.
945
+ #
946
+ # @param [Field, Function, Symbol, String] string
947
+ #
948
+ # @param [Field, Function, Symbol, Numeric] position
949
+ #
950
+ # @param [Field, Function, Symbol, Numeric] length
951
+ #
952
+ # @return [Function]
953
+ # The new function.
954
+ #
955
+ def mid(string,position,length)
956
+ Function.new(:MID,string,position,length)
957
+ end
958
+
959
+ #
960
+ # The `OCT` function.
961
+ #
962
+ # @param [Field, Function, Symbol, Numeric] number
963
+ #
964
+ # @return [Function]
965
+ # The new function.
966
+ #
967
+ def oct(number)
968
+ Function.new(:OCT,number)
969
+ end
970
+
971
+ #
972
+ # The `OCTET_LENGTH` function.
973
+ #
974
+ # @param [Field, Function, Symbol, String] string
975
+ #
976
+ # @return [Function]
977
+ # The new function.
978
+ #
979
+ def octet_length(string)
980
+ Function.new(:OCTET_LENGTH,string)
981
+ end
982
+
983
+ #
984
+ # The `ORD` function.
985
+ #
986
+ # @param [Field, Function, Symbol, String] string
987
+ #
988
+ # @return [Function]
989
+ # The new function.
990
+ #
991
+ def ord(string)
992
+ Function.new(:ORD,string)
993
+ end
994
+
995
+ #
996
+ # The `POSITION` function.
997
+ #
998
+ # @param [BinaryExpr] expr
999
+ #
1000
+ # @return [Function]
1001
+ # The new function.
1002
+ #
1003
+ def position(expr)
1004
+ Function.new(:POSITION,expr)
1005
+ end
1006
+
1007
+ #
1008
+ # The `QUOTE` function.
1009
+ #
1010
+ # @param [Field, Function, Symbol, String] string
1011
+ #
1012
+ # @return [Function]
1013
+ # The new function.
1014
+ #
1015
+ def quote(string)
1016
+ Function.new(:QUOTE,string)
1017
+ end
1018
+
1019
+ #
1020
+ # The `REPEAT` function.
1021
+ #
1022
+ # @param [Field, Function, Symbol, String] string
1023
+ #
1024
+ # @param [Field, Function, Symbol, Numeric] count
1025
+ #
1026
+ # @return [Function]
1027
+ # The new function.
1028
+ #
1029
+ def repeat(string,count)
1030
+ Function.new(:REPEAT,string,count)
1031
+ end
1032
+
1033
+ #
1034
+ # The `REPLACE` function.
1035
+ #
1036
+ # @param [Field, Function, Symbol, String] string
1037
+ #
1038
+ # @param [Field, Function, Symbol, String] from_string
1039
+ #
1040
+ # @param [Field, Function, Symbol, String] to_string
1041
+ #
1042
+ # @return [Function]
1043
+ # The new function.
1044
+ #
1045
+ def replace(string,from_string,to_string)
1046
+ Function.new(:REPLACE,string,from_string,to_string)
1047
+ end
1048
+
1049
+ #
1050
+ # The `REVERSE` function.
1051
+ #
1052
+ # @param [Field, Function, Symbol, String] string
1053
+ # The input String to reverse.
1054
+ #
1055
+ # @return [Function]
1056
+ # The new function.
1057
+ #
1058
+ def reverse(string)
1059
+ Function.new(:REVERSE,string)
1060
+ end
1061
+
1062
+ #
1063
+ # The `RIGHT` function.
1064
+ #
1065
+ # @param [Field, Function, Symbol, String] string
1066
+ # The input String to extract from.
1067
+ #
1068
+ # @param [Integer] length
1069
+ # The desired number of characters to extract.
1070
+ #
1071
+ # @return [Function]
1072
+ # The new function.
1073
+ #
1074
+ def right(string,length)
1075
+ Function.new(:RIGHT,string,length)
1076
+ end
1077
+
1078
+ #
1079
+ # The `RPAD` function.
1080
+ #
1081
+ # @param [Field, Function, Symbol, String] string
1082
+ # The original String to pad.
1083
+ #
1084
+ # @param [Integer] length
1085
+ # The desired length of the String.
1086
+ #
1087
+ # @param [Field, Function, Symbol, String] pad_string
1088
+ # The String to pad with.
1089
+ #
1090
+ # @return [Function]
1091
+ # The new function.
1092
+ #
1093
+ def rpad(string,length,pad_string)
1094
+ Function.new(:RPAD,string,length,pad_string)
1095
+ end
1096
+
1097
+ #
1098
+ # The `RTRIM` function.
1099
+ #
1100
+ # @param [Field, Function, Symbol, String] string
1101
+ # The original String to trim.
1102
+ #
1103
+ # @return [Function]
1104
+ # The new function.
1105
+ #
1106
+ def rtrim(string)
1107
+ Function.new(:RTRIM,string)
1108
+ end
1109
+
1110
+ #
1111
+ # The `SOUNDEX` function.
1112
+ #
1113
+ # @param [Field, Function, Symbol, String] string
1114
+ # The input string.
1115
+ #
1116
+ # @return [Function]
1117
+ # The new function.
1118
+ #
1119
+ def soundex(string)
1120
+ Function.new(:SOUNDEX,string)
1121
+ end
1122
+
1123
+ #
1124
+ # The `SPACE` function.
1125
+ #
1126
+ # @param [Field, Function, Symbol, Numeric] number
1127
+ #
1128
+ # @return [Function]
1129
+ # The new function.
1130
+ #
1131
+ def space(number)
1132
+ Function.new(:SPACE,number)
1133
+ end
1134
+
1135
+ #
1136
+ # The `STRCMP` function.
1137
+ #
1138
+ # @param [Field, Function, Symbol, String] string1
1139
+ #
1140
+ # @param [Field, Function, Symbol, String] string2
1141
+ #
1142
+ # @return [Function]
1143
+ # The new function.
1144
+ #
1145
+ def strcmp(string1,string2)
1146
+ Function.new(:STRCMP,string1,string2)
1147
+ end
1148
+
1149
+ #
1150
+ # The `SUBSTRING` function.
1151
+ #
1152
+ # @param [Field, Function, Symbol, String] string
1153
+ # The original string.
1154
+ #
1155
+ # @param [Integer] position
1156
+ # The beginning index of the substring.
1157
+ #
1158
+ # @param [Integer, nil] length
1159
+ # The desired length of the substring.
1160
+ #
1161
+ # @return [Function]
1162
+ # The new function.
1163
+ #
1164
+ def substring(string,position,length=nil)
1165
+ if length then Function.new(:SUBSTRING,string,position,length)
1166
+ else Function.new(:SUBSTRING,string,position)
1167
+ end
1168
+ end
1169
+
1170
+ #
1171
+ # The `SUBSTRING_INDEX` function.
1172
+ #
1173
+ # @param [Field, Function, Symbol, String] string
1174
+ # The string to search within.
1175
+ #
1176
+ # @param [Field, Function, Symbol, String] deliminator
1177
+ # The deliminator string to search for.
1178
+ #
1179
+ # @param [Integer] count
1180
+ # The number of times to search for the deliminator.
1181
+ #
1182
+ # @return [Function]
1183
+ # The new function.
1184
+ #
1185
+ def substring_index(string,deliminator,count)
1186
+ Function.new(:SUBSTRING_INDEX,string,deliminator,count)
1187
+ end
1188
+
1189
+ #
1190
+ # The `TRIM` function.
1191
+ #
1192
+ # @param [String, Hash{Symbol => Object}] string_or_options
1193
+ #
1194
+ # @option string_or_options [Field, Function, Symbol, String] :both
1195
+ #
1196
+ # @option string_or_options [Field, Function, Symbol, String] :leading
1197
+ #
1198
+ # @option string_or_options [Field, Function, Symbol, String] :trailing
1199
+ #
1200
+ # @option string_or_options [Field, Function, Symbol, String] :from
1201
+ #
1202
+ # @return [Function]
1203
+ # The new function.
1204
+ #
1205
+ def trim(string_or_options)
1206
+ Function.new(:TRIM,string_or_options)
1207
+ end
1208
+
1209
+ #
1210
+ # The `UCASE` function.
1211
+ #
1212
+ # @param [Field, Function, Symbol, String] string
1213
+ # The string argument for `UCASE`.
1214
+ #
1215
+ # @return [Function]
1216
+ # The new function.
1217
+ #
1218
+ def ucase(string)
1219
+ Function.new(:UCASE,string)
1220
+ end
1221
+
1222
+ #
1223
+ # The `UNHEX` function.
1224
+ #
1225
+ # @param [Field, Function, Symbol, String] string
1226
+ # The string argument for `UNHEX`.
1227
+ #
1228
+ # @return [Function]
1229
+ # The new function.
1230
+ #
1231
+ def unhex(string)
1232
+ Function.new(:UNHEX,string)
1233
+ end
1234
+
1235
+ #
1236
+ # The `UPPER` function.
1237
+ #
1238
+ # @param [Field, Function, Symbol, String] string
1239
+ # The string argument for `UPPER`.
1240
+ #
1241
+ # @return [Function]
1242
+ # The new function.
1243
+ #
1244
+ def upper(string)
1245
+ Function.new(:UPPER,string)
1246
+ end
1247
+
1248
+ #
1249
+ # The `SLEEP` function.
1250
+ #
1251
+ # @param [Numeric] secs
1252
+ # The number of seconds to sleep for.
1253
+ #
1254
+ # @return [Function]
1255
+ # The new function.
1256
+ #
1257
+ # @since 1.2.0
1258
+ #
1259
+ def sleep(secs)
1260
+ Function.new(:SLEEP,secs)
1261
+ end
1262
+ end
1263
+ end
1264
+ end
1265
+ end