1
1
use crate :: constants:: DuckDBType ;
2
2
use crate :: duckly:: {
3
- duckdb_create_logical_type, duckdb_destroy_logical_type , duckdb_get_type_id ,
4
- duckdb_logical_type,
3
+ duckdb_create_logical_type, duckdb_create_map_type , duckdb_destroy_logical_type ,
4
+ duckdb_get_type_id , duckdb_logical_type,
5
5
} ;
6
6
use num_traits:: FromPrimitive ;
7
7
@@ -18,12 +18,26 @@ impl LogicalType {
18
18
}
19
19
}
20
20
}
21
+ pub fn new_map_type ( key : & LogicalType , value : & LogicalType ) -> Self {
22
+ unsafe {
23
+ Self {
24
+ typ : duckdb_create_map_type ( key. typ , value. typ ) ,
25
+ }
26
+ }
27
+ }
21
28
pub fn type_id ( & self ) -> DuckDBType {
22
29
let id = unsafe { duckdb_get_type_id ( self . typ ) } ;
23
30
24
31
FromPrimitive :: from_u32 ( id) . unwrap ( )
25
32
}
26
33
}
34
+ impl Clone for LogicalType {
35
+ fn clone ( & self ) -> Self {
36
+ let type_id = self . type_id ( ) ;
37
+
38
+ Self :: new ( type_id)
39
+ }
40
+ }
27
41
28
42
impl From < duckdb_logical_type > for LogicalType {
29
43
fn from ( ptr : duckdb_logical_type ) -> Self {
@@ -38,3 +52,19 @@ impl Drop for LogicalType {
38
52
}
39
53
}
40
54
}
55
+
56
+ #[ cfg( test) ]
57
+ mod test {
58
+ use crate :: constants:: DuckDBType ;
59
+ use crate :: LogicalType ;
60
+ #[ test]
61
+ fn test_logi ( ) {
62
+ let key = LogicalType :: new ( DuckDBType :: Varchar ) ;
63
+
64
+ let value = LogicalType :: new ( DuckDBType :: Utinyint ) ;
65
+
66
+ let map = LogicalType :: new_map_type ( & key, & value) ;
67
+
68
+ assert_eq ! ( map. type_id( ) , DuckDBType :: Map ) ;
69
+ }
70
+ }
0 commit comments