diff --git a/include/sqlpp11/core/clause/where.h b/include/sqlpp11/core/clause/where.h index f3f4826a..7df53952 100644 --- a/include/sqlpp11/core/clause/where.h +++ b/include/sqlpp11/core/clause/where.h @@ -131,10 +131,7 @@ namespace sqlpp }; template - using check_where_t = typename check_where::type; - - template - using check_where_static_t = check_where_t; + using check_where_t = typename check_where>::type; // NO WHERE YET template @@ -170,9 +167,9 @@ namespace sqlpp template auto where(Expression expression) const - -> _new_statement_t, where_t> + -> _new_statement_t, where_t> { - using Check = check_where_static_t; + using Check = check_where_t; return _where_impl(Check{}, expression); } @@ -197,6 +194,16 @@ namespace sqlpp return " WHERE " + to_sql_string(context, t._expression); } + template + auto to_sql_string(Context& context, const where_data_t>& t) -> std::string + { + if (t._expression._condition) + { + return " WHERE " + to_sql_string(context, t._expression._expr); + } + return ""; + } + template auto to_sql_string(Context& , const where_data_t&) -> std::string { diff --git a/tests/core/serialize/clause/CMakeLists.txt b/tests/core/serialize/clause/CMakeLists.txt index 2d240fe1..2cf0b9b3 100644 --- a/tests/core/serialize/clause/CMakeLists.txt +++ b/tests/core/serialize/clause/CMakeLists.txt @@ -38,4 +38,5 @@ create_test(insert_set) create_test(select_columns) create_test(select_flags) create_test(update_set) +create_test(where) diff --git a/tests/core/serialize/clause/where.cpp b/tests/core/serialize/clause/where.cpp new file mode 100644 index 00000000..5487223b --- /dev/null +++ b/tests/core/serialize/clause/where.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::unconditionally(), ""); + SQLPP_COMPARE(sqlpp::where(true), " WHERE 1"); + + // Whith static condition. + SQLPP_COMPARE(sqlpp::where(foo.boolN), " WHERE tab_foo.bool_n"); + SQLPP_COMPARE(sqlpp::where(foo.boolN.is_not_distinct_from(true)), " WHERE tab_foo.bool_n IS NOT DISTINCT FROM 1"); + SQLPP_COMPARE(sqlpp::where(foo.id > 17), " WHERE tab_foo.id > 17"); + + // With dynamic condition. + SQLPP_COMPARE(sqlpp::where(dynamic(true, foo.id > 17)), " WHERE tab_foo.id > 17"); + SQLPP_COMPARE(sqlpp::where(dynamic(false, foo.id > 17)), ""); + + return 0; +}