# frozen_string_literal: true # # ronin-code-sql - A Ruby DSL for crafting SQL Injections. # # Copyright (c) 2007-2022 Hal Brodigan (postmodern.mod3 at gmail.com) # # ronin-code-sql is free software: you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published # by the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # ronin-code-sql is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with ronin-code-sql. If not, see . # require 'ronin/code/sql/function' module Ronin module Code module SQL # # Methods for creating common SQL {Function Functions}. # # @api public # module Functions # # @!group Aggregate Functions # # # The `COUNT` function. # # @param [Field, Symbol] field # The field to aggregate. # # @return [Function] # The new function. # def count(field=:*) Function.new(:COUNT,field) end # # The `MAX` function. # # @param [Field, Symbol] field # The field to aggregate. # # @return [Function] # The new function. # def max(field) Function.new(:MAX,field) end # # The `MIN` function. # # @param [Field, Symbol] field # The field to aggregate. # # @return [Function] # The new function. # def min(field) Function.new(:MIN,field) end # # The `AVG` function. # # @param [Field, Symbol] field # The field to aggregate. # # @return [Function] # The new function. # def avg(field) Function.new(:AVG,field) end # # The `SUM` function. # # @param [Field, Symbol] field # The field to aggregate. # # @return [Function] # The new function. # def sum(field) Function.new(:SUM,field) end # # The `SQRT` function. # # @param [Field, Symbol] field # The field to aggregate. # # @return [Function] # The new function. # def sqrt(field) Function.new(:SQRT,field) end # # The `RAND` function. # # @param [Field, Symbol] field # The field to aggregate. # # @return [Function] # The new function. # def rand(field) Function.new(:RAND,field) end # # @!group Numeric Functions # # # The `ABS` function. # # @param [Field, Function, Symbol, Numeric] x # # @return [Function] # The new function. # def abs(x) Function.new(:ABS,x) end # # The `ACOS` function. # # @param [Field, Function, Symbol, Numeric] x # # @return [Function] # The new function. # def acos(x) Function.new(:ACOS,x) end # # The `ASIN` function. # # @param [Field, Function, Symbol, Numeric] x # # @return [Function] # The new function. # def asin(x) Function.new(:ASIN,x) end # # The `ATAN` function. # # @param [Field, Function, Symbol, Numeric] x # # @return [Function] # The new function. # def atan(x) Function.new(:ATAN,x) end # # The `ATAN2` function. # # @param [Field, Function, Symbol, Numeric] x # # @param [Field, Function, Symbol, Numeric] y # # @return [Function] # The new function. # def atan2(y,x) Function.new(:ATAN2,y,x) end # # The `BIT_AND` function. # # @param [Field, Function, Symbol, Numeric] x # # @return [Function] # The new function. # def bit_and(x) Function.new(:BIT_AND,x) end # # The `BIT_COUNT` function. # # @param [Field, Function, Symbol, Numeric] x # # @return [Function] # The new function. # def bit_count(x) Function.new(:BIT_COUNT,x) end # # The `BIT_OR` function. # # @param [Field, Function, Symbol, Numeric] x # # @return [Function] # The new function. # def bit_or(x) Function.new(:BIT_OR,x) end # # The `CEIL` function. # # @param [Field, Function, Symbol, Numeric] x # # @return [Function] # The new function. # def ceil(x) Function.new(:CEIL,x) end # # The `CEILING` function. # # @param [Field, Function, Symbol, Numeric] x # # @return [Function] # The new function. # def ceiling(x) Function.new(:CEILING,x) end # # The `COS` function. # # @param [Field, Function, Symbol, Numeric] x # # @return [Function] # The new function. # def cos(x) Function.new(:COS,x) end # # The `COT` function. # # @param [Field, Function, Symbol, Numeric] x # # @return [Function] # The new function. # def cot(x) Function.new(:COT,x) end # # The `DEGREES` function. # # @param [Field, Function, Symbol, Numeric] x # # @return [Function] # The new function. # def degrees(x) Function.new(:DEGREES,x) end # # The `EXP` function. # # @param [Field, Function, Symbol, Numeric] x # # @return [Function] # The new function. # def exp(x) Function.new(:EXP,x) end # # The `FLOOR` function. # # @param [Field, Function, Symbol, Numeric] x # # @return [Function] # The new function. # def floor(x) Function.new(:FLOOR,x) end # # The `FORMAT` function. # # @param [Field, Function, Symbol, String, Numeric] value # # @param [Field, Function, Symbol, String] pattern # # @return [Function] # The new function. # def format(value,pattern) Function.new(:FORMAT,value,pattern) end # # The `GREATEST` function. # # @param [Array] values # # @return [Function] # The new function. # def greatest(*values) Function.new(:GREATEST,*values) end # # The `INTERVAL` function. # # @param [Array] values # # @return [Function] # The new function. # def interval(*values) Function.new(:INTERVAL,*values) end # # The `LEAST` function. # # @param [Array] values # # @return [Function] # The new function. # def least(*values) Function.new(:LEAST,*values) end # # The `LOG` function. # # @param [Field, Function, Symbol, Numeric, nil] b # # @param [Field, Function, Symbol, Numeric] x # # @return [Function] # The new function. # def log(b=nil,x) if b then Function.new(:LOG,b,x) else Function.new(:LOG,x) end end # # The `LOG10` function. # # @param [Field, Function, Symbol, Numeric] x # # @return [Function] # The new function. # def log10(x) Function.new(:LOG10,x) end # # The `MOD` function. # # @param [Field, Function, Symbol, Numeric] n # # @param [Field, Function, Symbol, Numeric] m # # @return [Function] # The new function. # def mod(n,m) Function.new(:MOD,n,m) end # # The `PI` function. # # @return [Function] # The new function. # def pi Function.new(:PI) end # # The `POW` function. # # @param [Field, Function, Symbol, Numeric] x # # @param [Field, Function, Symbol, Numeric] y # # @return [Function] # The new function. # def pow(x,y) Function.new(:POW,x,y) end # # The `POWER` function. # # @param [Field, Function, Symbol, Numeric] x # # @param [Field, Function, Symbol, Numeric] y # # @return [Function] # The new function. # def power(x,y) Function.new(:POWER,x,y) end # # The `RADIANS` function. # # @param [Field, Function, Symbol, Numeric] x # # @return [Function] # The new function. # def radians(x) Function.new(:RADIANS,x) end # # The `RANDOM` function. # # @return [Function] # The new function. # def random Function.new(:RANDOM) end # # The `ROUND` function. # # @param [Field, Function, Symbol, Numeric] x # # @param [Field, Function, Symbol, Numeric, nil] d # # @return [Function] # The new function. # def round(x,d=nil) if d then Function.new(:ROUND,x,d) else Function.new(:ROUND,x) end end # # The `SIGN` function. # # @param [Field, Function, Symbol, Numeric] x # # @return [Function] # The new function. # def sign(x) Function.new(:SIGN,x) end # # The `SIN` function. # # @param [Field, Function, Symbol, Numeric] x # # @return [Function] # The new function. # def sin(x) Function.new(:SIN,x) end # # The `SQRT` function. # # @param [Field, Function, Symbol, Numeric] x # # @return [Function] # The new function. # def sqrt(x) Function.new(:SQRT,x) end # # The `STD` function. # # @param [Field, Symbol] field # # @return [Function] # The new function. # def std(field) Function.new(:STD,field) end # # The `STDDEV` function. # # @param [Field, Symbol] field # # @return [Function] # The new function. # def stddev(field) Function.new(:STDDEV,field) end # # The `TAN` function. # # @param [Field, Function, Symbol, Numeric] x # # @return [Function] # The new function. # def tan(x) Function.new(:TAN,x) end # # The `TRUNCATE` function. # # @param [Field, Function, Symbol, Numeric] x # # @param [Field, Function, Symbol, Numeric] d # # @return [Function] # The new function. # def truncate(x,d) Function.new(:TRUNCATE,x,d) end # # @!group String Functions # # # The `ASCII` function. # # @param [Field, Function, Symbol, String] string # # @return [Function] # The new function. # def ascii(string) Function.new(:ASCII,string) end # # The `BIN` function. # # @param [Field, Function, Symbol, Numeric] n # # @return [Function] # The new function. # def bin(n) Function.new(:BIN,n) end # # The `BIT_LENGTH` function. # # @param [Field, Function, Symbol, String] string # # @return [Function] # The new function. # def bit_length(string) Function.new(:BIT_LENGTH,string) end # # The `CHAR` function. # # @param [Array] bytes # # @return [Function] # The new function. # def char(*bytes) Function.new(:CHAR,*bytes) end # # The `CHAR_LENGTH` function. # # @param [Field, Function, Symbol, String] string # # @return [Function] # The new function. # def char_length(string) Function.new(:CHAR_LENGTH,string) end # # The `CHARACTER_LENGTH` function. # # @param [Field, Function, Symbol, String] string # # @return [Function] # The new function. # def character_length(string) Function.new(:CHARACTER_LENGTH,string) end # # The `CONCAT` function. # # @param [Array] strings # # @return [Function] # The new function. # def concat(*strings) Function.new(:CONCAT,*strings) end # # The `CONCAT_WS` function. # # @param [Field, Function, Symbol, String] separator # # @param [Array] strings # # @return [Function] # The new function. # def concat_ws(separator,*strings) Function.new(:CONCAT_WS,separator,*strings) end # # The `CONV` function. # # @param [Field, Function, Symbol, Numeric] number # # @param [Field, Function, Symbol, Numeric] from_base # # @param [Field, Function, Symbol, Numeric] to_base # # @return [Function] # The new function. # def conv(number,from_base,to_base) Function.new(:CONV,number,from_base,to_base) end # # The `ELT` function. # # @param [Field, Function, Symbol, Numeric] index # # @param [Array] strings # # @return [Function] # The new function. # def elt(index,*strings) Function.new(:ELT,index,*strings) end # # The `EXPORT_SET` function. # # @param [Field, Function, Symbol, Numeric] bits # # @param [Field, Function, Symbol, String] on # # @param [Field, Function, Symbol, String] off # # @param [Field, Function, Symbol, String, nil] separator # # @param [Field, Function, Symbol, Numeric, nil] number_of_bits # # @return [Function] # The new function. # def export_set(bits,on,off,separator=nil,number_of_bits=nil) if (separator && number_of_bits) Function.new(:EXPORT_SET,bits,on,off,separator,number_of_bits) elsif separator Function.new(:EXPORT_SET,bits,on,off,separator) else Function.new(:EXPORT_SET,bits,on,off) end end # # The `FIELD` function. # # @param [Array] strings # # @return [Function] # The new function. # def field(*strings) Function.new(:FIELD,*strings) end # # The `FIND_IN_SET` function. # # @param [Field, Function, Symbol, String] string # # @param [Array] set # # @return [Function] # The new function. # def find_in_set(string,set) Function.new(:FIND_IN_SET,string,set) end # # The `GLOB` function. # # @param [Field, Function, Symbol, String] pattern # # @param [Field, Function, Symbol, String] string # # @return [Function] # The new function. # def glob(pattern,string) Function.new(:GLOB,pattern,string) end # # The `HEX` function. # # @param [Field, Function, Symbol, Numeric, String] value # # @return [Function] # The new function. # def hex(value) Function.new(:HEX,value) end # # The `INSERT` function. # # @param [Field, Function, Symbol, String] string # # @param [Field, Function, Symbol, Numeric] position # # @param [Field, Function, Symbol, Numeric] length # # @param [Field, Function, Symbol, String] new_string # # @return [Function] # The new function. # def insert(string,position,length,new_string) Function.new(:INSERT,string,position,length,new_string) end # # The `INSTR` function. # # @param [Field, Function, Symbol, String] string # # @param [Field, Function, Symbol, String] sub_string # # @return [Function] # The new function. # def instr(string,sub_string) Function.new(:INSTR,string,sub_string) end # # The `LCASE` function. # # @param [Field, Function, Symbol, String] string # # @return [Function] # The new function. # def lcase(string) Function.new(:LCASE,string) end # # The `LEFT` function. # # @param [Field, Function, Symbol, String] string # # @param [Field, Function, Symbol, Numeric] length # # @return [Function] # The new function. # def left(string,length) Function.new(:LEFT,string,length) end # # The `LENGTH` function. # # @param [Field, Function, Symbol, String] string # # @return [Function] # The new function. # def length(string) Function.new(:LENGTH,string) end # # The `LIKE` function. # # @return [Function] # The new function. # def like(x,y,options=nil) if options then Function.new(:LIKE,x,y,options) else Function.new(:LIKE,x,y) end end # # The `LOAD_FILE` function. # # @param [Field, Function, Symbol, String] file_name # # @return [Function] # The new function. # def load_file(file_name) Function.new(:LOAD_FILE,file_name) end # # The `LOCATE` function. # # @param [Field, Function, Symbol, String] substring # # @param [Field, Function, Symbol, String] string # # @param [Field, Function, Symbol, Numeric, nil] pos # # @return [Function] # The new function. # def locate(substring,string,pos=nil) if pos then Function.new(:LOCATE,substring,string,pos) else Function.new(:LOCATE,substring,string) end end # # The `LOWER` function. # # @param [Field, Function, Symbol, String] string # # @return [Function] # The new function. # def lower(string) Function.new(:LOWER,string) end # # The `LPAD` function. # # @param [Field, Function, Symbol, String] string # # @param [Field, Function, Symbol, Numeric] length # # @param [Field, Function, Symbol, String] pad_string # # @return [Function] # The new function. # def lpad(string,length,pad_string) Function.new(:LPAD,string,length,pad_string) end # # The `LTRIM` function. # # @param [Field, Function, Symbol, String] string # # @return [Function] # The new function. # def ltrim(string) Function.new(:LTRIM,string) end # # The `MAKE_SET` function. # # @param [Field, Function, Symbol, Numeric] bits # # @param [Array] strings # # @return [Function] # The new function. # def make_set(bits,*strings) Function.new(:MAKE_SET,bits,*strings) end # # The `MID` function. # # @param [Field, Function, Symbol, String] string # # @param [Field, Function, Symbol, Numeric] position # # @param [Field, Function, Symbol, Numeric] length # # @return [Function] # The new function. # def mid(string,position,length) Function.new(:MID,string,position,length) end # # The `OCT` function. # # @param [Field, Function, Symbol, Numeric] number # # @return [Function] # The new function. # def oct(number) Function.new(:OCT,number) end # # The `OCTET_LENGTH` function. # # @param [Field, Function, Symbol, String] string # # @return [Function] # The new function. # def octet_length(string) Function.new(:OCTET_LENGTH,string) end # # The `ORD` function. # # @param [Field, Function, Symbol, String] string # # @return [Function] # The new function. # def ord(string) Function.new(:ORD,string) end # # The `POSITION` function. # # @param [BinaryExpr] expr # # @return [Function] # The new function. # def position(expr) Function.new(:POSITION,expr) end # # The `QUOTE` function. # # @param [Field, Function, Symbol, String] string # # @return [Function] # The new function. # def quote(string) Function.new(:QUOTE,string) end # # The `REPEAT` function. # # @param [Field, Function, Symbol, String] string # # @param [Field, Function, Symbol, Numeric] count # # @return [Function] # The new function. # def repeat(string,count) Function.new(:REPEAT,string,count) end # # The `REPLACE` function. # # @param [Field, Function, Symbol, String] string # # @param [Field, Function, Symbol, String] from_string # # @param [Field, Function, Symbol, String] to_string # # @return [Function] # The new function. # def replace(string,from_string,to_string) Function.new(:REPLACE,string,from_string,to_string) end # # The `REVERSE` function. # # @param [Field, Function, Symbol, String] string # The input String to reverse. # # @return [Function] # The new function. # def reverse(string) Function.new(:REVERSE,string) end # # The `RIGHT` function. # # @param [Field, Function, Symbol, String] string # The input String to extract from. # # @param [Integer] length # The desired number of characters to extract. # # @return [Function] # The new function. # def right(string,length) Function.new(:RIGHT,string,length) end # # The `RPAD` function. # # @param [Field, Function, Symbol, String] string # The original String to pad. # # @param [Integer] length # The desired length of the String. # # @param [Field, Function, Symbol, String] pad_string # The String to pad with. # # @return [Function] # The new function. # def rpad(string,length,pad_string) Function.new(:RPAD,string,length,pad_string) end # # The `RTRIM` function. # # @param [Field, Function, Symbol, String] string # The original String to trim. # # @return [Function] # The new function. # def rtrim(string) Function.new(:RTRIM,string) end # # The `SOUNDEX` function. # # @param [Field, Function, Symbol, String] string # The input string. # # @return [Function] # The new function. # def soundex(string) Function.new(:SOUNDEX,string) end # # The `SPACE` function. # # @param [Field, Function, Symbol, Numeric] number # # @return [Function] # The new function. # def space(number) Function.new(:SPACE,number) end # # The `STRCMP` function. # # @param [Field, Function, Symbol, String] string1 # # @param [Field, Function, Symbol, String] string2 # # @return [Function] # The new function. # def strcmp(string1,string2) Function.new(:STRCMP,string1,string2) end # # The `SUBSTRING` function. # # @param [Field, Function, Symbol, String] string # The original string. # # @param [Integer] position # The beginning index of the substring. # # @param [Integer, nil] length # The desired length of the substring. # # @return [Function] # The new function. # def substring(string,position,length=nil) if length then Function.new(:SUBSTRING,string,position,length) else Function.new(:SUBSTRING,string,position) end end # # The `SUBSTRING_INDEX` function. # # @param [Field, Function, Symbol, String] string # The string to search within. # # @param [Field, Function, Symbol, String] deliminator # The deliminator string to search for. # # @param [Integer] count # The number of times to search for the deliminator. # # @return [Function] # The new function. # def substring_index(string,deliminator,count) Function.new(:SUBSTRING_INDEX,string,deliminator,count) end # # The `TRIM` function. # # @param [String, Hash{Symbol => Object}] string_or_options # # @option string_or_options [Field, Function, Symbol, String] :both # # @option string_or_options [Field, Function, Symbol, String] :leading # # @option string_or_options [Field, Function, Symbol, String] :trailing # # @option string_or_options [Field, Function, Symbol, String] :from # # @return [Function] # The new function. # def trim(string_or_options) Function.new(:TRIM,string_or_options) end # # The `UCASE` function. # # @param [Field, Function, Symbol, String] string # The string argument for `UCASE`. # # @return [Function] # The new function. # def ucase(string) Function.new(:UCASE,string) end # # The `UNHEX` function. # # @param [Field, Function, Symbol, String] string # The string argument for `UNHEX`. # # @return [Function] # The new function. # def unhex(string) Function.new(:UNHEX,string) end # # The `UPPER` function. # # @param [Field, Function, Symbol, String] string # The string argument for `UPPER`. # # @return [Function] # The new function. # def upper(string) Function.new(:UPPER,string) end # # The `SLEEP` function. # # @param [Numeric] secs # The number of seconds to sleep for. # # @return [Function] # The new function. # # @since 1.2.0 # def sleep(secs) Function.new(:SLEEP,secs) end end end end end