@@ -213,38 +213,40 @@ func (c *ReaderConfig) Validate() error {
213213// CreatedBy: "my test program",
214214// })
215215type WriterConfig struct {
216- CreatedBy string
217- ColumnPageBuffers BufferPool
218- ColumnIndexSizeLimit int
219- PageBufferSize int
220- WriteBufferSize int
221- DataPageVersion int
222- DataPageStatistics bool
223- MaxRowsPerRowGroup int64
224- KeyValueMetadata map [string ]string
225- Schema * Schema
226- BloomFilters []BloomFilterColumn
227- Compression compress.Codec
228- Sorting SortingConfig
229- SkipPageBounds [][]string
230- Encodings map [Kind ]encoding.Encoding
231- DictionaryMaxBytes int64
232- SchemaConfig * SchemaConfig
216+ CreatedBy string
217+ ColumnPageBuffers BufferPool
218+ ColumnIndexSizeLimit int
219+ PageBufferSize int
220+ WriteBufferSize int
221+ DataPageVersion int
222+ DataPageStatistics bool
223+ MaxRowsPerRowGroup int64
224+ KeyValueMetadata map [string ]string
225+ Schema * Schema
226+ BloomFilters []BloomFilterColumn
227+ Compression compress.Codec
228+ Sorting SortingConfig
229+ SkipPageBounds [][]string
230+ Encodings map [Kind ]encoding.Encoding
231+ DictionaryMaxBytes int64
232+ SchemaConfig * SchemaConfig
233+ WriteZeroOptionalFields bool
233234}
234235
235236// DefaultWriterConfig returns a new WriterConfig value initialized with the
236237// default writer configuration.
237238func DefaultWriterConfig () * WriterConfig {
238239 return & WriterConfig {
239- CreatedBy : defaultCreatedBy (),
240- ColumnPageBuffers : & defaultColumnBufferPool ,
241- ColumnIndexSizeLimit : DefaultColumnIndexSizeLimit ,
242- PageBufferSize : DefaultPageBufferSize ,
243- WriteBufferSize : DefaultWriteBufferSize ,
244- DataPageVersion : DefaultDataPageVersion ,
245- DataPageStatistics : DefaultDataPageStatistics ,
246- MaxRowsPerRowGroup : DefaultMaxRowsPerRowGroup ,
247- SchemaConfig : DefaultSchemaConfig (),
240+ CreatedBy : defaultCreatedBy (),
241+ ColumnPageBuffers : & defaultColumnBufferPool ,
242+ ColumnIndexSizeLimit : DefaultColumnIndexSizeLimit ,
243+ PageBufferSize : DefaultPageBufferSize ,
244+ WriteBufferSize : DefaultWriteBufferSize ,
245+ DataPageVersion : DefaultDataPageVersion ,
246+ DataPageStatistics : DefaultDataPageStatistics ,
247+ MaxRowsPerRowGroup : DefaultMaxRowsPerRowGroup ,
248+ SchemaConfig : DefaultSchemaConfig (),
249+ WriteZeroOptionalFields : false ,
248250 Sorting : SortingConfig {
249251 SortingBuffers : & defaultSortingBufferPool ,
250252 },
@@ -288,22 +290,23 @@ func (c *WriterConfig) ConfigureWriter(config *WriterConfig) {
288290 }
289291
290292 * config = WriterConfig {
291- CreatedBy : coalesceString (c .CreatedBy , config .CreatedBy ),
292- ColumnPageBuffers : coalesceBufferPool (c .ColumnPageBuffers , config .ColumnPageBuffers ),
293- ColumnIndexSizeLimit : coalesceInt (c .ColumnIndexSizeLimit , config .ColumnIndexSizeLimit ),
294- PageBufferSize : coalesceInt (c .PageBufferSize , config .PageBufferSize ),
295- WriteBufferSize : coalesceInt (c .WriteBufferSize , config .WriteBufferSize ),
296- DataPageVersion : coalesceInt (c .DataPageVersion , config .DataPageVersion ),
297- DataPageStatistics : coalesceBool (c .DataPageStatistics , config .DataPageStatistics ),
298- MaxRowsPerRowGroup : coalesceInt64 (c .MaxRowsPerRowGroup , config .MaxRowsPerRowGroup ),
299- KeyValueMetadata : keyValueMetadata ,
300- Schema : coalesceSchema (c .Schema , config .Schema ),
301- BloomFilters : coalesceBloomFilters (c .BloomFilters , config .BloomFilters ),
302- Compression : coalesceCompression (c .Compression , config .Compression ),
303- Sorting : coalesceSortingConfig (c .Sorting , config .Sorting ),
304- SkipPageBounds : coalesceSkipPageBounds (c .SkipPageBounds , config .SkipPageBounds ),
305- Encodings : encodings ,
306- SchemaConfig : coalesceSchemaConfig (c .SchemaConfig , config .SchemaConfig ),
293+ CreatedBy : coalesceString (c .CreatedBy , config .CreatedBy ),
294+ ColumnPageBuffers : coalesceBufferPool (c .ColumnPageBuffers , config .ColumnPageBuffers ),
295+ ColumnIndexSizeLimit : coalesceInt (c .ColumnIndexSizeLimit , config .ColumnIndexSizeLimit ),
296+ PageBufferSize : coalesceInt (c .PageBufferSize , config .PageBufferSize ),
297+ WriteBufferSize : coalesceInt (c .WriteBufferSize , config .WriteBufferSize ),
298+ DataPageVersion : coalesceInt (c .DataPageVersion , config .DataPageVersion ),
299+ DataPageStatistics : coalesceBool (c .DataPageStatistics , config .DataPageStatistics ),
300+ MaxRowsPerRowGroup : coalesceInt64 (c .MaxRowsPerRowGroup , config .MaxRowsPerRowGroup ),
301+ KeyValueMetadata : keyValueMetadata ,
302+ Schema : coalesceSchema (c .Schema , config .Schema ),
303+ BloomFilters : coalesceBloomFilters (c .BloomFilters , config .BloomFilters ),
304+ Compression : coalesceCompression (c .Compression , config .Compression ),
305+ Sorting : coalesceSortingConfig (c .Sorting , config .Sorting ),
306+ SkipPageBounds : coalesceSkipPageBounds (c .SkipPageBounds , config .SkipPageBounds ),
307+ Encodings : encodings ,
308+ SchemaConfig : coalesceSchemaConfig (c .SchemaConfig , config .SchemaConfig ),
309+ WriteZeroOptionalFields : coalesceBool (c .WriteZeroOptionalFields , config .WriteZeroOptionalFields ),
307310 }
308311}
309312
@@ -688,6 +691,18 @@ func SkipPageBounds(path ...string) WriterOption {
688691 return writerOption (func (config * WriterConfig ) { config .SkipPageBounds = append (config .SkipPageBounds , path ) })
689692}
690693
694+ // WriteZeroOptionalFields creates a configuration option which forces the writer
695+ // to always encode optional thrift fields even when they have zero values.
696+ // This is useful for compatibility with systems like Snowflake that require
697+ // explicit null counts in statistics even when they are zero.
698+ //
699+ // Defaults to false (zero-valued optional fields are omitted).
700+ func WriteZeroOptionalFields (enabled bool ) WriterOption {
701+ return writerOption (func (config * WriterConfig ) {
702+ config .WriteZeroOptionalFields = enabled
703+ })
704+ }
705+
691706// DefaultEncodingFor creates a configuration option which sets the default encoding
692707// used by a writer for columns with the specified primitive type where none were defined.
693708//
0 commit comments