Skip to main content

drizzle_sqlite/
common.rs

1use drizzle_core::traits::SQLViewInfo;
2use drizzle_core::{SQLIndexInfo, SQLSchemaType, TableRef};
3
4/// The type of database object
5#[derive(Debug, Clone)]
6pub enum SQLiteSchemaType {
7    /// A regular table
8    Table(&'static TableRef),
9    /// A view
10    View(&'static dyn SQLViewInfo),
11    /// An index
12    Index(&'static dyn SQLIndexInfo),
13    /// A trigger
14    Trigger,
15}
16
17impl SQLSchemaType for SQLiteSchemaType {}
18
19//------------------------------------------------------------------------------
20// Number Type
21//------------------------------------------------------------------------------
22
23/// Numeric type that can be either an integer or a floating point value
24#[derive(Clone, Copy, Debug, PartialEq, PartialOrd)]
25pub enum Number {
26    /// Integer value
27    Integer(i64),
28    /// Floating point value
29    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
50// Note: Generic From implementation is removed to avoid conflicts.
51// The table macro will generate specific implementations using SQLiteEnumVisitor.
52
53// Re-export Join from core
54pub use drizzle_core::{Join, JoinType};
55
56//------------------------------------------------------------------------------
57// Tests
58//------------------------------------------------------------------------------
59
60#[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}