diff --git a/include/sqlpp11/core/clause/having.h b/include/sqlpp11/core/clause/having.h index 0b682165..7d554412 100644 --- a/include/sqlpp11/core/clause/having.h +++ b/include/sqlpp11/core/clause/having.h @@ -101,10 +101,7 @@ namespace sqlpp }; template - using check_having_t = typename check_having::type; - - template - using check_having_static_t = check_having_t; + using check_having_t = typename check_having>::type; template constexpr auto are_all_parameters_expressions() -> bool @@ -148,9 +145,9 @@ namespace sqlpp template auto having(Expression expression) const - -> _new_statement_t, having_t> + -> _new_statement_t, having_t> { - using Check = check_having_static_t; + using Check = check_having_t; return _having_impl(Check{}, expression); } @@ -176,6 +173,16 @@ namespace sqlpp return " HAVING " + to_sql_string(context, t._expression); } + template + auto to_sql_string(Context& context, const having_data_t>& t) -> std::string + { + if (t._expression._condition) + { + return " HAVING " + to_sql_string(context, t._expression._expr); + } + return ""; + } + template auto having(T&& t) -> decltype(statement_t().having(std::forward(t))) { diff --git a/tests/core/serialize/clause/CMakeLists.txt b/tests/core/serialize/clause/CMakeLists.txt index 2cf0b9b3..10d9d3b5 100644 --- a/tests/core/serialize/clause/CMakeLists.txt +++ b/tests/core/serialize/clause/CMakeLists.txt @@ -31,6 +31,7 @@ endfunction() create_test(group_by) create_test(from) +create_test(having) create_test(insert) create_test(insert_columns) create_test(insert_default_values) diff --git a/tests/core/serialize/clause/having.cpp b/tests/core/serialize/clause/having.cpp new file mode 100644 index 00000000..b80bcfb3 --- /dev/null +++ b/tests/core/serialize/clause/having.cpp @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2024, Roland Bock + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "Sample.h" +#include "../compare.h" +#include + +int main(int, char* []) +{ + const auto val = sqlpp::value(17); + const auto expr = sqlpp::value(17) + 4; + + const auto foo = test::TabFoo{}; + + // Without condition. + SQLPP_COMPARE(sqlpp::having(true), " HAVING 1"); + + // Whith static condition. + SQLPP_COMPARE(sqlpp::having(foo.boolN), " HAVING tab_foo.bool_n"); + SQLPP_COMPARE(sqlpp::having(foo.boolN.is_not_distinct_from(true)), " HAVING tab_foo.bool_n IS NOT DISTINCT FROM 1"); + SQLPP_COMPARE(sqlpp::having(foo.id > 17), " HAVING tab_foo.id > 17"); + SQLPP_COMPARE(sqlpp::having(max(foo.id) > 17), " HAVING MAX(tab_foo.id) > 17"); + + // With dynamic condition. + SQLPP_COMPARE(sqlpp::having(dynamic(true, max(foo.id) > 17)), " HAVING MAX(tab_foo.id) > 17"); + SQLPP_COMPARE(sqlpp::having(dynamic(false, max(foo.id) > 17)), ""); + + return 0; +}