@@ -349,7 +349,7 @@ func (d *DictionaryPage) Release() {
349349func (d * DictionaryPage ) IsSorted () bool { return d .sorted }
350350
351351type serializedPageReader struct {
352- r parquet.BufferedReader
352+ r parquet.BufferedReaderV2
353353 chunk * metadata.ColumnChunkMetaData
354354 colIdx int
355355 pgIndexReader * metadata.RowGroupPageIndexReader
@@ -421,6 +421,25 @@ func (p *serializedPageReader) init(compressType compress.Compression, ctx *Cryp
421421 return nil
422422}
423423
424+ type bufferedReaderV2Adapter struct {
425+ parquet.BufferedReader
426+ }
427+
428+ func (b * bufferedReaderV2Adapter ) Buffered () int {
429+ return 0
430+ }
431+
432+ func (b * bufferedReaderV2Adapter ) Free () {
433+ // no-op
434+ }
435+
436+ func getBufferedReaderV2 (r parquet.BufferedReader ) parquet.BufferedReaderV2 {
437+ if brV2 , ok := r .(parquet.BufferedReaderV2 ); ok {
438+ return brV2
439+ }
440+ return & bufferedReaderV2Adapter {BufferedReader : r }
441+ }
442+
424443// NewPageReader returns a page reader for the data which can be read from the provided reader and compression.
425444//
426445// Deprecated: This function isn't properly safe for public API use and should not be utilized
@@ -436,7 +455,7 @@ func NewPageReader(r parquet.BufferedReader, nrows int64, compressType compress.
436455 }
437456
438457 rdr := & serializedPageReader {
439- r : r ,
458+ r : getBufferedReaderV2 ( r ) ,
440459 maxPageHeaderSize : defaultMaxPageHeaderSize ,
441460 nrows : nrows ,
442461 mem : mem ,
@@ -458,7 +477,10 @@ func NewPageReader(r parquet.BufferedReader, nrows int64, compressType compress.
458477func (p * serializedPageReader ) Reset (r parquet.BufferedReader , nrows int64 , compressType compress.Compression , ctx * CryptoContext ) {
459478 p .rowsSeen , p .pageOrd , p .nrows = 0 , 0 , nrows
460479 p .curPageHdr , p .curPage , p .err = nil , nil , nil
461- p .r = r
480+ if p .r != nil && p .r != r {
481+ p .r .Free ()
482+ }
483+ p .r = getBufferedReaderV2 (r )
462484
463485 p .codec , p .err = compress .GetCodec (compressType )
464486 if p .err != nil {
@@ -508,26 +530,6 @@ func (p *serializedPageReader) Page() Page {
508530 return p .curPage
509531}
510532
511- func (p * serializedPageReader ) decompress (rd io.Reader , lenCompressed int , buf []byte ) ([]byte , error ) {
512- p .decompressBuffer .ResizeNoShrink (lenCompressed )
513-
514- // Read directly into the memory.Buffer's backing slice
515- n , err := io .ReadFull (rd , p .decompressBuffer .Bytes ()[:lenCompressed ])
516- if err != nil {
517- return nil , err
518- }
519- if n != lenCompressed {
520- return nil , fmt .Errorf ("parquet: expected to read %d compressed bytes, got %d" , lenCompressed , n )
521- }
522-
523- data := p .decompressBuffer .Bytes ()[:lenCompressed ]
524- if p .cryptoCtx .DataDecryptor != nil {
525- data = p .cryptoCtx .DataDecryptor .Decrypt (data )
526- }
527-
528- return p .codec .Decode (buf , data ), nil
529- }
530-
531533type dataheader interface {
532534 IsSetStatistics () bool
533535 GetStatistics () * format.Statistics
@@ -613,7 +615,7 @@ func (p *serializedPageReader) GetDictionaryPage() (*DictionaryPage, error) {
613615 return nil , nil
614616}
615617
616- func (p * serializedPageReader ) readPageHeader (rd parquet.BufferedReader , hdr * format.PageHeader ) error {
618+ func (p * serializedPageReader ) readPageHeader (rd parquet.BufferedReaderV2 , hdr * format.PageHeader ) error {
617619 allowedPgSz := defaultPageHeaderSize
618620 for {
619621 view , err := rd .Peek (allowedPgSz )
@@ -699,7 +701,7 @@ func (p *serializedPageReader) SeekToPageWithRow(rowIdx int64) error {
699701
700702// readOrStealData attempts to steal data from the buffered reader if enough is buffered,
701703// otherwise reads from the underlying reader into the provided buffer.
702- func (p * serializedPageReader ) readOrStealData (r parquet.BufferedReader , lenCompressed int , buffer * memory.Buffer ) ([]byte , error ) {
704+ func (p * serializedPageReader ) readOrStealData (r parquet.BufferedReaderV2 , lenCompressed int , buffer * memory.Buffer ) ([]byte , error ) {
703705 // if enough data is buffered, steal it to avoid an extra copy
704706 if r .Buffered () >= lenCompressed {
705707 data , err := r .Peek (lenCompressed )
@@ -727,7 +729,7 @@ func (p *serializedPageReader) readOrStealData(r parquet.BufferedReader, lenComp
727729}
728730
729731func (p * serializedPageReader ) getPageBytesV1 (
730- r parquet.BufferedReader , isCompressed bool , lenCompressed , lenUncompressed int , buffer * memory.Buffer ,
732+ r parquet.BufferedReaderV2 , isCompressed bool , lenCompressed , lenUncompressed int , buffer * memory.Buffer ,
731733) ([]byte , error ) {
732734 // 8 possible cases:
733735 // 1. enough data buffered (r.Buffered() >= lenCompressed)
@@ -773,7 +775,7 @@ func (p *serializedPageReader) getPageBytesV1(
773775 return data , nil
774776}
775777
776- func (p * serializedPageReader ) readV2UnencryptedCompressedWithLevels (r parquet.BufferedReader , lenCompressed , lenUncompressed , levelsBytelen int , buffer * memory.Buffer ) ([]byte , error ) {
778+ func (p * serializedPageReader ) readV2UnencryptedCompressedWithLevels (r parquet.BufferedReaderV2 , lenCompressed , lenUncompressed , levelsBytelen int , buffer * memory.Buffer ) ([]byte , error ) {
777779 // Special case: unencrypted + compressed + has levels
778780 // Read levels directly into output buffer, compressed data into decompress buffer
779781 buffer .ResizeNoShrink (lenUncompressed )
@@ -800,7 +802,7 @@ func (p *serializedPageReader) readV2UnencryptedCompressedWithLevels(r parquet.B
800802}
801803
802804func (p * serializedPageReader ) getPageBytesV2 (
803- r parquet.BufferedReader , isCompressed bool , lenCompressed , lenUncompressed , levelsBytelen int , buffer * memory.Buffer ,
805+ r parquet.BufferedReaderV2 , isCompressed bool , lenCompressed , lenUncompressed , levelsBytelen int , buffer * memory.Buffer ,
804806) ([]byte , error ) {
805807 // Special case: unencrypted + compressed + has levels - read levels and compressed data separately
806808 if r .Buffered () < lenCompressed && p .cryptoCtx .DataDecryptor == nil && isCompressed && levelsBytelen > 0 {
0 commit comments