@@ -21,6 +21,7 @@ pub struct TableCatalog {
21
21
pub ( crate ) indexes : Vec < IndexMetaRef > ,
22
22
23
23
schema_ref : SchemaRef ,
24
+ primary_keys : Vec < ( usize , ColumnRef ) > ,
24
25
}
25
26
26
27
//TODO: can add some like Table description and other information as attributes
@@ -73,17 +74,13 @@ impl TableCatalog {
73
74
self . columns . len ( )
74
75
}
75
76
76
- pub ( crate ) fn primary_key ( & self ) -> Result < ( usize , & ColumnRef ) , DatabaseError > {
77
- self . schema_ref
78
- . iter ( )
79
- . enumerate ( )
80
- . find ( |( _, column) | column. desc ( ) . is_primary )
81
- . ok_or ( DatabaseError :: PrimaryKeyNotFound )
77
+ pub ( crate ) fn primary_keys ( & self ) -> & [ ( usize , ColumnRef ) ] {
78
+ & self . primary_keys
82
79
}
83
80
84
81
pub ( crate ) fn types ( & self ) -> Vec < LogicalType > {
85
82
self . columns ( )
86
- . map ( |column| * column. datatype ( ) )
83
+ . map ( |column| column. datatype ( ) . clone ( ) )
87
84
. collect_vec ( )
88
85
}
89
86
@@ -128,7 +125,17 @@ impl TableCatalog {
128
125
}
129
126
130
127
let index_id = self . indexes . last ( ) . map ( |index| index. id + 1 ) . unwrap_or ( 0 ) ;
131
- let pk_ty = * self . primary_key ( ) ?. 1 . datatype ( ) ;
128
+ let primary_keys = self . primary_keys ( ) ;
129
+ let pk_ty = if primary_keys. len ( ) == 1 {
130
+ primary_keys[ 0 ] . 1 . datatype ( ) . clone ( )
131
+ } else {
132
+ LogicalType :: Tuple (
133
+ primary_keys
134
+ . iter ( )
135
+ . map ( |( _, column) | column. datatype ( ) . clone ( ) )
136
+ . collect_vec ( ) ,
137
+ )
138
+ } ;
132
139
let index = IndexMeta {
133
140
id : index_id,
134
141
column_ids,
@@ -154,13 +161,21 @@ impl TableCatalog {
154
161
columns : BTreeMap :: new ( ) ,
155
162
indexes : vec ! [ ] ,
156
163
schema_ref : Arc :: new ( vec ! [ ] ) ,
164
+ primary_keys : vec ! [ ] ,
157
165
} ;
158
166
let mut generator = Generator :: new ( ) ;
159
167
for col_catalog in columns. into_iter ( ) {
160
168
let _ = table_catalog
161
169
. add_column ( col_catalog, & mut generator)
162
170
. unwrap ( ) ;
163
171
}
172
+ table_catalog. primary_keys = table_catalog
173
+ . schema_ref
174
+ . iter ( )
175
+ . enumerate ( )
176
+ . filter ( |& ( _, column) | column. desc ( ) . is_primary ( ) )
177
+ . map ( |( i, column) | ( i, column. clone ( ) ) )
178
+ . collect_vec ( ) ;
164
179
165
180
Ok ( table_catalog)
166
181
}
@@ -182,13 +197,20 @@ impl TableCatalog {
182
197
columns. insert ( column_id, i) ;
183
198
}
184
199
let schema_ref = Arc :: new ( column_refs. clone ( ) ) ;
200
+ let primary_keys = schema_ref
201
+ . iter ( )
202
+ . enumerate ( )
203
+ . filter ( |& ( _, column) | column. desc ( ) . is_primary ( ) )
204
+ . map ( |( i, column) | ( i, column. clone ( ) ) )
205
+ . collect_vec ( ) ;
185
206
186
207
Ok ( TableCatalog {
187
208
name,
188
209
column_idxs,
189
210
columns,
190
211
indexes,
191
212
schema_ref,
213
+ primary_keys,
192
214
} )
193
215
}
194
216
}
0 commit comments