3#include "../query/condition.hpp"
4#include "../query/date_concepts.hpp"
5#include "../query/function.hpp"
6#include "../query/meta.hpp"
7#include "../query/schema_adapter.hpp"
8#include "../query/value.hpp"
9#include "../schema/column.hpp"
20namespace type_checking {
39template <
typename T1,
typename T2>
41 std::same_as<std::remove_cvref_t<T1>, std::string_view> ||
42 std::same_as<std::remove_cvref_t<T1>,
const char*>) &&
43 (std::same_as<std::remove_cvref_t<T2>, std::string> ||
44 std::same_as<std::remove_cvref_t<T2>, std::string_view> ||
45 std::same_as<std::remove_cvref_t<T2>,
const char*> ||
46 std::convertible_to<std::remove_cvref_t<T2>, std::string> ||
47 std::convertible_to<std::remove_cvref_t<T2>, std::string_view>);
50template <
typename ColumnType,
typename ValueType>
53 (remove_optional<std::remove_cvref_t<ColumnType>>::is_optional &&
54 std::same_as<remove_optional_t<std::remove_cvref_t<ColumnType>>,
55 std::remove_cvref_t<ValueType>>) ||
57 (remove_optional<std::remove_cvref_t<ValueType>>::is_optional &&
58 std::same_as<std::remove_cvref_t<ColumnType>,
61 (remove_optional<std::remove_cvref_t<ColumnType>>::is_optional &&
64 (remove_optional<std::remove_cvref_t<ValueType>>::is_optional &&
67 (remove_optional<std::remove_cvref_t<ColumnType>>::is_optional &&
68 remove_optional<std::remove_cvref_t<ValueType>>::is_optional &&
69 (std::same_as<remove_optional_t<std::remove_cvref_t<ColumnType>>,
70 remove_optional_t<std::remove_cvref_t<ValueType>>> ||
72 remove_optional_t<std::remove_cvref_t<ValueType>>>));
75template <
typename ColumnType,
typename ValueType>
78 std::same_as<std::remove_cvref_t<ColumnType>, std::remove_cvref_t<ValueType>> ||
86 "Column type and value type are not compatible. "
87 "Column types must match the value types being compared. "
88 "For string columns, you can use std::string, std::string_view, or const char*. "
89 "For optional columns, you can compare with the underlying type or another optional. "
90 "For numeric columns, types must match exactly (use explicit casts if needed).";
98template <
typename TableT,
fixed_string Name,
typename T,
typename... Modifiers,
typename ValueType>
105template <
typename TableT,
fixed_string Name,
typename T,
typename... Modifiers,
typename ValueType>
112template <
typename TableT,
fixed_string Name,
typename T,
typename... Modifiers,
typename ValueType>
119template <
typename TableT,
fixed_string Name,
typename T,
typename... Modifiers,
typename ValueType>
126template <
typename TableT,
fixed_string Name,
typename T,
typename... Modifiers,
typename ValueType>
133template <
typename TableT,
fixed_string Name,
typename T,
typename... Modifiers,
typename ValueType>
140template <
typename TableT1,
fixed_string Name1,
typename T1,
typename... Modifiers1,
141 typename TableT2,
fixed_string Name2,
typename T2,
typename... Modifiers2>
145 "Column types in comparisons (especially JOIN conditions) must be compatible. "
146 "For example, you cannot join an int column with a string column. "
147 "Both columns must have the same type or be string-compatible types.");
150 return col1_expr == col2_expr;
154template <
typename TableT1,
fixed_string Name1,
typename T1,
typename... Modifiers1,
155 typename TableT2,
fixed_string Name2,
typename T2,
typename... Modifiers2>
159 "Column types in comparisons must be compatible. "
160 "Both columns must have the same type or be string-compatible types.");
163 return col1_expr != col2_expr;
167template <
typename TableT1,
fixed_string Name1,
typename T1,
typename... Modifiers1,
168 typename TableT2,
fixed_string Name2,
typename T2,
typename... Modifiers2>
172 "Column types in comparisons must be compatible. "
173 "Both columns must have the same type or be string-compatible types.");
176 return col1_expr > col2_expr;
180template <
typename TableT1,
fixed_string Name1,
typename T1,
typename... Modifiers1,
181 typename TableT2,
fixed_string Name2,
typename T2,
typename... Modifiers2>
185 "Column types in comparisons must be compatible. "
186 "Both columns must have the same type or be string-compatible types.");
189 return col1_expr < col2_expr;
193template <
typename TableT1,
fixed_string Name1,
typename T1,
typename... Modifiers1,
194 typename TableT2,
fixed_string Name2,
typename T2,
typename... Modifiers2>
198 "Column types in comparisons must be compatible. "
199 "Both columns must have the same type or be string-compatible types.");
202 return col1_expr >= col2_expr;
206template <
typename TableT1,
fixed_string Name1,
typename T1,
typename... Modifiers1,
207 typename TableT2,
fixed_string Name2,
typename T2,
typename... Modifiers2>
211 "Column types in comparisons must be compatible. "
212 "Both columns must have the same type or be string-compatible types.");
215 return col1_expr <= col2_expr;
221template <
typename TableT,
fixed_string Name,
typename... Modifiers>
232 return col_expr && expr;
239 return expr && col_expr;
246 return col_expr || expr;
253 return expr || col_expr;
259template <
typename ValueType,
typename TableT,
fixed_string Name,
typename T,
typename... Modifiers>
266template <
typename ValueType,
typename TableT,
fixed_string Name,
typename T,
typename... Modifiers>
273template <
typename ValueType,
typename TableT,
fixed_string Name,
typename T,
typename... Modifiers>
280template <
typename ValueType,
typename TableT,
fixed_string Name,
typename T,
typename... Modifiers>
287template <
typename ValueType,
typename TableT,
fixed_string Name,
typename T,
typename... Modifiers>
294template <
typename ValueType,
typename TableT,
fixed_string Name,
typename T,
typename... Modifiers>
303template <
typename TableT,
fixed_string Name,
typename... Modifiers,
typename Cond>
308 return col_expr && cond;
311 return col_expr && val_expr;
316template <
typename TableT,
fixed_string Name,
typename... Modifiers,
typename Cond>
321 return col_expr || cond;
324 return col_expr || val_expr;
329template <
typename Cond,
typename TableT,
fixed_string Name,
typename... Modifiers>
334 return cond && col_expr;
337 return val_expr && col_expr;
342template <
typename Cond,
typename TableT,
fixed_string Name,
typename... Modifiers>
347 return cond || col_expr;
350 return val_expr || col_expr;
362template <
typename T,
template <
typename...>
class Template>
365template <
template <
typename...>
class Template,
typename... Args>
368template <
typename T,
template <
typename...>
class Template>
378 return col_expr ==
value;
387 return col_expr !=
value;
396 return col_expr >
value;
405 return col_expr <
value;
414 return col_expr >=
value;
423 return col_expr <=
value;
432 requires std::is_arithmetic_v<std::remove_cvref_t<LiteralT>> &&
433 (!std::is_same_v<LiteralT, bool>) &&
435auto operator==(const schema::
column<TableT, Name, T, Modifiers...>& col, LiteralT&& literal) {
437 auto val_expr =
val(std::forward<LiteralT>(literal));
438 return col_expr == val_expr;
444 requires std::is_arithmetic_v<std::remove_cvref_t<LiteralT>> &&
445 (!std::is_same_v<LiteralT, bool>) &&
447auto operator!=(const schema::
column<TableT, Name, T, Modifiers...>& col, LiteralT&& literal) {
449 auto val_expr =
val(std::forward<LiteralT>(literal));
450 return col_expr != val_expr;
456 requires std::is_arithmetic_v<std::remove_cvref_t<LiteralT>> &&
457 (!std::is_same_v<LiteralT, bool>) &&
459auto operator>(const schema::
column<TableT, Name, T, Modifiers...>& col, LiteralT&& literal) {
461 auto val_expr =
val(std::forward<LiteralT>(literal));
462 return col_expr > val_expr;
468 requires std::is_arithmetic_v<std::remove_cvref_t<LiteralT>> &&
469 (!std::is_same_v<LiteralT, bool>) &&
471auto operator<(const schema::
column<TableT, Name, T, Modifiers...>& col, LiteralT&& literal) {
473 auto val_expr =
val(std::forward<LiteralT>(literal));
474 return col_expr < val_expr;
480 requires std::is_arithmetic_v<std::remove_cvref_t<LiteralT>> &&
481 (!std::is_same_v<LiteralT, bool>) &&
483auto operator>=(const schema::
column<TableT, Name, T, Modifiers...>& col, LiteralT&& literal) {
485 auto val_expr =
val(std::forward<LiteralT>(literal));
486 return col_expr >= val_expr;
492 requires std::is_arithmetic_v<std::remove_cvref_t<LiteralT>> &&
493 (!std::is_same_v<LiteralT, bool>) &&
495auto operator<=(const schema::
column<TableT, Name, T, Modifiers...>& col, LiteralT&& literal) {
497 auto val_expr =
val(std::forward<LiteralT>(literal));
498 return col_expr <= val_expr;
505 typename... Modifiers>
506 requires std::is_arithmetic_v<std::remove_cvref_t<LiteralT>> &&
507 (!std::is_same_v<LiteralT, bool>) &&
509auto operator==(LiteralT&& literal, const schema::
column<TableT, Name, T, Modifiers...>& col) {
510 return col == std::forward<LiteralT>(literal);
515 typename... Modifiers>
516 requires std::is_arithmetic_v<std::remove_cvref_t<LiteralT>> &&
517 (!std::is_same_v<LiteralT, bool>) &&
519auto operator!=(LiteralT&& literal, const schema::
column<TableT, Name, T, Modifiers...>& col) {
520 return col != std::forward<LiteralT>(literal);
525 typename... Modifiers>
526 requires std::is_arithmetic_v<std::remove_cvref_t<LiteralT>> &&
527 (!std::is_same_v<LiteralT, bool>) &&
529auto operator>(LiteralT&& literal, const schema::
column<TableT, Name, T, Modifiers...>& col) {
530 return col < std::forward<LiteralT>(literal);
535 typename... Modifiers>
536 requires std::is_arithmetic_v<std::remove_cvref_t<LiteralT>> &&
537 (!std::is_same_v<LiteralT, bool>) &&
539auto operator<(LiteralT&& literal, const schema::
column<TableT, Name, T, Modifiers...>& col) {
540 return col > std::forward<LiteralT>(literal);
545 typename... Modifiers>
546 requires std::is_arithmetic_v<std::remove_cvref_t<LiteralT>> &&
547 (!std::is_same_v<LiteralT, bool>) &&
549auto operator>=(LiteralT&& literal, const schema::
column<TableT, Name, T, Modifiers...>& col) {
550 return col <= std::forward<LiteralT>(literal);
555 typename... Modifiers>
556 requires std::is_arithmetic_v<std::remove_cvref_t<LiteralT>> &&
557 (!std::is_same_v<LiteralT, bool>) &&
559auto operator<=(LiteralT&& literal, const schema::
column<TableT, Name, T, Modifiers...>& col) {
560 return col >= std::forward<LiteralT>(literal);
570 auto val_expr =
val(str);
571 return col_expr == val_expr;
578 auto val_expr =
val(str);
579 return col_expr != val_expr;
599 return like(col_expr, std::move(pattern));
631 auto col_expr =
to_expr(condition);
632 return when(col_expr, result);
637 typename... Modifiers>
639 auto result_expr =
to_expr(result);
640 return when(condition, result_expr);
647 auto result_expr =
to_expr(result);
648 return else_(result_expr);
656 return select_expr(col_expr, std::forward<Args>(args)...);
662template <
typename Column,
typename LiteralT>
663 requires std::is_arithmetic_v<std::remove_cvref_t<LiteralT>> &&
664 (!std::is_same_v<LiteralT, bool>) &&
667 return col ==
val(std::forward<LiteralT>(literal));
670template <
typename Column,
typename LiteralT>
671 requires std::is_arithmetic_v<std::remove_cvref_t<LiteralT>> &&
672 (!std::is_same_v<LiteralT, bool>) &&
675 return col !=
val(std::forward<LiteralT>(literal));
678template <
typename Column,
typename LiteralT>
679 requires std::is_arithmetic_v<std::remove_cvref_t<LiteralT>> &&
680 (!std::is_same_v<LiteralT, bool>) &&
683 return col >
val(std::forward<LiteralT>(literal));
686template <
typename Column,
typename LiteralT>
687 requires std::is_arithmetic_v<std::remove_cvref_t<LiteralT>> &&
688 (!std::is_same_v<LiteralT, bool>) &&
691 return col < val(std::forward<LiteralT>(literal));
694template <
typename Column,
typename LiteralT>
695 requires std::is_arithmetic_v<std::remove_cvref_t<LiteralT>> &&
696 (!std::is_same_v<LiteralT, bool>) &&
699 return col >=
val(std::forward<LiteralT>(literal));
702template <
typename Column,
typename LiteralT>
703 requires std::is_arithmetic_v<std::remove_cvref_t<LiteralT>> &&
704 (!std::is_same_v<LiteralT, bool>) &&
707 return col <= val(std::forward<LiteralT>(literal));
711template <
typename LiteralT,
typename Column>
712 requires std::is_arithmetic_v<std::remove_cvref_t<LiteralT>> &&
713 (!std::is_same_v<LiteralT, bool>) &&
716 return col == std::forward<LiteralT>(literal);
719template <
typename LiteralT,
typename Column>
720 requires std::is_arithmetic_v<std::remove_cvref_t<LiteralT>> &&
721 (!std::is_same_v<LiteralT, bool>) &&
724 return col != std::forward<LiteralT>(literal);
727template <
typename LiteralT,
typename Column>
728 requires std::is_arithmetic_v<std::remove_cvref_t<LiteralT>> &&
729 (!std::is_same_v<LiteralT, bool>) &&
732 return col < std::forward<LiteralT>(literal);
735template <
typename LiteralT,
typename Column>
736 requires std::is_arithmetic_v<std::remove_cvref_t<LiteralT>> &&
737 (!std::is_same_v<LiteralT, bool>) &&
740 return col > std::forward<LiteralT>(literal);
743template <
typename LiteralT,
typename Column>
744 requires std::is_arithmetic_v<std::remove_cvref_t<LiteralT>> &&
745 (!std::is_same_v<LiteralT, bool>) &&
748 return col <= std::forward<LiteralT>(literal);
751template <
typename LiteralT,
typename Column>
752 requires std::is_arithmetic_v<std::remove_cvref_t<LiteralT>> &&
753 (!std::is_same_v<LiteralT, bool>) &&
756 return col >= std::forward<LiteralT>(literal);
760template <
typename Column>
762 return col ==
val(str);
765template <
typename Column>
767 return col !=
val(str);
770template <
typename Column>
775template <
typename Column>
785template <SqlExpr Expr,
typename LiteralT>
786 requires std::is_arithmetic_v<std::remove_cvref_t<LiteralT>> ||
787 std::is_convertible_v<std::remove_cvref_t<LiteralT>, std::string>
789 auto val_expr =
val(std::forward<LiteralT>(literal));
794template <SqlExpr Expr,
typename LiteralT>
795 requires std::is_arithmetic_v<std::remove_cvref_t<LiteralT>> ||
796 std::is_convertible_v<std::remove_cvref_t<LiteralT>, std::string>
798 return col == std::forward<LiteralT>(literal);
802template <SqlExpr Expr>
804 auto str_val =
val(str);
808template <SqlExpr Expr>
814template <SqlExpr Expr,
typename LiteralT>
815 requires std::is_arithmetic_v<std::remove_cvref_t<LiteralT>> ||
816 std::is_convertible_v<std::remove_cvref_t<LiteralT>, std::string>
818 auto val_expr =
val(std::forward<LiteralT>(literal));
823template <SqlExpr Expr,
typename LiteralT>
824 requires std::is_arithmetic_v<std::remove_cvref_t<LiteralT>> ||
825 std::is_convertible_v<std::remove_cvref_t<LiteralT>, std::string>
827 return col != std::forward<LiteralT>(literal);
831template <SqlExpr Expr>
833 auto str_val =
val(str);
837template <SqlExpr Expr>
843template <SqlExpr Expr,
typename LiteralT>
844 requires std::is_arithmetic_v<std::remove_cvref_t<LiteralT>> ||
845 std::is_convertible_v<std::remove_cvref_t<LiteralT>, std::string>
847 auto val_expr =
val(std::forward<LiteralT>(literal));
851template <SqlExpr Expr,
typename LiteralT>
852 requires std::is_arithmetic_v<std::remove_cvref_t<LiteralT>> ||
853 std::is_convertible_v<std::remove_cvref_t<LiteralT>, std::string>
855 auto val_expr =
val(std::forward<LiteralT>(literal));
859template <SqlExpr Expr,
typename LiteralT>
860 requires std::is_arithmetic_v<std::remove_cvref_t<LiteralT>> ||
861 std::is_convertible_v<std::remove_cvref_t<LiteralT>, std::string>
863 auto val_expr =
val(std::forward<LiteralT>(literal));
867template <SqlExpr Expr,
typename LiteralT>
868 requires std::is_arithmetic_v<std::remove_cvref_t<LiteralT>> ||
869 std::is_convertible_v<std::remove_cvref_t<LiteralT>, std::string>
871 auto val_expr =
val(std::forward<LiteralT>(literal));
876template <SqlExpr Expr,
typename LiteralT>
877 requires std::is_arithmetic_v<std::remove_cvref_t<LiteralT>> ||
878 std::is_convertible_v<std::remove_cvref_t<LiteralT>, std::string>
880 return col < std::forward<LiteralT>(literal);
883template <SqlExpr Expr,
typename LiteralT>
884 requires std::is_arithmetic_v<std::remove_cvref_t<LiteralT>> ||
885 std::is_convertible_v<std::remove_cvref_t<LiteralT>, std::string>
887 return col > std::forward<LiteralT>(literal);
890template <SqlExpr Expr,
typename LiteralT>
891 requires std::is_arithmetic_v<std::remove_cvref_t<LiteralT>> ||
892 std::is_convertible_v<std::remove_cvref_t<LiteralT>, std::string>
894 return col <= std::forward<LiteralT>(literal);
897template <SqlExpr Expr,
typename LiteralT>
898 requires std::is_arithmetic_v<std::remove_cvref_t<LiteralT>> ||
899 std::is_convertible_v<std::remove_cvref_t<LiteralT>, std::string>
901 return col >= std::forward<LiteralT>(literal);
907template <SqlExpr Expr,
typename LiteralT>
908 requires std::is_arithmetic_v<std::remove_cvref_t<LiteralT>> ||
909 std::is_convertible_v<std::remove_cvref_t<LiteralT>, std::string>
911 auto val_expr =
val(std::forward<LiteralT>(literal));
916template <SqlExpr Expr,
typename LiteralT>
917 requires std::is_arithmetic_v<std::remove_cvref_t<LiteralT>> ||
918 std::is_convertible_v<std::remove_cvref_t<LiteralT>, std::string>
920 return func == std::forward<LiteralT>(literal);
924template <SqlExpr Expr>
926 auto str_val =
val(str);
930template <SqlExpr Expr>
936template <SqlExpr Expr,
typename LiteralT>
937 requires std::is_arithmetic_v<std::remove_cvref_t<LiteralT>> ||
938 std::is_convertible_v<std::remove_cvref_t<LiteralT>, std::string>
940 auto val_expr =
val(std::forward<LiteralT>(literal));
945template <SqlExpr Expr,
typename LiteralT>
946 requires std::is_arithmetic_v<std::remove_cvref_t<LiteralT>> ||
947 std::is_convertible_v<std::remove_cvref_t<LiteralT>, std::string>
949 return func != std::forward<LiteralT>(literal);
953template <SqlExpr Expr>
955 auto str_val =
val(str);
959template <SqlExpr Expr>
965template <SqlExpr Expr,
typename LiteralT>
966 requires std::is_arithmetic_v<std::remove_cvref_t<LiteralT>> ||
967 std::is_convertible_v<std::remove_cvref_t<LiteralT>, std::string>
969 auto val_expr =
val(std::forward<LiteralT>(literal));
973template <SqlExpr Expr,
typename LiteralT>
974 requires std::is_arithmetic_v<std::remove_cvref_t<LiteralT>> ||
975 std::is_convertible_v<std::remove_cvref_t<LiteralT>, std::string>
977 auto val_expr =
val(std::forward<LiteralT>(literal));
981template <SqlExpr Expr,
typename LiteralT>
982 requires std::is_arithmetic_v<std::remove_cvref_t<LiteralT>> ||
983 std::is_convertible_v<std::remove_cvref_t<LiteralT>, std::string>
985 auto val_expr =
val(std::forward<LiteralT>(literal));
989template <SqlExpr Expr,
typename LiteralT>
990 requires std::is_arithmetic_v<std::remove_cvref_t<LiteralT>> ||
991 std::is_convertible_v<std::remove_cvref_t<LiteralT>, std::string>
993 auto val_expr =
val(std::forward<LiteralT>(literal));
998template <SqlExpr Expr,
typename LiteralT>
999 requires std::is_arithmetic_v<std::remove_cvref_t<LiteralT>> ||
1000 std::is_convertible_v<std::remove_cvref_t<LiteralT>, std::string>
1002 return func < std::forward<LiteralT>(literal);
1005template <SqlExpr Expr,
typename LiteralT>
1006 requires std::is_arithmetic_v<std::remove_cvref_t<LiteralT>> ||
1007 std::is_convertible_v<std::remove_cvref_t<LiteralT>, std::string>
1009 return func > std::forward<LiteralT>(literal);
1012template <SqlExpr Expr,
typename LiteralT>
1013 requires std::is_arithmetic_v<std::remove_cvref_t<LiteralT>> ||
1014 std::is_convertible_v<std::remove_cvref_t<LiteralT>, std::string>
1016 return func <= std::forward<LiteralT>(literal);
1019template <SqlExpr Expr,
typename LiteralT>
1020 requires std::is_arithmetic_v<std::remove_cvref_t<LiteralT>> ||
1021 std::is_convertible_v<std::remove_cvref_t<LiteralT>, std::string>
1023 return func >= std::forward<LiteralT>(literal);
1029template <SqlExpr First, SqlExpr Second, SqlExpr... Rest,
typename LiteralT>
1030 requires std::is_arithmetic_v<std::remove_cvref_t<LiteralT>> ||
1031 std::is_convertible_v<std::remove_cvref_t<LiteralT>, std::string>
1033 auto val_expr =
val(std::forward<LiteralT>(literal));
1039template <SqlExpr First, SqlExpr Second, SqlExpr... Rest,
typename LiteralT>
1040 requires std::is_arithmetic_v<std::remove_cvref_t<LiteralT>> ||
1041 std::is_convertible_v<std::remove_cvref_t<LiteralT>, std::string>
1043 return coalesce == std::forward<LiteralT>(literal);
1047template <SqlExpr First, SqlExpr Second, SqlExpr... Rest>
1049 auto str_val =
val(str);
1054template <SqlExpr First, SqlExpr Second, SqlExpr... Rest>
1060template <SqlExpr First, SqlExpr Second, SqlExpr... Rest,
typename LiteralT>
1061 requires std::is_arithmetic_v<std::remove_cvref_t<LiteralT>> ||
1062 std::is_convertible_v<std::remove_cvref_t<LiteralT>, std::string>
1064 auto val_expr =
val(std::forward<LiteralT>(literal));
1070template <SqlExpr First, SqlExpr Second, SqlExpr... Rest,
typename LiteralT>
1071 requires std::is_arithmetic_v<std::remove_cvref_t<LiteralT>> ||
1072 std::is_convertible_v<std::remove_cvref_t<LiteralT>, std::string>
1074 return coalesce != std::forward<LiteralT>(literal);
1078template <SqlExpr First, SqlExpr Second, SqlExpr... Rest>
1080 auto str_val =
val(str);
1085template <SqlExpr First, SqlExpr Second, SqlExpr... Rest>
1091template <
typename LiteralT>
1092 requires std::is_arithmetic_v<std::remove_cvref_t<LiteralT>> ||
1093 std::is_convertible_v<std::remove_cvref_t<LiteralT>, std::string>
1095 auto val_expr =
val(std::forward<LiteralT>(literal));
1099template <
typename LiteralT>
1100 requires std::is_arithmetic_v<std::remove_cvref_t<LiteralT>> ||
1101 std::is_convertible_v<std::remove_cvref_t<LiteralT>, std::string>
1103 return expr == std::forward<LiteralT>(literal);
1106template <
typename LiteralT>
1107 requires std::is_arithmetic_v<std::remove_cvref_t<LiteralT>> ||
1108 std::is_convertible_v<std::remove_cvref_t<LiteralT>, std::string>
1110 auto val_expr =
val(std::forward<LiteralT>(literal));
1114template <
typename LiteralT>
1115 requires std::is_arithmetic_v<std::remove_cvref_t<LiteralT>> ||
1116 std::is_convertible_v<std::remove_cvref_t<LiteralT>, std::string>
1118 return expr != std::forward<LiteralT>(literal);
1121template <
typename LiteralT>
1122 requires std::is_arithmetic_v<std::remove_cvref_t<LiteralT>> ||
1123 std::is_convertible_v<std::remove_cvref_t<LiteralT>, std::string>
1125 auto val_expr =
val(std::forward<LiteralT>(literal));
1129template <
typename LiteralT>
1130 requires std::is_arithmetic_v<std::remove_cvref_t<LiteralT>> ||
1131 std::is_convertible_v<std::remove_cvref_t<LiteralT>, std::string>
1133 auto val_expr =
val(std::forward<LiteralT>(literal));
1137template <
typename LiteralT>
1138 requires std::is_arithmetic_v<std::remove_cvref_t<LiteralT>> ||
1139 std::is_convertible_v<std::remove_cvref_t<LiteralT>, std::string>
1141 auto val_expr =
val(std::forward<LiteralT>(literal));
1145template <
typename LiteralT>
1146 requires std::is_arithmetic_v<std::remove_cvref_t<LiteralT>> ||
1147 std::is_convertible_v<std::remove_cvref_t<LiteralT>, std::string>
1149 auto val_expr =
val(std::forward<LiteralT>(literal));
1153template <
typename LiteralT>
1154 requires std::is_arithmetic_v<std::remove_cvref_t<LiteralT>> ||
1155 std::is_convertible_v<std::remove_cvref_t<LiteralT>, std::string>
1157 auto val_expr =
val(std::forward<LiteralT>(literal));
1161template <
typename LiteralT>
1162 requires std::is_arithmetic_v<std::remove_cvref_t<LiteralT>> ||
1163 std::is_convertible_v<std::remove_cvref_t<LiteralT>, std::string>
1165 auto val_expr =
val(std::forward<LiteralT>(literal));
1169template <
typename LiteralT>
1170 requires std::is_arithmetic_v<std::remove_cvref_t<LiteralT>> ||
1171 std::is_convertible_v<std::remove_cvref_t<LiteralT>, std::string>
1173 auto val_expr =
val(std::forward<LiteralT>(literal));
1177template <
typename LiteralT>
1178 requires std::is_arithmetic_v<std::remove_cvref_t<LiteralT>> ||
1179 std::is_convertible_v<std::remove_cvref_t<LiteralT>, std::string>
1181 auto val_expr =
val(std::forward<LiteralT>(literal));
1186class CurrentDateTimeExpr;
1187template <SqlExpr Expr>
1188class UnaryDateFunctionExpr;
1189template <SqlExpr Left, SqlExpr Right>
1190class BinaryDateFunctionExpr;
1191template <SqlExpr DateExpr, SqlExpr IntervalExpr>
1192class DateArithmeticExpr;
1196 requires date_checking::DateTimeType<T>
1204 requires date_checking::DateTimeType<T>
1212 requires date_checking::DateTimeType<T>
1220 requires date_checking::DateTimeType<T>
1228 requires date_checking::DateTimeType<T>
1236 requires date_checking::DateTimeType<T>
1245 typename... Modifiers>
1246 requires date_checking::DateTimeType<T>
1254 typename... Modifiers>
1255 requires date_checking::DateTimeType<T>
1263 typename... Modifiers>
1264 requires date_checking::DateTimeType<T>
1272 typename... Modifiers>
1273 requires date_checking::DateTimeType<T>
1281 typename... Modifiers>
1282 requires date_checking::DateTimeType<T>
1290 typename... Modifiers>
1291 requires date_checking::DateTimeType<T>
1300 typename... Modifiers>
1301 requires date_checking::DateTimeType<T>
1310 typename... Modifiers>
1311 requires date_checking::DateTimeType<T>
1320 typename... Modifiers>
1321 requires date_checking::DateTimeType<T>
1330 typename... Modifiers>
1331 requires date_checking::DateTimeType<T>
1340 typename... Modifiers>
1341 requires date_checking::DateTimeType<T>
1350 typename... Modifiers>
1351 requires date_checking::DateTimeType<T>
1361 typename T,
typename... Modifiers>
1362 requires date_checking::DateTimeType<T>
1371 typename T,
typename... Modifiers>
1372 requires date_checking::DateTimeType<T>
1381 typename T,
typename... Modifiers>
1382 requires date_checking::DateTimeType<T>
1387 expr,
">=", col_expr);
1391 typename T,
typename... Modifiers>
1392 requires date_checking::DateTimeType<T>
1397 expr,
"<=", col_expr);
1401 typename T,
typename... Modifiers>
1402 requires date_checking::DateTimeType<T>
1411 typename T,
typename... Modifiers>
1412 requires date_checking::DateTimeType<T>
1417 expr,
"!=", col_expr);
1428template <
typename TableT, fixed_string Name,
typename T,
typename... Modifiers>
1429template <
typename PatternType>
1430 requires std::convertible_to<PatternType, std::string>
1432 return query::like(*
this, std::string(std::forward<PatternType>(pattern)));
1435template <
typename TableT,
fixed_string Name,
typename T,
typename... Modifiers>
1440template <
typename TableT,
fixed_string Name,
typename T,
typename... Modifiers>
1446template <
typename TableT,
fixed_string Name,
typename T,
typename... Modifiers>
1447template <
typename PatternType>
1448 requires std::convertible_to<PatternType, std::string>
1450 return query::like(*
this, std::string(std::forward<PatternType>(pattern)));
1453template <
typename TableT,
fixed_string Name,
typename T,
typename... Modifiers>
1458template <
typename TableT,
fixed_string Name,
typename T,
typename... Modifiers>
Generic binary condition expression.
Binary date function expression (e.g., DATE_DIFF)
Expression representing COUNT(*) in SQL.
Current date/time functions (no arguments)
Date addition/subtraction expression.
Base class for SQL function expressions.
Adapter to convert schema::column to a ColumnRef This allows direct use of schema columns in query ex...
Unary date function expression with unit (e.g., EXTRACT)
Represents a literal value in a SQL query.
Represents a column in a database table.
auto like(PatternType &&pattern) const
Create a LIKE condition for this column.
auto is_null() const
Create an IS NULL condition for this column.
auto is_not_null() const
Create an IS NOT NULL condition for this column.
Concept for SQL expression components.
Check if optional types are compatible with each other or their underlying types.
Check if two types are string-compatible.
Check if column type is compatible with value type.
auto like(Expr expr, std::string pattern)
Create a LIKE condition.
auto operator<=(Left left, Right right)
Less than or equal condition (col <= value)
auto operator>(Left left, Right right)
Greater than condition (col > value)
auto select_expr(const schema::column< TableT, Name, T, Modifiers... > &col, Args &&... args)
auto operator<(Left left, Right right)
Less than condition (col < value)
auto operator>=(Left left, Right right)
Greater than or equal condition (col >= value)
auto to_expr(const C &col, std::string_view table_name="")
Helper to wrap a schema column in a SQL expression.
auto is_null(Expr expr)
Create an IS NULL condition.
auto else_(CaseBuilder &builder, const char *value)
auto between(Expr expr, std::string lower, std::string upper)
Create a BETWEEN condition.
auto value(T val)
Create a value expression.
auto coalesce(First first, Second second, Rest... rest)
Create a COALESCE expression.
auto lower(Expr expr)
LOWER string function.
auto operator==(Left left, Right right)
Equality condition (col = value)
auto val(const char *str)
Helper to create a value expression from a string literal.
auto is_not_null(Expr expr)
Create an IS NOT NULL condition.
auto upper(Expr expr)
UPPER string function.
auto when(CaseBuilder &builder, const ConditionExpr auto &condition, const char *value)
auto operator!=(Left left, Right right)
Inequality condition (col != value)
auto operator>(const column< TableT, Name, T, Modifiers... > &col, const ValueType &value)
auto operator<(const column< TableT, Name, T, Modifiers... > &col, const ValueType &value)
auto operator>=(const column< TableT, Name, T, Modifiers... > &col, const ValueType &value)
auto operator&&(const column< TableT, Name, bool, Modifiers... > &col, const Expr &expr)
auto operator<=(const column< TableT, Name, T, Modifiers... > &col, const ValueType &value)
auto operator!=(const column< TableT, Name, T, Modifiers... > &col, const ValueType &value)
auto operator!(const column< TableT, Name, bool, Modifiers... > &col)
auto operator==(const column< TableT, Name, T, Modifiers... > &col, const ValueType &value)
auto operator||(const column< TableT, Name, bool, Modifiers... > &col, const Expr &expr)
constexpr std::string_view type_error_message
Constant error message for type mismatches.
typename remove_optional< T >::type remove_optional_t
Compile-time string type that can be used as template non-type parameter in C++20.
Helper to extract the underlying type from optional.
static constexpr bool is_optional