Skip to main content

rusqlite/
limits.rs

1//! `feature = "limits"` Run-Time Limits
2
3use std::os::raw::c_int;
4
5use crate::ffi;
6pub use crate::ffi::Limit;
7
8use crate::Connection;
9
10impl Connection {
11    /// `feature = "limits"` Returns the current value of a limit.
12    #[inline]
13    pub fn limit(&self, limit: Limit) -> i32 {
14        let c = self.db.borrow();
15        unsafe { ffi::sqlite3_limit(c.db(), limit as c_int, -1) }
16    }
17
18    /// `feature = "limits"` Changes the limit to `new_val`, returning the prior
19    /// value of the limit.
20    #[inline]
21    pub fn set_limit(&self, limit: Limit, new_val: i32) -> i32 {
22        let c = self.db.borrow_mut();
23        unsafe { ffi::sqlite3_limit(c.db(), limit as c_int, new_val) }
24    }
25}
26
27#[cfg(test)]
28mod test {
29    use crate::ffi::Limit;
30    use crate::{Connection, Result};
31
32    #[test]
33    fn test_limit() -> Result<()> {
34        let db = Connection::open_in_memory()?;
35        db.set_limit(Limit::SQLITE_LIMIT_LENGTH, 1024);
36        assert_eq!(1024, db.limit(Limit::SQLITE_LIMIT_LENGTH));
37
38        db.set_limit(Limit::SQLITE_LIMIT_SQL_LENGTH, 1024);
39        assert_eq!(1024, db.limit(Limit::SQLITE_LIMIT_SQL_LENGTH));
40
41        db.set_limit(Limit::SQLITE_LIMIT_COLUMN, 64);
42        assert_eq!(64, db.limit(Limit::SQLITE_LIMIT_COLUMN));
43
44        db.set_limit(Limit::SQLITE_LIMIT_EXPR_DEPTH, 256);
45        assert_eq!(256, db.limit(Limit::SQLITE_LIMIT_EXPR_DEPTH));
46
47        db.set_limit(Limit::SQLITE_LIMIT_COMPOUND_SELECT, 32);
48        assert_eq!(32, db.limit(Limit::SQLITE_LIMIT_COMPOUND_SELECT));
49
50        db.set_limit(Limit::SQLITE_LIMIT_FUNCTION_ARG, 32);
51        assert_eq!(32, db.limit(Limit::SQLITE_LIMIT_FUNCTION_ARG));
52
53        db.set_limit(Limit::SQLITE_LIMIT_ATTACHED, 2);
54        assert_eq!(2, db.limit(Limit::SQLITE_LIMIT_ATTACHED));
55
56        db.set_limit(Limit::SQLITE_LIMIT_LIKE_PATTERN_LENGTH, 128);
57        assert_eq!(128, db.limit(Limit::SQLITE_LIMIT_LIKE_PATTERN_LENGTH));
58
59        db.set_limit(Limit::SQLITE_LIMIT_VARIABLE_NUMBER, 99);
60        assert_eq!(99, db.limit(Limit::SQLITE_LIMIT_VARIABLE_NUMBER));
61
62        // SQLITE_LIMIT_TRIGGER_DEPTH was added in SQLite 3.6.18.
63        if crate::version_number() >= 3_006_018 {
64            db.set_limit(Limit::SQLITE_LIMIT_TRIGGER_DEPTH, 32);
65            assert_eq!(32, db.limit(Limit::SQLITE_LIMIT_TRIGGER_DEPTH));
66        }
67
68        // SQLITE_LIMIT_WORKER_THREADS was added in SQLite 3.8.7.
69        if crate::version_number() >= 3_008_007 {
70            db.set_limit(Limit::SQLITE_LIMIT_WORKER_THREADS, 2);
71            assert_eq!(2, db.limit(Limit::SQLITE_LIMIT_WORKER_THREADS));
72        }
73        Ok(())
74    }
75}