diff --git a/include/sqlpp11/is_not_null.h b/include/sqlpp11/is_not_null.h index 4fd3706f..f5f232ac 100644 --- a/include/sqlpp11/is_not_null.h +++ b/include/sqlpp11/is_not_null.h @@ -52,7 +52,7 @@ namespace sqlpp struct is_not_null_t : public expression_operators, boolean>, public alias_operators> { - using _traits = make_traits; + using _traits = make_traits; using _nodes = detail::type_vector; using _auto_alias_t = is_not_null_alias_t; @@ -73,9 +73,8 @@ namespace sqlpp template Context& serialize(const is_not_null_t& t, Context& context) { - context << "("; serialize_operand(t._operand, context); - context << " IS NOT NULL)"; + context << " IS NOT NULL"; return context; } } // namespace sqlpp diff --git a/include/sqlpp11/is_null.h b/include/sqlpp11/is_null.h index 8baa6a59..1c692b1a 100644 --- a/include/sqlpp11/is_null.h +++ b/include/sqlpp11/is_null.h @@ -52,7 +52,7 @@ namespace sqlpp struct is_null_t : public expression_operators, boolean>, public alias_operators> { - using _traits = make_traits; + using _traits = make_traits; using _nodes = detail::type_vector; using _auto_alias_t = is_null_alias_t; @@ -73,9 +73,8 @@ namespace sqlpp template Context& serialize(const is_null_t& t, Context& context) { - context << "("; serialize_operand(t._operand, context); - context << " IS NULL)"; + context << " IS NULL"; return context; } } // namespace sqlpp diff --git a/tests/core/serialize/CMakeLists.txt b/tests/core/serialize/CMakeLists.txt index 8ee4c4ee..6032f1a4 100644 --- a/tests/core/serialize/CMakeLists.txt +++ b/tests/core/serialize/CMakeLists.txt @@ -33,6 +33,8 @@ set(test_files From.cpp In.cpp Insert.cpp + IsNotNull.cpp + IsNull.cpp Lower.cpp Max.cpp Min.cpp diff --git a/tests/core/serialize/IsNotNull.cpp b/tests/core/serialize/IsNotNull.cpp new file mode 100644 index 00000000..a880b3fe --- /dev/null +++ b/tests/core/serialize/IsNotNull.cpp @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2023, 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 IsNotNull(int, char* []) +{ + const auto bar = test::TabBar{}; + + // Single column. + compare(__LINE__, is_not_null(bar.beta), "tab_bar.beta IS NOT NULL"); + + // Expression. + compare(__LINE__, is_not_null(bar.beta + "suffix"), "(tab_bar.beta||'suffix') IS NOT NULL"); + + // With sub select. + compare(__LINE__, is_not_null(select(sqlpp::value("something").as(sqlpp::alias::a))), "(SELECT 'something' AS a) IS NOT NULL"); + + // Requires parens. + compare(__LINE__, is_not_null(bar.beta) or bar.beta == "", "((tab_bar.beta IS NOT NULL) OR (tab_bar.beta=''))"); + compare(__LINE__, bar.beta == "" or is_not_null(bar.beta), "((tab_bar.beta='') OR (tab_bar.beta IS NOT NULL))"); + + return 0; +} diff --git a/tests/core/serialize/IsNull.cpp b/tests/core/serialize/IsNull.cpp new file mode 100644 index 00000000..ffadb530 --- /dev/null +++ b/tests/core/serialize/IsNull.cpp @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2023, 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 IsNull(int, char* []) +{ + const auto bar = test::TabBar{}; + + // Single column. + compare(__LINE__, is_null(bar.beta), "tab_bar.beta IS NULL"); + + // Expression. + compare(__LINE__, is_null(bar.beta + "suffix"), "(tab_bar.beta||'suffix') IS NULL"); + + // With sub select. + compare(__LINE__, is_null(select(sqlpp::value("something").as(sqlpp::alias::a))), "(SELECT 'something' AS a) IS NULL"); + + // Requires parens. + compare(__LINE__, is_null(bar.beta) or bar.beta == "", "((tab_bar.beta IS NULL) OR (tab_bar.beta=''))"); + compare(__LINE__, bar.beta == "" or is_null(bar.beta), "((tab_bar.beta='') OR (tab_bar.beta IS NULL))"); + + return 0; +} diff --git a/tests/core/serialize/Where.cpp b/tests/core/serialize/Where.cpp index cbb1a7fe..99a2e7d1 100644 --- a/tests/core/serialize/Where.cpp +++ b/tests/core/serialize/Where.cpp @@ -63,11 +63,11 @@ int Where(int, char*[]) // Sometimes compare(__LINE__, where(bar.gamma), " WHERE tab_bar.gamma"); compare(__LINE__, where(bar.gamma == false), " WHERE (tab_bar.gamma=" + getFalse() + ")"); - compare(__LINE__, where(bar.beta.is_null()), " WHERE (tab_bar.beta IS NULL)"); + compare(__LINE__, where(bar.beta.is_null()), " WHERE tab_bar.beta IS NULL"); compare(__LINE__, where(bar.beta == "SQL"), " WHERE (tab_bar.beta='SQL')"); compare(__LINE__, where(is_equal_to_or_null(bar.beta, ::sqlpp::value_or_null("SQL"))), " WHERE (tab_bar.beta='SQL')"); compare(__LINE__, where(is_equal_to_or_null(bar.beta, ::sqlpp::value_or_null(::sqlpp::null))), - " WHERE (tab_bar.beta IS NULL)"); + " WHERE tab_bar.beta IS NULL"); #if __cplusplus >= 201703L // string_view argument std::string_view sqlString = "SQL";