diff --git a/include/sqlpp11/update_list.h b/include/sqlpp11/update_list.h index 26b6a7e7..e32b2400 100644 --- a/include/sqlpp11/update_list.h +++ b/include/sqlpp11/update_list.h @@ -191,33 +191,44 @@ namespace sqlpp struct _methods_t { using _database_t = typename Policies::_database_t; - template - using _new_statement_t = new_statement; + + template + using _check = detail::all_t::value...>; + + template + using _new_statement_t = new_statement_t; using _consistency_check = assert_update_assignments_t; template auto set(Assignments... assignments) const - -> _new_statement_t> + -> _new_statement_t<_check, update_list_t> { static_assert(sizeof...(Assignments), "at least one assignment expression required in set()"); - return _set_impl(assignments...); + static_assert(_check::value, "at least one argument is not an assignment in set()"); + + return _set_impl(_check{}, assignments...); } template auto dynamic_set(Assignments... assignments) const - -> _new_statement_t> + -> _new_statement_t<_check, update_list_t<_database_t, Assignments...>> { static_assert(not std::is_same<_database_t, void>::value, "dynamic_set() must not be called in a static statement"); - return _set_impl<_database_t>(assignments...); + static_assert(_check::value, "at least one argument is not an assignment in set()"); + + return _set_impl<_database_t>(_check{}, assignments...); } private: template - auto _set_impl(Assignments... assignments) const - -> _new_statement_t> + auto _set_impl(const std::false_type&, Assignments... assignments) const + -> bad_statement; + + template + auto _set_impl(const std::true_type&, Assignments... assignments) const + -> _new_statement_t> { - static_assert(detail::all_t::value...>::value, "at least one argument is not an assignment in set()"); static_assert(not detail::has_duplicates...>::value, "at least one duplicate column detected in set()"); static_assert(detail::none_t>::value...>::value, "at least one assignment is prohibited by its column definition in set()"); diff --git a/include/sqlpp11/using.h b/include/sqlpp11/using.h index cfc0858a..e743e0ae 100644 --- a/include/sqlpp11/using.h +++ b/include/sqlpp11/using.h @@ -62,12 +62,6 @@ namespace sqlpp using _is_dynamic = is_database; - static_assert(_is_dynamic::value or sizeof...(Tables), "at least one table argument required in using()"); - - static_assert(not detail::has_duplicates::value, "at least one duplicate argument detected in using()"); - - static_assert(detail::all_t::value...>::value, "at least one argument is not an table in using()"); - // Data using _data_t = using_data_t; @@ -165,25 +159,49 @@ namespace sqlpp struct _methods_t { using _database_t = typename Policies::_database_t; - template - using _new_statement_t = new_statement; + + template + using _check = detail::all_t::value...>; + + template + using _new_statement_t = new_statement_t; using _consistency_check = consistent_t; template auto using_(Args... args) const - -> _new_statement_t> + -> _new_statement_t<_check, using_t> { - return { static_cast&>(*this), using_data_t{args...} }; + static_assert(not detail::has_duplicates::value, "at least one duplicate argument detected in using()"); + static_assert(sizeof...(Args), "at least one table required in using()"); + static_assert(_check::value, "at least one argument is not an table in using()"); + + return { _using_impl(_check{}, args...) }; } template auto dynamic_using(Args... args) const - -> _new_statement_t> + -> _new_statement_t<_check, using_t<_database_t, Args...>> { static_assert(not std::is_same<_database_t, void>::value, "dynamic_using must not be called in a static statement"); - return { static_cast&>(*this), using_data_t<_database_t, Args...>{args...} }; + static_assert(_check::value, "at least one argument is not an table in using()"); + + return { _using_impl<_database_t>(_check{}, args...) }; } + + private: + template + auto _using_impl(const std::false_type&, Args... args) const + -> bad_statement; + + template + auto _using_impl(const std::true_type&, Args... args) const + -> _new_statement_t> + { + static_assert(not detail::has_duplicates::value, "at least one duplicate argument detected in using()"); + + return { static_cast&>(*this), using_data_t{args...} }; + }; }; };