@@ -15,6 +15,7 @@ use vortex::array::match_each_integer_ptype;
1515use vortex:: buffer:: ByteBuffer ;
1616use vortex:: encodings:: fsst:: FSST ;
1717use vortex:: encodings:: fsst:: FSSTArrayExt ;
18+ use vortex:: error:: vortex_err;
1819use vortex:: error:: VortexResult ;
1920
2021use crate :: cpp;
@@ -102,7 +103,7 @@ impl ColumnExporter for FSSTExporter {
102103 let start: usize = offsets[ offset + row] . as_( ) ;
103104 let end: usize = offsets[ offset + row + 1 ] . as_( ) ;
104105 let value = & bytes[ start..end] ;
105- out[ row] = PtrString :: new( value) ;
106+ out[ row] = PtrString :: new( value) ? ;
106107 }
107108 } ) ;
108109
@@ -125,32 +126,33 @@ struct PtrString {
125126}
126127
127128impl PtrString {
128- fn new ( value : & [ u8 ] ) -> Self {
129- let length = u32:: try_from ( value. len ( ) ) . expect ( "FSST code length must fit in u32" ) ;
129+ fn new ( value : & [ u8 ] ) -> VortexResult < Self > {
130+ let length = u32:: try_from ( value. len ( ) )
131+ . map_err ( |_| vortex_err ! ( "FSST code length {} exceeds u32" , value. len( ) ) ) ?;
130132 if value. len ( ) <= 12 {
131133 let mut inlined = [ 0_i8 ; 12 ] ;
132134 for ( dst, src) in inlined. iter_mut ( ) . zip ( value) {
133135 * dst = * src as i8 ;
134136 }
135- Self {
137+ Ok ( Self {
136138 value : PtrStringValue {
137139 inlined : PtrStringInlined { length, inlined } ,
138140 } ,
139- }
141+ } )
140142 } else {
141143 let mut prefix = [ 0_i8 ; 4 ] ;
142144 for ( dst, src) in prefix. iter_mut ( ) . zip ( value. iter ( ) . copied ( ) ) {
143145 * dst = src as i8 ;
144146 }
145- Self {
147+ Ok ( Self {
146148 value : PtrStringValue {
147149 pointer : PtrStringPointer {
148150 length,
149151 prefix,
150152 ptr : value. as_ptr ( ) . cast_mut ( ) . cast :: < c_char > ( ) ,
151153 } ,
152154 } ,
153- }
155+ } )
154156 }
155157 }
156158}
0 commit comments