// Tresql default function signatures (UTF-8 encoding)
// NOTE: Multiline comment must be indented by at least one space starting from second line !!!
/***
 * Recognized types:
 * ------
 * string,
 * integer, int, long, short, float, double, decimal,
 * date, time, dateTime, timestamp,
 * boolean, bytes, any
 * ------
 * any other type results as Any
 * Function parameter type can end with asterisk - '*' indicating multiple arguments
 * Function return type can reference some parameter type - fun(par)::'$par'
 ***/

//aggregate functions
count(col)::long
max(col)::'$col'
min(col)::'$col'
sum(col)::'$col'
avg(col)::'$col'

//basic db functions
coalesce(pars::'*')::'$pars'
upper(string::string)::string
lower(string::string)::string
insert (str1::string, offset::int, length::int, str2::string)::string
to_date(date::string, format::string)::date
trim(string::string)::string
exists(cond::any)::boolean
group_concat(what::'*')::string
//postgres group_concat replacement is string_agg
string_agg(expr::'*')::any

array(arr::'any*')::any
array_length(arr::any, dim::int)::int
cast(value::any)::any
chr(charCode::int)::string
concat(str::'any*')::string
concat_ws(sep::string, str::'any*')::string
current_date()::date
current_time()::timestamp
date(t::timestamp)::date
date_part (text::string, timestamp::timestamp)::double    // TODO or interval
date_trunc(text::string, timestamp::timestamp)::timestamp // TODO or interval
generate_series(args::'any*')::any
greatest(v::'any*')::'$v'
least(v::'any*')::'$v'
left(s::string, n::int)::string
length(s::string)::int
localtimestamp()::timestamp
lpad(string::string, length::int, lpad_string::string)::string
not(b::boolean)::boolean
now()::timestamp
nullif(v1::any, v2::any)::'$v1'
random()::double
regexp_matches(s::string, rx::string)::boolean
replace(v::string, from::string, to::string)::string
right(s::string, n::int)::string
round(d::double)::int
round(d::double, i::int)::double
substring(s::string, n::int)::string
substring(s::string, n::int, nn::int)::string
to_char(n::long,      format::string)::string
to_char(n::long,      format::string)::string
to_char(t::timestamp, format::string)::string
to_char(t::timestamp, format::string)::string
to_number(text::string, format::string)::double
unnest(arr::'any*')::any
json_to_record(json::any)::any
json_to_recordset(json::any)::any

//basic dialect functions
case(when::any, then, rest::'any*')::'$then'
nextval(seq::string)::long
cast(exp::any, typ::string)::any
