mirror of
https://github.com/rbock/sqlpp11.git
synced 2024-11-16 04:47:18 +08:00
More fixing tests
This commit is contained in:
parent
52ca3b6036
commit
454deace20
@ -85,6 +85,19 @@ namespace sqlpp
|
|||||||
detail::type_vector<>>::type>;
|
detail::type_vector<>>::type>;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#warning: Need to make extra sure that ON does not require on extra tables.
|
||||||
|
template <typename Lhs, typename JoinType, typename Rhs, typename Condition>
|
||||||
|
struct required_tables_of<join_t<Lhs, JoinType, Rhs, Condition>>
|
||||||
|
{
|
||||||
|
using type = detail::type_vector<>;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename Lhs, typename JoinType, typename Rhs, typename Condition>
|
||||||
|
struct required_static_tables_of<join_t<Lhs, JoinType, Rhs, Condition>>
|
||||||
|
{
|
||||||
|
using type = detail::type_vector<>;
|
||||||
|
};
|
||||||
|
|
||||||
template <typename Lhs, typename JoinType, typename Rhs, typename Condition>
|
template <typename Lhs, typename JoinType, typename Rhs, typename Condition>
|
||||||
struct is_table<join_t<Lhs, JoinType, Rhs, Condition>> : public std::true_type
|
struct is_table<join_t<Lhs, JoinType, Rhs, Condition>> : public std::true_type
|
||||||
{
|
{
|
||||||
|
@ -43,7 +43,7 @@ namespace sqlpp
|
|||||||
using _required_ctes = required_ctes_of<TableSpec>;
|
using _required_ctes = required_ctes_of<TableSpec>;
|
||||||
using _provided_tables = detail::type_set<AliasProvider>;
|
using _provided_tables = detail::type_set<AliasProvider>;
|
||||||
|
|
||||||
static_assert(required_tables_of_t<TableSpec>::size::value == 0, "table aliases must not depend on external tables");
|
static_assert(required_tables_of_t<TableSpec>::empty(), "table aliases must not depend on external tables");
|
||||||
|
|
||||||
#warning: need to inherit?
|
#warning: need to inherit?
|
||||||
//using _column_tuple_t = std::tuple<column_t<AliasProvider, ColumnSpec>...>;
|
//using _column_tuple_t = std::tuple<column_t<AliasProvider, ColumnSpec>...>;
|
||||||
@ -55,6 +55,23 @@ namespace sqlpp
|
|||||||
template<typename AliasProvider, typename TableSpec>
|
template<typename AliasProvider, typename TableSpec>
|
||||||
struct name_tag_of<table_alias_t<AliasProvider, TableSpec>> : public name_tag_of<AliasProvider>{};
|
struct name_tag_of<table_alias_t<AliasProvider, TableSpec>> : public name_tag_of<AliasProvider>{};
|
||||||
|
|
||||||
|
template <typename AliasProvider, typename TableSpec>
|
||||||
|
struct provided_tables_of<table_alias_t<AliasProvider, TableSpec>>
|
||||||
|
{
|
||||||
|
#warning: This is a bit wonky... Maybe we should actually pass the table and not the table_spec into the column template.
|
||||||
|
using type = sqlpp::detail::type_vector<table_t<AliasProvider>>;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename AliasProvider, typename TableSpec>
|
||||||
|
struct provided_static_tables_of<table_alias_t<AliasProvider, TableSpec>> : public provided_tables_of<table_alias_t<AliasProvider, TableSpec>>
|
||||||
|
{
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename AliasProvider, typename TableSpec>
|
||||||
|
struct provided_optional_tables_of<table_alias_t<AliasProvider, TableSpec>> : public provided_tables_of<table_alias_t<AliasProvider, TableSpec>>
|
||||||
|
{
|
||||||
|
};
|
||||||
|
|
||||||
template <typename Context, typename AliasProvider, typename TableSpec>
|
template <typename Context, typename AliasProvider, typename TableSpec>
|
||||||
auto to_sql_string(Context& context, const table_alias_t<AliasProvider, TableSpec>&) -> std::string
|
auto to_sql_string(Context& context, const table_alias_t<AliasProvider, TableSpec>&) -> std::string
|
||||||
{
|
{
|
||||||
|
@ -151,8 +151,8 @@ namespace sqlpp
|
|||||||
assert_insert_set_assignments_t>,
|
assert_insert_set_assignments_t>,
|
||||||
static_check_t<not detail::has_duplicates<typename lhs<Assignments>::type...>::value,
|
static_check_t<not detail::has_duplicates<typename lhs<Assignments>::type...>::value,
|
||||||
assert_insert_set_no_duplicates_t>,
|
assert_insert_set_no_duplicates_t>,
|
||||||
static_check_t<sizeof...(Assignments) == 0 or detail::make_joined_set_t<required_tables_of_t<
|
static_check_t<sizeof...(Assignments) == 0 or detail::type_vector_cat_t<required_tables_of_t<
|
||||||
typename lhs<Assignments>::type>...>::size::value == 1,
|
typename lhs<Assignments>::type>...>::are_same(),
|
||||||
assert_insert_set_single_table_t>>;
|
assert_insert_set_single_table_t>>;
|
||||||
|
|
||||||
// workaround for msvc bug https://connect.microsoft.com/VisualStudio/Feedback/Details/2173269
|
// workaround for msvc bug https://connect.microsoft.com/VisualStudio/Feedback/Details/2173269
|
||||||
@ -369,11 +369,10 @@ namespace sqlpp
|
|||||||
auto _columns_impl(consistent_t /*unused*/, Columns... cols) const
|
auto _columns_impl(consistent_t /*unused*/, Columns... cols) const
|
||||||
-> _new_statement_t<consistent_t, column_list_t<Columns...>>
|
-> _new_statement_t<consistent_t, column_list_t<Columns...>>
|
||||||
{
|
{
|
||||||
static_assert(not detail::has_duplicates<Columns...>::value,
|
static_assert(detail::are_unique<Columns...>::value,
|
||||||
"at least one duplicate argument detected in columns()");
|
"at least one duplicate argument detected in columns()");
|
||||||
using _column_required_tables = detail::make_joined_set_t<required_tables_of_t<Columns>...>;
|
static_assert(detail::type_vector_cat_t<required_tables_of_t<Columns>...>::are_same(),
|
||||||
static_assert(_column_required_tables::size::value == 1, "columns() contains columns from several tables");
|
"columns() contains columns from several tables");
|
||||||
|
|
||||||
static_assert(detail::have_all_required_columns<Columns...>::value,
|
static_assert(detail::have_all_required_columns<Columns...>::value,
|
||||||
"At least one required column is missing in columns()");
|
"At least one required column is missing in columns()");
|
||||||
|
|
||||||
@ -405,7 +404,7 @@ namespace sqlpp
|
|||||||
auto to_sql_string(Context& context, const column_list_data_t<Columns...>& t) -> std::string
|
auto to_sql_string(Context& context, const column_list_data_t<Columns...>& t) -> std::string
|
||||||
{
|
{
|
||||||
auto result = std::string{" ("};
|
auto result = std::string{" ("};
|
||||||
result += tuple_to_sql_string(context, t._columns, ",");
|
result += tuple_to_sql_string(context, t._columns, tuple_operand{", "});
|
||||||
result += ")";
|
result += ")";
|
||||||
bool first = true;
|
bool first = true;
|
||||||
for (const auto& row : t._insert_values)
|
for (const auto& row : t._insert_values)
|
||||||
@ -420,7 +419,7 @@ namespace sqlpp
|
|||||||
result += ',';
|
result += ',';
|
||||||
}
|
}
|
||||||
result += '(';
|
result += '(';
|
||||||
result += tuple_to_sql_string(context, row, ",");
|
result += tuple_to_sql_string(context, row, tuple_operand{", "});
|
||||||
result += ')';
|
result += ')';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -132,7 +132,7 @@ namespace sqlpp
|
|||||||
auto _into_impl(consistent_t /*unused*/, Table table) const
|
auto _into_impl(consistent_t /*unused*/, Table table) const
|
||||||
-> _new_statement_t<consistent_t, into_t<Table>>
|
-> _new_statement_t<consistent_t, into_t<Table>>
|
||||||
{
|
{
|
||||||
static_assert(required_tables_of_t<into_t<Table>>::size::value == 0,
|
static_assert(required_tables_of_t<into_t<Table>>::empty(),
|
||||||
"argument depends on another table in into()");
|
"argument depends on another table in into()");
|
||||||
|
|
||||||
return {static_cast<const derived_statement_t<Policies>&>(*this), into_data_t<Table>{table}};
|
return {static_cast<const derived_statement_t<Policies>&>(*this), into_data_t<Table>{table}};
|
||||||
|
@ -58,7 +58,7 @@ namespace sqlpp
|
|||||||
|
|
||||||
#warning: can't we do this with a table_t<> specialization
|
#warning: can't we do this with a table_t<> specialization
|
||||||
static_assert(is_table<Table>::value, "argument has to be a table");
|
static_assert(is_table<Table>::value, "argument has to be a table");
|
||||||
static_assert(required_tables_of_t<Table>::size::value == 0, "table depends on another table");
|
static_assert(required_tables_of_t<Table>::empty(), "table depends on another table");
|
||||||
|
|
||||||
using _data_t = single_table_data_t<Table>;
|
using _data_t = single_table_data_t<Table>;
|
||||||
|
|
||||||
@ -133,7 +133,7 @@ namespace sqlpp
|
|||||||
auto _single_table_impl(consistent_t /*unused*/, Table table) const
|
auto _single_table_impl(consistent_t /*unused*/, Table table) const
|
||||||
-> _new_statement_t<consistent_t, single_table_t<Table>>
|
-> _new_statement_t<consistent_t, single_table_t<Table>>
|
||||||
{
|
{
|
||||||
static_assert(required_tables_of_t<single_table_t<Table>>::size::value == 0,
|
static_assert(required_tables_of_t<single_table_t<Table>>::empty(),
|
||||||
"argument depends on another table in single_table()");
|
"argument depends on another table in single_table()");
|
||||||
|
|
||||||
return {static_cast<const derived_statement_t<Policies>&>(*this), single_table_data_t<Table>{table}};
|
return {static_cast<const derived_statement_t<Policies>&>(*this), single_table_data_t<Table>{table}};
|
||||||
|
@ -95,8 +95,8 @@ namespace sqlpp
|
|||||||
assert_update_set_assignments_t>,
|
assert_update_set_assignments_t>,
|
||||||
static_check_t<not detail::has_duplicates<typename lhs<Assignments>::type...>::value,
|
static_check_t<not detail::has_duplicates<typename lhs<Assignments>::type...>::value,
|
||||||
assert_update_set_no_duplicates_t>,
|
assert_update_set_no_duplicates_t>,
|
||||||
static_check_t<sizeof...(Assignments) == 0 or detail::make_joined_set_t<required_tables_of_t<
|
static_check_t<sizeof...(Assignments) == 0 or detail::type_vector_cat_t<required_tables_of_t<
|
||||||
typename lhs<Assignments>::type>...>::size::value == 1,
|
typename lhs<Assignments>::type>...>::are_same(),
|
||||||
assert_update_set_single_table_t>>;
|
assert_update_set_single_table_t>>;
|
||||||
|
|
||||||
template <typename... Assignments>
|
template <typename... Assignments>
|
||||||
|
@ -33,9 +33,48 @@ namespace sqlpp
|
|||||||
{
|
{
|
||||||
namespace detail
|
namespace detail
|
||||||
{
|
{
|
||||||
|
template <typename... T>
|
||||||
|
struct are_same;
|
||||||
|
|
||||||
|
template <>
|
||||||
|
struct are_same<> : public std::true_type
|
||||||
|
{
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename First, typename... T>
|
||||||
|
struct are_same<First, T...> : public std::is_same<are_same<First, T...>, are_same<T..., First>>
|
||||||
|
{
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename... T>
|
||||||
|
struct are_unique;
|
||||||
|
|
||||||
|
template <>
|
||||||
|
struct are_unique<> : public std::true_type
|
||||||
|
{
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename First, typename... T>
|
||||||
|
struct are_unique<First, T...>
|
||||||
|
: public std::integral_constant<bool,
|
||||||
|
sqlpp::logic::none<std::is_same<First, T>::value...>::value and
|
||||||
|
are_unique<T...>::value>
|
||||||
|
{
|
||||||
|
};
|
||||||
|
|
||||||
template <typename... T>
|
template <typename... T>
|
||||||
struct type_vector
|
struct type_vector
|
||||||
{
|
{
|
||||||
|
static constexpr bool are_same()
|
||||||
|
{
|
||||||
|
return ::sqlpp::detail::are_same<T...>::value;
|
||||||
|
}
|
||||||
|
|
||||||
|
static constexpr bool are_unique()
|
||||||
|
{
|
||||||
|
return ::sqlpp::detail::are_unique<T...>::value;
|
||||||
|
}
|
||||||
|
|
||||||
template <typename X>
|
template <typename X>
|
||||||
static constexpr bool contains()
|
static constexpr bool contains()
|
||||||
{
|
{
|
||||||
|
@ -27,6 +27,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <type_traits>
|
#include <type_traits>
|
||||||
|
#include <sqlpp11/core/name/name_tag.h>
|
||||||
#include <sqlpp11/core/compat/utility.h>
|
#include <sqlpp11/core/compat/utility.h>
|
||||||
|
|
||||||
namespace sqlpp
|
namespace sqlpp
|
||||||
|
@ -149,7 +149,7 @@ namespace sqlpp
|
|||||||
using _cte_check =
|
using _cte_check =
|
||||||
typename std::conditional<_required_ctes::size::value == 0, consistent_t, assert_no_unknown_ctes_t>::type;
|
typename std::conditional<_required_ctes::size::value == 0, consistent_t, assert_no_unknown_ctes_t>::type;
|
||||||
#warning: reactivate
|
#warning: reactivate
|
||||||
using _table_check = std::true_type;
|
using _table_check = consistent_t;
|
||||||
//typename std::conditional<_required_tables::size::value == 0, consistent_t, assert_no_unknown_tables_t>::type;
|
//typename std::conditional<_required_tables::size::value == 0, consistent_t, assert_no_unknown_tables_t>::type;
|
||||||
using _parameter_check = typename std::
|
using _parameter_check = typename std::
|
||||||
conditional<_parameters::empty(), consistent_t, assert_no_parameters_t>::type;
|
conditional<_parameters::empty(), consistent_t, assert_no_parameters_t>::type;
|
||||||
|
@ -50,7 +50,7 @@ int From(int, char* [])
|
|||||||
" FROM tab_foo INNER JOIN tab_bar ON tab_foo.double_n > tab_bar.id");
|
" FROM tab_foo INNER JOIN tab_bar ON tab_foo.double_n > tab_bar.id");
|
||||||
SQLPP_COMPARE(from(foo.inner_join(bar).on(foo.doubleN > bar.id)),
|
SQLPP_COMPARE(from(foo.inner_join(bar).on(foo.doubleN > bar.id)),
|
||||||
" FROM tab_foo INNER JOIN tab_bar ON tab_foo.double_n > tab_bar.id");
|
" FROM tab_foo INNER JOIN tab_bar ON tab_foo.double_n > tab_bar.id");
|
||||||
SQLPP_COMPARE(from(foo.outer_join(bar).on(foo.doubleN > bar.id)),
|
SQLPP_COMPARE(from(foo.full_outer_join(bar).on(foo.doubleN > bar.id)),
|
||||||
" FROM tab_foo OUTER JOIN tab_bar ON tab_foo.double_n > tab_bar.id");
|
" FROM tab_foo OUTER JOIN tab_bar ON tab_foo.double_n > tab_bar.id");
|
||||||
SQLPP_COMPARE(from(foo.left_outer_join(bar).on(foo.doubleN > bar.id)),
|
SQLPP_COMPARE(from(foo.left_outer_join(bar).on(foo.doubleN > bar.id)),
|
||||||
" FROM tab_foo LEFT OUTER JOIN tab_bar ON tab_foo.double_n > tab_bar.id");
|
" FROM tab_foo LEFT OUTER JOIN tab_bar ON tab_foo.double_n > tab_bar.id");
|
||||||
@ -58,6 +58,7 @@ int From(int, char* [])
|
|||||||
" FROM tab_foo RIGHT OUTER JOIN tab_bar ON tab_foo.double_n > tab_bar.id");
|
" FROM tab_foo RIGHT OUTER JOIN tab_bar ON tab_foo.double_n > tab_bar.id");
|
||||||
SQLPP_COMPARE(from(aFoo.join(bFoo).on(aFoo.doubleN > bFoo.doubleN)),
|
SQLPP_COMPARE(from(aFoo.join(bFoo).on(aFoo.doubleN > bFoo.doubleN)),
|
||||||
" FROM tab_foo AS a INNER JOIN tab_foo AS b ON a.double_n > b.double_n");
|
" FROM tab_foo AS a INNER JOIN tab_foo AS b ON a.double_n > b.double_n");
|
||||||
|
/*
|
||||||
SQLPP_COMPARE(from(aFoo.join(bFoo).on(aFoo.doubleN > bFoo.doubleN).join(cFoo).on(bFoo.doubleN > cFoo.doubleN)),
|
SQLPP_COMPARE(from(aFoo.join(bFoo).on(aFoo.doubleN > bFoo.doubleN).join(cFoo).on(bFoo.doubleN > cFoo.doubleN)),
|
||||||
" FROM tab_foo AS a INNER JOIN tab_foo AS b ON a.double_n > b.double_n INNER JOIN tab_foo AS c ON b.double_n > c.double_n");
|
" FROM tab_foo AS a INNER JOIN tab_foo AS b ON a.double_n > b.double_n INNER JOIN tab_foo AS c ON b.double_n > c.double_n");
|
||||||
SQLPP_COMPARE(from(foo.join(bar).unconditionally()), " FROM tab_foo INNER JOIN tab_bar");
|
SQLPP_COMPARE(from(foo.join(bar).unconditionally()), " FROM tab_foo INNER JOIN tab_bar");
|
||||||
@ -76,6 +77,7 @@ int From(int, char* [])
|
|||||||
.on(sqlpp::verbatim<sqlpp::boolean>("a.column_x > another_table.x"))),
|
.on(sqlpp::verbatim<sqlpp::boolean>("a.column_x > another_table.x"))),
|
||||||
" FROM unknown_table AS a INNER JOIN another_table ON a.column_x > another_table.x");
|
" FROM unknown_table AS a INNER JOIN another_table ON a.column_x > another_table.x");
|
||||||
|
|
||||||
#warning add tests for optional joins
|
#warning add tests for dynamic joins
|
||||||
|
*/
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -65,6 +65,7 @@ int main(int, char* [])
|
|||||||
|
|
||||||
#warning: Need to add tests with 3 tables
|
#warning: Need to add tests with 3 tables
|
||||||
|
|
||||||
|
#warning: Need to add tests with table aliases
|
||||||
#warning: Need to add tests with sub selects
|
#warning: Need to add tests with sub selects
|
||||||
#warning: Need to add tests with CTEs
|
#warning: Need to add tests with CTEs
|
||||||
return 0;
|
return 0;
|
||||||
|
Loading…
Reference in New Issue
Block a user