Skip to content

Commit b82db39

Browse files
authored
add test_all_types() test (#283)
1 parent ff7d11d commit b82db39

File tree

3 files changed

+228
-0
lines changed

3 files changed

+228
-0
lines changed

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ unicase = "2.6.0"
7171
rand = "0.8.3"
7272
tempdir = "0.3.7"
7373
polars-core = "0.35.4"
74+
pretty_assertions = "1.4.0"
7475
# criterion = "0.3"
7576

7677
# [[bench]]

src/lib.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,9 @@ pub mod types;
121121
#[cfg(feature = "vtab")]
122122
pub mod vtab;
123123

124+
#[cfg(test)]
125+
mod test_all_types;
126+
124127
pub(crate) mod util;
125128

126129
// Number of cached prepared statements we'll hold on to.

src/test_all_types.rs

Lines changed: 224 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,224 @@
1+
use pretty_assertions::assert_eq;
2+
use rust_decimal::Decimal;
3+
4+
use crate::{
5+
types::{TimeUnit, ValueRef},
6+
Connection,
7+
};
8+
9+
#[test]
10+
fn test_all_types() -> crate::Result<()> {
11+
let database = Connection::open_in_memory()?;
12+
13+
let excluded = vec![
14+
// uhugeint, time_tz, and dec38_10 aren't supported in the duckdb arrow layer
15+
"uhugeint",
16+
"time_tz",
17+
"dec38_10",
18+
// union is currently blocked by https://github.com/duckdb/duckdb/pull/11326
19+
"union",
20+
// these remaining types are not yet supported by duckdb-rs
21+
"interval",
22+
"small_enum",
23+
"medium_enum",
24+
"large_enum",
25+
"int_array",
26+
"double_array",
27+
"date_array",
28+
"timestamp_array",
29+
"timestamptz_array",
30+
"varchar_array",
31+
"nested_int_array",
32+
"struct",
33+
"struct_of_arrays",
34+
"array_of_structs",
35+
"map",
36+
"fixed_int_array",
37+
"fixed_varchar_array",
38+
"fixed_nested_int_array",
39+
"fixed_nested_varchar_array",
40+
"fixed_struct_array",
41+
"struct_of_fixed_array",
42+
"fixed_array_of_int_list",
43+
"list_of_fixed_int_array",
44+
];
45+
46+
let mut binding = database.prepare(&format!(
47+
"SELECT * EXCLUDE ({}) FROM test_all_types()",
48+
excluded
49+
.iter()
50+
.map(|s| format!("'{}'", s))
51+
.collect::<Vec<String>>()
52+
.join(",")
53+
))?;
54+
let mut rows = binding.query([])?;
55+
56+
let mut idx = -1;
57+
while let Some(row) = rows.next()? {
58+
idx += 1;
59+
for column in row.stmt.column_names() {
60+
let value = row.get_ref_unwrap(row.stmt.column_index(&column)?);
61+
test_single(&mut idx, column, value);
62+
}
63+
}
64+
65+
Ok(())
66+
}
67+
68+
fn test_single(idx: &mut i32, column: String, value: ValueRef) {
69+
match column.as_str() {
70+
"bool" => match idx {
71+
0 => assert_eq!(value, ValueRef::Boolean(false)),
72+
1 => assert_eq!(value, ValueRef::Boolean(true)),
73+
_ => assert_eq!(value, ValueRef::Null),
74+
},
75+
"tinyint" => match idx {
76+
0 => assert_eq!(value, ValueRef::TinyInt(-128)),
77+
1 => assert_eq!(value, ValueRef::TinyInt(127)),
78+
_ => assert_eq!(value, ValueRef::Null),
79+
},
80+
"smallint" => match idx {
81+
0 => assert_eq!(value, ValueRef::SmallInt(-32768)),
82+
1 => assert_eq!(value, ValueRef::SmallInt(32767)),
83+
_ => assert_eq!(value, ValueRef::Null),
84+
},
85+
"int" => match idx {
86+
0 => assert_eq!(value, ValueRef::Int(-2147483648)),
87+
1 => assert_eq!(value, ValueRef::Int(2147483647)),
88+
_ => assert_eq!(value, ValueRef::Null),
89+
},
90+
"bigint" => match idx {
91+
0 => assert_eq!(value, ValueRef::BigInt(-9223372036854775808)),
92+
1 => assert_eq!(value, ValueRef::BigInt(9223372036854775807)),
93+
_ => assert_eq!(value, ValueRef::Null),
94+
},
95+
"hugeint" => match idx {
96+
0 => assert_eq!(value, ValueRef::HugeInt(-170141183460469231731687303715884105728)),
97+
1 => assert_eq!(value, ValueRef::HugeInt(170141183460469231731687303715884105727)),
98+
_ => assert_eq!(value, ValueRef::Null),
99+
},
100+
"utinyint" => match idx {
101+
0 => assert_eq!(value, ValueRef::UTinyInt(0)),
102+
1 => assert_eq!(value, ValueRef::UTinyInt(255)),
103+
_ => assert_eq!(value, ValueRef::Null),
104+
},
105+
"usmallint" => match idx {
106+
0 => assert_eq!(value, ValueRef::USmallInt(0)),
107+
1 => assert_eq!(value, ValueRef::USmallInt(65535)),
108+
_ => assert_eq!(value, ValueRef::Null),
109+
},
110+
"uint" => match idx {
111+
0 => assert_eq!(value, ValueRef::UInt(0)),
112+
1 => assert_eq!(value, ValueRef::UInt(4294967295)),
113+
_ => assert_eq!(value, ValueRef::Null),
114+
},
115+
"ubigint" => match idx {
116+
0 => assert_eq!(value, ValueRef::UBigInt(0)),
117+
1 => assert_eq!(value, ValueRef::UBigInt(18446744073709551615)),
118+
_ => assert_eq!(value, ValueRef::Null),
119+
},
120+
"uhugeint" => match idx {
121+
0 => assert_eq!(value, ValueRef::UBigInt(0)),
122+
1 => assert_eq!(value, ValueRef::UBigInt(18446744073709551615)),
123+
_ => assert_eq!(value, ValueRef::Null),
124+
},
125+
"float" => match idx {
126+
0 => assert_eq!(value, ValueRef::Float(-3.4028235e38)),
127+
1 => assert_eq!(value, ValueRef::Float(3.4028235e38)),
128+
_ => assert_eq!(value, ValueRef::Null),
129+
},
130+
"double" => match idx {
131+
0 => assert_eq!(value, ValueRef::Double(-1.7976931348623157e308)),
132+
1 => assert_eq!(value, ValueRef::Double(1.7976931348623157e308)),
133+
_ => assert_eq!(value, ValueRef::Null),
134+
},
135+
"decimal" => match idx {
136+
0 => assert_eq!(value, ValueRef::Decimal(Decimal::from_i128_with_scale(0, 0))),
137+
1 => assert_eq!(value, ValueRef::Decimal(Decimal::from_i128_with_scale(1, 0))),
138+
_ => assert_eq!(value, ValueRef::Null),
139+
},
140+
"date" => match idx {
141+
0 => assert_eq!(value, ValueRef::Date32(-2147483646)),
142+
1 => assert_eq!(value, ValueRef::Date32(2147483646)),
143+
_ => assert_eq!(value, ValueRef::Null),
144+
},
145+
"time" => match idx {
146+
0 => assert_eq!(value, ValueRef::Time64(TimeUnit::Microsecond, 0)),
147+
1 => assert_eq!(value, ValueRef::Time64(TimeUnit::Microsecond, 86400000000)),
148+
_ => assert_eq!(value, ValueRef::Null),
149+
},
150+
"timestamp" => match idx {
151+
0 => assert_eq!(value, ValueRef::Timestamp(TimeUnit::Microsecond, -9223372022400000000)),
152+
1 => assert_eq!(value, ValueRef::Timestamp(TimeUnit::Microsecond, 9223372036854775806)),
153+
_ => assert_eq!(value, ValueRef::Null),
154+
},
155+
"timestamp_s" => match idx {
156+
0 => assert_eq!(value, ValueRef::Timestamp(TimeUnit::Second, -9223372022400)),
157+
1 => assert_eq!(value, ValueRef::Timestamp(TimeUnit::Second, 9223372036854)),
158+
_ => assert_eq!(value, ValueRef::Null),
159+
},
160+
"timestamp_ms" => match idx {
161+
0 => assert_eq!(value, ValueRef::Timestamp(TimeUnit::Millisecond, -9223372022400000)),
162+
1 => assert_eq!(value, ValueRef::Timestamp(TimeUnit::Millisecond, 9223372036854775)),
163+
_ => assert_eq!(value, ValueRef::Null),
164+
},
165+
"timestamp_ns" => match idx {
166+
0 => assert_eq!(value, ValueRef::Timestamp(TimeUnit::Nanosecond, -9223372036854775808)),
167+
1 => assert_eq!(value, ValueRef::Timestamp(TimeUnit::Nanosecond, 9223372036854775806)),
168+
_ => assert_eq!(value, ValueRef::Null),
169+
},
170+
"timestamp_tz" => match idx {
171+
0 => assert_eq!(value, ValueRef::Timestamp(TimeUnit::Microsecond, -9223372022400000000)),
172+
1 => assert_eq!(value, ValueRef::Timestamp(TimeUnit::Microsecond, 9223372036854775806)),
173+
_ => assert_eq!(value, ValueRef::Null),
174+
},
175+
"dec_4_1" => match idx {
176+
0 => assert_eq!(value, ValueRef::Decimal(Decimal::from_i128_with_scale(-9999, 1))),
177+
1 => assert_eq!(value, ValueRef::Decimal(Decimal::from_i128_with_scale(9999, 1))),
178+
_ => assert_eq!(value, ValueRef::Null),
179+
},
180+
"dec_9_4" => match idx {
181+
0 => assert_eq!(value, ValueRef::Decimal(Decimal::from_i128_with_scale(-999999999, 4))),
182+
1 => assert_eq!(value, ValueRef::Decimal(Decimal::from_i128_with_scale(999999999, 4))),
183+
_ => assert_eq!(value, ValueRef::Null),
184+
},
185+
"dec_18_6" => match idx {
186+
0 => assert_eq!(
187+
value,
188+
ValueRef::Decimal(Decimal::from_i128_with_scale(-999999999999999999, 6))
189+
),
190+
1 => assert_eq!(
191+
value,
192+
ValueRef::Decimal(Decimal::from_i128_with_scale(999999999999999999, 6))
193+
),
194+
_ => assert_eq!(value, ValueRef::Null),
195+
},
196+
"uuid" => match idx {
197+
0 => assert_eq!(value, ValueRef::Text("00000000-0000-0000-0000-000000000000".as_bytes())),
198+
1 => assert_eq!(value, ValueRef::Text("ffffffff-ffff-ffff-ffff-ffffffffffff".as_bytes())),
199+
_ => assert_eq!(value, ValueRef::Null),
200+
},
201+
"varchar" => match idx {
202+
0 => assert_eq!(value, ValueRef::Text("🦆🦆🦆🦆🦆🦆".as_bytes())),
203+
1 => assert_eq!(value, ValueRef::Text("goo\0se".as_bytes())),
204+
_ => assert_eq!(value, ValueRef::Null),
205+
},
206+
"blob" => match idx {
207+
0 => assert_eq!(
208+
value,
209+
ValueRef::Blob(&[
210+
116, 104, 105, 115, 105, 115, 97, 108, 111, 110, 103, 98, 108, 111, 98, 0, 119, 105, 116, 104, 110,
211+
117, 108, 108, 98, 121, 116, 101, 115
212+
])
213+
),
214+
1 => assert_eq!(value, ValueRef::Blob(&[0, 0, 0, 97])),
215+
_ => assert_eq!(value, ValueRef::Null),
216+
},
217+
"bit" => match idx {
218+
0 => assert_eq!(value, ValueRef::Blob(&[1, 145, 46, 42, 215]),),
219+
1 => assert_eq!(value, ValueRef::Blob(&[3, 245])),
220+
_ => assert_eq!(value, ValueRef::Null),
221+
},
222+
_ => todo!("{column:?}"),
223+
}
224+
}

0 commit comments

Comments
 (0)