@@ -14,7 +14,7 @@ use std::{cell::RefCell, collections::HashMap, iter::once, marker::PhantomData,
1414
1515use pgrx:: {
1616 pg_sys:: { InvalidBlockNumber , InvalidOffsetNumber , BLCKSZ } ,
17- PgRelation ,
17+ PgBox , PgRelation ,
1818} ;
1919use rkyv:: { vec:: ArchivedVec , Archive , Deserialize , Serialize } ;
2020
@@ -276,12 +276,22 @@ impl SbqSearchDistanceMeasure {
276276 & bq_vector[ ..self . quantized_dimensions ] ,
277277 )
278278 } else {
279- debug_assert ! ( self . quantized_vector. len( ) == bq_vector. len( ) ) ;
279+ debug_assert ! (
280+ self . quantized_vector. len( ) == bq_vector. len( ) ,
281+ "self.quantized_vector.len()={} bq_vector.len()={}" ,
282+ self . quantized_vector. len( ) ,
283+ bq_vector. len( )
284+ ) ;
280285 ( self . quantized_vector . as_slice ( ) , bq_vector)
281286 }
282287 }
283288 GraphNeighborStore :: Builder ( _b) => {
284- debug_assert ! ( self . quantized_vector. len( ) == bq_vector. len( ) ) ;
289+ debug_assert ! (
290+ self . quantized_vector. len( ) == bq_vector. len( ) ,
291+ "self.quantized_vector.len()={} bq_vector.len()={}" ,
292+ self . quantized_vector. len( ) ,
293+ bq_vector. len( )
294+ ) ;
285295 ( self . quantized_vector . as_slice ( ) , bq_vector)
286296 }
287297 } ;
@@ -538,14 +548,6 @@ impl<'a> SbqSpeedupStorage<'a> {
538548 }
539549 }
540550 }
541-
542- unsafe fn get_heap_table_slot_from_heap_pointer < T : StatsHeapNodeRead > (
543- & self ,
544- heap_pointer : HeapPointer ,
545- stats : & mut T ,
546- ) -> TableSlot {
547- TableSlot :: new ( self . heap_rel , heap_pointer, stats)
548- }
549551}
550552
551553pub type SbqSpeedupStorageLsnPrivateData = PhantomData < bool > ; //no data stored
@@ -635,17 +637,28 @@ impl<'a> Storage for SbqSpeedupStorage<'a> {
635637
636638 fn get_full_distance_for_resort < S : StatsHeapNodeRead + StatsDistanceComparison > (
637639 & self ,
640+ scan : & PgBox < pgrx:: pg_sys:: IndexScanDescData > ,
638641 qdm : & Self :: QueryDistanceMeasure ,
639642 _index_pointer : IndexPointer ,
640643 heap_pointer : HeapPointer ,
641644 meta_page : & MetaPage ,
642645 stats : & mut S ,
643- ) -> f32 {
644- let slot = unsafe { self . get_heap_table_slot_from_heap_pointer ( heap_pointer, stats) } ;
646+ ) -> Option < f32 > {
647+ let slot_opt = unsafe {
648+ TableSlot :: from_index_heap_pointer ( self . heap_rel , heap_pointer, scan. xs_snapshot , stats)
649+ } ;
650+
651+ let slot = slot_opt?;
645652
646- let datum = unsafe { slot. get_attribute ( self . heap_attr ) . unwrap ( ) } ;
653+ let datum = unsafe {
654+ slot. get_attribute ( self . heap_attr )
655+ . expect ( "vector attribute should exist in the heap" )
656+ } ;
647657 let vec = unsafe { PgVector :: from_datum ( datum, meta_page, false , true ) } ;
648- self . get_distance_function ( ) ( vec. to_full_slice ( ) , qdm. query . to_full_slice ( ) )
658+ Some ( self . get_distance_function ( ) (
659+ vec. to_full_slice ( ) ,
660+ qdm. query . to_full_slice ( ) ,
661+ ) )
649662 }
650663
651664 fn get_neighbors_with_distances_from_disk < S : StatsNodeRead + StatsDistanceComparison > (
@@ -1045,6 +1058,12 @@ mod tests {
10451058 ) ;
10461059 }
10471060
1061+ #[ test]
1062+ fn test_bq_compressed_storage_update_with_null ( ) {
1063+ crate :: access_method:: vacuum:: tests:: test_update_with_null_scaffold (
1064+ "num_neighbors = 38, storage_layout = memory_optimized" ,
1065+ ) ;
1066+ }
10481067 #[ pg_test]
10491068 unsafe fn test_bq_compressed_storage_empty_table_insert ( ) -> spi:: Result < ( ) > {
10501069 crate :: access_method:: build:: tests:: test_empty_table_insert_scaffold (
0 commit comments