@@ -481,6 +481,44 @@ delta_delta_compressor_append_value(DeltaDeltaCompressor *compressor, int64 next
481481/**********************************************************************************/
482482/**********************************************************************************/
483483
484+ static inline uint32
485+ decompression_iterator_items_seen (const DeltaDeltaDecompressionIterator * iter )
486+ {
487+ if (iter -> has_nulls )
488+ {
489+ return iter -> nulls .num_elements_returned ;
490+ }
491+ else
492+ {
493+ return iter -> delta_deltas .num_elements_returned ;
494+ }
495+ }
496+
497+ static inline uint32
498+ decompression_iterator_item_count (const DeltaDeltaDecompressionIterator * iter )
499+ {
500+ if (iter -> has_nulls )
501+ {
502+ return iter -> nulls .num_elements ;
503+ }
504+ else
505+ {
506+ return iter -> delta_deltas .num_elements ;
507+ }
508+ }
509+
510+ static inline uint32
511+ decompression_iterator_values_seen (const DeltaDeltaDecompressionIterator * iter )
512+ {
513+ return iter -> delta_deltas .num_elements_returned ;
514+ }
515+
516+ static inline uint32
517+ decompression_iterator_value_count (const DeltaDeltaDecompressionIterator * iter )
518+ {
519+ return iter -> delta_deltas .num_elements ;
520+ }
521+
484522static void
485523int64_decompression_iterator_init_forward (DeltaDeltaDecompressionIterator * iter , void * compressed ,
486524 Oid element_type )
@@ -515,6 +553,7 @@ int64_decompression_iterator_init_forward(DeltaDeltaDecompressionIterator *iter,
515553 {
516554 Simple8bRleSerialized * nulls = bytes_deserialize_simple8b_and_advance (& si );
517555 simple8brle_decompression_iterator_init_forward (& iter -> nulls , nulls );
556+ CheckCompressedData (deltas -> num_elements <= nulls -> num_elements );
518557 }
519558}
520559
@@ -529,7 +568,7 @@ int64_decompression_iterator_init_reverse(DeltaDeltaDecompressionIterator *iter,
529568 DeltaDeltaCompressed * header = consumeCompressedData (& si , sizeof (DeltaDeltaCompressed ));
530569 Simple8bRleSerialized * deltas = bytes_deserialize_simple8b_and_advance (& si );
531570
532- Assert (header -> has_nulls == 0 || header -> has_nulls == 1 );
571+ CheckCompressedData (header -> has_nulls == 0 || header -> has_nulls == 1 );
533572
534573 * iter = (DeltaDeltaDecompressionIterator ){
535574 .base = {
@@ -549,6 +588,7 @@ int64_decompression_iterator_init_reverse(DeltaDeltaDecompressionIterator *iter,
549588 {
550589 Simple8bRleSerialized * nulls = bytes_deserialize_simple8b_and_advance (& si );
551590 simple8brle_decompression_iterator_init_reverse (& iter -> nulls , nulls );
591+ CheckCompressedData (deltas -> num_elements <= nulls -> num_elements );
552592 }
553593}
554594
@@ -615,6 +655,12 @@ delta_delta_decompression_iterator_try_next_forward_internal(DeltaDeltaDecompres
615655 simple8brle_decompression_iterator_try_next_forward (& iter -> nulls );
616656 if (result .is_done )
617657 {
658+ /* make sure we exhausted all items before */
659+ CheckCompressedData (decompression_iterator_items_seen (iter ) ==
660+ decompression_iterator_item_count (iter ));
661+ /* and also that we returned all values */
662+ CheckCompressedData (decompression_iterator_values_seen (iter ) ==
663+ decompression_iterator_value_count (iter ));
618664 return (DecompressResultInternal ){
619665 .is_done = true,
620666 };
@@ -633,6 +679,9 @@ delta_delta_decompression_iterator_try_next_forward_internal(DeltaDeltaDecompres
633679
634680 if (result .is_done )
635681 {
682+ /* make sure we exhausted all items before */
683+ CheckCompressedData (decompression_iterator_items_seen (iter ) ==
684+ decompression_iterator_item_count (iter ));
636685 return (DecompressResultInternal ){
637686 .is_done = true,
638687 };
@@ -712,14 +761,20 @@ delta_delta_decompression_iterator_try_next_reverse_internal(DeltaDeltaDecompres
712761 simple8brle_decompression_iterator_try_next_reverse (& iter -> nulls );
713762 if (result .is_done )
714763 {
764+ /* make sure we exhausted all items before */
765+ CheckCompressedData (decompression_iterator_items_seen (iter ) ==
766+ decompression_iterator_item_count (iter ));
767+ /* and also that we returned all values */
768+ CheckCompressedData (decompression_iterator_values_seen (iter ) ==
769+ decompression_iterator_value_count (iter ));
715770 return (DecompressResultInternal ){
716771 .is_done = true,
717772 };
718773 }
719774
720775 if (result .val != 0 )
721776 {
722- Assert (result .val == 1 );
777+ CheckCompressedData (result .val == 1 );
723778 return (DecompressResultInternal ){
724779 .is_null = true,
725780 };
@@ -730,6 +785,9 @@ delta_delta_decompression_iterator_try_next_reverse_internal(DeltaDeltaDecompres
730785
731786 if (result .is_done )
732787 {
788+ /* make sure we exhausted all items before */
789+ CheckCompressedData (decompression_iterator_items_seen (iter ) ==
790+ decompression_iterator_item_count (iter ));
733791 return (DecompressResultInternal ){
734792 .is_done = true,
735793 };
0 commit comments