1#[test]
6fn sqlite_test() {
7 let connection = sqlite::open(":memory:").unwrap();
8
9 let sql = "
10 CREATE TABLE users (Id INTEGER PRIMARY KEY, name TEXT, age INTEGER);
11 INSERT INTO users(name,age) VALUES ('Alice', 1000);";
12 connection.execute(sql).unwrap();
13
14 let sql = "INSERT INTO users(name,age) SELECT name, age FROM users";
15
16 for _i in 0..13 {
18 connection.execute(sql).unwrap();
19 }
20
21 let mut results = Vec::new();
22 for _outer in 0..100 {
23 let start = std::time::Instant::now();
24 for _i in 0..10 {
25 let sql = "SELECT SUM(age) FROM users";
26 connection.execute(sql).unwrap();
27 }
28 results.push(start.elapsed().as_micros() as u64);
29 }
30 print_results("sqlite_test", results);
31}
32
33#[test]
34fn rustdb_test() {
35 use crate::*;
36
37 let stg = MemFile::new();
39
40 let mut bmap = BuiltinMap::default();
41 standard_builtins(&mut bmap);
42 let bmap = Arc::new(bmap);
43
44 let spd = SharedPagedData::new(stg);
45 let wapd = AccessPagedData::new_writer(spd.clone());
46 let db = Database::new(wapd, "", bmap.clone());
47
48 let mut tr = GenTransaction::default();
49
50 let sql = "
51 CREATE SCHEMA test GO
52 CREATE TABLE test.users (name string, age int) GO";
53
54 db.run(&sql, &mut tr);
55
56 let sql = "DECLARE @i int SET @i = 8192
57 WHILE @i > 0
58 BEGIN
59 INSERT INTO test.users(name,age) VALUES ('Alice', 1000)
60 SET @i -= 1
61 END";
62
63 db.run(&sql, &mut tr);
64
65 let mut results = Vec::new();
66 for _outer in 0..100 {
67 let start = std::time::Instant::now();
68
69 for _i in 0..10 {
70 let sql =
71 "DECLARE @total int FOR @total += age FROM test.users BEGIN END SELECT ''|@total";
72 let mut tr = GenTransaction::default();
73 db.run(&sql, &mut tr);
74 assert_eq!(tr.rp.output, b"8192000");
75 }
76
77 results.push(start.elapsed().as_micros() as u64);
78 }
79 print_results("rustdb_test", results);
80}
81
82#[test]
83fn rustdb_direct_test() {
84 use crate::*;
85
86 let stg = MemFile::new();
88
89 let mut bmap = BuiltinMap::default();
90 standard_builtins(&mut bmap);
91 let bmap = Arc::new(bmap);
92
93 let spd = SharedPagedData::new(stg);
94 let wapd = AccessPagedData::new_writer(spd.clone());
95
96 let db = Database::new(wapd, "", bmap.clone());
97
98 let mut tr = GenTransaction::default();
99
100 let sql = "
101 CREATE SCHEMA test GO
102 CREATE TABLE test.users (name string, age int) GO";
103
104 db.run(&sql, &mut tr);
105
106 let sql = "DECLARE @i int SET @i = 8192
107 WHILE @i > 0
108 BEGIN
109 INSERT INTO test.users(name,age) VALUES ('Alice', 1000)
110 SET @i -= 1
111 END";
112
113 db.run(&sql, &mut tr);
114
115 let mut results = Vec::new();
116 for _outer in 0..100 {
117 let start = std::time::Instant::now();
118 for _i in 0..10 {
119 let ut = db.table("test", "users");
120 assert!(data_kind(ut.info.typ[1]) == DataKind::Int);
121 assert!(data_size(ut.info.typ[1]) == 8);
122 let col_off = ut.info.off[1];
123 let mut total = 0;
124 for (pp, off) in ut.scan(&db) {
125 let p = &pp.borrow();
126 total += util::iget(&p.data, off + col_off, 8);
128 }
129 assert_eq!(total, 8192000);
130 }
131 results.push(start.elapsed().as_micros() as u64);
132 }
133 print_results("rustdb_direct_test", results);
134}
135
136#[cfg(test)]
137pub fn print_results(name: &str, mut results: Vec<u64>) {
138 results.sort();
139 let n = results.len() / 10;
140 let results = &results[0..n];
141 let mut total = 0;
142 for result in results {
143 total += result;
144 }
145 println!(
146 "{} average time={} sorted results={:?}",
147 name,
148 total / (n as u64),
149 results
150 );
151}