11use crate :: schema_cache:: SchemaCacheItem ;
22
3- enum ColumnClassKind {
3+ #[ derive( Debug , Clone , PartialEq , Eq ) ]
4+ pub enum ColumnClassKind {
45 OrdinaryTable ,
56 View ,
67 MaterializedView ,
@@ -30,19 +31,23 @@ impl From<String> for ColumnClassKind {
3031 }
3132}
3233
34+ impl From < char > for ColumnClassKind {
35+ fn from ( value : char ) -> Self {
36+ ColumnClassKind :: from ( String :: from ( value) )
37+ }
38+ }
39+
3340#[ derive( Debug , Clone , PartialEq , Eq ) ]
3441pub struct Column {
3542 pub name : String ,
3643
3744 pub table_name : String ,
3845 pub table_oid : i64 ,
39-
4046 /// What type of class does this column belong to?
41- pub class_kind : bool ,
47+ pub class_kind : ColumnClassKind ,
4248
4349 pub schema_name : String ,
4450 pub type_id : i64 ,
45-
4651 pub is_nullable : bool ,
4752
4853 pub is_primary_key : bool ,
@@ -52,8 +57,7 @@ pub struct Column {
5257 pub default_expr : Option < String > ,
5358
5459 pub varchar_length : Option < i32 > ,
55- // /// None if the column is not a foreign key.
56- // pub foreign_key: Option<ForeignKeyReference>,
60+
5761 /// Comment inserted via `COMMENT ON COLUMN my_table.my_comment '...'`, if present.
5862 pub comment : Option < String > ,
5963}
@@ -74,3 +78,125 @@ impl SchemaCacheItem for Column {
7478 . await
7579 }
7680}
81+
82+ #[ cfg( test) ]
83+ mod tests {
84+ use pg_test_utils:: test_database:: get_new_test_db;
85+ use sqlx:: Executor ;
86+
87+ use crate :: { columns:: ColumnClassKind , schema_cache, SchemaCache } ;
88+
89+ #[ tokio:: test]
90+ async fn loads_columns ( ) {
91+ let test_db = get_new_test_db ( ) . await ;
92+
93+ let setup = r#"
94+ create table public.users (
95+ id serial primary key,
96+ name varchar(255) not null,
97+ is_vegetarian bool default false,
98+ middle_name varchar(255)
99+ );
100+
101+ create schema real_estate;
102+
103+ create table real_estate.addresses (
104+ user_id serial references users(id),
105+ postal_code smallint not null,
106+ street text,
107+ city text
108+ );
109+
110+ create table real_estate.properties (
111+ id serial primary key,
112+ owner_id int references users(id),
113+ square_meters smallint not null
114+ );
115+
116+ comment on column real_estate.properties.owner_id is 'users might own many houses';
117+ "# ;
118+
119+ test_db
120+ . execute ( setup)
121+ . await
122+ . expect ( "Failed to setup test database" ) ;
123+
124+ let cache = SchemaCache :: load ( & test_db)
125+ . await
126+ . expect ( "Failed to load Schema Cache" ) ;
127+
128+ let public_schema_columns = cache
129+ . columns
130+ . iter ( )
131+ . filter ( |c| c. schema_name . as_str ( ) == "public" )
132+ . count ( ) ;
133+
134+ assert_eq ! ( public_schema_columns, 4 ) ;
135+
136+ let real_estate_schema_columns = cache
137+ . columns
138+ . iter ( )
139+ . filter ( |c| c. schema_name . as_str ( ) == "real_estate" )
140+ . count ( ) ;
141+
142+ assert_eq ! ( real_estate_schema_columns, 7 ) ;
143+
144+ let user_id_col = cache. find_col ( "id" , "users" , None ) . unwrap ( ) ;
145+ assert_eq ! ( user_id_col. class_kind, ColumnClassKind :: OrdinaryTable ) ;
146+ assert_eq ! ( user_id_col. comment, None ) ;
147+ assert_eq ! (
148+ user_id_col. default_expr,
149+ Some ( "nextval('users_id_seq'::regclass)" . into( ) )
150+ ) ;
151+ assert_eq ! ( user_id_col. is_nullable, false ) ;
152+ assert_eq ! ( user_id_col. is_primary_key, true ) ;
153+ assert_eq ! ( user_id_col. is_unique, true ) ;
154+ assert_eq ! ( user_id_col. varchar_length, None ) ;
155+
156+ let user_name_col = cache. find_col ( "name" , "users" , None ) . unwrap ( ) ;
157+ assert_eq ! ( user_name_col. class_kind, ColumnClassKind :: OrdinaryTable ) ;
158+ assert_eq ! ( user_name_col. comment, None ) ;
159+ assert_eq ! ( user_name_col. default_expr, None ) ;
160+ assert_eq ! ( user_name_col. is_nullable, false ) ;
161+ assert_eq ! ( user_name_col. is_primary_key, false ) ;
162+ assert_eq ! ( user_name_col. is_unique, false ) ;
163+ assert_eq ! ( user_name_col. varchar_length, Some ( 255 ) ) ;
164+
165+ let user_is_veg_col = cache. find_col ( "is_vegetarian" , "users" , None ) . unwrap ( ) ;
166+ assert_eq ! ( user_is_veg_col. class_kind, ColumnClassKind :: OrdinaryTable ) ;
167+ assert_eq ! ( user_is_veg_col. comment, None ) ;
168+ assert_eq ! ( user_is_veg_col. default_expr, Some ( "false" . into( ) ) ) ;
169+ assert_eq ! ( user_is_veg_col. is_nullable, true ) ;
170+ assert_eq ! ( user_is_veg_col. is_primary_key, false ) ;
171+ assert_eq ! ( user_is_veg_col. is_unique, false ) ;
172+ assert_eq ! ( user_is_veg_col. varchar_length, None ) ;
173+
174+ let user_middle_name_col = cache. find_col ( "middle_name" , "users" , None ) . unwrap ( ) ;
175+ assert_eq ! (
176+ user_middle_name_col. class_kind,
177+ ColumnClassKind :: OrdinaryTable
178+ ) ;
179+ assert_eq ! ( user_middle_name_col. comment, None ) ;
180+ assert_eq ! ( user_middle_name_col. default_expr, None ) ;
181+ assert_eq ! ( user_middle_name_col. is_nullable, true ) ;
182+ assert_eq ! ( user_middle_name_col. is_primary_key, false ) ;
183+ assert_eq ! ( user_middle_name_col. is_unique, false ) ;
184+ assert_eq ! ( user_middle_name_col. varchar_length, Some ( 255 ) ) ;
185+
186+ let properties_owner_id_col = cache
187+ . find_col ( "owner_id" , "properties" , Some ( "real_estate" ) )
188+ . unwrap ( ) ;
189+ assert_eq ! (
190+ properties_owner_id_col. class_kind,
191+ ColumnClassKind :: OrdinaryTable
192+ ) ;
193+ assert_eq ! (
194+ properties_owner_id_col. comment,
195+ Some ( "users might own many houses" . into( ) )
196+ ) ;
197+ assert_eq ! ( properties_owner_id_col. is_nullable, true ) ;
198+ assert_eq ! ( properties_owner_id_col. is_primary_key, false ) ;
199+ assert_eq ! ( properties_owner_id_col. is_unique, false ) ;
200+ assert_eq ! ( properties_owner_id_col. varchar_length, None ) ;
201+ }
202+ }
0 commit comments