/
UCS
/
sqlite_orm
Обзор
Документация
Войти
/
UCS
/
sqlite_orm
Код
Запросы
0
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
dev/core_functions.h
2 096 строк
73 KB
klaus triendl
Renamed file cxx_polyfill.h to cxx_type_traits_polyfill.h
28 май 2022, 11:32
28 май 2022, 11:32
1bed906
Код
Авторство
О чём код?
#pragma once #include <string> // std::string #include <tuple> // std::make_tuple, std::tuple_size #include <type_traits> // std::forward, std::is_base_of, std::enable_if #include <memory> // std::unique_ptr #include <vector> // std::vector #include "functional/cxx_type_traits_polyfill.h" #include "conditions.h" #include "is_base_of_template.h" #include "tuple_helper/tuple_filter.h" #include "serialize_result_type.h" #include "operators.h" #include "ast/into.h" namespace sqlite_orm { using int64 = sqlite_int64; using uint64 = sqlite_uint64; namespace internal { template<class T> struct unique_ptr_result_of {}; /** * Base class for operator overloading * R - return type * S - class with operator std::string * Args - function arguments types */ template<class R, class S, class... Args> struct built_in_function_t : S, arithmetic_t { using return_type = R; using string_type = S; using args_type = std::tuple<Args...>; static constexpr size_t args_size = std::tuple_size<args_type>::value; args_type args; built_in_function_t(args_type&& args_) : args(std::move(args_)) {} }; template<class F, class W> struct filtered_aggregate_function { using function_type = F; using where_expression = W; function_type function; where_expression where; }; template<class C> struct where_t; template<class R, class S, class... Args> struct built_in_aggregate_function_t : built_in_function_t<R, S, Args...> { using super = built_in_function_t<R, S, Args...>; using super::super; template<class W> filtered_aggregate_function<built_in_aggregate_function_t<R, S, Args...>, W> filter(where_t<W> wh) { return {*this, std::move(wh.expression)}; } }; struct typeof_string { serialize_result_type serialize() const { return "TYPEOF"; } }; struct unicode_string { serialize_result_type serialize() const { return "UNICODE"; } }; struct length_string { serialize_result_type serialize() const { return "LENGTH"; } }; struct abs_string { serialize_result_type serialize() const { return "ABS"; } }; struct lower_string { serialize_result_type serialize() const { return "LOWER"; } }; struct upper_string { serialize_result_type serialize() const { return "UPPER"; } }; struct last_insert_rowid_string { serialize_result_type serialize() const { return "LAST_INSERT_ROWID"; } }; struct total_changes_string { serialize_result_type serialize() const { return "TOTAL_CHANGES"; } }; struct changes_string { serialize_result_type serialize() const { return "CHANGES"; } }; struct trim_string { serialize_result_type serialize() const { return "TRIM"; } }; struct ltrim_string { serialize_result_type serialize() const { return "LTRIM"; } }; struct rtrim_string { serialize_result_type serialize() const { return "RTRIM"; } }; struct hex_string { serialize_result_type serialize() const { return "HEX"; } }; struct quote_string { serialize_result_type serialize() const { return "QUOTE"; } }; struct randomblob_string { serialize_result_type serialize() const { return "RANDOMBLOB"; } }; struct instr_string { serialize_result_type serialize() const { return "INSTR"; } }; struct replace_string { serialize_result_type serialize() const { return "REPLACE"; } }; struct round_string { serialize_result_type serialize() const { return "ROUND"; } }; #if SQLITE_VERSION_NUMBER >= 3007016 struct char_string { serialize_result_type serialize() const { return "CHAR"; } }; struct random_string { serialize_result_type serialize() const { return "RANDOM"; } }; #endif struct coalesce_string { serialize_result_type serialize() const { return "COALESCE"; } }; struct ifnull_string { serialize_result_type serialize() const { return "IFNULL"; } }; struct nullif_string { serialize_result_type serialize() const { return "NULLIF"; } }; struct date_string { serialize_result_type serialize() const { return "DATE"; } }; struct time_string { serialize_result_type serialize() const { return "TIME"; } }; struct datetime_string { serialize_result_type serialize() const { return "DATETIME"; } }; struct julianday_string { serialize_result_type serialize() const { return "JULIANDAY"; } }; struct strftime_string { serialize_result_type serialize() const { return "STRFTIME"; } }; struct zeroblob_string { serialize_result_type serialize() const { return "ZEROBLOB"; } }; struct substr_string { serialize_result_type serialize() const { return "SUBSTR"; } }; #ifdef SQLITE_SOUNDEX struct soundex_string { serialize_result_type serialize() const { return "SOUNDEX"; } }; #endif struct total_string { serialize_result_type serialize() const { return "TOTAL"; } }; struct sum_string { serialize_result_type serialize() const { return "SUM"; } }; struct count_string { serialize_result_type serialize() const { return "COUNT"; } }; /** * T is use to specify type explicitly for queries like * SELECT COUNT(*) FROM table_name; * T can be omitted with void. */ template<class T> struct count_asterisk_t : count_string { using type = T; template<class W> filtered_aggregate_function<count_asterisk_t<T>, W> filter(where_t<W> wh) { return {*this, std::move(wh.expression)}; } }; /** * The same thing as count<T>() but without T arg. * Is used in cases like this: * SELECT cust_code, cust_name, cust_city, grade * FROM customer * WHERE grade=2 AND EXISTS * (SELECT COUNT(*) * FROM customer * WHERE grade=2 * GROUP BY grade * HAVING COUNT(*)>2); * `c++` * auto rows = * storage.select(columns(&Customer::code, &Customer::name, &Customer::city, &Customer::grade), * where(is_equal(&Customer::grade, 2) * and exists(select(count<Customer>(), * where(is_equal(&Customer::grade, 2)), * group_by(&Customer::grade), * having(greater_than(count(), 2)))))); */ struct count_asterisk_without_type : count_string {}; struct avg_string { serialize_result_type serialize() const { return "AVG"; } }; struct max_string { serialize_result_type serialize() const { return "MAX"; } }; struct min_string { serialize_result_type serialize() const { return "MIN"; } }; struct group_concat_string { serialize_result_type serialize() const { return "GROUP_CONCAT"; } }; #ifdef SQLITE_ENABLE_MATH_FUNCTIONS struct acos_string { serialize_result_type serialize() const { return "ACOS"; } }; struct acosh_string { serialize_result_type serialize() const { return "ACOSH"; } }; struct asin_string { serialize_result_type serialize() const { return "ASIN"; } }; struct asinh_string { serialize_result_type serialize() const { return "ASINH"; } }; struct atan_string { serialize_result_type serialize() const { return "ATAN"; } }; struct atan2_string { serialize_result_type serialize() const { return "ATAN2"; } }; struct atanh_string { serialize_result_type serialize() const { return "ATANH"; } }; struct ceil_string { serialize_result_type serialize() const { return "CEIL"; } }; struct ceiling_string { serialize_result_type serialize() const { return "CEILING"; } }; struct cos_string { serialize_result_type serialize() const { return "COS"; } }; struct cosh_string { serialize_result_type serialize() const { return "COSH"; } }; struct degrees_string { serialize_result_type serialize() const { return "DEGREES"; } }; struct exp_string { serialize_result_type serialize() const { return "EXP"; } }; struct floor_string { serialize_result_type serialize() const { return "FLOOR"; } }; struct ln_string { serialize_result_type serialize() const { return "LN"; } }; struct log_string { serialize_result_type serialize() const { return "LOG"; } }; struct log10_string { serialize_result_type serialize() const { return "LOG10"; } }; struct log2_string { serialize_result_type serialize() const { return "LOG2"; } }; struct mod_string { serialize_result_type serialize() const { return "MOD"; } }; struct pi_string { serialize_result_type serialize() const { return "PI"; } }; struct pow_string { serialize_result_type serialize() const { return "POW"; } }; struct power_string { serialize_result_type serialize() const { return "POWER"; } }; struct radians_string { serialize_result_type serialize() const { return "RADIANS"; } }; struct sin_string { serialize_result_type serialize() const { return "SIN"; } }; struct sinh_string { serialize_result_type serialize() const { return "SINH"; } }; struct sqrt_string { serialize_result_type serialize() const { return "SQRT"; } }; struct tan_string { serialize_result_type serialize() const { return "TAN"; } }; struct tanh_string { serialize_result_type serialize() const { return "TANH"; } }; struct trunc_string { serialize_result_type serialize() const { return "TRUNC"; } }; #endif // SQLITE_ENABLE_MATH_FUNCTIONS #ifdef SQLITE_ENABLE_JSON1 struct json_string { serialize_result_type serialize() const { return "JSON"; } }; struct json_array_string { serialize_result_type serialize() const { return "JSON_ARRAY"; } }; struct json_array_length_string { serialize_result_type serialize() const { return "JSON_ARRAY_LENGTH"; } }; struct json_extract_string { serialize_result_type serialize() const { return "JSON_EXTRACT"; } }; struct json_insert_string { serialize_result_type serialize() const { return "JSON_INSERT"; } }; struct json_replace_string { serialize_result_type serialize() const { return "JSON_REPLACE"; } }; struct json_set_string { serialize_result_type serialize() const { return "JSON_SET"; } }; struct json_object_string { serialize_result_type serialize() const { return "JSON_OBJECT"; } }; struct json_patch_string { serialize_result_type serialize() const { return "JSON_PATCH"; } }; struct json_remove_string { serialize_result_type serialize() const { return "JSON_REMOVE"; } }; struct json_type_string { serialize_result_type serialize() const { return "JSON_TYPE"; } }; struct json_valid_string { serialize_result_type serialize() const { return "JSON_VALID"; } }; struct json_quote_string { serialize_result_type serialize() const { return "JSON_QUOTE"; } }; struct json_group_array_string { serialize_result_type serialize() const { return "JSON_GROUP_ARRAY"; } }; struct json_group_object_string { serialize_result_type serialize() const { return "JSON_GROUP_OBJECT"; } }; #endif // SQLITE_ENABLE_JSON1 template<class T> using field_type_or_type_t = polyfill::detected_or_t<T, type_t, member_field_type<T>>; } /** * Cute operators for core functions */ template<class F, class R, std::enable_if_t<internal::is_base_of_template_v<F, internal::built_in_function_t>, bool> = true> internal::lesser_than_t<F, R> operator<(F f, R r) { return {std::move(f), std::move(r)}; } template<class F, class R, std::enable_if_t<internal::is_base_of_template_v<F, internal::built_in_function_t>, bool> = true> internal::lesser_or_equal_t<F, R> operator<=(F f, R r) { return {std::move(f), std::move(r)}; } template<class F, class R, std::enable_if_t<internal::is_base_of_template_v<F, internal::built_in_function_t>, bool> = true> internal::greater_than_t<F, R> operator>(F f, R r) { return {std::move(f), std::move(r)}; } template<class F, class R, std::enable_if_t<internal::is_base_of_template_v<F, internal::built_in_function_t>, bool> = true> internal::greater_or_equal_t<F, R> operator>=(F f, R r) { return {std::move(f), std::move(r)}; } template<class F, class R, std::enable_if_t<internal::is_base_of_template_v<F, internal::built_in_function_t>, bool> = true> internal::is_equal_t<F, R> operator==(F f, R r) { return {std::move(f), std::move(r)}; } template<class F, class R, std::enable_if_t<internal::is_base_of_template_v<F, internal::built_in_function_t>, bool> = true> internal::is_not_equal_t<F, R> operator!=(F f, R r) { return {std::move(f), std::move(r)}; } #ifdef SQLITE_ENABLE_MATH_FUNCTIONS /** * ACOS(X) function https://www.sqlite.org/lang_mathfunc.html#acos * * Example: * * auto rows = storage.select(sqlite_orm::acos(&Triangle::cornerA)); // decltype(rows) is std::vector<double> */ template<class X> internal::built_in_function_t<double, internal::acos_string, X> acos(X x) { return {std::tuple<X>{std::forward<X>(x)}}; } /** * ACOS(X) function https://www.sqlite.org/lang_mathfunc.html#acos * * Difference with the previous function is that previous override has `double` as return type but this * override accepts return type from you as a template argument. You can use any bindable type: * `float`, `int`, `std::optional<double>` etc. This override is handy when you expect `null` as result. * * Example: * * auto rows = storage.select(sqlite_orm::acos<std::optional<double>>(&Triangle::cornerA)); // decltype(rows) is std::vector<std::optional<double>> */ template<class R, class X> internal::built_in_function_t<R, internal::acos_string, X> acos(X x) { return {std::tuple<X>{std::forward<X>(x)}}; } /** * ACOSH(X) function https://www.sqlite.org/lang_mathfunc.html#acosh * * Example: * * auto rows = storage.select(sqlite_orm::acosh(&Triangle::cornerA)); // decltype(rows) is std::vector<double> */ template<class X> internal::built_in_function_t<double, internal::acosh_string, X> acosh(X x) { return {std::tuple<X>{std::forward<X>(x)}}; } /** * ACOSH(X) function https://www.sqlite.org/lang_mathfunc.html#acosh * * Difference with the previous function is that previous override has `double` as return type but this * override accepts return type from you as a template argument. You can use any bindable type: * `float`, `int`, `std::optional<double>` etc. This override is handy when you expect `null` as result. * * Example: * * auto rows = storage.select(sqlite_orm::acosh<std::optional<double>>(&Triangle::cornerA)); // decltype(rows) is std::vector<std::optional<double>> */ template<class R, class X> internal::built_in_function_t<R, internal::acosh_string, X> acosh(X x) { return {std::tuple<X>{std::forward<X>(x)}}; } /** * ASIN(X) function https://www.sqlite.org/lang_mathfunc.html#asin * * Example: * * auto rows = storage.select(sqlite_orm::asin(&Triangle::cornerA)); // decltype(rows) is std::vector<double> */ template<class X> internal::built_in_function_t<double, internal::asin_string, X> asin(X x) { return {std::tuple<X>{std::forward<X>(x)}}; } /** * ASIN(X) function https://www.sqlite.org/lang_mathfunc.html#asin * * Difference with the previous function is that previous override has `double` as return type but this * override accepts return type from you as a template argument. You can use any bindable type: * `float`, `int`, `std::optional<double>` etc. This override is handy when you expect `null` as result. * * Example: * * auto rows = storage.select(sqlite_orm::asin<std::optional<double>>(&Triangle::cornerA)); // decltype(rows) is std::vector<std::optional<double>> */ template<class R, class X> internal::built_in_function_t<R, internal::asin_string, X> asin(X x) { return {std::tuple<X>{std::forward<X>(x)}}; } /** * ASINH(X) function https://www.sqlite.org/lang_mathfunc.html#asinh * * Example: * * auto rows = storage.select(sqlite_orm::asinh(&Triangle::cornerA)); // decltype(rows) is std::vector<double> */ template<class X> internal::built_in_function_t<double, internal::asinh_string, X> asinh(X x) { return {std::tuple<X>{std::forward<X>(x)}}; } /** * ASINH(X) function https://www.sqlite.org/lang_mathfunc.html#asinh * * Difference with the previous function is that previous override has `double` as return type but this * override accepts return type from you as a template argument. You can use any bindable type: * `float`, `int`, `std::optional<double>` etc. This override is handy when you expect `null` as result. * * Example: * * auto rows = storage.select(sqlite_orm::asinh<std::optional<double>>(&Triangle::cornerA)); // decltype(rows) is std::vector<std::optional<double>> */ template<class R, class X> internal::built_in_function_t<R, internal::asinh_string, X> asinh(X x) { return {std::tuple<X>{std::forward<X>(x)}}; } /** * ATAN(X) function https://www.sqlite.org/lang_mathfunc.html#atan * * Example: * * auto rows = storage.select(sqlite_orm::atan(1)); // decltype(rows) is std::vector<double> */ template<class X> internal::built_in_function_t<double, internal::atan_string, X> atan(X x) { return {std::tuple<X>{std::forward<X>(x)}}; } /** * ATAN(X) function https://www.sqlite.org/lang_mathfunc.html#atan * * Difference with the previous function is that previous override has `double` as return type but this * override accepts return type from you as a template argument. You can use any bindable type: * `float`, `int`, `std::optional<double>` etc. This override is handy when you expect `null` as result. * * Example: * * auto rows = storage.select(sqlite_orm::atan<std::optional<double>>(1)); // decltype(rows) is std::vector<std::optional<double>> */ template<class R, class X> internal::built_in_function_t<R, internal::atan_string, X> atan(X x) { return {std::tuple<X>{std::forward<X>(x)}}; } /** * ATAN2(X, Y) function https://www.sqlite.org/lang_mathfunc.html#atan2 * * Example: * * auto rows = storage.select(sqlite_orm::atan2(1, 3)); // decltype(rows) is std::vector<double> */ template<class X, class Y> internal::built_in_function_t<double, internal::atan2_string, X, Y> atan2(X x, Y y) { return {std::tuple<X, Y>{std::forward<X>(x), std::forward<Y>(y)}}; } /** * ATAN2(X, Y) function https://www.sqlite.org/lang_mathfunc.html#atan2 * * Difference with the previous function is that previous override has `double` as return type but this * override accepts return type from you as a template argument. You can use any bindable type: * `float`, `int`, `std::optional<double>` etc. This override is handy when you expect `null` as result. * * Example: * * auto rows = storage.select(sqlite_orm::atan2<std::optional<double>>(1, 3)); // decltype(rows) is std::vector<std::optional<double>> */ template<class R, class X, class Y> internal::built_in_function_t<R, internal::atan2_string, X, Y> atan2(X x, Y y) { return {std::tuple<X, Y>{std::forward<X>(x), std::forward<Y>(y)}}; } /** * ATANH(X) function https://www.sqlite.org/lang_mathfunc.html#atanh * * Example: * * auto rows = storage.select(sqlite_orm::atanh(1)); // decltype(rows) is std::vector<double> */ template<class X> internal::built_in_function_t<double, internal::atanh_string, X> atanh(X x) { return {std::tuple<X>{std::forward<X>(x)}}; } /** * ATANH(X) function https://www.sqlite.org/lang_mathfunc.html#atanh * * Difference with the previous function is that previous override has `double` as return type but this * override accepts return type from you as a template argument. You can use any bindable type: * `float`, `int`, `std::optional<double>` etc. This override is handy when you expect `null` as result. * * Example: * * auto rows = storage.select(sqlite_orm::atanh<std::optional<double>>(1)); // decltype(rows) is std::vector<std::optional<double>> */ template<class R, class X> internal::built_in_function_t<R, internal::atanh_string, X> atanh(X x) { return {std::tuple<X>{std::forward<X>(x)}}; } /** * CEIL(X) function https://www.sqlite.org/lang_mathfunc.html#ceil * * Example: * * auto rows = storage.select(sqlite_orm::ceil(&User::rating)); // decltype(rows) is std::vector<double> */ template<class X> internal::built_in_function_t<double, internal::ceil_string, X> ceil(X x) { return {std::tuple<X>{std::forward<X>(x)}}; } /** * CEIL(X) function https://www.sqlite.org/lang_mathfunc.html#ceil * * Difference with the previous function is that previous override has `double` as return type but this * override accepts return type from you as a template argument. You can use any bindable type: * `float`, `int`, `std::optional<double>` etc. This override is handy when you expect `null` as result. * * Example: * * auto rows = storage.select(sqlite_orm::ceil<std::optional<double>>(&User::rating)); // decltype(rows) is std::vector<std::optional<double>> */ template<class R, class X> internal::built_in_function_t<R, internal::ceil_string, X> ceil(X x) { return {std::tuple<X>{std::forward<X>(x)}}; } /** * CEILING(X) function https://www.sqlite.org/lang_mathfunc.html#ceil * * Example: * * auto rows = storage.select(sqlite_orm::ceiling(&User::rating)); // decltype(rows) is std::vector<double> */ template<class X> internal::built_in_function_t<double, internal::ceiling_string, X> ceiling(X x) { return {std::tuple<X>{std::forward<X>(x)}}; } /** * CEILING(X) function https://www.sqlite.org/lang_mathfunc.html#ceil * * Difference with the previous function is that previous override has `double` as return type but this * override accepts return type from you as a template argument. You can use any bindable type: * `float`, `int`, `std::optional<double>` etc. This override is handy when you expect `null` as result. * * Example: * * auto rows = storage.select(sqlite_orm::ceiling<std::optional<double>>(&User::rating)); // decltype(rows) is std::vector<std::optional<double>> */ template<class R, class X> internal::built_in_function_t<R, internal::ceiling_string, X> ceiling(X x) { return {std::tuple<X>{std::forward<X>(x)}}; } /** * COS(X) function https://www.sqlite.org/lang_mathfunc.html#cos * * Example: * * auto rows = storage.select(sqlite_orm::cos(&Triangle::cornerB)); // decltype(rows) is std::vector<double> */ template<class X> internal::built_in_function_t<double, internal::cos_string, X> cos(X x) { return {std::tuple<X>{std::forward<X>(x)}}; } /** * COS(X) function https://www.sqlite.org/lang_mathfunc.html#cos * * Difference with the previous function is that previous override has `double` as return type but this * override accepts return type from you as a template argument. You can use any bindable type: * `float`, `int`, `std::optional<double>` etc. This override is handy when you expect `null` as result. * * Example: * * auto rows = storage.select(sqlite_orm::cos<std::optional<double>>(&User::rating)); // decltype(rows) is std::vector<std::optional<double>> */ template<class R, class X> internal::built_in_function_t<R, internal::cos_string, X> cos(X x) { return {std::tuple<X>{std::forward<X>(x)}}; } /** * COSH(X) function https://www.sqlite.org/lang_mathfunc.html#cosh * * Example: * * auto rows = storage.select(sqlite_orm::cosh(&Triangle::cornerB)); // decltype(rows) is std::vector<double> */ template<class X> internal::built_in_function_t<double, internal::cosh_string, X> cosh(X x) { return {std::tuple<X>{std::forward<X>(x)}}; } /** * COSH(X) function https://www.sqlite.org/lang_mathfunc.html#cosh * * Difference with the previous function is that previous override has `double` as return type but this * override accepts return type from you as a template argument. You can use any bindable type: * `float`, `int`, `std::optional<double>` etc. This override is handy when you expect `null` as result. * * Example: * * auto rows = storage.select(sqlite_orm::cosh<std::optional<double>>(&User::rating)); // decltype(rows) is std::vector<std::optional<double>> */ template<class R, class X> internal::built_in_function_t<R, internal::cosh_string, X> cosh(X x) { return {std::tuple<X>{std::forward<X>(x)}}; } /** * DEGREES(X) function https://www.sqlite.org/lang_mathfunc.html#degrees * * Example: * * auto rows = storage.select(sqlite_orm::degrees(&Triangle::cornerB)); // decltype(rows) is std::vector<double> */ template<class X> internal::built_in_function_t<double, internal::degrees_string, X> degrees(X x) { return {std::tuple<X>{std::forward<X>(x)}}; } /** * DEGREES(X) function https://www.sqlite.org/lang_mathfunc.html#degrees * * Difference with the previous function is that previous override has `double` as return type but this * override accepts return type from you as a template argument. You can use any bindable type: * `float`, `int`, `std::optional<double>` etc. This override is handy when you expect `null` as result. * * Example: * * auto rows = storage.select(sqlite_orm::degrees<std::optional<double>>(&User::rating)); // decltype(rows) is std::vector<std::optional<double>> */ template<class R, class X> internal::built_in_function_t<R, internal::degrees_string, X> degrees(X x) { return {std::tuple<X>{std::forward<X>(x)}}; } /** * EXP(X) function https://www.sqlite.org/lang_mathfunc.html#exp * * Example: * * auto rows = storage.select(sqlite_orm::exp(&Triangle::cornerB)); // decltype(rows) is std::vector<double> */ template<class X> internal::built_in_function_t<double, internal::exp_string, X> exp(X x) { return {std::tuple<X>{std::forward<X>(x)}}; } /** * EXP(X) function https://www.sqlite.org/lang_mathfunc.html#exp * * Difference with the previous function is that previous override has `double` as return type but this * override accepts return type from you as a template argument. You can use any bindable type: * `float`, `int`, `std::optional<double>` etc. This override is handy when you expect `null` as result. * * Example: * * auto rows = storage.select(sqlite_orm::exp<std::optional<double>>(&User::rating)); // decltype(rows) is std::vector<std::optional<double>> */ template<class R, class X> internal::built_in_function_t<R, internal::exp_string, X> exp(X x) { return {std::tuple<X>{std::forward<X>(x)}}; } /** * FLOOR(X) function https://www.sqlite.org/lang_mathfunc.html#floor * * Example: * * auto rows = storage.select(sqlite_orm::floor(&User::rating)); // decltype(rows) is std::vector<double> */ template<class X> internal::built_in_function_t<double, internal::floor_string, X> floor(X x) { return {std::tuple<X>{std::forward<X>(x)}}; } /** * FLOOR(X) function https://www.sqlite.org/lang_mathfunc.html#floor * * Difference with the previous function is that previous override has `double` as return type but this * override accepts return type from you as a template argument. You can use any bindable type: * `float`, `int`, `std::optional<double>` etc. This override is handy when you expect `null` as result. * * Example: * * auto rows = storage.select(sqlite_orm::floor<std::optional<double>>(&User::rating)); // decltype(rows) is std::vector<std::optional<double>> */ template<class R, class X> internal::built_in_function_t<R, internal::floor_string, X> floor(X x) { return {std::tuple<X>{std::forward<X>(x)}}; } /** * LN(X) function https://www.sqlite.org/lang_mathfunc.html#ln * * Example: * * auto rows = storage.select(sqlite_orm::ln(200)); // decltype(rows) is std::vector<double> */ template<class X> internal::built_in_function_t<double, internal::ln_string, X> ln(X x) { return {std::tuple<X>{std::forward<X>(x)}}; } /** * LN(X) function https://www.sqlite.org/lang_mathfunc.html#ln * * Difference with the previous function is that previous override has `double` as return type but this * override accepts return type from you as a template argument. You can use any bindable type: * `float`, `int`, `std::optional<double>` etc. This override is handy when you expect `null` as result. * * Example: * * auto rows = storage.select(sqlite_orm::ln<std::optional<double>>(200)); // decltype(rows) is std::vector<std::optional<double>> */ template<class R, class X> internal::built_in_function_t<R, internal::ln_string, X> ln(X x) { return {std::tuple<X>{std::forward<X>(x)}}; } /** * LOG(X) function https://www.sqlite.org/lang_mathfunc.html#log * * Example: * * auto rows = storage.select(sqlite_orm::log(100)); // decltype(rows) is std::vector<double> */ template<class X> internal::built_in_function_t<double, internal::log_string, X> log(X x) { return {std::tuple<X>{std::forward<X>(x)}}; } /** * LOG(X) function https://www.sqlite.org/lang_mathfunc.html#log * * Difference with the previous function is that previous override has `double` as return type but this * override accepts return type from you as a template argument. You can use any bindable type: * `float`, `int`, `std::optional<double>` etc. This override is handy when you expect `null` as result. * * Example: * * auto rows = storage.select(sqlite_orm::log<std::optional<double>>(100)); // decltype(rows) is std::vector<std::optional<double>> */ template<class R, class X> internal::built_in_function_t<R, internal::log_string, X> log(X x) { return {std::tuple<X>{std::forward<X>(x)}}; } /** * LOG10(X) function https://www.sqlite.org/lang_mathfunc.html#log * * Example: * * auto rows = storage.select(sqlite_orm::log10(100)); // decltype(rows) is std::vector<double> */ template<class X> internal::built_in_function_t<double, internal::log10_string, X> log10(X x) { return {std::tuple<X>{std::forward<X>(x)}}; } /** * LOG10(X) function https://www.sqlite.org/lang_mathfunc.html#log * * Difference with the previous function is that previous override has `double` as return type but this * override accepts return type from you as a template argument. You can use any bindable type: * `float`, `int`, `std::optional<double>` etc. This override is handy when you expect `null` as result. * * Example: * * auto rows = storage.select(sqlite_orm::log10<std::optional<double>>(100)); // decltype(rows) is std::vector<std::optional<double>> */ template<class R, class X> internal::built_in_function_t<R, internal::log10_string, X> log10(X x) { return {std::tuple<X>{std::forward<X>(x)}}; } /** * LOG(B, X) function https://www.sqlite.org/lang_mathfunc.html#log * * Example: * * auto rows = storage.select(sqlite_orm::log(10, 100)); // decltype(rows) is std::vector<double> */ template<class B, class X> internal::built_in_function_t<double, internal::log_string, B, X> log(B b, X x) { return {std::tuple<B, X>{std::forward<B>(b), std::forward<X>(x)}}; } /** * LOG(B, X) function https://www.sqlite.org/lang_mathfunc.html#log * * Difference with the previous function is that previous override has `double` as return type but this * override accepts return type from you as a template argument. You can use any bindable type: * `float`, `int`, `std::optional<double>` etc. This override is handy when you expect `null` as result. * * Example: * * auto rows = storage.select(sqlite_orm::log<std::optional<double>>(10, 100)); // decltype(rows) is std::vector<std::optional<double>> */ template<class R, class B, class X> internal::built_in_function_t<R, internal::log_string, B, X> log(B b, X x) { return {std::tuple<B, X>{std::forward<B>(b), std::forward<X>(x)}}; } /** * LOG2(X) function https://www.sqlite.org/lang_mathfunc.html#log2 * * Example: * * auto rows = storage.select(sqlite_orm::log2(64)); // decltype(rows) is std::vector<double> */ template<class X> internal::built_in_function_t<double, internal::log2_string, X> log2(X x) { return {std::tuple<X>{std::forward<X>(x)}}; } /** * LOG2(X) function https://www.sqlite.org/lang_mathfunc.html#log2 * * Difference with the previous function is that previous override has `double` as return type but this * override accepts return type from you as a template argument. You can use any bindable type: * `float`, `int`, `std::optional<double>` etc. This override is handy when you expect `null` as result. * * Example: * * auto rows = storage.select(sqlite_orm::log2<std::optional<double>>(64)); // decltype(rows) is std::vector<std::optional<double>> */ template<class R, class X> internal::built_in_function_t<R, internal::log2_string, X> log2(X x) { return {std::tuple<X>{std::forward<X>(x)}}; } /** * MOD(X, Y) function https://www.sqlite.org/lang_mathfunc.html#mod * * Example: * * auto rows = storage.select(sqlite_orm::mod_f(6, 5)); // decltype(rows) is std::vector<double> */ template<class X, class Y> internal::built_in_function_t<double, internal::mod_string, X, Y> mod_f(X x, Y y) { return {std::tuple<X, Y>{std::forward<X>(x), std::forward<Y>(y)}}; } /** * MOD(X, Y) function https://www.sqlite.org/lang_mathfunc.html#mod * * Difference with the previous function is that previous override has `double` as return type but this * override accepts return type from you as a template argument. You can use any bindable type: * `float`, `int`, `std::optional<double>` etc. This override is handy when you expect `null` as result. * * Example: * * auto rows = storage.select(sqlite_orm::mod_f<std::optional<double>>(6, 5)); // decltype(rows) is std::vector<std::optional<double>> */ template<class R, class X, class Y> internal::built_in_function_t<R, internal::mod_string, X, Y> mod_f(X x, Y y) { return {std::tuple<X, Y>{std::forward<X>(x), std::forward<Y>(y)}}; } /** * PI() function https://www.sqlite.org/lang_mathfunc.html#pi * * Example: * * auto rows = storage.select(sqlite_orm::pi()); // decltype(rows) is std::vector<double> */ inline internal::built_in_function_t<double, internal::pi_string> pi() { return {{}}; } /** * PI() function https://www.sqlite.org/lang_mathfunc.html#pi * * Difference with the previous function is that previous override has `double` as return type but this * override accepts return type from you as a template argument. You can use any bindable type: * `float`, `int`, etc. * * Example: * * auto rows = storage.select(sqlite_orm::pi<float>()); // decltype(rows) is std::vector<float> */ template<class R> internal::built_in_function_t<R, internal::pi_string> pi() { return {{}}; } /** * POW(X, Y) function https://www.sqlite.org/lang_mathfunc.html#pow * * Example: * * auto rows = storage.select(sqlite_orm::pow(2, 5)); // decltype(rows) is std::vector<double> */ template<class X, class Y> internal::built_in_function_t<double, internal::pow_string, X, Y> pow(X x, Y y) { return {std::tuple<X, Y>{std::forward<X>(x), std::forward<Y>(y)}}; } /** * POW(X, Y) function https://www.sqlite.org/lang_mathfunc.html#pow * * Difference with the previous function is that previous override has `double` as return type but this * override accepts return type from you as a template argument. You can use any bindable type: * `float`, `int`, `std::optional<double>` etc. This override is handy when you expect `null` as result. * * Example: * * auto rows = storage.select(sqlite_orm::pow<std::optional<double>>(2, 5)); // decltype(rows) is std::vector<std::optional<double>> */ template<class R, class X, class Y> internal::built_in_function_t<R, internal::pow_string, X, Y> pow(X x, Y y) { return {std::tuple<X, Y>{std::forward<X>(x), std::forward<Y>(y)}}; } /** * POWER(X, Y) function https://www.sqlite.org/lang_mathfunc.html#pow * * Example: * * auto rows = storage.select(sqlite_orm::power(2, 5)); // decltype(rows) is std::vector<double> */ template<class X, class Y> internal::built_in_function_t<double, internal::power_string, X, Y> power(X x, Y y) { return {std::tuple<X, Y>{std::forward<X>(x), std::forward<Y>(y)}}; } /** * POWER(X, Y) function https://www.sqlite.org/lang_mathfunc.html#pow * * Difference with the previous function is that previous override has `double` as return type but this * override accepts return type from you as a template argument. You can use any bindable type: * `float`, `int`, `std::optional<double>` etc. This override is handy when you expect `null` as result. * * Example: * * auto rows = storage.select(sqlite_orm::power<std::optional<double>>(2, 5)); // decltype(rows) is std::vector<std::optional<double>> */ template<class R, class X, class Y> internal::built_in_function_t<R, internal::power_string, X, Y> power(X x, Y y) { return {std::tuple<X, Y>{std::forward<X>(x), std::forward<Y>(y)}}; } /** * RADIANS(X) function https://www.sqlite.org/lang_mathfunc.html#radians * * Example: * * auto rows = storage.select(sqlite_orm::radians(&Triangle::cornerAInDegrees)); // decltype(rows) is std::vector<double> */ template<class X> internal::built_in_function_t<double, internal::radians_string, X> radians(X x) { return {std::tuple<X>{std::forward<X>(x)}}; } /** * RADIANS(X) function https://www.sqlite.org/lang_mathfunc.html#radians * * Difference with the previous function is that previous override has `double` as return type but this * override accepts return type from you as a template argument. You can use any bindable type: * `float`, `int`, `std::optional<double>` etc. This override is handy when you expect `null` as result. * * Example: * * auto rows = storage.select(sqlite_orm::radians<std::optional<double>>(&Triangle::cornerAInDegrees)); // decltype(rows) is std::vector<std::optional<double>> */ template<class R, class X> internal::built_in_function_t<R, internal::radians_string, X> radians(X x) { return {std::tuple<X>{std::forward<X>(x)}}; } /** * SIN(X) function https://www.sqlite.org/lang_mathfunc.html#sin * * Example: * * auto rows = storage.select(sqlite_orm::sin(&Triangle::cornerA)); // decltype(rows) is std::vector<double> */ template<class X> internal::built_in_function_t<double, internal::sin_string, X> sin(X x) { return {std::tuple<X>{std::forward<X>(x)}}; } /** * SIN(X) function https://www.sqlite.org/lang_mathfunc.html#sin * * Difference with the previous function is that previous override has `double` as return type but this * override accepts return type from you as a template argument. You can use any bindable type: * `float`, `int`, `std::optional<double>` etc. This override is handy when you expect `null` as result. * * Example: * * auto rows = storage.select(sqlite_orm::sin<std::optional<double>>(&Triangle::cornerA)); // decltype(rows) is std::vector<std::optional<double>> */ template<class R, class X> internal::built_in_function_t<R, internal::sin_string, X> sin(X x) { return {std::tuple<X>{std::forward<X>(x)}}; } /** * SINH(X) function https://www.sqlite.org/lang_mathfunc.html#sinh * * Example: * * auto rows = storage.select(sqlite_orm::sinh(&Triangle::cornerA)); // decltype(rows) is std::vector<double> */ template<class X> internal::built_in_function_t<double, internal::sinh_string, X> sinh(X x) { return {std::tuple<X>{std::forward<X>(x)}}; } /** * SINH(X) function https://www.sqlite.org/lang_mathfunc.html#sinh * * Difference with the previous function is that previous override has `double` as return type but this * override accepts return type from you as a template argument. You can use any bindable type: * `float`, `int`, `std::optional<double>` etc. This override is handy when you expect `null` as result. * * Example: * * auto rows = storage.select(sqlite_orm::sinh<std::optional<double>>(&Triangle::cornerA)); // decltype(rows) is std::vector<std::optional<double>> */ template<class R, class X> internal::built_in_function_t<R, internal::sinh_string, X> sinh(X x) { return {std::tuple<X>{std::forward<X>(x)}}; } /** * SQRT(X) function https://www.sqlite.org/lang_mathfunc.html#sqrt * * Example: * * auto rows = storage.select(sqlite_orm::sqrt(25)); // decltype(rows) is std::vector<double> */ template<class X> internal::built_in_function_t<double, internal::sqrt_string, X> sqrt(X x) { return {std::tuple<X>{std::forward<X>(x)}}; } /** * SQRT(X) function https://www.sqlite.org/lang_mathfunc.html#sqrt * * Difference with the previous function is that previous override has `double` as return type but this * override accepts return type from you as a template argument. You can use any bindable type: * `float`, `int`, `std::optional<double>` etc. This override is handy when you expect `null` as result. * * Example: * * auto rows = storage.select(sqlite_orm::sqrt<int>(25)); // decltype(rows) is std::vector<int> */ template<class R, class X> internal::built_in_function_t<R, internal::sqrt_string, X> sqrt(X x) { return {std::tuple<X>{std::forward<X>(x)}}; } /** * TAN(X) function https://www.sqlite.org/lang_mathfunc.html#tan * * Example: * * auto rows = storage.select(sqlite_orm::tan(&Triangle::cornerC)); // decltype(rows) is std::vector<double> */ template<class X> internal::built_in_function_t<double, internal::tan_string, X> tan(X x) { return {std::tuple<X>{std::forward<X>(x)}}; } /** * TAN(X) function https://www.sqlite.org/lang_mathfunc.html#tan * * Difference with the previous function is that previous override has `double` as return type but this * override accepts return type from you as a template argument. You can use any bindable type: * `float`, `int`, `std::optional<double>` etc. This override is handy when you expect `null` as result. * * Example: * * auto rows = storage.select(sqlite_orm::tan<float>(&Triangle::cornerC)); // decltype(rows) is std::vector<float> */ template<class R, class X> internal::built_in_function_t<R, internal::tan_string, X> tan(X x) { return {std::tuple<X>{std::forward<X>(x)}}; } /** * TANH(X) function https://www.sqlite.org/lang_mathfunc.html#tanh * * Example: * * auto rows = storage.select(sqlite_orm::tanh(&Triangle::cornerC)); // decltype(rows) is std::vector<double> */ template<class X> internal::built_in_function_t<double, internal::tanh_string, X> tanh(X x) { return {std::tuple<X>{std::forward<X>(x)}}; } /** * TANH(X) function https://www.sqlite.org/lang_mathfunc.html#tanh * * Difference with the previous function is that previous override has `double` as return type but this * override accepts return type from you as a template argument. You can use any bindable type: * `float`, `int`, `std::optional<double>` etc. This override is handy when you expect `null` as result. * * Example: * * auto rows = storage.select(sqlite_orm::tanh<float>(&Triangle::cornerC)); // decltype(rows) is std::vector<float> */ template<class R, class X> internal::built_in_function_t<R, internal::tanh_string, X> tanh(X x) { return {std::tuple<X>{std::forward<X>(x)}}; } /** * TRUNC(X) function https://www.sqlite.org/lang_mathfunc.html#trunc * * Example: * * auto rows = storage.select(sqlite_orm::trunc(5.5)); // decltype(rows) is std::vector<double> */ template<class X> internal::built_in_function_t<double, internal::trunc_string, X> trunc(X x) { return {std::tuple<X>{std::forward<X>(x)}}; } /** * TRUNC(X) function https://www.sqlite.org/lang_mathfunc.html#trunc * * Difference with the previous function is that previous override has `double` as return type but this * override accepts return type from you as a template argument. You can use any bindable type: * `float`, `int`, `std::optional<double>` etc. This override is handy when you expect `null` as result. * * Example: * * auto rows = storage.select(sqlite_orm::trunc<float>(5.5)); // decltype(rows) is std::vector<float> */ template<class R, class X> internal::built_in_function_t<R, internal::trunc_string, X> trunc(X x) { return {std::tuple<X>{std::forward<X>(x)}}; } #endif // SQLITE_ENABLE_MATH_FUNCTIONS /** * TYPEOF(x) function https://sqlite.org/lang_corefunc.html#typeof */ template<class T> internal::built_in_function_t<std::string, internal::typeof_string, T> typeof_(T t) { return {std::tuple<T>{std::forward<T>(t)}}; } /** * UNICODE(x) function https://sqlite.org/lang_corefunc.html#unicode */ template<class T> internal::built_in_function_t<int, internal::unicode_string, T> unicode(T t) { return {std::tuple<T>{std::forward<T>(t)}}; } /** * LENGTH(x) function https://sqlite.org/lang_corefunc.html#length */ template<class T> internal::built_in_function_t<int, internal::length_string, T> length(T t) { return {std::tuple<T>{std::forward<T>(t)}}; } /** * ABS(x) function https://sqlite.org/lang_corefunc.html#abs */ template<class T> internal::built_in_function_t<std::unique_ptr<double>, internal::abs_string, T> abs(T t) { return {std::tuple<T>{std::forward<T>(t)}}; } /** * LOWER(x) function https://sqlite.org/lang_corefunc.html#lower */ template<class T> internal::built_in_function_t<std::string, internal::lower_string, T> lower(T t) { return {std::tuple<T>{std::forward<T>(t)}}; } /** * UPPER(x) function https://sqlite.org/lang_corefunc.html#upper */ template<class T> internal::built_in_function_t<std::string, internal::upper_string, T> upper(T t) { return {std::tuple<T>{std::forward<T>(t)}}; } /** * LAST_INSERT_ROWID(x) function https://www.sqlite.org/lang_corefunc.html#last_insert_rowid */ inline internal::built_in_function_t<int64, internal::last_insert_rowid_string> last_insert_rowid() { return {{}}; } /** * TOTAL_CHANGES() function https://sqlite.org/lang_corefunc.html#total_changes */ inline internal::built_in_function_t<int, internal::total_changes_string> total_changes() { return {{}}; } /** * CHANGES() function https://sqlite.org/lang_corefunc.html#changes */ inline internal::built_in_function_t<int, internal::changes_string> changes() { return {{}}; } /** * TRIM(X) function https://sqlite.org/lang_corefunc.html#trim */ template<class T> internal::built_in_function_t<std::string, internal::trim_string, T> trim(T t) { return {std::tuple<T>{std::forward<T>(t)}}; } /** * TRIM(X,Y) function https://sqlite.org/lang_corefunc.html#trim */ template<class X, class Y> internal::built_in_function_t<std::string, internal::trim_string, X, Y> trim(X x, Y y) { return {std::tuple<X, Y>{std::forward<X>(x), std::forward<Y>(y)}}; } /** * LTRIM(X) function https://sqlite.org/lang_corefunc.html#ltrim */ template<class X> internal::built_in_function_t<std::string, internal::ltrim_string, X> ltrim(X x) { return {std::tuple<X>{std::forward<X>(x)}}; } /** * LTRIM(X,Y) function https://sqlite.org/lang_corefunc.html#ltrim */ template<class X, class Y> internal::built_in_function_t<std::string, internal::ltrim_string, X, Y> ltrim(X x, Y y) { return {std::tuple<X, Y>{std::forward<X>(x), std::forward<Y>(y)}}; } /** * RTRIM(X) function https://sqlite.org/lang_corefunc.html#rtrim */ template<class X> internal::built_in_function_t<std::string, internal::rtrim_string, X> rtrim(X x) { return {std::tuple<X>{std::forward<X>(x)}}; } /** * RTRIM(X,Y) function https://sqlite.org/lang_corefunc.html#rtrim */ template<class X, class Y> internal::built_in_function_t<std::string, internal::rtrim_string, X, Y> rtrim(X x, Y y) { return {std::tuple<X, Y>{std::forward<X>(x), std::forward<Y>(y)}}; } /** * HEX(X) function https://sqlite.org/lang_corefunc.html#hex */ template<class X> internal::built_in_function_t<std::string, internal::hex_string, X> hex(X x) { return {std::tuple<X>{std::forward<X>(x)}}; } /** * QUOTE(X) function https://sqlite.org/lang_corefunc.html#quote */ template<class X> internal::built_in_function_t<std::string, internal::quote_string, X> quote(X x) { return {std::tuple<X>{std::forward<X>(x)}}; } /** * RANDOMBLOB(X) function https://sqlite.org/lang_corefunc.html#randomblob */ template<class X> internal::built_in_function_t<std::vector<char>, internal::randomblob_string, X> randomblob(X x) { return {std::tuple<X>{std::forward<X>(x)}}; } /** * INSTR(X) function https://sqlite.org/lang_corefunc.html#instr */ template<class X, class Y> internal::built_in_function_t<int, internal::instr_string, X, Y> instr(X x, Y y) { return {std::tuple<X, Y>{std::forward<X>(x), std::forward<Y>(y)}}; } /** * REPLACE(X) function https://sqlite.org/lang_corefunc.html#replace */ template<class X, class Y, class Z, std::enable_if_t<internal::count_tuple<std::tuple<X, Y, Z>, internal::is_into>::value == 0, bool> = true> internal::built_in_function_t<std::string, internal::replace_string, X, Y, Z> replace(X x, Y y, Z z) { return {std::tuple<X, Y, Z>{std::forward<X>(x), std::forward<Y>(y), std::forward<Z>(z)}}; } /** * ROUND(X) function https://sqlite.org/lang_corefunc.html#round */ template<class X> internal::built_in_function_t<double, internal::round_string, X> round(X x) { return {std::tuple<X>{std::forward<X>(x)}}; } /** * ROUND(X, Y) function https://sqlite.org/lang_corefunc.html#round */ template<class X, class Y> internal::built_in_function_t<double, internal::round_string, X, Y> round(X x, Y y) { return {std::tuple<X, Y>{std::forward<X>(x), std::forward<Y>(y)}}; } #if SQLITE_VERSION_NUMBER >= 3007016 /** * CHAR(X1,X2,...,XN) function https://sqlite.org/lang_corefunc.html#char */ template<class... Args> internal::built_in_function_t<std::string, internal::char_string, Args...> char_(Args... args) { return {std::make_tuple(std::forward<Args>(args)...)}; } /** * RANDOM() function https://www.sqlite.org/lang_corefunc.html#random */ inline internal::built_in_function_t<int, internal::random_string> random() { return {{}}; } #endif /** * COALESCE(X,Y,...) function https://www.sqlite.org/lang_corefunc.html#coalesce */ template<class R = void, class... Args> auto coalesce(Args... args) -> internal::built_in_function_t<typename std::conditional_t< // choose R or common type std::is_void<R>::value, std::common_type<internal::field_type_or_type_t<Args>...>, polyfill::type_identity<R>>::type, internal::coalesce_string, Args...> { return {std::make_tuple(std::forward<Args>(args)...)}; } /** * IFNULL(X,Y) function https://www.sqlite.org/lang_corefunc.html#ifnull */ template<class R = void, class X, class Y> auto ifnull(X x, Y y) -> internal::built_in_function_t< typename std::conditional_t< // choose R or common type std::is_void<R>::value, std::common_type<internal::field_type_or_type_t<X>, internal::field_type_or_type_t<Y>>, polyfill::type_identity<R>>::type, internal::ifnull_string, X, Y> { return {std::make_tuple(std::move(x), std::move(y))}; } /** * NULLIF(X,Y) function https://www.sqlite.org/lang_corefunc.html#nullif */ #if defined(SQLITE_ORM_OPTIONAL_SUPPORTED) && defined(SQLITE_ORM_IF_CONSTEXPR_SUPPORTED) /** * NULLIF(X,Y) using common return type of X and Y */ template<class R = void, class X, class Y, std::enable_if_t<polyfill::disjunction_v<polyfill::negation<std::is_void<R>>, polyfill::is_detected<std::common_type_t, internal::field_type_or_type_t<X>, internal::field_type_or_type_t<Y>>>, bool> = true> auto nullif(X x, Y y) { if constexpr(std::is_void_v<R>) { using F = internal::built_in_function_t< std::optional<std::common_type_t<internal::field_type_or_type_t<X>, internal::field_type_or_type_t<Y>>>, internal::nullif_string, X, Y>; return F{std::make_tuple(std::move(x), std::move(y))}; } else { using F = internal::built_in_function_t<R, internal::nullif_string, X, Y>; return F{std::make_tuple(std::move(x), std::move(y))}; } } #else template<class R, class X, class Y> internal::built_in_function_t<R, internal::nullif_string, X, Y> nullif(X x, Y y) { return {std::make_tuple(std::move(x), std::move(y))}; } #endif /** * DATE(timestring, modifier, modifier, ...) function https://www.sqlite.org/lang_datefunc.html */ template<class... Args> internal::built_in_function_t<std::string, internal::date_string, Args...> date(Args... args) { return {std::tuple<Args...>{std::forward<Args>(args)...}}; } /** * TIME(timestring, modifier, modifier, ...) function https://www.sqlite.org/lang_datefunc.html */ template<class... Args> internal::built_in_function_t<std::string, internal::time_string, Args...> time(Args... args) { return {std::tuple<Args...>{std::forward<Args>(args)...}}; } /** * DATETIME(timestring, modifier, modifier, ...) function https://www.sqlite.org/lang_datefunc.html */ template<class... Args> internal::built_in_function_t<std::string, internal::datetime_string, Args...> datetime(Args... args) { return {std::tuple<Args...>{std::forward<Args>(args)...}}; } /** * JULIANDAY(timestring, modifier, modifier, ...) function https://www.sqlite.org/lang_datefunc.html */ template<class... Args> internal::built_in_function_t<double, internal::julianday_string, Args...> julianday(Args... args) { return {std::tuple<Args...>{std::forward<Args>(args)...}}; } /** * STRFTIME(timestring, modifier, modifier, ...) function https://www.sqlite.org/lang_datefunc.html */ template<class... Args> internal::built_in_function_t<std::string, internal::strftime_string, Args...> strftime(Args... args) { return {std::tuple<Args...>{std::forward<Args>(args)...}}; } /** * ZEROBLOB(N) function https://www.sqlite.org/lang_corefunc.html#zeroblob */ template<class N> internal::built_in_function_t<std::vector<char>, internal::zeroblob_string, N> zeroblob(N n) { return {std::tuple<N>{std::forward<N>(n)}}; } /** * SUBSTR(X,Y) function https://www.sqlite.org/lang_corefunc.html#substr */ template<class X, class Y> internal::built_in_function_t<std::string, internal::substr_string, X, Y> substr(X x, Y y) { return {std::tuple<X, Y>{std::forward<X>(x), std::forward<Y>(y)}}; } /** * SUBSTR(X,Y,Z) function https://www.sqlite.org/lang_corefunc.html#substr */ template<class X, class Y, class Z> internal::built_in_function_t<std::string, internal::substr_string, X, Y, Z> substr(X x, Y y, Z z) { return {std::tuple<X, Y, Z>{std::forward<X>(x), std::forward<Y>(y), std::forward<Z>(z)}}; } #ifdef SQLITE_SOUNDEX /** * SOUNDEX(X) function https://www.sqlite.org/lang_corefunc.html#soundex */ template<class X> internal::built_in_function_t<std::string, internal::soundex_string, X> soundex(X x) { return {std::tuple<X>{std::forward<X>(x)}}; } #endif /** * TOTAL(X) aggregate function. */ template<class X> internal::built_in_aggregate_function_t<double, internal::total_string, X> total(X x) { return {std::tuple<X>{std::forward<X>(x)}}; } /** * SUM(X) aggregate function. */ template<class X> internal::built_in_aggregate_function_t<std::unique_ptr<double>, internal::sum_string, X> sum(X x) { return {std::tuple<X>{std::forward<X>(x)}}; } /** * COUNT(X) aggregate function. */ template<class X> internal::built_in_aggregate_function_t<int, internal::count_string, X> count(X x) { return {std::tuple<X>{std::forward<X>(x)}}; } /** * COUNT(*) without FROM function. */ inline internal::count_asterisk_without_type count() { return {}; } /** * COUNT(*) with FROM function. Specified type T will be serializeed as * a from argument. */ template<class T> internal::count_asterisk_t<T> count() { return {}; } /** * AVG(X) aggregate function. */ template<class X> internal::built_in_aggregate_function_t<double, internal::avg_string, X> avg(X x) { return {std::tuple<X>{std::forward<X>(x)}}; } /** * MAX(X) aggregate function. */ template<class X> internal::built_in_aggregate_function_t<internal::unique_ptr_result_of<X>, internal::max_string, X> max(X x) { return {std::tuple<X>{std::forward<X>(x)}}; } /** * MIN(X) aggregate function. */ template<class X> internal::built_in_aggregate_function_t<internal::unique_ptr_result_of<X>, internal::min_string, X> min(X x) { return {std::tuple<X>{std::forward<X>(x)}}; } /** * MAX(X, Y, ...) scalar function. * The return type is the type of the first argument. */ template<class X, class Y, class... Rest> internal::built_in_function_t<internal::unique_ptr_result_of<X>, internal::max_string, X, Y, Rest...> max(X x, Y y, Rest... rest) { return {std::tuple<X, Y, Rest...>{std::forward<X>(x), std::forward<Y>(y), std::forward<Rest>(rest)...}}; } /** * MIN(X, Y, ...) scalar function. * The return type is the type of the first argument. */ template<class X, class Y, class... Rest> internal::built_in_function_t<internal::unique_ptr_result_of<X>, internal::min_string, X, Y, Rest...> min(X x, Y y, Rest... rest) { return {std::tuple<X, Y, Rest...>{std::forward<X>(x), std::forward<Y>(y), std::forward<Rest>(rest)...}}; } /** * GROUP_CONCAT(X) aggregate function. */ template<class X> internal::built_in_aggregate_function_t<std::string, internal::group_concat_string, X> group_concat(X x) { return {std::tuple<X>{std::forward<X>(x)}}; } /** * GROUP_CONCAT(X, Y) aggregate function. */ template<class X, class Y> internal::built_in_aggregate_function_t<std::string, internal::group_concat_string, X, Y> group_concat(X x, Y y) { return {std::tuple<X, Y>{std::forward<X>(x), std::forward<Y>(y)}}; } #ifdef SQLITE_ENABLE_JSON1 template<class X> internal::built_in_function_t<std::string, internal::json_string, X> json(X x) { return {std::tuple<X>{std::forward<X>(x)}}; } template<class... Args> internal::built_in_function_t<std::string, internal::json_array_string, Args...> json_array(Args... args) { return {std::tuple<Args...>{std::forward<Args>(args)...}}; } template<class X> internal::built_in_function_t<int, internal::json_array_length_string, X> json_array_length(X x) { return {std::tuple<X>{std::forward<X>(x)}}; } template<class R, class X> internal::built_in_function_t<R, internal::json_array_length_string, X> json_array_length(X x) { return {std::tuple<X>{std::forward<X>(x)}}; } template<class X, class Y> internal::built_in_function_t<int, internal::json_array_length_string, X, Y> json_array_length(X x, Y y) { return {std::tuple<X, Y>{std::forward<X>(x), std::forward<Y>(y)}}; } template<class R, class X, class Y> internal::built_in_function_t<R, internal::json_array_length_string, X, Y> json_array_length(X x, Y y) { return {std::tuple<X, Y>{std::forward<X>(x), std::forward<Y>(y)}}; } template<class R, class X, class... Args> internal::built_in_function_t<R, internal::json_extract_string, X, Args...> json_extract(X x, Args... args) { return {std::tuple<X, Args...>{std::forward<X>(x), std::forward<Args>(args)...}}; } template<class X, class... Args> internal::built_in_function_t<std::string, internal::json_insert_string, X, Args...> json_insert(X x, Args... args) { static_assert(std::tuple_size<std::tuple<Args...>>::value % 2 == 0, "number of arguments in json_insert must be odd"); return {std::tuple<X, Args...>{std::forward<X>(x), std::forward<Args>(args)...}}; } template<class X, class... Args> internal::built_in_function_t<std::string, internal::json_replace_string, X, Args...> json_replace(X x, Args... args) { static_assert(std::tuple_size<std::tuple<Args...>>::value % 2 == 0, "number of arguments in json_replace must be odd"); return {std::tuple<X, Args...>{std::forward<X>(x), std::forward<Args>(args)...}}; } template<class X, class... Args> internal::built_in_function_t<std::string, internal::json_set_string, X, Args...> json_set(X x, Args... args) { static_assert(std::tuple_size<std::tuple<Args...>>::value % 2 == 0, "number of arguments in json_set must be odd"); return {std::tuple<X, Args...>{std::forward<X>(x), std::forward<Args>(args)...}}; } template<class... Args> internal::built_in_function_t<std::string, internal::json_object_string, Args...> json_object(Args... args) { static_assert(std::tuple_size<std::tuple<Args...>>::value % 2 == 0, "number of arguments in json_object must be even"); return {std::tuple<Args...>{std::forward<Args>(args)...}}; } template<class X, class Y> internal::built_in_function_t<std::string, internal::json_patch_string, X, Y> json_patch(X x, Y y) { return {std::tuple<X, Y>{std::forward<X>(x), std::forward<Y>(y)}}; } template<class X, class... Args> internal::built_in_function_t<std::string, internal::json_remove_string, X, Args...> json_remove(X x, Args... args) { return {std::tuple<X, Args...>{std::forward<X>(x), std::forward<Args>(args)...}}; } template<class R, class X, class... Args> internal::built_in_function_t<R, internal::json_remove_string, X, Args...> json_remove(X x, Args... args) { return {std::tuple<X, Args...>{std::forward<X>(x), std::forward<Args>(args)...}}; } template<class X> internal::built_in_function_t<std::string, internal::json_type_string, X> json_type(X x) { return {std::tuple<X>{std::forward<X>(x)}}; } template<class R, class X> internal::built_in_function_t<R, internal::json_type_string, X> json_type(X x) { return {std::tuple<X>{std::forward<X>(x)}}; } template<class X, class Y> internal::built_in_function_t<std::string, internal::json_type_string, X, Y> json_type(X x, Y y) { return {std::tuple<X, Y>{std::forward<X>(x), std::forward<Y>(y)}}; } template<class R, class X, class Y> internal::built_in_function_t<R, internal::json_type_string, X, Y> json_type(X x, Y y) { return {std::tuple<X, Y>{std::forward<X>(x), std::forward<Y>(y)}}; } template<class X> internal::built_in_function_t<bool, internal::json_valid_string, X> json_valid(X x) { return {std::tuple<X>{std::forward<X>(x)}}; } template<class R, class X> internal::built_in_function_t<R, internal::json_quote_string, X> json_quote(X x) { return {std::tuple<X>{std::forward<X>(x)}}; } template<class X> internal::built_in_function_t<std::string, internal::json_group_array_string, X> json_group_array(X x) { return {std::tuple<X>{std::forward<X>(x)}}; } template<class X, class Y> internal::built_in_function_t<std::string, internal::json_group_object_string, X, Y> json_group_object(X x, Y y) { return {std::tuple<X, Y>{std::forward<X>(x), std::forward<Y>(y)}}; } #endif // SQLITE_ENABLE_JSON1 template<class L, class R, std::enable_if_t<polyfill::disjunction_v<std::is_base_of<internal::arithmetic_t, L>, std::is_base_of<internal::arithmetic_t, R>>, bool> = true> internal::add_t<L, R> operator+(L l, R r) { return {std::move(l), std::move(r)}; } template<class L, class R, std::enable_if_t<polyfill::disjunction_v<std::is_base_of<internal::arithmetic_t, L>, std::is_base_of<internal::arithmetic_t, R>>, bool> = true> internal::sub_t<L, R> operator-(L l, R r) { return {std::move(l), std::move(r)}; } template<class L, class R, std::enable_if_t<polyfill::disjunction_v<std::is_base_of<internal::arithmetic_t, L>, std::is_base_of<internal::arithmetic_t, R>>, bool> = true> internal::mul_t<L, R> operator*(L l, R r) { return {std::move(l), std::move(r)}; } template<class L, class R, std::enable_if_t<polyfill::disjunction_v<std::is_base_of<internal::arithmetic_t, L>, std::is_base_of<internal::arithmetic_t, R>>, bool> = true> internal::div_t<L, R> operator/(L l, R r) { return {std::move(l), std::move(r)}; } template<class L, class R, std::enable_if_t<polyfill::disjunction_v<std::is_base_of<internal::arithmetic_t, L>, std::is_base_of<internal::arithmetic_t, R>>, bool> = true> internal::mod_t<L, R> operator%(L l, R r) { return {std::move(l), std::move(r)}; } }