@@ -310,6 +310,48 @@ namespace sqlite_orm {
310
310
311
311
template <class T >
312
312
using is_insert_constraint = std::is_same<T, insert_constraint>;
313
+
314
+ /* *
315
+ * Specialize if a type is a DML statement expression.
316
+ */
317
+ template <class T , class SFINAE = void >
318
+ inline constexpr bool is_raw_dml_expression_v = false ;
319
+
320
+ template <class T >
321
+ using is_raw_dml_expression = polyfill::bool_constant<is_raw_dml_expression_v<T>>;
322
+
323
+ template <class DML >
324
+ inline constexpr bool is_raw_dml_expression_v<
325
+ DML,
326
+ std::enable_if_t <
327
+ polyfill::
328
+ disjunction_v<is_insert_raw<DML>, is_replace_raw<DML>, is_update_all<DML>, is_remove_all<DML>>>> =
329
+ true ;
330
+
331
+ template <class With >
332
+ inline constexpr bool is_raw_dml_expression_v<
333
+ With,
334
+ std::enable_if_t <polyfill::conjunction_v<is_with_clause<With>,
335
+ polyfill::disjunction<is_insert_raw<expression_type_t <With>>,
336
+ is_replace_raw<expression_type_t <With>>,
337
+ is_update_all<expression_type_t <With>>,
338
+ is_remove_all<expression_type_t <With>>>>>> =
339
+ true ;
340
+
341
+ /*
342
+ * Access the main select expression of a with clause or the passed in select expression.
343
+ */
344
+ template <class DML , satisfies<is_raw_dml_expression, DML> = true >
345
+ constexpr decltype (auto ) access_main_dml(const DML& dml) {
346
+ if constexpr (is_with_clause_v<DML>) {
347
+ return (dml.expression );
348
+ } else {
349
+ return dml;
350
+ }
351
+ }
352
+
353
+ template <class DML >
354
+ using main_dml_t = polyfill::remove_cvref_t <decltype (access_main_dml(std::declval<DML>()))>;
313
355
}
314
356
}
315
357
0 commit comments