include/sqlon/query.h
| Line | Branch | Exec | Source |
|---|---|---|---|
| 1 | /****************************************************************************** | ||
| 2 | ** | ||
| 3 | ** Copyright (C) 2026 Ivan Pinezhaninov <ivan.pinezhaninov@gmail.com> | ||
| 4 | ** | ||
| 5 | ** This file is part of the SQLon - which can be found at | ||
| 6 | ** https://github.com/IvanPinezhaninov/sqlon/. | ||
| 7 | ** | ||
| 8 | ** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
| 9 | ** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
| 10 | ** FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. | ||
| 11 | ** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, | ||
| 12 | ** DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR | ||
| 13 | ** OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR | ||
| 14 | ** THE USE OR OTHER DEALINGS IN THE SOFTWARE. | ||
| 15 | ** | ||
| 16 | ******************************************************************************/ | ||
| 17 | |||
| 18 | #ifndef SQLON_QUERY_H | ||
| 19 | #define SQLON_QUERY_H | ||
| 20 | |||
| 21 | #include <sqlon/conditions.h> | ||
| 22 | #include <sqlon/error.h> | ||
| 23 | #include <sqlon/export.h> | ||
| 24 | #include <sqlon/order.h> | ||
| 25 | #include <sqlon/relation.h> | ||
| 26 | |||
| 27 | #include <cstdint> | ||
| 28 | #include <initializer_list> | ||
| 29 | #include <memory> | ||
| 30 | #include <string> | ||
| 31 | #include <tuple> | ||
| 32 | #include <type_traits> | ||
| 33 | #include <utility> | ||
| 34 | #include <vector> | ||
| 35 | |||
| 36 | namespace sqlon { | ||
| 37 | |||
| 38 | /** @brief INSERT builder that retains its target column types. */ | ||
| 39 | template<typename... ColumnTypes> | ||
| 40 | class insert_values_query; | ||
| 41 | |||
| 42 | namespace detail { | ||
| 43 | struct assignment_access; | ||
| 44 | struct common_table_expression_access; | ||
| 45 | struct query_access; | ||
| 46 | } // namespace detail | ||
| 47 | |||
| 48 | /** @brief Base handle for an immutable SQL statement. */ | ||
| 49 | class query { | ||
| 50 | protected: | ||
| 51 | /** @brief Creates a query handle from an internal node. */ | ||
| 52 | SQLON_API explicit query(detail::query_ptr node); | ||
| 53 | |||
| 54 | private: | ||
| 55 | friend struct detail::query_access; | ||
| 56 | |||
| 57 | detail::query_ptr m_node; | ||
| 58 | }; | ||
| 59 | |||
| 60 | /** @brief Column assignment used by INSERT, UPDATE, and conflict actions. */ | ||
| 61 | class assignment final { | ||
| 62 | private: | ||
| 63 | friend struct detail::assignment_access; | ||
| 64 | |||
| 65 | 61 | explicit assignment(detail::assignment_node node) | |
| 66 | 61 | : m_node(std::move(node)) | |
| 67 | 61 | {} | |
| 68 | |||
| 69 | detail::assignment_node m_node; | ||
| 70 | }; | ||
| 71 | |||
| 72 | namespace detail { | ||
| 73 | |||
| 74 | struct query_access final { | ||
| 75 | SQLON_API static const query_ptr& node(const query& value) noexcept; | ||
| 76 | SQLON_API static std::shared_ptr<query_node> copy(const query& value); | ||
| 77 | |||
| 78 | template<typename Query> | ||
| 79 | 285 | static Query make(query_ptr node) | |
| 80 | { | ||
| 81 |
4/4sqlon::delete_query sqlon::detail::query_access::make<sqlon::delete_query>(std::shared_ptr<sqlon::detail::query_node const>):
✓ Branch 3 taken 8 times.
sqlon::insert_query sqlon::detail::query_access::make<sqlon::insert_query>(std::shared_ptr<sqlon::detail::query_node const>):
✓ Branch 3 taken 62 times.
sqlon::select_query sqlon::detail::query_access::make<sqlon::select_query>(std::shared_ptr<sqlon::detail::query_node const>):
✓ Branch 3 taken 199 times.
sqlon::update_query sqlon::detail::query_access::make<sqlon::update_query>(std::shared_ptr<sqlon::detail::query_node const>):
✓ Branch 3 taken 16 times.
|
285 | return Query{std::move(node)}; |
| 82 | } | ||
| 83 | }; | ||
| 84 | |||
| 85 | struct assignment_access final { | ||
| 86 | 61 | static assignment make(assignment_node node) | |
| 87 | { | ||
| 88 | 61 | return assignment{std::move(node)}; | |
| 89 | } | ||
| 90 | |||
| 91 | 59 | static const assignment_node& node(const assignment& value) noexcept | |
| 92 | { | ||
| 93 | 59 | return value.m_node; | |
| 94 | } | ||
| 95 | }; | ||
| 96 | |||
| 97 | SQLON_API void append_assignment_row(detail::query_node& query, | ||
| 98 | const std::vector<detail::assignment_node>& assignments); | ||
| 99 | |||
| 100 | SQLON_API void set_insert_columns(detail::query_node& query, const std::vector<detail::expression_ptr>& columns); | ||
| 101 | |||
| 102 | SQLON_API void set_update_assignments(detail::query_node& query, | ||
| 103 | const std::vector<detail::assignment_node>& assignments); | ||
| 104 | |||
| 105 | SQLON_API void set_conflict_target(detail::query_node& query, const std::vector<detail::expression_ptr>& columns); | ||
| 106 | |||
| 107 | SQLON_API void set_conflict_do_nothing(detail::query_node& query, const std::vector<detail::expression_ptr>& columns); | ||
| 108 | |||
| 109 | SQLON_API void set_conflict_action(detail::query_node& query, detail::conflict_clause_node::kind action, | ||
| 110 | const std::vector<detail::assignment_node>& assignments); | ||
| 111 | |||
| 112 | template<typename ExpectedTuple, typename ValuesTuple, std::size_t... Indices> | ||
| 113 | constexpr bool compatible_insert_row_impl(std::index_sequence<Indices...>) | ||
| 114 | { | ||
| 115 | return (compatible_expression_types<std::tuple_element_t<Indices, ExpectedTuple>, | ||
| 116 | expression_value_type_t<std::tuple_element_t<Indices, ValuesTuple>>> && | ||
| 117 | ...); | ||
| 118 | } | ||
| 119 | |||
| 120 | template<typename ExpectedTuple, typename ValuesTuple> | ||
| 121 | constexpr bool compatible_insert_row() | ||
| 122 | { | ||
| 123 | if constexpr (std::tuple_size_v<ExpectedTuple> != std::tuple_size_v<ValuesTuple>) | ||
| 124 | return false; | ||
| 125 | else | ||
| 126 | return compatible_insert_row_impl<ExpectedTuple, ValuesTuple>( | ||
| 127 | std::make_index_sequence<std::tuple_size_v<ExpectedTuple>>{}); | ||
| 128 | } | ||
| 129 | |||
| 130 | } // namespace detail | ||
| 131 | |||
| 132 | template<typename T> | ||
| 133 | template<typename Right> | ||
| 134 | 61 | assignment column<T>::operator=(Right&& value) const | |
| 135 | { | ||
| 136 |
3/3sqlon::assignment sqlon::column<bool>::operator=<bool>(bool&&) const:
✓ Branch 2 taken 15 times.
sqlon::assignment sqlon::column<long>::operator=<int>(int&&) const:
✓ Branch 2 taken 4 times.
sqlon::assignment sqlon::column<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >::operator=<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&&) const:
✓ Branch 2 taken 25 times.
|
61 | auto value_expression = to_expression(std::forward<Right>(value)); |
| 137 | static_assert(detail::compatible_expression_types<T, typename decltype(value_expression)::value_type>, | ||
| 138 | "incompatible SQL assignment types"); | ||
| 139 | return detail::assignment_access::make( | ||
| 140 | 166 | {detail::expression_access::node(*this), detail::expression_access::node(value_expression)}); | |
| 141 | 122 | } | |
| 142 | |||
| 143 | template<typename T> | ||
| 144 | assignment column<T>::operator=(const column<T>& value) const | ||
| 145 | { | ||
| 146 | return detail::assignment_access::make( | ||
| 147 | {detail::expression_access::node(*this), detail::expression_access::node(value)}); | ||
| 148 | } | ||
| 149 | |||
| 150 | /** @brief Creates an assignment for a target column. */ | ||
| 151 | template<typename T, typename Right> | ||
| 152 | 1 | assignment assign(const column<T>& target, Right&& value) | |
| 153 | { | ||
| 154 | 1 | return target.operator=(std::forward<Right>(value)); | |
| 155 | } | ||
| 156 | |||
| 157 | /** @brief Immutable builder for a SELECT statement. */ | ||
| 158 | class select_query final : public query { | ||
| 159 | public: | ||
| 160 | /** @brief Enables SELECT DISTINCT. */ | ||
| 161 | SQLON_API select_query distinct() const; | ||
| 162 | |||
| 163 | /** @brief Sets the FROM relation. */ | ||
| 164 | template<typename Relation> | ||
| 165 | 87 | select_query from(const Relation& relation) const | |
| 166 | { | ||
| 167 |
9/9sqlon::select_query sqlon::select_query::from<EventsTable>(EventsTable const&) const:
✓ Branch 1 taken 1 time.
sqlon::select_query sqlon::select_query::from<OrdersTable>(OrdersTable const&) const:
✓ Branch 1 taken 14 times.
sqlon::select_query sqlon::select_query::from<SessionsTable>(SessionsTable const&) const:
✓ Branch 1 taken 1 time.
sqlon::select_query sqlon::select_query::from<UsersTable>(UsersTable const&) const:
✓ Branch 1 taken 49 times.
sqlon::select_query sqlon::select_query::from<sqlon::common_table_expression>(sqlon::common_table_expression const&) const:
✓ Branch 1 taken 2 times.
sqlon::select_query sqlon::select_query::from<sqlon::cte_relation>(sqlon::cte_relation const&) const:
✓ Branch 1 taken 2 times.
sqlon::select_query sqlon::select_query::from<sqlon::relation>(sqlon::relation const&) const:
✓ Branch 1 taken 15 times.
sqlon::select_query sqlon::select_query::from<sqlon::subquery_relation>(sqlon::subquery_relation const&) const:
✓ Branch 1 taken 2 times.
sqlon::select_query sqlon::select_query::from<sqlon::table>(sqlon::table const&) const:
✓ Branch 1 taken 1 time.
|
87 | std::shared_ptr<detail::query_node> copy = detail::query_access::copy(*this); |
| 168 |
11/27sqlon::select_query sqlon::select_query::from<EventsTable>(EventsTable const&) const:
✗ Branch 1 not taken.
✓ Branch 2 taken 1 time.
✗ Branch 5 not taken.
sqlon::select_query sqlon::select_query::from<OrdersTable>(OrdersTable const&) const:
✗ Branch 1 not taken.
✓ Branch 2 taken 14 times.
✗ Branch 5 not taken.
sqlon::select_query sqlon::select_query::from<SessionsTable>(SessionsTable const&) const:
✗ Branch 1 not taken.
✓ Branch 2 taken 1 time.
✗ Branch 5 not taken.
sqlon::select_query sqlon::select_query::from<UsersTable>(UsersTable const&) const:
✓ Branch 1 taken 1 time.
✓ Branch 2 taken 48 times.
✓ Branch 5 taken 1 time.
sqlon::select_query sqlon::select_query::from<sqlon::common_table_expression>(sqlon::common_table_expression const&) const:
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 5 not taken.
sqlon::select_query sqlon::select_query::from<sqlon::cte_relation>(sqlon::cte_relation const&) const:
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 5 not taken.
sqlon::select_query sqlon::select_query::from<sqlon::relation>(sqlon::relation const&) const:
✗ Branch 1 not taken.
✓ Branch 2 taken 15 times.
✗ Branch 5 not taken.
sqlon::select_query sqlon::select_query::from<sqlon::subquery_relation>(sqlon::subquery_relation const&) const:
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 5 not taken.
sqlon::select_query sqlon::select_query::from<sqlon::table>(sqlon::table const&) const:
✗ Branch 1 not taken.
✓ Branch 2 taken 1 time.
✗ Branch 5 not taken.
|
87 | if (copy->from_set) throw invalid_query{"FROM was already specified"}; |
| 169 |
9/9sqlon::select_query sqlon::select_query::from<EventsTable>(EventsTable const&) const:
✓ Branch 1 taken 1 time.
sqlon::select_query sqlon::select_query::from<OrdersTable>(OrdersTable const&) const:
✓ Branch 1 taken 14 times.
sqlon::select_query sqlon::select_query::from<SessionsTable>(SessionsTable const&) const:
✓ Branch 1 taken 1 time.
sqlon::select_query sqlon::select_query::from<UsersTable>(UsersTable const&) const:
✓ Branch 1 taken 48 times.
sqlon::select_query sqlon::select_query::from<sqlon::common_table_expression>(sqlon::common_table_expression const&) const:
✓ Branch 1 taken 2 times.
sqlon::select_query sqlon::select_query::from<sqlon::cte_relation>(sqlon::cte_relation const&) const:
✓ Branch 1 taken 2 times.
sqlon::select_query sqlon::select_query::from<sqlon::relation>(sqlon::relation const&) const:
✓ Branch 1 taken 15 times.
sqlon::select_query sqlon::select_query::from<sqlon::subquery_relation>(sqlon::subquery_relation const&) const:
✓ Branch 1 taken 2 times.
sqlon::select_query sqlon::select_query::from<sqlon::table>(sqlon::table const&) const:
✓ Branch 1 taken 1 time.
|
86 | copy->from = detail::to_relation(relation); |
| 170 | 86 | copy->from_set = true; | |
| 171 |
9/9sqlon::select_query sqlon::select_query::from<EventsTable>(EventsTable const&) const:
✓ Branch 3 taken 1 time.
sqlon::select_query sqlon::select_query::from<OrdersTable>(OrdersTable const&) const:
✓ Branch 3 taken 14 times.
sqlon::select_query sqlon::select_query::from<SessionsTable>(SessionsTable const&) const:
✓ Branch 3 taken 1 time.
sqlon::select_query sqlon::select_query::from<UsersTable>(UsersTable const&) const:
✓ Branch 3 taken 48 times.
sqlon::select_query sqlon::select_query::from<sqlon::common_table_expression>(sqlon::common_table_expression const&) const:
✓ Branch 3 taken 2 times.
sqlon::select_query sqlon::select_query::from<sqlon::cte_relation>(sqlon::cte_relation const&) const:
✓ Branch 3 taken 2 times.
sqlon::select_query sqlon::select_query::from<sqlon::relation>(sqlon::relation const&) const:
✓ Branch 3 taken 15 times.
sqlon::select_query sqlon::select_query::from<sqlon::subquery_relation>(sqlon::subquery_relation const&) const:
✓ Branch 3 taken 2 times.
sqlon::select_query sqlon::select_query::from<sqlon::table>(sqlon::table const&) const:
✓ Branch 3 taken 1 time.
|
172 | return select_query{std::move(copy)}; |
| 172 | 87 | } | |
| 173 | |||
| 174 | /** @brief Sets the WHERE predicate. */ | ||
| 175 | SQLON_API select_query where(const expression<bool>& predicate) const; | ||
| 176 | |||
| 177 | /** @brief Sets WHERE from a dynamic condition group. */ | ||
| 178 | SQLON_API select_query where(const conditions& predicates) const; | ||
| 179 | |||
| 180 | /** @brief Appends expressions to GROUP BY. */ | ||
| 181 | template<typename... Expressions> | ||
| 182 | 5 | select_query group_by(const Expressions&... expressions) const | |
| 183 | { | ||
| 184 | static_assert(sizeof...(Expressions) > 0, "group_by expects at least one expression"); | ||
| 185 |
3/3sqlon::select_query sqlon::select_query::group_by<sqlon::column<long> >(sqlon::column<long> const&) const:
✓ Branch 1 taken 1 time.
sqlon::select_query sqlon::select_query::group_by<sqlon::column<long>, sqlon::column<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >(sqlon::column<long> const&, sqlon::column<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&) const:
✓ Branch 1 taken 2 times.
sqlon::select_query sqlon::select_query::group_by<sqlon::column<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >(sqlon::column<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&) const:
✓ Branch 1 taken 2 times.
|
5 | std::shared_ptr<detail::query_node> copy = detail::query_access::copy(*this); |
| 186 |
4/4sqlon::select_query sqlon::select_query::group_by<sqlon::column<long> >(sqlon::column<long> const&) const:
✓ Branch 4 taken 1 time.
sqlon::select_query sqlon::select_query::group_by<sqlon::column<long>, sqlon::column<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >(sqlon::column<long> const&, sqlon::column<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&) const:
✓ Branch 4 taken 2 times.
✓ Branch 10 taken 2 times.
sqlon::select_query sqlon::select_query::group_by<sqlon::column<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >(sqlon::column<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&) const:
✓ Branch 4 taken 2 times.
|
5 | (copy->group_by.push_back(detail::expression_access::node(to_expression(expressions))), ...); |
| 187 |
3/3sqlon::select_query sqlon::select_query::group_by<sqlon::column<long> >(sqlon::column<long> const&) const:
✓ Branch 3 taken 1 time.
sqlon::select_query sqlon::select_query::group_by<sqlon::column<long>, sqlon::column<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >(sqlon::column<long> const&, sqlon::column<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&) const:
✓ Branch 3 taken 2 times.
sqlon::select_query sqlon::select_query::group_by<sqlon::column<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >(sqlon::column<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&) const:
✓ Branch 3 taken 2 times.
|
10 | return select_query{std::move(copy)}; |
| 188 | 5 | } | |
| 189 | |||
| 190 | /** @brief Sets the HAVING predicate. */ | ||
| 191 | SQLON_API select_query having(const expression<bool>& predicate) const; | ||
| 192 | |||
| 193 | /** @brief Appends ORDER BY items. */ | ||
| 194 | template<typename... Orders> | ||
| 195 | 14 | select_query order_by(const Orders&... orders) const | |
| 196 | { | ||
| 197 | static_assert(sizeof...(Orders) > 0, "order_by expects at least one ordering"); | ||
| 198 | static_assert((std::is_same_v<std::decay_t<Orders>, ordering> && ...), "order_by expects asc()/desc() values"); | ||
| 199 |
2/2sqlon::select_query sqlon::select_query::order_by<sqlon::ordering, sqlon::ordering>(sqlon::ordering const&, sqlon::ordering const&) const:
✓ Branch 1 taken 1 time.
sqlon::select_query sqlon::select_query::order_by<sqlon::ordering>(sqlon::ordering const&) const:
✓ Branch 1 taken 13 times.
|
14 | std::shared_ptr<detail::query_node> copy = detail::query_access::copy(*this); |
| 200 |
3/3sqlon::select_query sqlon::select_query::order_by<sqlon::ordering, sqlon::ordering>(sqlon::ordering const&, sqlon::ordering const&) const:
✓ Branch 3 taken 1 time.
✓ Branch 8 taken 1 time.
sqlon::select_query sqlon::select_query::order_by<sqlon::ordering>(sqlon::ordering const&) const:
✓ Branch 3 taken 13 times.
|
14 | (copy->order_by.push_back(detail::ordering_access::node(orders)), ...); |
| 201 |
2/2sqlon::select_query sqlon::select_query::order_by<sqlon::ordering, sqlon::ordering>(sqlon::ordering const&, sqlon::ordering const&) const:
✓ Branch 3 taken 1 time.
sqlon::select_query sqlon::select_query::order_by<sqlon::ordering>(sqlon::ordering const&) const:
✓ Branch 3 taken 13 times.
|
28 | return select_query{std::move(copy)}; |
| 202 | 14 | } | |
| 203 | |||
| 204 | /** @brief Sets the result-row limit. */ | ||
| 205 | SQLON_API select_query limit(std::uint64_t value) const; | ||
| 206 | |||
| 207 | /** @brief Sets the result-row offset. */ | ||
| 208 | SQLON_API select_query offset(std::uint64_t value) const; | ||
| 209 | |||
| 210 | /** @brief Appends a UNION operand. */ | ||
| 211 | SQLON_API select_query union_(const select_query& right) const; | ||
| 212 | |||
| 213 | /** @brief Appends a UNION ALL operand. */ | ||
| 214 | SQLON_API select_query union_all(const select_query& right) const; | ||
| 215 | |||
| 216 | /** @brief Appends an INTERSECT operand. */ | ||
| 217 | SQLON_API select_query intersect(const select_query& right) const; | ||
| 218 | |||
| 219 | /** @brief Appends an EXCEPT operand. */ | ||
| 220 | SQLON_API select_query except(const select_query& right) const; | ||
| 221 | |||
| 222 | private: | ||
| 223 | friend struct detail::query_access; | ||
| 224 | |||
| 225 | SQLON_API explicit select_query(detail::query_ptr node); | ||
| 226 | |||
| 227 | select_query add_set_operation(detail::set_operation_kind kind, const select_query& right) const; | ||
| 228 | }; | ||
| 229 | |||
| 230 | template<typename T> | ||
| 231 | 2 | expression<bool> expression<T>::in(const select_query& value) const | |
| 232 | { | ||
| 233 |
1/1✓ Branch 1 taken 2 times.
|
2 | std::shared_ptr<detail::expression_node> subquery = std::make_shared<detail::expression_node>(); |
| 234 | 2 | subquery->kind = detail::expression_kind::subquery; | |
| 235 | 2 | subquery->subquery = detail::query_access::node(value); | |
| 236 | return expression<bool>{ | ||
| 237 |
5/7✓ Branch 1 taken 2 times.
✓ Branch 4 taken 2 times.
✓ Branch 7 taken 2 times.
✓ Branch 13 taken 4 times.
✓ Branch 14 taken 2 times.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
|
14 | detail::make_expression_node(detail::expression_kind::function, "in", {m_node, std::move(subquery)})}; |
| 238 | 4 | } | |
| 239 | |||
| 240 | template<typename T> | ||
| 241 | 1 | expression<bool> expression<T>::not_in(const select_query& value) const | |
| 242 | { | ||
| 243 |
1/1✓ Branch 1 taken 1 time.
|
1 | std::shared_ptr<detail::expression_node> subquery = std::make_shared<detail::expression_node>(); |
| 244 | 1 | subquery->kind = detail::expression_kind::subquery; | |
| 245 | 1 | subquery->subquery = detail::query_access::node(value); | |
| 246 | return expression<bool>{ | ||
| 247 |
5/7✓ Branch 1 taken 1 time.
✓ Branch 4 taken 1 time.
✓ Branch 7 taken 1 time.
✓ Branch 13 taken 2 times.
✓ Branch 14 taken 1 time.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
|
7 | detail::make_expression_node(detail::expression_kind::function, "not_in", {m_node, std::move(subquery)})}; |
| 248 | 2 | } | |
| 249 | |||
| 250 | /** @brief Creates a SELECT statement with projection expressions. */ | ||
| 251 | template<typename... Values> | ||
| 252 | 190 | select_query select(Values&&... values) | |
| 253 | { | ||
| 254 |
48/48sqlon::select_query sqlon::select<>():
✓ Branch 1 taken 1 time.
sqlon::select_query sqlon::select<decltype(nullptr), bool, int, unsigned long, double, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::vector<std::byte, std::allocator<std::byte> > const&, sqlon::expression<ClientUuid> >(decltype(nullptr)&&, bool&&, int&&, unsigned long&&, double&&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&&, std::vector<std::byte, std::allocator<std::byte> > const&, sqlon::expression<ClientUuid>&&):
✓ Branch 1 taken 1 time.
sqlon::select_query sqlon::select<int>(int&&):
✓ Branch 1 taken 29 times.
sqlon::select_query sqlon::select<long, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, double>(long&&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&&, double&&):
✓ Branch 1 taken 1 time.
sqlon::select_query sqlon::select<sqlon::column<ClientUuid> const&>(sqlon::column<ClientUuid> const&):
✓ Branch 1 taken 1 time.
sqlon::select_query sqlon::select<sqlon::column<long> >(sqlon::column<long>&&):
✓ Branch 1 taken 1 time.
sqlon::select_query sqlon::select<sqlon::column<long> const&, sqlon::column<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, sqlon::expression<long>, sqlon::expression<long> >(sqlon::column<long> const&, sqlon::column<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, sqlon::expression<long>&&, sqlon::expression<long>&&):
✓ Branch 1 taken 2 times.
sqlon::select_query sqlon::select<sqlon::column<long> const&, sqlon::column<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&>(sqlon::column<long> const&, sqlon::column<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&):
✓ Branch 1 taken 3 times.
sqlon::select_query sqlon::select<sqlon::column<long> const&, sqlon::expression<long> >(sqlon::column<long> const&, sqlon::expression<long>&&):
✓ Branch 1 taken 1 time.
sqlon::select_query sqlon::select<sqlon::column<long> const&>(sqlon::column<long> const&):
✓ Branch 1 taken 54 times.
sqlon::select_query sqlon::select<sqlon::column<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, sqlon::column<bool> const&>(sqlon::column<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, sqlon::column<bool> const&):
✓ Branch 1 taken 2 times.
sqlon::select_query sqlon::select<sqlon::column<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, sqlon::column<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&>(sqlon::column<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, sqlon::column<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&):
✓ Branch 1 taken 1 time.
sqlon::select_query sqlon::select<sqlon::column<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&>(sqlon::column<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&):
✓ Branch 1 taken 3 times.
sqlon::select_query sqlon::select<sqlon::expression<ClientUuid>, sqlon::expression<ClientUuid> >(sqlon::expression<ClientUuid>&&, sqlon::expression<ClientUuid>&&):
✓ Branch 1 taken 1 time.
sqlon::select_query sqlon::select<sqlon::expression<PreparedDate> >(sqlon::expression<PreparedDate>&&):
✓ Branch 1 taken 1 time.
sqlon::select_query sqlon::select<sqlon::expression<bool> >(sqlon::expression<bool>&&):
✓ Branch 1 taken 2 times.
sqlon::select_query sqlon::select<sqlon::expression<bool> const&>(sqlon::expression<bool> const&):
✓ Branch 1 taken 7 times.
sqlon::select_query sqlon::select<sqlon::expression<bool>, sqlon::expression<bool>, sqlon::expression<bool>, sqlon::expression<bool>, sqlon::expression<bool>, sqlon::expression<bool>, sqlon::expression<long>, sqlon::expression<long>, sqlon::expression<long>, sqlon::expression<long> >(sqlon::expression<bool>&&, sqlon::expression<bool>&&, sqlon::expression<bool>&&, sqlon::expression<bool>&&, sqlon::expression<bool>&&, sqlon::expression<bool>&&, sqlon::expression<long>&&, sqlon::expression<long>&&, sqlon::expression<long>&&, sqlon::expression<long>&&):
✓ Branch 1 taken 1 time.
sqlon::select_query sqlon::select<sqlon::expression<decltype(nullptr)> >(sqlon::expression<decltype(nullptr)>&&):
✓ Branch 1 taken 1 time.
sqlon::select_query sqlon::select<sqlon::expression<decltype(nullptr)>, sqlon::expression<bool>, sqlon::expression<long>, sqlon::expression<unsigned long>, sqlon::expression<double>, sqlon::expression<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >(sqlon::expression<decltype(nullptr)>&&, sqlon::expression<bool>&&, sqlon::expression<long>&&, sqlon::expression<unsigned long>&&, sqlon::expression<double>&&, sqlon::expression<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >&&):
✓ Branch 1 taken 1 time.
sqlon::select_query sqlon::select<sqlon::expression<double> >(sqlon::expression<double>&&):
✓ Branch 1 taken 1 time.
sqlon::select_query sqlon::select<sqlon::expression<int> >(sqlon::expression<int>&&):
✓ Branch 1 taken 24 times.
sqlon::select_query sqlon::select<sqlon::expression<int> const&>(sqlon::expression<int> const&):
✓ Branch 1 taken 3 times.
sqlon::select_query sqlon::select<sqlon::expression<int>, int>(sqlon::expression<int>&&, int&&):
✓ Branch 1 taken 1 time.
sqlon::select_query sqlon::select<sqlon::expression<int>, sqlon::expression<int> >(sqlon::expression<int>&&, sqlon::expression<int>&&):
✓ Branch 1 taken 1 time.
sqlon::select_query sqlon::select<sqlon::expression<long> >(sqlon::expression<long>&&):
✓ Branch 1 taken 13 times.
sqlon::select_query sqlon::select<sqlon::expression<long> const&, sqlon::expression<bool> const&, sqlon::expression<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, sqlon::expression<long> const&, sqlon::expression<sqlon::timestamp> const&, sqlon::expression<decltype(nullptr)> const&, sqlon::expression<long> const&>(sqlon::expression<long> const&, sqlon::expression<bool> const&, sqlon::expression<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, sqlon::expression<long> const&, sqlon::expression<sqlon::timestamp> const&, sqlon::expression<decltype(nullptr)> const&, sqlon::expression<long> const&):
✓ Branch 1 taken 1 time.
sqlon::select_query sqlon::select<sqlon::expression<long> const&, sqlon::expression<long> const&, int>(sqlon::expression<long> const&, sqlon::expression<long> const&, int&&):
✓ Branch 1 taken 1 time.
sqlon::select_query sqlon::select<sqlon::expression<long> const&, sqlon::expression<long> const&, sqlon::expression<long> >(sqlon::expression<long> const&, sqlon::expression<long> const&, sqlon::expression<long>&&):
✓ Branch 1 taken 1 time.
sqlon::select_query sqlon::select<sqlon::expression<long> const&, sqlon::expression<long> const&, sqlon::expression<long> const&>(sqlon::expression<long> const&, sqlon::expression<long> const&, sqlon::expression<long> const&):
✓ Branch 1 taken 1 time.
sqlon::select_query sqlon::select<sqlon::expression<long> const&, sqlon::expression<long> const&>(sqlon::expression<long> const&, sqlon::expression<long> const&):
✓ Branch 1 taken 2 times.
sqlon::select_query sqlon::select<sqlon::expression<long> const&>(sqlon::expression<long> const&):
✓ Branch 1 taken 3 times.
sqlon::select_query sqlon::select<sqlon::expression<long>, sqlon::expression<long> >(sqlon::expression<long>&&, sqlon::expression<long>&&):
✓ Branch 1 taken 1 time.
sqlon::select_query sqlon::select<sqlon::expression<long>, sqlon::expression<long>, sqlon::expression<long>, sqlon::expression<double> >(sqlon::expression<long>&&, sqlon::expression<long>&&, sqlon::expression<long>&&, sqlon::expression<double>&&):
✓ Branch 1 taken 1 time.
sqlon::select_query sqlon::select<sqlon::expression<long>, sqlon::expression<long>, sqlon::expression<long>, sqlon::expression<long> >(sqlon::expression<long>&&, sqlon::expression<long>&&, sqlon::expression<long>&&, sqlon::expression<long>&&):
✓ Branch 1 taken 1 time.
sqlon::select_query sqlon::select<sqlon::expression<long>, sqlon::expression<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, sqlon::expression<long> const&>(sqlon::expression<long>&&, sqlon::expression<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, sqlon::expression<long> const&):
✓ Branch 1 taken 1 time.
sqlon::select_query sqlon::select<sqlon::expression<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >(sqlon::expression<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >&&):
✓ Branch 1 taken 6 times.
sqlon::select_query sqlon::select<sqlon::expression<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&>(sqlon::expression<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&):
✓ Branch 1 taken 2 times.
sqlon::select_query sqlon::select<sqlon::expression<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, sqlon::expression<sqlon::timestamp>, sqlon::expression<decltype(nullptr)> >(sqlon::expression<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >&&, sqlon::expression<sqlon::timestamp>&&, sqlon::expression<decltype(nullptr)>&&):
✓ Branch 1 taken 1 time.
sqlon::select_query sqlon::select<sqlon::expression<std::vector<std::byte, std::allocator<std::byte> > > >(sqlon::expression<std::vector<std::byte, std::allocator<std::byte> > >&&):
✓ Branch 1 taken 1 time.
sqlon::select_query sqlon::select<sqlon::parameter_slot<PreparedUuid> const&>(sqlon::parameter_slot<PreparedUuid> const&):
✓ Branch 1 taken 2 times.
sqlon::select_query sqlon::select<sqlon::parameter_slot<long> const&>(sqlon::parameter_slot<long> const&):
✓ Branch 1 taken 1 time.
sqlon::select_query sqlon::select<sqlon::parameter_slot<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, sqlon::parameter_slot<long> const&>(sqlon::parameter_slot<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, sqlon::parameter_slot<long> const&):
✓ Branch 1 taken 1 time.
sqlon::select_query sqlon::select<sqlon::parameter_slot<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&>(sqlon::parameter_slot<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&):
✓ Branch 1 taken 2 times.
sqlon::select_query sqlon::select<sqlon::parameter_slot<std::optional<PreparedUuid> > const&>(sqlon::parameter_slot<std::optional<PreparedUuid> > const&):
✓ Branch 1 taken 1 time.
sqlon::select_query sqlon::select<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, sqlon::column<long> const&>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&&, sqlon::column<long> const&):
✓ Branch 1 taken 1 time.
sqlon::select_query sqlon::select<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, sqlon::expression<long> >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&&, sqlon::expression<long>&&):
✓ Branch 1 taken 1 time.
sqlon::select_query sqlon::select<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, sqlon::expression<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&&, sqlon::expression<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&&):
✓ Branch 1 taken 1 time.
|
190 | std::shared_ptr<detail::query_node> node = std::make_shared<detail::query_node>(); |
| 255 | 190 | node->kind = detail::statement_kind::select; | |
| 256 |
126/126sqlon::select_query sqlon::select<decltype(nullptr), bool, int, unsigned long, double, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::vector<std::byte, std::allocator<std::byte> > const&, sqlon::expression<ClientUuid> >(decltype(nullptr)&&, bool&&, int&&, unsigned long&&, double&&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&&, std::vector<std::byte, std::allocator<std::byte> > const&, sqlon::expression<ClientUuid>&&):
✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✓ Branch 12 taken 1 time.
✓ Branch 16 taken 1 time.
✓ Branch 21 taken 1 time.
✓ Branch 25 taken 1 time.
✓ Branch 30 taken 1 time.
✓ Branch 34 taken 1 time.
✓ Branch 39 taken 1 time.
✓ Branch 43 taken 1 time.
✓ Branch 48 taken 1 time.
✓ Branch 52 taken 1 time.
✓ Branch 57 taken 1 time.
✓ Branch 61 taken 1 time.
✓ Branch 68 taken 1 time.
sqlon::select_query sqlon::select<int>(int&&):
✓ Branch 3 taken 29 times.
✓ Branch 7 taken 29 times.
sqlon::select_query sqlon::select<long, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, double>(long&&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&&, double&&):
✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✓ Branch 12 taken 1 time.
✓ Branch 16 taken 1 time.
✓ Branch 21 taken 1 time.
✓ Branch 25 taken 1 time.
sqlon::select_query sqlon::select<sqlon::column<ClientUuid> const&>(sqlon::column<ClientUuid> const&):
✓ Branch 5 taken 1 time.
sqlon::select_query sqlon::select<sqlon::column<long> >(sqlon::column<long>&&):
✓ Branch 5 taken 1 time.
sqlon::select_query sqlon::select<sqlon::column<long> const&, sqlon::column<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, sqlon::expression<long>, sqlon::expression<long> >(sqlon::column<long> const&, sqlon::column<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, sqlon::expression<long>&&, sqlon::expression<long>&&):
✓ Branch 5 taken 2 times.
✓ Branch 12 taken 2 times.
✓ Branch 19 taken 2 times.
✓ Branch 26 taken 2 times.
sqlon::select_query sqlon::select<sqlon::column<long> const&, sqlon::column<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&>(sqlon::column<long> const&, sqlon::column<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&):
✓ Branch 5 taken 3 times.
✓ Branch 12 taken 3 times.
sqlon::select_query sqlon::select<sqlon::column<long> const&, sqlon::expression<long> >(sqlon::column<long> const&, sqlon::expression<long>&&):
✓ Branch 5 taken 1 time.
✓ Branch 12 taken 1 time.
sqlon::select_query sqlon::select<sqlon::column<long> const&>(sqlon::column<long> const&):
✓ Branch 5 taken 54 times.
sqlon::select_query sqlon::select<sqlon::column<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, sqlon::column<bool> const&>(sqlon::column<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, sqlon::column<bool> const&):
✓ Branch 5 taken 2 times.
✓ Branch 12 taken 2 times.
sqlon::select_query sqlon::select<sqlon::column<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, sqlon::column<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&>(sqlon::column<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, sqlon::column<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&):
✓ Branch 5 taken 1 time.
✓ Branch 12 taken 1 time.
sqlon::select_query sqlon::select<sqlon::column<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&>(sqlon::column<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&):
✓ Branch 5 taken 3 times.
sqlon::select_query sqlon::select<sqlon::expression<ClientUuid>, sqlon::expression<ClientUuid> >(sqlon::expression<ClientUuid>&&, sqlon::expression<ClientUuid>&&):
✓ Branch 5 taken 1 time.
✓ Branch 12 taken 1 time.
sqlon::select_query sqlon::select<sqlon::expression<PreparedDate> >(sqlon::expression<PreparedDate>&&):
✓ Branch 5 taken 1 time.
sqlon::select_query sqlon::select<sqlon::expression<bool> >(sqlon::expression<bool>&&):
✓ Branch 5 taken 2 times.
sqlon::select_query sqlon::select<sqlon::expression<bool> const&>(sqlon::expression<bool> const&):
✓ Branch 5 taken 7 times.
sqlon::select_query sqlon::select<sqlon::expression<bool>, sqlon::expression<bool>, sqlon::expression<bool>, sqlon::expression<bool>, sqlon::expression<bool>, sqlon::expression<bool>, sqlon::expression<long>, sqlon::expression<long>, sqlon::expression<long>, sqlon::expression<long> >(sqlon::expression<bool>&&, sqlon::expression<bool>&&, sqlon::expression<bool>&&, sqlon::expression<bool>&&, sqlon::expression<bool>&&, sqlon::expression<bool>&&, sqlon::expression<long>&&, sqlon::expression<long>&&, sqlon::expression<long>&&, sqlon::expression<long>&&):
✓ Branch 5 taken 1 time.
✓ Branch 12 taken 1 time.
✓ Branch 19 taken 1 time.
✓ Branch 26 taken 1 time.
✓ Branch 33 taken 1 time.
✓ Branch 40 taken 1 time.
✓ Branch 47 taken 1 time.
✓ Branch 54 taken 1 time.
✓ Branch 61 taken 1 time.
✓ Branch 68 taken 1 time.
sqlon::select_query sqlon::select<sqlon::expression<decltype(nullptr)> >(sqlon::expression<decltype(nullptr)>&&):
✓ Branch 5 taken 1 time.
sqlon::select_query sqlon::select<sqlon::expression<decltype(nullptr)>, sqlon::expression<bool>, sqlon::expression<long>, sqlon::expression<unsigned long>, sqlon::expression<double>, sqlon::expression<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >(sqlon::expression<decltype(nullptr)>&&, sqlon::expression<bool>&&, sqlon::expression<long>&&, sqlon::expression<unsigned long>&&, sqlon::expression<double>&&, sqlon::expression<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >&&):
✓ Branch 5 taken 1 time.
✓ Branch 12 taken 1 time.
✓ Branch 19 taken 1 time.
✓ Branch 26 taken 1 time.
✓ Branch 33 taken 1 time.
✓ Branch 40 taken 1 time.
sqlon::select_query sqlon::select<sqlon::expression<double> >(sqlon::expression<double>&&):
✓ Branch 5 taken 1 time.
sqlon::select_query sqlon::select<sqlon::expression<int> >(sqlon::expression<int>&&):
✓ Branch 5 taken 24 times.
sqlon::select_query sqlon::select<sqlon::expression<int> const&>(sqlon::expression<int> const&):
✓ Branch 5 taken 3 times.
sqlon::select_query sqlon::select<sqlon::expression<int>, int>(sqlon::expression<int>&&, int&&):
✓ Branch 5 taken 1 time.
✓ Branch 10 taken 1 time.
✓ Branch 14 taken 1 time.
sqlon::select_query sqlon::select<sqlon::expression<int>, sqlon::expression<int> >(sqlon::expression<int>&&, sqlon::expression<int>&&):
✓ Branch 5 taken 1 time.
✓ Branch 12 taken 1 time.
sqlon::select_query sqlon::select<sqlon::expression<long> >(sqlon::expression<long>&&):
✓ Branch 5 taken 13 times.
sqlon::select_query sqlon::select<sqlon::expression<long> const&, sqlon::expression<bool> const&, sqlon::expression<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, sqlon::expression<long> const&, sqlon::expression<sqlon::timestamp> const&, sqlon::expression<decltype(nullptr)> const&, sqlon::expression<long> const&>(sqlon::expression<long> const&, sqlon::expression<bool> const&, sqlon::expression<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, sqlon::expression<long> const&, sqlon::expression<sqlon::timestamp> const&, sqlon::expression<decltype(nullptr)> const&, sqlon::expression<long> const&):
✓ Branch 5 taken 1 time.
✓ Branch 12 taken 1 time.
✓ Branch 19 taken 1 time.
✓ Branch 26 taken 1 time.
✓ Branch 33 taken 1 time.
✓ Branch 40 taken 1 time.
✓ Branch 47 taken 1 time.
sqlon::select_query sqlon::select<sqlon::expression<long> const&, sqlon::expression<long> const&, int>(sqlon::expression<long> const&, sqlon::expression<long> const&, int&&):
✓ Branch 5 taken 1 time.
✓ Branch 12 taken 1 time.
✓ Branch 17 taken 1 time.
✓ Branch 21 taken 1 time.
sqlon::select_query sqlon::select<sqlon::expression<long> const&, sqlon::expression<long> const&, sqlon::expression<long> >(sqlon::expression<long> const&, sqlon::expression<long> const&, sqlon::expression<long>&&):
✓ Branch 5 taken 1 time.
✓ Branch 12 taken 1 time.
✓ Branch 19 taken 1 time.
sqlon::select_query sqlon::select<sqlon::expression<long> const&, sqlon::expression<long> const&, sqlon::expression<long> const&>(sqlon::expression<long> const&, sqlon::expression<long> const&, sqlon::expression<long> const&):
✓ Branch 5 taken 1 time.
✓ Branch 12 taken 1 time.
✓ Branch 19 taken 1 time.
sqlon::select_query sqlon::select<sqlon::expression<long> const&, sqlon::expression<long> const&>(sqlon::expression<long> const&, sqlon::expression<long> const&):
✓ Branch 5 taken 2 times.
✓ Branch 12 taken 2 times.
sqlon::select_query sqlon::select<sqlon::expression<long> const&>(sqlon::expression<long> const&):
✓ Branch 5 taken 3 times.
sqlon::select_query sqlon::select<sqlon::expression<long>, sqlon::expression<long> >(sqlon::expression<long>&&, sqlon::expression<long>&&):
✓ Branch 5 taken 1 time.
✓ Branch 12 taken 1 time.
sqlon::select_query sqlon::select<sqlon::expression<long>, sqlon::expression<long>, sqlon::expression<long>, sqlon::expression<double> >(sqlon::expression<long>&&, sqlon::expression<long>&&, sqlon::expression<long>&&, sqlon::expression<double>&&):
✓ Branch 5 taken 1 time.
✓ Branch 12 taken 1 time.
✓ Branch 19 taken 1 time.
✓ Branch 26 taken 1 time.
sqlon::select_query sqlon::select<sqlon::expression<long>, sqlon::expression<long>, sqlon::expression<long>, sqlon::expression<long> >(sqlon::expression<long>&&, sqlon::expression<long>&&, sqlon::expression<long>&&, sqlon::expression<long>&&):
✓ Branch 5 taken 1 time.
✓ Branch 12 taken 1 time.
✓ Branch 19 taken 1 time.
✓ Branch 26 taken 1 time.
sqlon::select_query sqlon::select<sqlon::expression<long>, sqlon::expression<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, sqlon::expression<long> const&>(sqlon::expression<long>&&, sqlon::expression<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, sqlon::expression<long> const&):
✓ Branch 5 taken 1 time.
✓ Branch 12 taken 1 time.
✓ Branch 19 taken 1 time.
sqlon::select_query sqlon::select<sqlon::expression<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >(sqlon::expression<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >&&):
✓ Branch 5 taken 6 times.
sqlon::select_query sqlon::select<sqlon::expression<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&>(sqlon::expression<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&):
✓ Branch 5 taken 2 times.
sqlon::select_query sqlon::select<sqlon::expression<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, sqlon::expression<sqlon::timestamp>, sqlon::expression<decltype(nullptr)> >(sqlon::expression<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >&&, sqlon::expression<sqlon::timestamp>&&, sqlon::expression<decltype(nullptr)>&&):
✓ Branch 5 taken 1 time.
✓ Branch 12 taken 1 time.
✓ Branch 19 taken 1 time.
sqlon::select_query sqlon::select<sqlon::expression<std::vector<std::byte, std::allocator<std::byte> > > >(sqlon::expression<std::vector<std::byte, std::allocator<std::byte> > >&&):
✓ Branch 5 taken 1 time.
sqlon::select_query sqlon::select<sqlon::parameter_slot<PreparedUuid> const&>(sqlon::parameter_slot<PreparedUuid> const&):
✓ Branch 5 taken 2 times.
sqlon::select_query sqlon::select<sqlon::parameter_slot<long> const&>(sqlon::parameter_slot<long> const&):
✓ Branch 5 taken 1 time.
sqlon::select_query sqlon::select<sqlon::parameter_slot<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, sqlon::parameter_slot<long> const&>(sqlon::parameter_slot<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, sqlon::parameter_slot<long> const&):
✓ Branch 5 taken 1 time.
✓ Branch 12 taken 1 time.
sqlon::select_query sqlon::select<sqlon::parameter_slot<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&>(sqlon::parameter_slot<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&):
✓ Branch 5 taken 2 times.
sqlon::select_query sqlon::select<sqlon::parameter_slot<std::optional<PreparedUuid> > const&>(sqlon::parameter_slot<std::optional<PreparedUuid> > const&):
✓ Branch 5 taken 1 time.
sqlon::select_query sqlon::select<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, sqlon::column<long> const&>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&&, sqlon::column<long> const&):
✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✓ Branch 14 taken 1 time.
sqlon::select_query sqlon::select<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, sqlon::expression<long> >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&&, sqlon::expression<long>&&):
✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✓ Branch 14 taken 1 time.
sqlon::select_query sqlon::select<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, sqlon::expression<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&&, sqlon::expression<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&&):
✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✓ Branch 14 taken 1 time.
✓ Branch 19 taken 1 time.
✓ Branch 23 taken 1 time.
|
189 | (node->projection.push_back(detail::expression_access::node(to_expression(std::forward<Values>(values)))), ...); |
| 257 |
48/48sqlon::select_query sqlon::select<>():
✓ Branch 3 taken 1 time.
sqlon::select_query sqlon::select<decltype(nullptr), bool, int, unsigned long, double, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::vector<std::byte, std::allocator<std::byte> > const&, sqlon::expression<ClientUuid> >(decltype(nullptr)&&, bool&&, int&&, unsigned long&&, double&&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&&, std::vector<std::byte, std::allocator<std::byte> > const&, sqlon::expression<ClientUuid>&&):
✓ Branch 3 taken 1 time.
sqlon::select_query sqlon::select<int>(int&&):
✓ Branch 3 taken 29 times.
sqlon::select_query sqlon::select<long, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, double>(long&&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&&, double&&):
✓ Branch 3 taken 1 time.
sqlon::select_query sqlon::select<sqlon::column<ClientUuid> const&>(sqlon::column<ClientUuid> const&):
✓ Branch 3 taken 1 time.
sqlon::select_query sqlon::select<sqlon::column<long> >(sqlon::column<long>&&):
✓ Branch 3 taken 1 time.
sqlon::select_query sqlon::select<sqlon::column<long> const&, sqlon::column<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, sqlon::expression<long>, sqlon::expression<long> >(sqlon::column<long> const&, sqlon::column<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, sqlon::expression<long>&&, sqlon::expression<long>&&):
✓ Branch 3 taken 2 times.
sqlon::select_query sqlon::select<sqlon::column<long> const&, sqlon::column<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&>(sqlon::column<long> const&, sqlon::column<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&):
✓ Branch 3 taken 3 times.
sqlon::select_query sqlon::select<sqlon::column<long> const&, sqlon::expression<long> >(sqlon::column<long> const&, sqlon::expression<long>&&):
✓ Branch 3 taken 1 time.
sqlon::select_query sqlon::select<sqlon::column<long> const&>(sqlon::column<long> const&):
✓ Branch 3 taken 54 times.
sqlon::select_query sqlon::select<sqlon::column<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, sqlon::column<bool> const&>(sqlon::column<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, sqlon::column<bool> const&):
✓ Branch 3 taken 2 times.
sqlon::select_query sqlon::select<sqlon::column<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, sqlon::column<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&>(sqlon::column<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, sqlon::column<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&):
✓ Branch 3 taken 1 time.
sqlon::select_query sqlon::select<sqlon::column<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&>(sqlon::column<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&):
✓ Branch 3 taken 3 times.
sqlon::select_query sqlon::select<sqlon::expression<ClientUuid>, sqlon::expression<ClientUuid> >(sqlon::expression<ClientUuid>&&, sqlon::expression<ClientUuid>&&):
✓ Branch 3 taken 1 time.
sqlon::select_query sqlon::select<sqlon::expression<PreparedDate> >(sqlon::expression<PreparedDate>&&):
✓ Branch 3 taken 1 time.
sqlon::select_query sqlon::select<sqlon::expression<bool> >(sqlon::expression<bool>&&):
✓ Branch 3 taken 2 times.
sqlon::select_query sqlon::select<sqlon::expression<bool> const&>(sqlon::expression<bool> const&):
✓ Branch 3 taken 7 times.
sqlon::select_query sqlon::select<sqlon::expression<bool>, sqlon::expression<bool>, sqlon::expression<bool>, sqlon::expression<bool>, sqlon::expression<bool>, sqlon::expression<bool>, sqlon::expression<long>, sqlon::expression<long>, sqlon::expression<long>, sqlon::expression<long> >(sqlon::expression<bool>&&, sqlon::expression<bool>&&, sqlon::expression<bool>&&, sqlon::expression<bool>&&, sqlon::expression<bool>&&, sqlon::expression<bool>&&, sqlon::expression<long>&&, sqlon::expression<long>&&, sqlon::expression<long>&&, sqlon::expression<long>&&):
✓ Branch 3 taken 1 time.
sqlon::select_query sqlon::select<sqlon::expression<decltype(nullptr)> >(sqlon::expression<decltype(nullptr)>&&):
✓ Branch 3 taken 1 time.
sqlon::select_query sqlon::select<sqlon::expression<decltype(nullptr)>, sqlon::expression<bool>, sqlon::expression<long>, sqlon::expression<unsigned long>, sqlon::expression<double>, sqlon::expression<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >(sqlon::expression<decltype(nullptr)>&&, sqlon::expression<bool>&&, sqlon::expression<long>&&, sqlon::expression<unsigned long>&&, sqlon::expression<double>&&, sqlon::expression<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >&&):
✓ Branch 3 taken 1 time.
sqlon::select_query sqlon::select<sqlon::expression<double> >(sqlon::expression<double>&&):
✓ Branch 3 taken 1 time.
sqlon::select_query sqlon::select<sqlon::expression<int> >(sqlon::expression<int>&&):
✓ Branch 3 taken 24 times.
sqlon::select_query sqlon::select<sqlon::expression<int> const&>(sqlon::expression<int> const&):
✓ Branch 3 taken 3 times.
sqlon::select_query sqlon::select<sqlon::expression<int>, int>(sqlon::expression<int>&&, int&&):
✓ Branch 3 taken 1 time.
sqlon::select_query sqlon::select<sqlon::expression<int>, sqlon::expression<int> >(sqlon::expression<int>&&, sqlon::expression<int>&&):
✓ Branch 3 taken 1 time.
sqlon::select_query sqlon::select<sqlon::expression<long> >(sqlon::expression<long>&&):
✓ Branch 3 taken 13 times.
sqlon::select_query sqlon::select<sqlon::expression<long> const&, sqlon::expression<bool> const&, sqlon::expression<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, sqlon::expression<long> const&, sqlon::expression<sqlon::timestamp> const&, sqlon::expression<decltype(nullptr)> const&, sqlon::expression<long> const&>(sqlon::expression<long> const&, sqlon::expression<bool> const&, sqlon::expression<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, sqlon::expression<long> const&, sqlon::expression<sqlon::timestamp> const&, sqlon::expression<decltype(nullptr)> const&, sqlon::expression<long> const&):
✓ Branch 3 taken 1 time.
sqlon::select_query sqlon::select<sqlon::expression<long> const&, sqlon::expression<long> const&, int>(sqlon::expression<long> const&, sqlon::expression<long> const&, int&&):
✓ Branch 3 taken 1 time.
sqlon::select_query sqlon::select<sqlon::expression<long> const&, sqlon::expression<long> const&, sqlon::expression<long> >(sqlon::expression<long> const&, sqlon::expression<long> const&, sqlon::expression<long>&&):
✓ Branch 3 taken 1 time.
sqlon::select_query sqlon::select<sqlon::expression<long> const&, sqlon::expression<long> const&, sqlon::expression<long> const&>(sqlon::expression<long> const&, sqlon::expression<long> const&, sqlon::expression<long> const&):
✓ Branch 3 taken 1 time.
sqlon::select_query sqlon::select<sqlon::expression<long> const&, sqlon::expression<long> const&>(sqlon::expression<long> const&, sqlon::expression<long> const&):
✓ Branch 3 taken 2 times.
sqlon::select_query sqlon::select<sqlon::expression<long> const&>(sqlon::expression<long> const&):
✓ Branch 3 taken 3 times.
sqlon::select_query sqlon::select<sqlon::expression<long>, sqlon::expression<long> >(sqlon::expression<long>&&, sqlon::expression<long>&&):
✓ Branch 3 taken 1 time.
sqlon::select_query sqlon::select<sqlon::expression<long>, sqlon::expression<long>, sqlon::expression<long>, sqlon::expression<double> >(sqlon::expression<long>&&, sqlon::expression<long>&&, sqlon::expression<long>&&, sqlon::expression<double>&&):
✓ Branch 3 taken 1 time.
sqlon::select_query sqlon::select<sqlon::expression<long>, sqlon::expression<long>, sqlon::expression<long>, sqlon::expression<long> >(sqlon::expression<long>&&, sqlon::expression<long>&&, sqlon::expression<long>&&, sqlon::expression<long>&&):
✓ Branch 3 taken 1 time.
sqlon::select_query sqlon::select<sqlon::expression<long>, sqlon::expression<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, sqlon::expression<long> const&>(sqlon::expression<long>&&, sqlon::expression<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, sqlon::expression<long> const&):
✓ Branch 3 taken 1 time.
sqlon::select_query sqlon::select<sqlon::expression<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >(sqlon::expression<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >&&):
✓ Branch 3 taken 6 times.
sqlon::select_query sqlon::select<sqlon::expression<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&>(sqlon::expression<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&):
✓ Branch 3 taken 2 times.
sqlon::select_query sqlon::select<sqlon::expression<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, sqlon::expression<sqlon::timestamp>, sqlon::expression<decltype(nullptr)> >(sqlon::expression<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >&&, sqlon::expression<sqlon::timestamp>&&, sqlon::expression<decltype(nullptr)>&&):
✓ Branch 3 taken 1 time.
sqlon::select_query sqlon::select<sqlon::expression<std::vector<std::byte, std::allocator<std::byte> > > >(sqlon::expression<std::vector<std::byte, std::allocator<std::byte> > >&&):
✓ Branch 3 taken 1 time.
sqlon::select_query sqlon::select<sqlon::parameter_slot<PreparedUuid> const&>(sqlon::parameter_slot<PreparedUuid> const&):
✓ Branch 3 taken 2 times.
sqlon::select_query sqlon::select<sqlon::parameter_slot<long> const&>(sqlon::parameter_slot<long> const&):
✓ Branch 3 taken 1 time.
sqlon::select_query sqlon::select<sqlon::parameter_slot<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, sqlon::parameter_slot<long> const&>(sqlon::parameter_slot<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, sqlon::parameter_slot<long> const&):
✓ Branch 3 taken 1 time.
sqlon::select_query sqlon::select<sqlon::parameter_slot<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&>(sqlon::parameter_slot<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&):
✓ Branch 3 taken 2 times.
sqlon::select_query sqlon::select<sqlon::parameter_slot<std::optional<PreparedUuid> > const&>(sqlon::parameter_slot<std::optional<PreparedUuid> > const&):
✓ Branch 3 taken 1 time.
sqlon::select_query sqlon::select<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, sqlon::column<long> const&>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&&, sqlon::column<long> const&):
✓ Branch 3 taken 1 time.
sqlon::select_query sqlon::select<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, sqlon::expression<long> >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&&, sqlon::expression<long>&&):
✓ Branch 3 taken 1 time.
sqlon::select_query sqlon::select<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, sqlon::expression<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&&, sqlon::expression<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&&):
✓ Branch 3 taken 1 time.
|
380 | return detail::query_access::make<select_query>(std::move(node)); |
| 258 | 190 | } | |
| 259 | |||
| 260 | /** @brief Immutable builder for an INSERT statement. */ | ||
| 261 | class insert_query final : public query { | ||
| 262 | public: | ||
| 263 | /** @brief Sets typed INSERT target columns. */ | ||
| 264 | template<typename... Columns> | ||
| 265 | insert_values_query<typename std::decay_t<Columns>::value_type...> columns(const Columns&... columns) const; | ||
| 266 | |||
| 267 | /** @brief Appends an assignment-form INSERT row. */ | ||
| 268 | template<typename... Assignments> | ||
| 269 | 8 | insert_query values(const assignment& first, const Assignments&... rest) const | |
| 270 | { | ||
| 271 | static_assert((std::is_same_v<std::decay_t<Assignments>, assignment> && ...), | ||
| 272 | "assignment-form values expects column assignments"); | ||
| 273 |
2/2sqlon::insert_query sqlon::insert_query::values<>(sqlon::assignment const&) const:
✓ Branch 1 taken 3 times.
sqlon::insert_query sqlon::insert_query::values<sqlon::assignment>(sqlon::assignment const&, sqlon::assignment const&) const:
✓ Branch 1 taken 5 times.
|
8 | std::shared_ptr<detail::query_node> copy = detail::query_access::copy(*this); |
| 274 |
12/12sqlon::insert_query sqlon::insert_query::values<>(sqlon::assignment const&) const:
✓ Branch 1 taken 3 times.
✓ Branch 5 taken 1 time.
✓ Branch 8 taken 1 time.
✓ Branch 9 taken 1 time.
✓ Branch 12 taken 2 times.
✓ Branch 13 taken 2 times.
sqlon::insert_query sqlon::insert_query::values<sqlon::assignment>(sqlon::assignment const&, sqlon::assignment const&) const:
✓ Branch 1 taken 5 times.
✓ Branch 5 taken 3 times.
✓ Branch 8 taken 6 times.
✓ Branch 9 taken 3 times.
✓ Branch 12 taken 4 times.
✓ Branch 13 taken 2 times.
|
33 | detail::append_assignment_row(*copy, |
| 275 | {detail::assignment_access::node(first), detail::assignment_access::node(rest)...}); | ||
| 276 |
2/2sqlon::insert_query sqlon::insert_query::values<>(sqlon::assignment const&) const:
✓ Branch 3 taken 1 time.
sqlon::insert_query sqlon::insert_query::values<sqlon::assignment>(sqlon::assignment const&, sqlon::assignment const&) const:
✓ Branch 3 taken 3 times.
|
8 | return insert_query{std::move(copy)}; |
| 277 | 20 | } | |
| 278 | |||
| 279 | /** @brief Appends an assignment-form INSERT row. */ | ||
| 280 | SQLON_API insert_query values(std::initializer_list<assignment> values) const; | ||
| 281 | |||
| 282 | /** @brief Selects statement-level default values. */ | ||
| 283 | SQLON_API insert_query default_values() const; | ||
| 284 | |||
| 285 | /** @brief Sets a SELECT query as the INSERT source. */ | ||
| 286 | SQLON_API insert_query from_select(const select_query& source) const; | ||
| 287 | |||
| 288 | /** @brief Appends expressions to RETURNING. */ | ||
| 289 | template<typename... Expressions> | ||
| 290 | 7 | insert_query returning(const Expressions&... expressions) const | |
| 291 | { | ||
| 292 |
1/1✓ Branch 1 taken 7 times.
|
7 | std::shared_ptr<detail::query_node> copy = detail::query_access::copy(*this); |
| 293 |
1/1✓ Branch 4 taken 7 times.
|
7 | (copy->returning.push_back(detail::expression_access::node(to_expression(expressions))), ...); |
| 294 |
1/1✓ Branch 3 taken 7 times.
|
14 | return insert_query{std::move(copy)}; |
| 295 | 7 | } | |
| 296 | |||
| 297 | /** @brief Sets an ON CONFLICT target. */ | ||
| 298 | template<typename... Columns> | ||
| 299 | 25 | insert_query on_conflict(const Columns&... columns) const | |
| 300 | { | ||
| 301 | static_assert(sizeof...(Columns) > 0, "ON CONFLICT target cannot be empty"); | ||
| 302 | static_assert((detail::is_column<std::decay_t<Columns>>::value && ...), "on_conflict expects column values"); | ||
| 303 |
2/2sqlon::insert_query sqlon::insert_query::on_conflict<sqlon::column<long> >(sqlon::column<long> const&) const:
✓ Branch 1 taken 24 times.
sqlon::insert_query sqlon::insert_query::on_conflict<sqlon::column<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >(sqlon::column<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&) const:
✓ Branch 1 taken 1 time.
|
25 | std::shared_ptr<detail::query_node> copy = detail::query_access::copy(*this); |
| 304 |
9/12sqlon::insert_query sqlon::insert_query::on_conflict<sqlon::column<long> >(sqlon::column<long> const&) const:
✓ Branch 2 taken 24 times.
✓ Branch 6 taken 23 times.
✓ Branch 9 taken 23 times.
✓ Branch 10 taken 23 times.
✓ Branch 14 taken 1 time.
✓ Branch 15 taken 1 time.
sqlon::insert_query sqlon::insert_query::on_conflict<sqlon::column<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >(sqlon::column<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&) const:
✓ Branch 2 taken 1 time.
✗ Branch 6 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 14 taken 1 time.
✓ Branch 15 taken 1 time.
|
106 | detail::set_conflict_target(*copy, {detail::expression_access::node(to_expression(columns))...}); |
| 305 |
1/2sqlon::insert_query sqlon::insert_query::on_conflict<sqlon::column<long> >(sqlon::column<long> const&) const:
✓ Branch 3 taken 23 times.
sqlon::insert_query sqlon::insert_query::on_conflict<sqlon::column<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >(sqlon::column<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&) const:
✗ Branch 3 not taken.
|
46 | return insert_query{std::move(copy)}; |
| 306 | 77 | } | |
| 307 | |||
| 308 | /** @brief Sets an optional target and DO NOTHING conflict action. */ | ||
| 309 | template<typename... Columns> | ||
| 310 | 11 | insert_query on_conflict_do_nothing(const Columns&... columns) const | |
| 311 | { | ||
| 312 | static_assert((detail::is_column<std::decay_t<Columns>>::value && ...), | ||
| 313 | "on_conflict_do_nothing expects column values"); | ||
| 314 |
3/3sqlon::insert_query sqlon::insert_query::on_conflict_do_nothing<>() const:
✓ Branch 1 taken 3 times.
sqlon::insert_query sqlon::insert_query::on_conflict_do_nothing<sqlon::column<long> >(sqlon::column<long> const&) const:
✓ Branch 1 taken 6 times.
sqlon::insert_query sqlon::insert_query::on_conflict_do_nothing<sqlon::column<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >(sqlon::column<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&) const:
✓ Branch 1 taken 2 times.
|
11 | std::shared_ptr<detail::query_node> copy = detail::query_access::copy(*this); |
| 315 |
9/13sqlon::insert_query sqlon::insert_query::on_conflict_do_nothing<>() const:
✓ Branch 3 taken 2 times.
sqlon::insert_query sqlon::insert_query::on_conflict_do_nothing<sqlon::column<long> >(sqlon::column<long> const&) const:
✓ Branch 2 taken 6 times.
✓ Branch 6 taken 6 times.
✓ Branch 9 taken 6 times.
✓ Branch 10 taken 6 times.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
sqlon::insert_query sqlon::insert_query::on_conflict_do_nothing<sqlon::column<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >(sqlon::column<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&) const:
✓ Branch 2 taken 2 times.
✓ Branch 6 taken 2 times.
✓ Branch 9 taken 2 times.
✓ Branch 10 taken 2 times.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
|
36 | detail::set_conflict_do_nothing(*copy, {detail::expression_access::node(to_expression(columns))...}); |
| 316 |
3/3sqlon::insert_query sqlon::insert_query::on_conflict_do_nothing<>() const:
✓ Branch 3 taken 2 times.
sqlon::insert_query sqlon::insert_query::on_conflict_do_nothing<sqlon::column<long> >(sqlon::column<long> const&) const:
✓ Branch 3 taken 6 times.
sqlon::insert_query sqlon::insert_query::on_conflict_do_nothing<sqlon::column<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >(sqlon::column<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&) const:
✓ Branch 3 taken 2 times.
|
20 | return insert_query{std::move(copy)}; |
| 317 | 27 | } | |
| 318 | |||
| 319 | /** @brief Sets an ON CONFLICT DO UPDATE action for the previously selected target. */ | ||
| 320 | SQLON_API insert_query on_conflict_update(std::initializer_list<assignment> assignments) const; | ||
| 321 | |||
| 322 | /** @brief Updates every proposed non-target column after a targeted conflict. */ | ||
| 323 | SQLON_API insert_query on_conflict_update_inserted() const; | ||
| 324 | |||
| 325 | /** @brief Sets a targetless ON CONFLICT DO UPDATE action for any unique conflict. */ | ||
| 326 | SQLON_API insert_query on_any_conflict_update(std::initializer_list<assignment> assignments) const; | ||
| 327 | |||
| 328 | /** @brief Sets an ON DUPLICATE KEY UPDATE action. */ | ||
| 329 | SQLON_API insert_query on_duplicate_key_update(std::initializer_list<assignment> assignments) const; | ||
| 330 | |||
| 331 | private: | ||
| 332 | template<typename...> | ||
| 333 | friend class insert_values_query; | ||
| 334 | friend struct detail::query_access; | ||
| 335 | |||
| 336 | SQLON_API explicit insert_query(detail::query_ptr node); | ||
| 337 | |||
| 338 | SQLON_API insert_query append_row(std::vector<detail::expression_ptr> row) const; | ||
| 339 | }; | ||
| 340 | |||
| 341 | /** @brief Typed immutable builder for INSERT rows. */ | ||
| 342 | template<typename... ColumnTypes> | ||
| 343 | class insert_values_query final { | ||
| 344 | public: | ||
| 345 | /** @brief Creates a typed INSERT builder from an INSERT query. */ | ||
| 346 | 144 | explicit insert_values_query(insert_query query) | |
| 347 | 144 | : m_query(std::move(query)) | |
| 348 | 144 | {} | |
| 349 | |||
| 350 | /** @brief Converts to the untyped INSERT builder. */ | ||
| 351 | 49 | operator insert_query() const | |
| 352 | { | ||
| 353 | 49 | return m_query; | |
| 354 | } | ||
| 355 | |||
| 356 | /** @brief Appends a value row compatible with the selected columns. */ | ||
| 357 | template<typename... Values> | ||
| 358 | 44 | insert_values_query values(Values&&... values) const | |
| 359 | { | ||
| 360 | using expected_types = std::tuple<ColumnTypes...>; | ||
| 361 | using value_types = std::tuple<Values...>; | ||
| 362 | static_assert(sizeof...(Values) == sizeof...(ColumnTypes), "INSERT row width must match its column list"); | ||
| 363 | static_assert(detail::compatible_insert_row<expected_types, value_types>(), | ||
| 364 | "INSERT values must be compatible with their columns"); | ||
| 365 |
36/60sqlon::insert_values_query<long, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > sqlon::insert_values_query<long, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >::values<int, char const (&) [4]>(int&&, char const (&) [4]) const:
✓ Branch 1 taken 3 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 3 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
sqlon::insert_values_query<long, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > sqlon::insert_values_query<long, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >::values<int, char const (&) [6]>(int&&, char const (&) [6]) const:
✓ Branch 1 taken 21 times.
✓ Branch 3 taken 42 times.
✓ Branch 4 taken 21 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
sqlon::insert_values_query<long, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool> sqlon::insert_values_query<long, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool>::values<int, char const (&) [4], bool>(int&&, char const (&) [4], bool&&) const:
✓ Branch 1 taken 1 time.
✓ Branch 3 taken 3 times.
✓ Branch 4 taken 1 time.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
sqlon::insert_values_query<long, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool> sqlon::insert_values_query<long, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool>::values<int, char const (&) [6], bool>(int&&, char const (&) [6], bool&&) const:
✓ Branch 1 taken 3 times.
✓ Branch 3 taken 9 times.
✓ Branch 4 taken 3 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
sqlon::insert_values_query<long> sqlon::insert_values_query<long>::values<int>(int&&) const:
✓ Branch 1 taken 1 time.
✓ Branch 3 taken 1 time.
✓ Branch 4 taken 1 time.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
sqlon::insert_values_query<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > sqlon::insert_values_query<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >::values<char const (&) [4]>(char const (&) [4]) const:
✓ Branch 1 taken 1 time.
✓ Branch 3 taken 1 time.
✓ Branch 4 taken 1 time.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
sqlon::insert_values_query<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > sqlon::insert_values_query<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >::values<char const (&) [6]>(char const (&) [6]) const:
✓ Branch 1 taken 6 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 6 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
sqlon::insert_values_query<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > sqlon::insert_values_query<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >::values<sqlon::parameter_slot<std::optional<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&>(sqlon::parameter_slot<std::optional<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&) const:
✓ Branch 1 taken 1 time.
✓ Branch 3 taken 1 time.
✓ Branch 4 taken 1 time.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
sqlon::insert_values_query<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool> sqlon::insert_values_query<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool>::values<char const (&) [4], bool>(char const (&) [4], bool&&) const:
✓ Branch 1 taken 1 time.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 1 time.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
sqlon::insert_values_query<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool> sqlon::insert_values_query<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool>::values<char const (&) [6], bool>(char const (&) [6], bool&&) const:
✓ Branch 1 taken 2 times.
✓ Branch 3 taken 4 times.
✓ Branch 4 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
sqlon::insert_values_query<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool> sqlon::insert_values_query<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool>::values<sqlon::expression<decltype(nullptr)>, bool>(sqlon::expression<decltype(nullptr)>&&, bool&&) const:
✓ Branch 1 taken 1 time.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 1 time.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
sqlon::insert_values_query<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool> sqlon::insert_values_query<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool>::values<sqlon::parameter_slot<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, sqlon::parameter_slot<bool> const&>(sqlon::parameter_slot<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, sqlon::parameter_slot<bool> const&) const:
✓ Branch 1 taken 3 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 3 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
|
171 | std::vector<detail::expression_ptr> row{ |
| 366 |
18/18sqlon::insert_values_query<long, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > sqlon::insert_values_query<long, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >::values<int, char const (&) [4]>(int&&, char const (&) [4]) const:
✓ Branch 1 taken 3 times.
✓ Branch 5 taken 3 times.
sqlon::insert_values_query<long, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > sqlon::insert_values_query<long, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >::values<int, char const (&) [6]>(int&&, char const (&) [6]) const:
✓ Branch 1 taken 21 times.
✓ Branch 5 taken 21 times.
sqlon::insert_values_query<long, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool> sqlon::insert_values_query<long, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool>::values<int, char const (&) [4], bool>(int&&, char const (&) [4], bool&&) const:
✓ Branch 1 taken 1 time.
✓ Branch 5 taken 1 time.
✓ Branch 9 taken 1 time.
sqlon::insert_values_query<long, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool> sqlon::insert_values_query<long, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool>::values<int, char const (&) [6], bool>(int&&, char const (&) [6], bool&&) const:
✓ Branch 1 taken 3 times.
✓ Branch 5 taken 3 times.
✓ Branch 9 taken 3 times.
sqlon::insert_values_query<long> sqlon::insert_values_query<long>::values<int>(int&&) const:
✓ Branch 1 taken 1 time.
sqlon::insert_values_query<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > sqlon::insert_values_query<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >::values<char const (&) [4]>(char const (&) [4]) const:
✓ Branch 1 taken 1 time.
sqlon::insert_values_query<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > sqlon::insert_values_query<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >::values<char const (&) [6]>(char const (&) [6]) const:
✓ Branch 1 taken 6 times.
sqlon::insert_values_query<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool> sqlon::insert_values_query<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool>::values<char const (&) [4], bool>(char const (&) [4], bool&&) const:
✓ Branch 1 taken 1 time.
✓ Branch 5 taken 1 time.
sqlon::insert_values_query<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool> sqlon::insert_values_query<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool>::values<char const (&) [6], bool>(char const (&) [6], bool&&) const:
✓ Branch 1 taken 2 times.
✓ Branch 5 taken 2 times.
sqlon::insert_values_query<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool> sqlon::insert_values_query<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool>::values<sqlon::expression<decltype(nullptr)>, bool>(sqlon::expression<decltype(nullptr)>&&, bool&&) const:
✓ Branch 3 taken 1 time.
|
127 | detail::expression_access::node(to_expression(std::forward<Values>(values)))...}; |
| 367 |
12/12sqlon::insert_values_query<long, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > sqlon::insert_values_query<long, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >::values<int, char const (&) [4]>(int&&, char const (&) [4]) const:
✓ Branch 3 taken 3 times.
sqlon::insert_values_query<long, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > sqlon::insert_values_query<long, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >::values<int, char const (&) [6]>(int&&, char const (&) [6]) const:
✓ Branch 3 taken 21 times.
sqlon::insert_values_query<long, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool> sqlon::insert_values_query<long, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool>::values<int, char const (&) [4], bool>(int&&, char const (&) [4], bool&&) const:
✓ Branch 3 taken 1 time.
sqlon::insert_values_query<long, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool> sqlon::insert_values_query<long, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool>::values<int, char const (&) [6], bool>(int&&, char const (&) [6], bool&&) const:
✓ Branch 3 taken 3 times.
sqlon::insert_values_query<long> sqlon::insert_values_query<long>::values<int>(int&&) const:
✓ Branch 3 taken 1 time.
sqlon::insert_values_query<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > sqlon::insert_values_query<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >::values<char const (&) [4]>(char const (&) [4]) const:
✓ Branch 3 taken 1 time.
sqlon::insert_values_query<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > sqlon::insert_values_query<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >::values<char const (&) [6]>(char const (&) [6]) const:
✓ Branch 3 taken 6 times.
sqlon::insert_values_query<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > sqlon::insert_values_query<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >::values<sqlon::parameter_slot<std::optional<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&>(sqlon::parameter_slot<std::optional<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&) const:
✓ Branch 3 taken 1 time.
sqlon::insert_values_query<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool> sqlon::insert_values_query<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool>::values<char const (&) [4], bool>(char const (&) [4], bool&&) const:
✓ Branch 3 taken 1 time.
sqlon::insert_values_query<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool> sqlon::insert_values_query<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool>::values<char const (&) [6], bool>(char const (&) [6], bool&&) const:
✓ Branch 3 taken 2 times.
sqlon::insert_values_query<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool> sqlon::insert_values_query<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool>::values<sqlon::expression<decltype(nullptr)>, bool>(sqlon::expression<decltype(nullptr)>&&, bool&&) const:
✓ Branch 3 taken 1 time.
sqlon::insert_values_query<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool> sqlon::insert_values_query<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool>::values<sqlon::parameter_slot<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, sqlon::parameter_slot<bool> const&>(sqlon::parameter_slot<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, sqlon::parameter_slot<bool> const&) const:
✓ Branch 3 taken 3 times.
|
88 | return insert_values_query{m_query.append_row(std::move(row))}; |
| 368 | 171 | } | |
| 369 | |||
| 370 | /** @brief Appends expressions to RETURNING. */ | ||
| 371 | template<typename... Expressions> | ||
| 372 | 4 | insert_values_query returning(const Expressions&... expressions) const | |
| 373 | { | ||
| 374 |
3/3sqlon::insert_values_query<long, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > sqlon::insert_values_query<long, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >::returning<sqlon::column<long> >(sqlon::column<long> const&) const:
✓ Branch 1 taken 1 time.
sqlon::insert_values_query<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > sqlon::insert_values_query<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >::returning<sqlon::column<long> >(sqlon::column<long> const&) const:
✓ Branch 1 taken 2 times.
sqlon::insert_values_query<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool> sqlon::insert_values_query<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool>::returning<sqlon::column<long> >(sqlon::column<long> const&) const:
✓ Branch 1 taken 1 time.
|
4 | return insert_values_query{m_query.returning(expressions...)}; |
| 375 | } | ||
| 376 | |||
| 377 | /** @brief Sets a SELECT query as the INSERT source. */ | ||
| 378 | 7 | insert_query from_select(const select_query& source) const | |
| 379 | { | ||
| 380 | 7 | return m_query.from_select(source); | |
| 381 | } | ||
| 382 | |||
| 383 | /** @brief Sets an ON CONFLICT target. */ | ||
| 384 | template<typename... Columns> | ||
| 385 | 25 | insert_values_query on_conflict(const Columns&... columns) const | |
| 386 | { | ||
| 387 |
4/5sqlon::insert_values_query<long, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > sqlon::insert_values_query<long, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >::on_conflict<sqlon::column<long> >(sqlon::column<long> const&) const:
✓ Branch 1 taken 18 times.
sqlon::insert_values_query<long, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > sqlon::insert_values_query<long, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >::on_conflict<sqlon::column<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >(sqlon::column<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&) const:
✗ Branch 1 not taken.
sqlon::insert_values_query<long, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool> sqlon::insert_values_query<long, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool>::on_conflict<sqlon::column<long> >(sqlon::column<long> const&) const:
✓ Branch 1 taken 3 times.
sqlon::insert_values_query<long> sqlon::insert_values_query<long>::on_conflict<sqlon::column<long> >(sqlon::column<long> const&) const:
✓ Branch 1 taken 1 time.
sqlon::insert_values_query<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > sqlon::insert_values_query<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >::on_conflict<sqlon::column<long> >(sqlon::column<long> const&) const:
✓ Branch 1 taken 1 time.
|
25 | return insert_values_query{m_query.on_conflict(columns...)}; |
| 388 | } | ||
| 389 | |||
| 390 | /** @brief Sets an optional target and DO NOTHING conflict action. */ | ||
| 391 | template<typename... Columns> | ||
| 392 | 6 | insert_values_query on_conflict_do_nothing(const Columns&... columns) const | |
| 393 | { | ||
| 394 |
2/3sqlon::insert_values_query<long, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > sqlon::insert_values_query<long, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >::on_conflict_do_nothing<>() const:
✗ Branch 1 not taken.
sqlon::insert_values_query<long, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > sqlon::insert_values_query<long, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >::on_conflict_do_nothing<sqlon::column<long> >(sqlon::column<long> const&) const:
✓ Branch 1 taken 4 times.
sqlon::insert_values_query<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > sqlon::insert_values_query<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >::on_conflict_do_nothing<>() const:
✓ Branch 1 taken 1 time.
|
6 | return insert_values_query{m_query.on_conflict_do_nothing(columns...)}; |
| 395 | } | ||
| 396 | |||
| 397 | /** @brief Sets an ON CONFLICT DO UPDATE action for the previously selected target. */ | ||
| 398 | 17 | insert_values_query on_conflict_update(std::initializer_list<assignment> assignments) const | |
| 399 | { | ||
| 400 |
3/3sqlon::insert_values_query<long, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >::on_conflict_update(std::initializer_list<sqlon::assignment>) const:
✓ Branch 1 taken 10 times.
sqlon::insert_values_query<long, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool>::on_conflict_update(std::initializer_list<sqlon::assignment>) const:
✓ Branch 1 taken 1 time.
sqlon::insert_values_query<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >::on_conflict_update(std::initializer_list<sqlon::assignment>) const:
✓ Branch 1 taken 1 time.
|
17 | return insert_values_query{m_query.on_conflict_update(assignments)}; |
| 401 | } | ||
| 402 | |||
| 403 | /** @brief Updates every proposed non-target column after a targeted conflict. */ | ||
| 404 | 7 | insert_values_query on_conflict_update_inserted() const | |
| 405 | { | ||
| 406 |
2/3sqlon::insert_values_query<long, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >::on_conflict_update_inserted() const:
✓ Branch 1 taken 3 times.
sqlon::insert_values_query<long, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool>::on_conflict_update_inserted() const:
✓ Branch 1 taken 2 times.
sqlon::insert_values_query<long>::on_conflict_update_inserted() const:
✗ Branch 1 not taken.
|
7 | return insert_values_query{m_query.on_conflict_update_inserted()}; |
| 407 | } | ||
| 408 | |||
| 409 | /** @brief Sets a targetless ON CONFLICT DO UPDATE action for any unique conflict. */ | ||
| 410 | 6 | insert_values_query on_any_conflict_update(std::initializer_list<assignment> assignments) const | |
| 411 | { | ||
| 412 |
1/1✓ Branch 1 taken 2 times.
|
6 | return insert_values_query{m_query.on_any_conflict_update(assignments)}; |
| 413 | } | ||
| 414 | |||
| 415 | /** @brief Sets an ON DUPLICATE KEY UPDATE action. */ | ||
| 416 | 6 | insert_values_query on_duplicate_key_update(std::initializer_list<assignment> assignments) const | |
| 417 | { | ||
| 418 |
2/2sqlon::insert_values_query<long, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >::on_duplicate_key_update(std::initializer_list<sqlon::assignment>) const:
✓ Branch 1 taken 3 times.
sqlon::insert_values_query<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >::on_duplicate_key_update(std::initializer_list<sqlon::assignment>) const:
✓ Branch 1 taken 1 time.
|
6 | return insert_values_query{m_query.on_duplicate_key_update(assignments)}; |
| 419 | } | ||
| 420 | |||
| 421 | private: | ||
| 422 | insert_query m_query; | ||
| 423 | }; | ||
| 424 | |||
| 425 | template<typename... Columns> | ||
| 426 | insert_values_query<typename std::decay_t<Columns>::value_type...> | ||
| 427 | 48 | insert_query::columns(const Columns&... columns) const | |
| 428 | { | ||
| 429 | static_assert(sizeof...(Columns) > 0, "INSERT columns cannot be empty"); | ||
| 430 | static_assert((detail::is_column<std::decay_t<Columns>>::value && ...), "INSERT columns() expects column values"); | ||
| 431 |
6/6sqlon::insert_values_query<std::decay<sqlon::column<long> >::type::value_type, std::decay<sqlon::column<long> >::type::value_type> sqlon::insert_query::columns<sqlon::column<long>, sqlon::column<long> >(sqlon::column<long> const&, sqlon::column<long> const&) const:
✓ Branch 1 taken 1 time.
sqlon::insert_values_query<std::decay<sqlon::column<long> >::type::value_type, std::decay<sqlon::column<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >::type::value_type, std::decay<sqlon::column<bool> >::type::value_type> sqlon::insert_query::columns<sqlon::column<long>, sqlon::column<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, sqlon::column<bool> >(sqlon::column<long> const&, sqlon::column<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, sqlon::column<bool> const&) const:
✓ Branch 1 taken 3 times.
sqlon::insert_values_query<std::decay<sqlon::column<long> >::type::value_type, std::decay<sqlon::column<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >::type::value_type> sqlon::insert_query::columns<sqlon::column<long>, sqlon::column<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >(sqlon::column<long> const&, sqlon::column<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&) const:
✓ Branch 1 taken 22 times.
sqlon::insert_values_query<std::decay<sqlon::column<long> >::type::value_type> sqlon::insert_query::columns<sqlon::column<long> >(sqlon::column<long> const&) const:
✓ Branch 1 taken 3 times.
sqlon::insert_values_query<std::decay<sqlon::column<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >::type::value_type, std::decay<sqlon::column<bool> >::type::value_type> sqlon::insert_query::columns<sqlon::column<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, sqlon::column<bool> >(sqlon::column<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, sqlon::column<bool> const&) const:
✓ Branch 1 taken 7 times.
sqlon::insert_values_query<std::decay<sqlon::column<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >::type::value_type> sqlon::insert_query::columns<sqlon::column<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >(sqlon::column<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&) const:
✓ Branch 1 taken 12 times.
|
48 | std::shared_ptr<detail::query_node> copy = detail::query_access::copy(*this); |
| 432 |
27/36sqlon::insert_values_query<std::decay<sqlon::column<long> >::type::value_type, std::decay<sqlon::column<long> >::type::value_type> sqlon::insert_query::columns<sqlon::column<long>, sqlon::column<long> >(sqlon::column<long> const&, sqlon::column<long> const&) const:
✓ Branch 3 taken 1 time.
✗ Branch 7 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✓ Branch 16 taken 2 times.
✓ Branch 17 taken 1 time.
sqlon::insert_values_query<std::decay<sqlon::column<long> >::type::value_type, std::decay<sqlon::column<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >::type::value_type, std::decay<sqlon::column<bool> >::type::value_type> sqlon::insert_query::columns<sqlon::column<long>, sqlon::column<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, sqlon::column<bool> >(sqlon::column<long> const&, sqlon::column<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, sqlon::column<bool> const&) const:
✓ Branch 4 taken 3 times.
✓ Branch 8 taken 3 times.
✓ Branch 11 taken 9 times.
✓ Branch 12 taken 3 times.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
sqlon::insert_values_query<std::decay<sqlon::column<long> >::type::value_type, std::decay<sqlon::column<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >::type::value_type> sqlon::insert_query::columns<sqlon::column<long>, sqlon::column<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >(sqlon::column<long> const&, sqlon::column<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&) const:
✓ Branch 3 taken 22 times.
✓ Branch 7 taken 22 times.
✓ Branch 10 taken 44 times.
✓ Branch 11 taken 22 times.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
sqlon::insert_values_query<std::decay<sqlon::column<long> >::type::value_type> sqlon::insert_query::columns<sqlon::column<long> >(sqlon::column<long> const&) const:
✓ Branch 2 taken 3 times.
✓ Branch 6 taken 2 times.
✓ Branch 9 taken 2 times.
✓ Branch 10 taken 2 times.
✓ Branch 14 taken 1 time.
✓ Branch 15 taken 1 time.
sqlon::insert_values_query<std::decay<sqlon::column<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >::type::value_type, std::decay<sqlon::column<bool> >::type::value_type> sqlon::insert_query::columns<sqlon::column<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, sqlon::column<bool> >(sqlon::column<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, sqlon::column<bool> const&) const:
✓ Branch 3 taken 7 times.
✓ Branch 7 taken 7 times.
✓ Branch 10 taken 14 times.
✓ Branch 11 taken 7 times.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
sqlon::insert_values_query<std::decay<sqlon::column<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >::type::value_type> sqlon::insert_query::columns<sqlon::column<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >(sqlon::column<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&) const:
✓ Branch 2 taken 12 times.
✓ Branch 6 taken 11 times.
✓ Branch 9 taken 11 times.
✓ Branch 10 taken 11 times.
✓ Branch 14 taken 1 time.
✓ Branch 15 taken 1 time.
|
274 | detail::set_insert_columns(*copy, {detail::expression_access::node(to_expression(columns))...}); |
| 433 |
5/6sqlon::insert_values_query<std::decay<sqlon::column<long> >::type::value_type, std::decay<sqlon::column<long> >::type::value_type> sqlon::insert_query::columns<sqlon::column<long>, sqlon::column<long> >(sqlon::column<long> const&, sqlon::column<long> const&) const:
✗ Branch 3 not taken.
sqlon::insert_values_query<std::decay<sqlon::column<long> >::type::value_type, std::decay<sqlon::column<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >::type::value_type, std::decay<sqlon::column<bool> >::type::value_type> sqlon::insert_query::columns<sqlon::column<long>, sqlon::column<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, sqlon::column<bool> >(sqlon::column<long> const&, sqlon::column<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, sqlon::column<bool> const&) const:
✓ Branch 3 taken 3 times.
sqlon::insert_values_query<std::decay<sqlon::column<long> >::type::value_type, std::decay<sqlon::column<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >::type::value_type> sqlon::insert_query::columns<sqlon::column<long>, sqlon::column<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >(sqlon::column<long> const&, sqlon::column<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&) const:
✓ Branch 3 taken 22 times.
sqlon::insert_values_query<std::decay<sqlon::column<long> >::type::value_type> sqlon::insert_query::columns<sqlon::column<long> >(sqlon::column<long> const&) const:
✓ Branch 3 taken 2 times.
sqlon::insert_values_query<std::decay<sqlon::column<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >::type::value_type, std::decay<sqlon::column<bool> >::type::value_type> sqlon::insert_query::columns<sqlon::column<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, sqlon::column<bool> >(sqlon::column<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, sqlon::column<bool> const&) const:
✓ Branch 3 taken 7 times.
sqlon::insert_values_query<std::decay<sqlon::column<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >::type::value_type> sqlon::insert_query::columns<sqlon::column<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >(sqlon::column<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&) const:
✓ Branch 3 taken 11 times.
|
90 | return insert_values_query<typename std::decay_t<Columns>::value_type...>{insert_query{std::move(copy)}}; |
| 434 | 183 | } | |
| 435 | |||
| 436 | /** @brief Creates an INSERT statement targeting a table. */ | ||
| 437 | template<typename Table> | ||
| 438 | 62 | insert_query insert_into(const Table& table) | |
| 439 | { | ||
| 440 |
1/1✓ Branch 1 taken 62 times.
|
62 | std::shared_ptr<detail::query_node> node = std::make_shared<detail::query_node>(); |
| 441 | 62 | node->kind = detail::statement_kind::insert; | |
| 442 |
1/1✓ Branch 1 taken 62 times.
|
62 | node->target = detail::to_relation(table); |
| 443 |
1/1✓ Branch 3 taken 62 times.
|
124 | return detail::query_access::make<insert_query>(std::move(node)); |
| 444 | 62 | } | |
| 445 | |||
| 446 | /** @brief Immutable builder for an UPDATE statement. */ | ||
| 447 | class update_query final : public query { | ||
| 448 | public: | ||
| 449 | /** @brief Sets the column assignments. */ | ||
| 450 | SQLON_API update_query set(std::initializer_list<assignment> assignments) const; | ||
| 451 | |||
| 452 | /** @brief Sets the column assignments. */ | ||
| 453 | template<typename... Assignments> | ||
| 454 | 15 | update_query set(const assignment& first, const Assignments&... rest) const | |
| 455 | { | ||
| 456 | static_assert((std::is_same_v<std::decay_t<Assignments>, assignment> && ...), "set expects assignments"); | ||
| 457 |
2/2sqlon::update_query sqlon::update_query::set<>(sqlon::assignment const&) const:
✓ Branch 1 taken 13 times.
sqlon::update_query sqlon::update_query::set<sqlon::assignment>(sqlon::assignment const&, sqlon::assignment const&) const:
✓ Branch 1 taken 2 times.
|
15 | std::shared_ptr<detail::query_node> copy = detail::query_access::copy(*this); |
| 458 |
12/12sqlon::update_query sqlon::update_query::set<>(sqlon::assignment const&) const:
✓ Branch 1 taken 13 times.
✓ Branch 5 taken 11 times.
✓ Branch 8 taken 11 times.
✓ Branch 9 taken 11 times.
✓ Branch 12 taken 2 times.
✓ Branch 13 taken 2 times.
sqlon::update_query sqlon::update_query::set<sqlon::assignment>(sqlon::assignment const&, sqlon::assignment const&) const:
✓ Branch 1 taken 2 times.
✓ Branch 5 taken 1 time.
✓ Branch 8 taken 2 times.
✓ Branch 9 taken 1 time.
✓ Branch 12 taken 2 times.
✓ Branch 13 taken 1 time.
|
50 | detail::set_update_assignments(*copy, |
| 459 | {detail::assignment_access::node(first), detail::assignment_access::node(rest)...}); | ||
| 460 |
2/2sqlon::update_query sqlon::update_query::set<>(sqlon::assignment const&) const:
✓ Branch 3 taken 11 times.
sqlon::update_query sqlon::update_query::set<sqlon::assignment>(sqlon::assignment const&, sqlon::assignment const&) const:
✓ Branch 3 taken 1 time.
|
24 | return update_query{std::move(copy)}; |
| 461 | 33 | } | |
| 462 | |||
| 463 | /** @brief Sets the WHERE predicate. */ | ||
| 464 | SQLON_API update_query where(const expression<bool>& predicate) const; | ||
| 465 | |||
| 466 | /** @brief Sets WHERE from a dynamic condition group. */ | ||
| 467 | SQLON_API update_query where(const conditions& predicates) const; | ||
| 468 | |||
| 469 | /** @brief Sets the UPDATE FROM relation. */ | ||
| 470 | template<typename Relation> | ||
| 471 | 4 | update_query from(const Relation& relation) const | |
| 472 | { | ||
| 473 |
1/1✓ Branch 1 taken 4 times.
|
4 | std::shared_ptr<detail::query_node> copy = detail::query_access::copy(*this); |
| 474 |
3/3✓ Branch 1 taken 1 time.
✓ Branch 2 taken 3 times.
✓ Branch 5 taken 1 time.
|
4 | if (copy->from_set) throw invalid_query{"FROM was already specified"}; |
| 475 |
1/1✓ Branch 1 taken 3 times.
|
3 | copy->from = detail::to_relation(relation); |
| 476 | 3 | copy->from_set = true; | |
| 477 |
1/1✓ Branch 3 taken 3 times.
|
6 | return update_query{std::move(copy)}; |
| 478 | 4 | } | |
| 479 | |||
| 480 | /** @brief Appends expressions to RETURNING. */ | ||
| 481 | template<typename... Expressions> | ||
| 482 | 1 | update_query returning(const Expressions&... expressions) const | |
| 483 | { | ||
| 484 |
1/1✓ Branch 1 taken 1 time.
|
1 | std::shared_ptr<detail::query_node> copy = detail::query_access::copy(*this); |
| 485 |
1/1✓ Branch 4 taken 1 time.
|
1 | (copy->returning.push_back(detail::expression_access::node(to_expression(expressions))), ...); |
| 486 |
1/1✓ Branch 3 taken 1 time.
|
2 | return update_query{std::move(copy)}; |
| 487 | 1 | } | |
| 488 | |||
| 489 | private: | ||
| 490 | friend struct detail::query_access; | ||
| 491 | |||
| 492 | SQLON_API explicit update_query(detail::query_ptr node); | ||
| 493 | }; | ||
| 494 | |||
| 495 | /** @brief Creates an UPDATE statement targeting a table. */ | ||
| 496 | template<typename Table> | ||
| 497 | 16 | update_query update(const Table& table) | |
| 498 | { | ||
| 499 |
1/1✓ Branch 1 taken 16 times.
|
16 | std::shared_ptr<detail::query_node> node = std::make_shared<detail::query_node>(); |
| 500 | 16 | node->kind = detail::statement_kind::update; | |
| 501 |
1/1✓ Branch 1 taken 16 times.
|
16 | node->target = detail::to_relation(table); |
| 502 |
1/1✓ Branch 3 taken 16 times.
|
32 | return detail::query_access::make<update_query>(std::move(node)); |
| 503 | 16 | } | |
| 504 | |||
| 505 | /** @brief Immutable builder for a DELETE statement. */ | ||
| 506 | class delete_query final : public query { | ||
| 507 | public: | ||
| 508 | /** @brief Sets the WHERE predicate. */ | ||
| 509 | SQLON_API delete_query where(const expression<bool>& predicate) const; | ||
| 510 | |||
| 511 | /** @brief Sets WHERE from a dynamic condition group. */ | ||
| 512 | SQLON_API delete_query where(const conditions& predicates) const; | ||
| 513 | |||
| 514 | /** @brief Sets the DELETE USING relation. */ | ||
| 515 | template<typename Relation> | ||
| 516 | 4 | delete_query using_(const Relation& relation) const | |
| 517 | { | ||
| 518 |
1/1✓ Branch 1 taken 4 times.
|
4 | std::shared_ptr<detail::query_node> copy = detail::query_access::copy(*this); |
| 519 |
3/3✓ Branch 1 taken 1 time.
✓ Branch 2 taken 3 times.
✓ Branch 5 taken 1 time.
|
4 | if (copy->from_set) throw invalid_query{"USING was already specified"}; |
| 520 |
1/1✓ Branch 1 taken 3 times.
|
3 | copy->from = detail::to_relation(relation); |
| 521 | 3 | copy->from_set = true; | |
| 522 |
1/1✓ Branch 3 taken 3 times.
|
6 | return delete_query{std::move(copy)}; |
| 523 | 4 | } | |
| 524 | |||
| 525 | /** @brief Appends expressions to RETURNING. */ | ||
| 526 | template<typename... Expressions> | ||
| 527 | 1 | delete_query returning(const Expressions&... expressions) const | |
| 528 | { | ||
| 529 |
1/1✓ Branch 1 taken 1 time.
|
1 | std::shared_ptr<detail::query_node> copy = detail::query_access::copy(*this); |
| 530 |
1/1✓ Branch 4 taken 1 time.
|
1 | (copy->returning.push_back(detail::expression_access::node(to_expression(expressions))), ...); |
| 531 |
1/1✓ Branch 3 taken 1 time.
|
2 | return delete_query{std::move(copy)}; |
| 532 | 1 | } | |
| 533 | |||
| 534 | private: | ||
| 535 | friend struct detail::query_access; | ||
| 536 | |||
| 537 | SQLON_API explicit delete_query(detail::query_ptr node); | ||
| 538 | }; | ||
| 539 | |||
| 540 | /** @brief Creates a DELETE statement targeting a table. */ | ||
| 541 | template<typename Table> | ||
| 542 | 8 | delete_query delete_from(const Table& table) | |
| 543 | { | ||
| 544 |
1/1✓ Branch 1 taken 8 times.
|
8 | std::shared_ptr<detail::query_node> node = std::make_shared<detail::query_node>(); |
| 545 | 8 | node->kind = detail::statement_kind::delete_; | |
| 546 |
1/1✓ Branch 1 taken 8 times.
|
8 | node->target = detail::to_relation(table); |
| 547 |
1/1✓ Branch 3 taken 8 times.
|
16 | return detail::query_access::make<delete_query>(std::move(node)); |
| 548 | 8 | } | |
| 549 | |||
| 550 | class common_table_expression; | ||
| 551 | |||
| 552 | /** @brief Creates a common table expression definition. */ | ||
| 553 | SQLON_API common_table_expression cte(std::string name, const query& value, std::vector<std::string> columns = {}); | ||
| 554 | |||
| 555 | /** @brief Named common table expression definition and relation. */ | ||
| 556 | class common_table_expression final : public relation { | ||
| 557 | public: | ||
| 558 | /** @brief Creates a typed reference to a CTE result column. */ | ||
| 559 | template<typename T> | ||
| 560 | 2 | sqlon::column<T> column(std::string name) const | |
| 561 | { | ||
| 562 |
2/2✓ Branch 1 taken 2 times.
✓ Branch 6 taken 2 times.
|
2 | return sqlon::column<T>{proxy_table(), std::move(name)}; |
| 563 | } | ||
| 564 | |||
| 565 | private: | ||
| 566 | friend common_table_expression cte(std::string name, const query& value, std::vector<std::string> columns); | ||
| 567 | friend struct detail::common_table_expression_access; | ||
| 568 | |||
| 569 | common_table_expression(detail::common_table_expression_node definition, detail::relation_ptr relation_node); | ||
| 570 | |||
| 571 | SQLON_API table proxy_table() const; | ||
| 572 | |||
| 573 | detail::common_table_expression_node m_definition; | ||
| 574 | std::string m_name; | ||
| 575 | }; | ||
| 576 | |||
| 577 | namespace detail { | ||
| 578 | |||
| 579 | struct common_table_expression_access final { | ||
| 580 | 12 | static const common_table_expression_node& definition(const common_table_expression& value) noexcept | |
| 581 | { | ||
| 582 | 12 | return value.m_definition; | |
| 583 | } | ||
| 584 | }; | ||
| 585 | |||
| 586 | } // namespace detail | ||
| 587 | |||
| 588 | /** @brief Attaches common table expressions to a query. */ | ||
| 589 | template<typename Query, typename... Ctes> | ||
| 590 | 4 | Query with(const Query& value, const Ctes&... ctes) | |
| 591 | { | ||
| 592 |
2/2sqlon::select_query sqlon::with<sqlon::select_query, sqlon::common_table_expression, sqlon::common_table_expression>(sqlon::select_query const&, sqlon::common_table_expression const&, sqlon::common_table_expression const&):
✓ Branch 1 taken 2 times.
sqlon::select_query sqlon::with<sqlon::select_query, sqlon::common_table_expression>(sqlon::select_query const&, sqlon::common_table_expression const&):
✓ Branch 1 taken 2 times.
|
4 | std::shared_ptr<detail::query_node> copy = detail::query_access::copy(value); |
| 593 |
3/3sqlon::select_query sqlon::with<sqlon::select_query, sqlon::common_table_expression, sqlon::common_table_expression>(sqlon::select_query const&, sqlon::common_table_expression const&, sqlon::common_table_expression const&):
✓ Branch 3 taken 2 times.
✓ Branch 8 taken 2 times.
sqlon::select_query sqlon::with<sqlon::select_query, sqlon::common_table_expression>(sqlon::select_query const&, sqlon::common_table_expression const&):
✓ Branch 3 taken 2 times.
|
4 | (copy->ctes.push_back(detail::common_table_expression_access::definition(ctes)), ...); |
| 594 |
2/2sqlon::select_query sqlon::with<sqlon::select_query, sqlon::common_table_expression, sqlon::common_table_expression>(sqlon::select_query const&, sqlon::common_table_expression const&, sqlon::common_table_expression const&):
✓ Branch 3 taken 2 times.
sqlon::select_query sqlon::with<sqlon::select_query, sqlon::common_table_expression>(sqlon::select_query const&, sqlon::common_table_expression const&):
✓ Branch 3 taken 2 times.
|
8 | return detail::query_access::make<Query>(std::move(copy)); |
| 595 | 4 | } | |
| 596 | |||
| 597 | /** @brief Attaches recursive common table expressions to a query. */ | ||
| 598 | template<typename Query, typename... Ctes> | ||
| 599 | 5 | Query with_recursive(const Query& value, const Ctes&... ctes) | |
| 600 | { | ||
| 601 |
2/2sqlon::select_query sqlon::with_recursive<sqlon::select_query, sqlon::common_table_expression, sqlon::common_table_expression>(sqlon::select_query const&, sqlon::common_table_expression const&, sqlon::common_table_expression const&):
✓ Branch 1 taken 1 time.
sqlon::select_query sqlon::with_recursive<sqlon::select_query, sqlon::common_table_expression>(sqlon::select_query const&, sqlon::common_table_expression const&):
✓ Branch 1 taken 4 times.
|
5 | std::shared_ptr<detail::query_node> copy = detail::query_access::copy(value); |
| 602 | 5 | copy->recursive = true; | |
| 603 |
3/3sqlon::select_query sqlon::with_recursive<sqlon::select_query, sqlon::common_table_expression, sqlon::common_table_expression>(sqlon::select_query const&, sqlon::common_table_expression const&, sqlon::common_table_expression const&):
✓ Branch 3 taken 1 time.
✓ Branch 8 taken 1 time.
sqlon::select_query sqlon::with_recursive<sqlon::select_query, sqlon::common_table_expression>(sqlon::select_query const&, sqlon::common_table_expression const&):
✓ Branch 3 taken 4 times.
|
5 | (copy->ctes.push_back(detail::common_table_expression_access::definition(ctes)), ...); |
| 604 |
2/2sqlon::select_query sqlon::with_recursive<sqlon::select_query, sqlon::common_table_expression, sqlon::common_table_expression>(sqlon::select_query const&, sqlon::common_table_expression const&, sqlon::common_table_expression const&):
✓ Branch 3 taken 1 time.
sqlon::select_query sqlon::with_recursive<sqlon::select_query, sqlon::common_table_expression>(sqlon::select_query const&, sqlon::common_table_expression const&):
✓ Branch 3 taken 4 times.
|
10 | return detail::query_access::make<Query>(std::move(copy)); |
| 605 | 5 | } | |
| 606 | |||
| 607 | /** @brief Aliased query usable as a relation. */ | ||
| 608 | class subquery_relation final : public relation { | ||
| 609 | public: | ||
| 610 | /** @brief Creates an aliased derived-table relation. */ | ||
| 611 | SQLON_API subquery_relation(const select_query& value, std::string alias); | ||
| 612 | |||
| 613 | /** @brief Creates a typed reference to a subquery result column. */ | ||
| 614 | template<typename T> | ||
| 615 | 2 | sqlon::column<T> column(std::string name) const | |
| 616 | { | ||
| 617 |
2/2✓ Branch 1 taken 2 times.
✓ Branch 6 taken 2 times.
|
2 | return sqlon::column<T>{proxy_table(), std::move(name)}; |
| 618 | } | ||
| 619 | |||
| 620 | private: | ||
| 621 | static detail::relation_ptr make_node(const select_query& value, const std::string& alias); | ||
| 622 | |||
| 623 | SQLON_API table proxy_table() const; | ||
| 624 | |||
| 625 | std::string m_alias; | ||
| 626 | }; | ||
| 627 | |||
| 628 | /** @brief Creates an aliased derived-table relation. */ | ||
| 629 | SQLON_API subquery_relation alias(const select_query& value, std::string alias_name); | ||
| 630 | |||
| 631 | /** @brief Named reference to a common table expression. */ | ||
| 632 | class cte_relation final : public relation { | ||
| 633 | public: | ||
| 634 | /** @brief Creates a CTE relation reference. */ | ||
| 635 | SQLON_API explicit cte_relation(std::string name); | ||
| 636 | |||
| 637 | /** @brief Creates a typed reference to a CTE result column. */ | ||
| 638 | template<typename T> | ||
| 639 | 1 | sqlon::column<T> column(std::string name) const | |
| 640 | { | ||
| 641 |
2/2✓ Branch 1 taken 1 time.
✓ Branch 6 taken 1 time.
|
1 | return sqlon::column<T>{proxy_table(), std::move(name)}; |
| 642 | } | ||
| 643 | |||
| 644 | private: | ||
| 645 | static detail::relation_ptr make_node(const std::string& name); | ||
| 646 | |||
| 647 | SQLON_API table proxy_table() const; | ||
| 648 | |||
| 649 | std::string m_name; | ||
| 650 | }; | ||
| 651 | |||
| 652 | /** @brief Creates a relation reference to a CTE name. */ | ||
| 653 | SQLON_API cte_relation cte_reference(std::string name); | ||
| 654 | |||
| 655 | /** @brief Wraps a query as a typed scalar subquery expression. */ | ||
| 656 | template<typename T> | ||
| 657 | 3 | expression<T> scalar_subquery(const select_query& value) | |
| 658 | { | ||
| 659 |
2/2sqlon::expression<long> sqlon::scalar_subquery<long>(sqlon::select_query const&):
✓ Branch 1 taken 2 times.
sqlon::expression<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > sqlon::scalar_subquery<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(sqlon::select_query const&):
✓ Branch 1 taken 1 time.
|
3 | std::shared_ptr<detail::expression_node> node = std::make_shared<detail::expression_node>(); |
| 660 | 3 | node->kind = detail::expression_kind::subquery; | |
| 661 | 3 | node->subquery = detail::query_access::node(value); | |
| 662 | 6 | return detail::expression_access::make<T>(std::move(node)); | |
| 663 | 3 | } | |
| 664 | |||
| 665 | /** @brief Creates an EXISTS predicate for a query. */ | ||
| 666 | SQLON_API expression<bool> exists(const select_query& value); | ||
| 667 | |||
| 668 | /** @brief Builder for a typed searched CASE expression. */ | ||
| 669 | template<typename T> | ||
| 670 | class case_expression_builder final { | ||
| 671 | public: | ||
| 672 | /** @brief Creates a CASE builder with its first WHEN branch. */ | ||
| 673 | 2 | case_expression_builder(const expression<bool>& condition, const expression<T>& result) | |
| 674 |
3/5✓ Branch 1 taken 2 times.
✓ Branch 3 taken 4 times.
✓ Branch 4 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
|
8 | : m_operands{detail::expression_access::node(condition), detail::expression_access::node(result)} |
| 675 | 4 | {} | |
| 676 | |||
| 677 | /** @brief Appends a WHEN branch. */ | ||
| 678 | template<typename Value> | ||
| 679 | 2 | case_expression_builder when(const expression<bool>& condition, Value&& result) const | |
| 680 | { | ||
| 681 |
1/1✓ Branch 2 taken 2 times.
|
2 | auto result_expression = to_expression(std::forward<Value>(result)); |
| 682 | static_assert(detail::compatible_expression_types<T, typename decltype(result_expression)::value_type>, | ||
| 683 | "CASE branch results must have compatible types"); | ||
| 684 |
1/1✓ Branch 1 taken 2 times.
|
2 | case_expression_builder copy = *this; |
| 685 |
1/1✓ Branch 2 taken 2 times.
|
2 | copy.m_operands.push_back(detail::expression_access::node(condition)); |
| 686 |
1/1✓ Branch 2 taken 2 times.
|
2 | copy.m_operands.push_back(detail::expression_access::node(result_expression)); |
| 687 | 4 | return copy; | |
| 688 | 2 | } | |
| 689 | |||
| 690 | /** @brief Completes the CASE expression with an ELSE value. */ | ||
| 691 | template<typename Value> | ||
| 692 | 2 | expression<T> otherwise(Value&& result) const | |
| 693 | { | ||
| 694 |
1/1✓ Branch 2 taken 2 times.
|
2 | auto result_expression = to_expression(std::forward<Value>(result)); |
| 695 | static_assert(detail::compatible_expression_types<T, typename decltype(result_expression)::value_type>, | ||
| 696 | "CASE ELSE result must be compatible with its WHEN results"); | ||
| 697 |
1/1✓ Branch 1 taken 2 times.
|
2 | std::vector<detail::expression_ptr> operands = m_operands; |
| 698 |
1/1✓ Branch 2 taken 2 times.
|
2 | operands.push_back(detail::expression_access::node(result_expression)); |
| 699 | return detail::expression_access::make<T>( | ||
| 700 |
1/1✓ Branch 4 taken 2 times.
|
4 | detail::make_expression_node(detail::expression_kind::case_, {}, std::move(operands))); |
| 701 | 2 | } | |
| 702 | |||
| 703 | private: | ||
| 704 | std::vector<detail::expression_ptr> m_operands; | ||
| 705 | }; | ||
| 706 | |||
| 707 | /** @brief Starts a searched CASE expression with a WHEN branch. */ | ||
| 708 | template<typename Value> | ||
| 709 | 2 | auto case_when(const expression<bool>& condition, Value&& result) | |
| 710 | { | ||
| 711 |
1/1✓ Branch 2 taken 2 times.
|
2 | auto result_expression = to_expression(std::forward<Value>(result)); |
| 712 | using value_type = typename decltype(result_expression)::value_type; | ||
| 713 |
1/1✓ Branch 1 taken 2 times.
|
4 | return case_expression_builder<value_type>{condition, result_expression}; |
| 714 | 2 | } | |
| 715 | |||
| 716 | } // namespace sqlon | ||
| 717 | |||
| 718 | #endif // SQLON_QUERY_H | ||
| 719 |