@@ -38,7 +38,7 @@ pub struct TableCatalog {
3838 schema_ref : SchemaRef ,
3939 primary_keys : Vec < ( usize , ColumnRef ) > ,
4040 primary_key_indices : PrimaryKeyIndices ,
41- primary_key_type : LogicalType ,
41+ primary_key_type : Option < LogicalType > ,
4242}
4343
4444//TODO: can add some like Table description and other information as attributes
@@ -99,10 +99,6 @@ impl TableCatalog {
9999 & self . primary_keys
100100 }
101101
102- pub ( crate ) fn primary_keys_type ( & self ) -> & LogicalType {
103- & self . primary_key_type
104- }
105-
106102 pub ( crate ) fn primary_keys_indices ( & self ) -> & PrimaryKeyIndices {
107103 & self . primary_key_indices
108104 }
@@ -148,7 +144,23 @@ impl TableCatalog {
148144 }
149145
150146 let index_id = self . indexes . last ( ) . map ( |index| index. id + 1 ) . unwrap_or ( 0 ) ;
151- let pk_ty = self . primary_key_type . clone ( ) ;
147+ let pk_ty = self
148+ . primary_key_type
149+ . get_or_insert_with ( || {
150+ let primary_keys = & self . primary_keys ;
151+
152+ if primary_keys. len ( ) == 1 {
153+ primary_keys[ 0 ] . 1 . datatype ( ) . clone ( )
154+ } else {
155+ LogicalType :: Tuple (
156+ primary_keys
157+ . iter ( )
158+ . map ( |( _, column) | column. datatype ( ) . clone ( ) )
159+ . collect_vec ( ) ,
160+ )
161+ }
162+ } )
163+ . clone ( ) ;
152164
153165 let mut val_tys = Vec :: with_capacity ( column_ids. len ( ) ) ;
154166 for column_id in column_ids. iter ( ) {
@@ -193,7 +205,7 @@ impl TableCatalog {
193205 schema_ref : Arc :: new ( vec ! [ ] ) ,
194206 primary_keys : vec ! [ ] ,
195207 primary_key_indices : Default :: default ( ) ,
196- primary_key_type : LogicalType :: SqlNull ,
208+ primary_key_type : None ,
197209 } ;
198210 let mut generator = Generator :: new ( ) ;
199211 for col_catalog in columns. into_iter ( ) {
@@ -204,26 +216,12 @@ impl TableCatalog {
204216 let ( primary_keys, primary_key_indices) =
205217 Self :: build_primary_keys ( & table_catalog. schema_ref ) ;
206218
207- table_catalog. primary_key_type = Self :: build_primary_key_type ( & primary_keys) ;
208219 table_catalog. primary_keys = primary_keys;
209220 table_catalog. primary_key_indices = primary_key_indices;
210221
211222 Ok ( table_catalog)
212223 }
213224
214- fn build_primary_key_type ( primary_keys : & [ ( usize , ColumnRef ) ] ) -> LogicalType {
215- if primary_keys. len ( ) == 1 {
216- primary_keys[ 0 ] . 1 . datatype ( ) . clone ( )
217- } else {
218- LogicalType :: Tuple (
219- primary_keys
220- . iter ( )
221- . map ( |( _, column) | column. datatype ( ) . clone ( ) )
222- . collect_vec ( ) ,
223- )
224- }
225- }
226-
227225 pub ( crate ) fn reload (
228226 name : TableName ,
229227 column_refs : Vec < ColumnRef > ,
@@ -242,7 +240,6 @@ impl TableCatalog {
242240 }
243241 let schema_ref = Arc :: new ( column_refs. clone ( ) ) ;
244242 let ( primary_keys, primary_key_indices) = Self :: build_primary_keys ( & schema_ref) ;
245- let primary_key_type = Self :: build_primary_key_type ( & primary_keys) ;
246243
247244 Ok ( TableCatalog {
248245 name,
@@ -252,7 +249,7 @@ impl TableCatalog {
252249 schema_ref,
253250 primary_keys,
254251 primary_key_indices,
255- primary_key_type,
252+ primary_key_type : None ,
256253 } )
257254 }
258255
0 commit comments