1use drizzle_core::traits::SQLViewInfo;
2use drizzle_core::{SQLIndexInfo, SQLSchemaType, TableRef};
3
4#[derive(Debug, Clone)]
6pub enum SQLiteSchemaType {
7 Table(&'static TableRef),
9 View(&'static dyn SQLViewInfo),
11 Index(&'static dyn SQLIndexInfo),
13 Trigger,
15}
16
17impl SQLSchemaType for SQLiteSchemaType {}
18
19#[derive(Clone, Copy, Debug, PartialEq, PartialOrd)]
25pub enum Number {
26 Integer(i64),
28 Real(f64),
30}
31
32impl Default for Number {
33 fn default() -> Self {
34 Self::Integer(Default::default())
35 }
36}
37
38impl From<i64> for Number {
39 fn from(value: i64) -> Self {
40 Self::Integer(value)
41 }
42}
43
44impl From<f64> for Number {
45 fn from(value: f64) -> Self {
46 Self::Real(value)
47 }
48}
49
50pub use drizzle_core::{Join, JoinType};
55
56#[cfg(any(feature = "turso", feature = "libsql", feature = "rusqlite"))]
61#[cfg(test)]
62mod tests {
63 use crate::common::{Join, JoinType, Number};
64 use crate::values::SQLiteValue;
65 use std::borrow::Cow;
66
67 #[test]
68 fn test_into_sqlite_value_impls() {
69 assert_eq!(
70 SQLiteValue::from("hello"),
71 SQLiteValue::Text(Cow::Borrowed("hello"))
72 );
73 assert_eq!(
74 SQLiteValue::from(String::from("world")),
75 SQLiteValue::Text(Cow::Owned("world".to_string()))
76 );
77 assert_eq!(SQLiteValue::from(42i64), SQLiteValue::Integer(42));
78 assert_eq!(SQLiteValue::from(123i32), SQLiteValue::Integer(123));
79 assert_eq!(SQLiteValue::from(2.5f64), SQLiteValue::Real(2.5));
80 assert_eq!(SQLiteValue::from(true), SQLiteValue::Integer(1));
81 assert_eq!(SQLiteValue::from(false), SQLiteValue::Integer(0));
82 let blob_vec: Vec<u8> = vec![1, 2, 3];
83 assert_eq!(
84 SQLiteValue::from(blob_vec.clone()),
85 SQLiteValue::Blob(Cow::Owned(blob_vec.clone()))
86 );
87 let blob_slice: &[u8] = &[4, 5, 6];
88 assert_eq!(
89 SQLiteValue::from(blob_slice),
90 SQLiteValue::Blob(Cow::Borrowed(blob_slice))
91 );
92 assert_eq!(SQLiteValue::from(Option::<String>::None), SQLiteValue::Null);
93 assert_eq!(
94 SQLiteValue::from(Some("optional")),
95 SQLiteValue::Text(Cow::Borrowed("optional"))
96 );
97 }
98
99 #[test]
100 fn test_number_enum() {
101 let int_num = Number::Integer(42);
102 let real_num = Number::Real(2.5);
103
104 assert_eq!(int_num, Number::from(42i64));
105 assert_eq!(real_num, Number::from(2.5f64));
106 assert_eq!(Number::default(), Number::Integer(0));
107 }
108
109 #[test]
110 fn test_join_type_and_join() {
111 let join = Join::new().inner().natural();
112 assert_eq!(join.join_type, JoinType::Inner);
113 assert!(join.natural);
114 assert!(!join.outer);
115
116 let outer_join = Join::new().left().outer();
117 assert_eq!(outer_join.join_type, JoinType::Left);
118 assert!(outer_join.outer);
119
120 let cross_join = Join::new().cross();
121 assert_eq!(cross_join.join_type, JoinType::Cross);
122 }
123
124 #[test]
125 fn test_join_to_sql() {
126 use drizzle_core::{SQL, ToSQL};
127
128 let inner_join = Join::new().inner();
129 let sql: SQL<SQLiteValue> = inner_join.to_sql();
130 assert_eq!(sql.sql(), "INNER JOIN");
131
132 let natural_left_outer = Join::new().natural().left().outer();
133 let sql: SQL<SQLiteValue> = natural_left_outer.to_sql();
134 assert_eq!(sql.sql(), "NATURAL LEFT OUTER JOIN");
135
136 let cross_join = Join::new().cross();
137 let sql: SQL<SQLiteValue> = cross_join.to_sql();
138 assert_eq!(sql.sql(), "CROSS JOIN");
139 }
140}