SQLon test coverage


Directory: ./
Coverage: low: ≥ 0% medium: ≥ 75.0% high: ≥ 90.0%
Coverage Exec / Excl / Total
Lines: 99.3% 745 / 0 / 750
Functions: 99.4% 161 / 0 / 162
Branches: 89.0% 541 / 0 / 608

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/4
sqlon::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/3
sqlon::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/9
sqlon::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/27
sqlon::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/9
sqlon::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/9
sqlon::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/3
sqlon::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/4
sqlon::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/3
sqlon::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/2
sqlon::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/3
sqlon::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/2
sqlon::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/48
sqlon::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/126
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.
✓ 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/48
sqlon::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/2
sqlon::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/12
sqlon::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/2
sqlon::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/2
sqlon::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/12
sqlon::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/2
sqlon::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/3
sqlon::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/13
sqlon::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/3
sqlon::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/60
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 (&) [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/18
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 (&) [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/12
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 (&) [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/3
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> > >::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/5
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<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/3
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<>() 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/3
sqlon::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/3
sqlon::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/2
sqlon::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/6
sqlon::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/36
sqlon::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/6
sqlon::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/2
sqlon::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/12
sqlon::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/2
sqlon::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/2
sqlon::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/3
sqlon::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/2
sqlon::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/2
sqlon::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/3
sqlon::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/2
sqlon::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/2
sqlon::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