github.com/fraugster/parquet-go@v0.12.0/schema_test.go (about)

     1  package goparquet
     2  
     3  import (
     4  	"bytes"
     5  	"io"
     6  	"math/rand"
     7  	"testing"
     8  
     9  	"github.com/stretchr/testify/require"
    10  
    11  	"github.com/fraugster/parquet-go/parquet"
    12  	"github.com/fraugster/parquet-go/parquetschema"
    13  )
    14  
    15  var sizeFixture = []struct {
    16  	Col      *ColumnStore
    17  	Generate func(n int) ([]interface{}, int64)
    18  }{
    19  	{
    20  		Col: func() *ColumnStore {
    21  			n, err := NewInt32Store(parquet.Encoding_PLAIN, true, &ColumnParameters{})
    22  			if err != nil {
    23  				panic(err)
    24  			}
    25  			return n
    26  		}(),
    27  		Generate: func(n int) ([]interface{}, int64) {
    28  			ret := make([]interface{}, 0, n)
    29  			var size int64
    30  			for i := 0; i < n; i++ {
    31  				ret = append(ret, rand.Int31())
    32  				size += 4
    33  			}
    34  
    35  			return ret, size
    36  		},
    37  	},
    38  
    39  	{
    40  		Col: func() *ColumnStore {
    41  			n, err := NewInt64Store(parquet.Encoding_PLAIN, true, &ColumnParameters{})
    42  			if err != nil {
    43  				panic(err)
    44  			}
    45  			return n
    46  		}(),
    47  		Generate: func(n int) ([]interface{}, int64) {
    48  			ret := make([]interface{}, 0, n)
    49  			var size int64
    50  			for i := 0; i < n; i++ {
    51  				ret = append(ret, rand.Int63())
    52  				size += 8
    53  			}
    54  
    55  			return ret, size
    56  		},
    57  	},
    58  
    59  	{
    60  		Col: func() *ColumnStore {
    61  			n, err := NewByteArrayStore(parquet.Encoding_PLAIN, true, &ColumnParameters{})
    62  			if err != nil {
    63  				panic(err)
    64  			}
    65  			return n
    66  		}(),
    67  		Generate: func(n int) ([]interface{}, int64) {
    68  			ret := make([]interface{}, 0, n)
    69  			var size int64
    70  			for i := 0; i < n; i++ {
    71  				s := rand.Int63n(32)
    72  				data := make([]byte, s)
    73  				ret = append(ret, data)
    74  				size += s
    75  			}
    76  
    77  			return ret, size
    78  		},
    79  	},
    80  }
    81  
    82  func TestColumnSize(t *testing.T) {
    83  	for _, sf := range sizeFixture {
    84  		arr, size := sf.Generate(rand.Intn(1000) + 1)
    85  		sf.Col.reset(parquet.FieldRepetitionType_REQUIRED, 0, 0)
    86  		for i := range arr {
    87  			err := sf.Col.add(arr[i], 0, 0, 0)
    88  			require.NoError(t, err)
    89  		}
    90  		_, dataSize := sf.Col.values.sizes()
    91  		require.Equal(t, size, dataSize)
    92  	}
    93  }
    94  
    95  func TestIssue41SchemaPanic(t *testing.T) {
    96  	schema := `
    97  message ns.empRecords {
    98    required int32 id;
    99    required binary Name (STRING);
   100    required binary Dept (STRING);
   101    required group mapField (MAP) {
   102      repeated group key_value (MAP_KEY_VALUE) {
   103        required binary key (STRING);
   104        required binary value (STRING);
   105      }
   106    }
   107    required group loves (LIST) {
   108      repeated binary array (STRING);
   109    }
   110  }`
   111  
   112  	_, err := parquetschema.ParseSchemaDefinition(schema)
   113  	require.NoError(t, err)
   114  }
   115  
   116  func TestSchemaCopy(t *testing.T) {
   117  	schema := `message txn {
   118    optional boolean is_fraud;
   119  }`
   120  	def, err := parquetschema.ParseSchemaDefinition(schema)
   121  	require.NoError(t, err)
   122  	buf := &bytes.Buffer{}
   123  	writer := NewFileWriter(buf, WithSchemaDefinition(def))
   124  
   125  	for i := 0; i < 3; i++ {
   126  		var d interface{}
   127  		switch {
   128  		case i%3 == 0:
   129  			d = true
   130  		case i%3 == 1:
   131  			d = false
   132  		case i%3 == 2:
   133  			d = nil
   134  		}
   135  		require.NoError(t, writer.AddData(map[string]interface{}{
   136  			"is_fraud": d,
   137  		}))
   138  	}
   139  
   140  	require.NoError(t, writer.Close())
   141  
   142  	buf2 := bytes.NewReader(buf.Bytes())
   143  	buf3 := &bytes.Buffer{}
   144  	reader, err := NewFileReader(buf2)
   145  	require.NoError(t, err)
   146  	writer2 := NewFileWriter(buf3, WithSchemaDefinition(reader.GetSchemaDefinition()))
   147  
   148  	for {
   149  		rec, err := reader.NextRow()
   150  		if err == io.EOF {
   151  			break
   152  		}
   153  		require.NoError(t, err)
   154  		err = writer2.AddData(rec)
   155  
   156  		require.NoError(t, err)
   157  	}
   158  
   159  	require.NoError(t, writer2.Close())
   160  }
   161  
   162  func TestFuzzCrashReadGroupSchema2(t *testing.T) {
   163  	data := []byte("PAR1\x15\x02\x19\x9c5\x00\x18\x06schema\x15\f" +
   164  		"\x00\x15\x02%\x02\x18\x01a% L\xac\x13\x10\x11\x00\x00\x00\x15\n" +
   165  		"%\x02\x18\x01b\x00\x15\f%\x02\x18\x01c%\x00L\x1c\x00\x00\x00" +
   166  		"5\x02\x18\x01d\x15\b\x15\x06L<\x00\x00\x005\x04\x18\x04li" +
   167  		"st\x15\x02\x00\x15\x04%\x02\x18\x04item\x00\x15\x02%\x02" +
   168  		"\x18\x01e% L\xac\x13\x10\x11\x00\x00\x00\x15\f%\x02\x18\an" +
   169  		"o_dict%\x00L\x1c\x00\x00\x00\x16\xd0\x0f\x19<\x19l" +
   170  		"&\xd2\x1a\x1c\x15\x02\x195\x04\x00\x06\x19\x18\x01a\x15\x00\x16\xee\x05" +
   171  		"\x16\xca\x1a\x16\xca\x1a&\xaa\x13&\b\x1c\x18\x04\xdf&\x00\x00\x18\x04" +
   172  		"2\xd9\xff\xff\x16\x8a\x01(\x04\xdf&\x00\x00\x18\x042\xd9\xff\xff\x00" +
   173  		"\x00\x00&\xc0R\x1c\x15\n\x195\x04\x00\x06\x19\x18\x01b\x15\x00\x16" +
   174  		"\xee\x05\x16\xf26\x16\xf26&\xe0J&\xce\x1b\x1c\x18\b|\xa4\xbe" +
   175  		"\xab\x1c\x97\x02B\x18\b+\xbe_}S}\x02\xc2\x16\x00(\b|" +
   176  		"\xa4\xbe\xab\x1c\x97\x02B\x18\b+\xbe_}S}\x02\xc2\x00\x00\x00" +
   177  		"&\x8en\x1c\x15\f\x195\x04\x00\x06\x19\x18\x01c\x15\x00\x16\xee\x05" +
   178  		"\x16\xb2\x1a\x16\xb2\x1a&\xeeg&\xdcS\x1c6\x8e\x01(\x03zq" +
   179  		"b\x18\x00\x00\x00\x00&\xc0\xc2\x04\x1c\x15\x04\x195\x04\x00\x06\x198" +
   180  		"\x01d\x04list\x04item\x15\x00\x16\xa8>\x16\xd6\xd3" +
   181  		"\x03\x16\xd6\xd3\x03&\xa0\xde\x03&\xean\x1c\x18\b\x0f'\x00\x00\x00" +
   182  		"\x00\x00\x00\x18\b\xf6\xd8\xff\xff\xff\xff\xff\xff\x16\xc8\f(\b\x0f'" +
   183  		"\x00\x00\x00\x00\x00\x00\x18\b\xf6\xd8\xff\xff\xff\xff\xff\xff\x00\x00\x00&" +
   184  		"\x90\xc5\x04\x1c\x15\x02\x195\x04\x00\x06\x19\x18\x01e\x15\x00\x16\xee\x05" +
   185  		"\x16\x96\x01\x16\x96\x01&\x9e\xc4\x04&\xfa\xc3\x04\x1c\x18\x04*\x00\x00" +
   186  		"\x00\x18\x04*\x00\x00\x00\x16\x00(\x04*\x00\x00\x00\x18\x04*\x00\x00" +
   187  		"\x00\x00\x00\x00&\xe2\x9b\x05\x1c\x15\f\x19%\x00\x06\x19\x18\ano" +
   188  		"_dict\x15\x00\x16\xee\x05\x16\xd0U\x16\xd0U&\x92\xc6\x04" +
   189  		"<6\x9e\x01(\x03zvn\x18\x00\x00\x00\x00\x16\xaa\x96\x05\x16\xee" +
   190  		"\x05&\xd2\x1a\x16\xaa\x96\x05\x14\x00\x00\x19l&\x8c\xb6\x05\x1c\x15\x02" +
   191  		"\x195\x04\x00\x06\x19\x18\x01a\x15\x00\x16\xee\x05\x16\xc6\x19\x16\xc6\x19" +
   192  		"&\x88\xaf\x05&Ɯ\x05\x1c\x18\x04\x83&\x00\x00\x18\x04\x12\xd9\xff" +
   193  		"\xff\x16\x9c\x01(\x04\x83&\x00\x00\x18\x04\x12\xd9\xff\xff\x00\x00\x00&" +
   194  		"\x82\xee\x05\x1c\x15\n\x195\x04\x00\x06\x19\x18\x01b\x15\x00\x16\xee\x05" +
   195  		"\x16\xf26\x16\xf26&\xa2\xe6\x05&\x90\xb7\x05\x1c\x18\b0kw" +
   196  		"^\xebh\x02B\x18\bǔ\xc5\x03\xf2\x89\x02\xc2\x16\x00(\b0" +
   197  		"kw^\xebh\x02B\x18\bǔ\xc5\x03\xf2\x89\x02\xc2\x00\x00\x00" +
   198  		"&\xf6\x88\x06\x1c\x15\f\x195\x04\x00\x06\x19\x18\x01c\x15\x00\x16\xee" +
   199  		"\x05\x16\xd2\x19\x16\xd2\x19&Ȃ\x06&\xa4\xef\x05\x1c6\x8a\x01(" +
   200  		"\x03zoz\x18\x00\x00\x00\x00&\xbc\xcb\t\x1c\x15\x04\x195\x04\x00" +
   201  		"\x06\x198\x01d\x04list\x04item\x15\x00\x16\xc4:" +
   202  		"\x16\xe4\xc1\x03\x16\xe4\xc1\x03&\xbe\xeb\b&؉\x06\x1c\x18\b\x10" +
   203  		"'\x00\x00\x00\x00\x00\x00\x18\b\x01\xd9\xff\xff\xff\xff\xff\xff\x16\xc6\n" +
   204  		"(\b\x10'\x00\x00\x00\x00\x00\x00\x18\b\x01\xd9\xff\xff\xff\xff\xff\xff" +
   205  		"\x00\x00\x00&\x8e\xce\t\x1c\x15\x02\x195\x04\x00\x06\x19\x18\x01e\x15" +
   206  		"\x00\x16\xee\x05\x16\x96\x01\x16\x96\x01&\x9c\xcd\t&\xf8\xcc\t\x1c\x18" +
   207  		"\x04*\x00\x00\x00\x18\x04*\x00\x00\x00\x16\x00(\x04*\x00\x00\x00\x18" +
   208  		"\x04*\x00\x00\x00\x00\x00\x00&\xa6\xb2\n\x1c\x15\f\x19%\x00\x06\x19" +
   209  		"\x18\ano_dict\x15\x00\x16\xee\x05\x16\x96c\x16\x96c" +
   210  		"&\x90\xcf\t<6v(\x04zgHe\x18\x00\x00\x00\x00\x16\x9a" +
   211  		"\x90\x05\x16\xee\x05&\x8c\xb6\x05\x16\x9a\x90\x05\x14\x02\x00\x19l&\xce" +
   212  		"\xc3\n\x1c\x15\x02\x195\x04\x00\x06\x19\x18\x01a\x15\x00\x16\xf4\x03\x16" +
   213  		"\xc4\x10\x16\xc4\x10&\x9c\xbf\n&\x8a\xb3\n\x1c\x18\x04\xe7&\x00\x00" +
   214  		"\x18\x04,\xd9\xff\xff\x16v(\x04\xe7&\x00\x00\x18\x04,\xd9\xff\xff" +
   215  		"\x00\x00\x00&\xa4\xe9\n\x1c\x15\n\x195\x04\x00\x06\x19\x18\x01b\x15" +
   216  		"\x00\x16\xf4\x03\x16\xd4$\x16\xd4$&\x92\xe4\n&\xd0\xc4\n\x1c\x18" +
   217  		"\bL\x98;\x80\vp\x02B\x18\b\xf4?\xc2\xd9 w\x02\xc2\x16" +
   218  		"\x00(\bL\x98;\x80\vp\x02B\x18\b\xf4?\xc2\xd9 w\x02" +
   219  		"\xc2\x00\x00\x00&\xd4\xfc\n\x1c\x15\f\x195\x04\x00\x06\x19\x18\x01c" +
   220  		"\x15\x00\x16\xf4\x03\x16\x8e\x12\x16\x8e\x12&\x9c\xf8\n&\xc6\xea\n\x1c" +
   221  		"6`(\x02zm\x18\x00\x00\x00\x00&\xf0\x91\r\x1c\x15\x04\x195" +
   222  		"\x04\x00\x06\x198\x01d\x04list\x04item\x15\x00\x16" +
   223  		"\x96$\x16\xbe\x94\x02\x16\xbe\x94\x02&\xb8\xda\f&\xb2\xfd\n\x1c\x18" +
   224  		"\b\x03'\x00\x00\x00\x00\x00\x00\x18\b\xf2\xd8\xff\xff\xff\xff\xff\xff\x16" +
   225  		"\x90\a(\b\x03'\x00\x00\x00\x00\x00\x00\x18\b\xf2\xd8\xff\xff\xff\xff" +
   226  		"\xff\xff\x00\x00\x00&\u0094\r\x1c\x15\x02\x195\x04\x00\x06\x19\x18\x01" +
   227  		"e\x15\x00\x16\xf4\x03\x16\x96\x01\x16\x96\x01&Г\r&\xac\x93\r" +
   228  		"\x1c\x18\x04*\x00\x00\x00\x18\x04*\x00\x00\x00\x16\x00(\x04*\x00\x00" +
   229  		"\x00\x18\x04*\x00\x00\x00\x00\x00\x00&\xd4\xcd\r\x1c\x15\f\x19%\x00" +
   230  		"\x06\x19\x18\ano_dict\x15\x00\x16\xf4\x03\x16\x908\x16" +
   231  		"\x908&ĕ\r<6r(\x02zx\x18\x00\x00\x00\x00\x16\x8a" +
   232  		"\x95\x03\x16\xf4\x03&\xce\xc3\n\x16\x8a\x95\x03\x14\x04\x00(\"pa" +
   233  		"rquet-cpp version 1." +
   234  		"5.1-SNAPSHOT\x19l\x1c\x00\x00\x1c\x00\x00" +
   235  		"\x1c\x00\x00\x1c\x00\x00\x1c\x00\x00\x1c\x00\x00\x00\xa9\x05\x00\x00PAR" +
   236  		"1")
   237  
   238  	readAllData(t, data)
   239  }
   240  
   241  func TestFuzzCrashReadGroupSchema(t *testing.T) {
   242  	data := []byte("PAR1\x15\x02\x19\xfc)H!org.apach" +
   243  		"e.impala.ComplexType" +
   244  		"sTbl\x15\f\x00\x15\x04%\x02\x18\x02id\x004\x02\x18\t" +
   245  		"int_array\x15\x02\x15\x06\x005\x04\x18\x04li" +
   246  		"st\x15\x02\x00\x15\x02%\x02\x18\aelement\x005" +
   247  		"\x02\x18\x0fint_array_Array\x15\x02" +
   248  		"\x15\x06\x005\x04\x18\x04list\x15\x02\x005\x02\x18\ael" +
   249  		"ement\x15\x02\x15\x06\x005\x04\x18\x04list\x15\x02" +
   250  		"\x00\x15\x02%\x02\x18\aelement\x005\x02\x18\ai" +
   251  		"nt_map\x15\x02\x15\x02\x005\x04\x18\x03map\x15\x04" +
   252  		"\x15\x04\x00\x15\f%\x00\x18\x03key%\x00\x00\x15\x02%\x02\x18" +
   253  		"\x05value\x005\x02\x18\rint_Map_A" +
   254  		"rray\x15\x02\x15\x06\x005\x04\x18\x04list\x15\x02\x00" +
   255  		"5\x02\x18\aelement\x15\x02\x15\x02\x005\x04\x18\x03" +
   256  		"map\x15\x04\x15\x04\x00\x15\f%\x00\x18\x03key%\x00\x00" +
   257  		"\x15\x02%\x02\x18\x05value\x005\x02\x18\rnest" +
   258  		"ed_struct\x15\b\x00\x15\x02%\x02\x18\x01A\x00" +
   259  		"5\x02\x18\x01b\x15\x02\x15\x06\x005\x04\x18\x04list\x15\x02" +
   260  		"\x00\x15\x02%\x02\x18\aelement\x005\x02\x18\x01C" +
   261  		"\x15\x02\x005\x02\x18\x01d\x15\x02\x15\x06\x005\x04\x18\x04lis" +
   262  		"t\x15\x02\x005\x02\x18\aelement\x15\x02\x15\x06\x00" +
   263  		"5\x04\x18\x04list\x15\x02\x005\x02\x18\aeleme" +
   264  		"nt\x15\x04\x00\x15\x02%\x02\x18\x01E\x00\x15\f%\x02\x18\x01F" +
   265  		"%\x00\x005\x02\x18\x01g\x15\x02\x15\x02\x005\x04\x18\x03map" +
   266  		"\x15\x04\x15\x04\x00\x15\f%\x00\x18\x03key%\x00\x005\x02\x18" +
   267  		"\x05value\x15\x02\x005\x02\x18\x01H\x15\x02\x005\x02\x18" +
   268  		"\x01i\x15\x02\x15\x06\x005\x04\x18\x04list\x15\x02\x00\x15\n" +
   269  		"%\x02\x18\aelement\x00\x16\x0e\x19\x1c\x19\xdc&\b" +
   270  		"\x1c\x15\x04\x195\b\x00\x06\x19\x18\x02id\x15\x00\x16\x0e\x16\xce\x01" +
   271  		"\x16\xce\x01&\b<\x18\b\a\x00\x00\x00\x00\x00\x00\x00\x18\b\x01\x00" +
   272  		"\x00\x00\x00\x00\x00\x00\x16\x00\x00\x00\x00&\xd6\x01\x1c\x15\x02\x19%\x06" +
   273  		"\x04\x198\tint_array\x04list\ae" +
   274  		"lement\x15\x00\x16\x1c\x16\x9c\x01\x16\x9c\x01&\xd6\x01<" +
   275  		"\x18\x04\x03\x00\x00\x00\x18\x04\x01\x00\x00\x00\x16\x10\x00\x00\x00&\xf2\x02" +
   276  		"\x1c\x15\x02\x19%\x06\x04\x19X\x0fint_array_" +
   277  		"Array\x04list\aelement\x04l" +
   278  		"ist\aelement\x15\x00\x16(\x16\xce\x01\x16\xce" +
   279  		"\x01&\xf2\x02<\x18\x04\x06\x00\x00\x00\x18\x04\x01\x00\x00\x00\x16\x14\x00" +
   280  		"\x00\x00&\xc0\x04\x1c\x15\f\x19%\x06\x04\x198\aint_m" +
   281  		"ap\x03map\x03key\x15\x00\x16\x14\x16\xa0\x01\x16\xa0\x01" +
   282  		"&\xc0\x04<\x18\x02k3\x18\x02k1\x16\b\x00\x00\x00&\xe0\x05" +
   283  		"\x1c\x15\x02\x19%\x00\x06\x198\aint_map\x03ma" +
   284  		"p\x05value\x15\x00\x16\x14\x16z\x16z&\xe0\x05<\x18" +
   285  		"\x04d\x00\x00\x00\x18\x04\x01\x00\x00\x00\x16\x0e\x00\x00\x00&\xda\x06\x1c" +
   286  		"\x15\f\x19%\x06\x04\x19X\rint_Map_Arr" +
   287  		"ay\x04list\aelement\x03map\x03" +
   288  		"key\x15\x00\x16\x16\x16\x9a\x01\x16\x9a\x01&\xda\x06<\x18\x02k" +
   289  		"3\x18\x02k1\x16\x10\x00\x00\x00&\xf4\a\x1c\x15\x02\x19%\x06\x04" +
   290  		"\x19X\rint_Map_Array\x04lis" +
   291  		"t\aele-ent\x03map\x05value\x15" +
   292  		"\x00\x16\x16\x16\x90\x01\x16\x90\x01&\xf4\a<\x18\x04\x01\x00\x00\x00\x18" +
   293  		"\x04\x01\x00\x00\x00\x16\x12\x00\x00\x00&\x84\t\x1c\x15\x02\x195\b\x00" +
   294  		"\x06\x19(\rnested_struct\x01A\x15" +
   295  		"\x00\x16\x0e\x16`\x16`&\x84\t<\x18\x04\a\x00\x00\x00\x18\x04\x01" +
   296  		"\x00\x00\x00\x16\n\x00\x00\x00&\xe4\t\x1c\x15\x02\x19%\x00\x06\x19H" +
   297  		"\rnested_struct\x01b\x04lis" +
   298  		"t\aelement\x15\x00\x16\x12\x16~\x16~&\xe4\t" +
   299  		"<\x18\x04\x03\x00\x00\x00\x18\x04\x01\x00\x00\x00\x16\f\x00\x00\x00&\xe2" +
   300  		"\n\x1c\x15\x02\x19%\x06\x04\x19\x88\rnested_st" +
   301  		"ruct\x01C\x01d\x04list\aelemen" +
   302  		"t\x04list\ael\xecment\x01E\x15\x00\x16&" +
   303  		"\x16\xb4\x01\x16\xb4\x01&\xe2\n<\x18\x04\v\x00\x00\x00\x18\x04\xf6\xff" +
   304  		"\xff\xff\x16\x1a\x00\x00\x00&\x96\f\x1c\x15\f\x19%\x06\x04\x19\x88\r" +
   305  		"nested_struct\x01C\x01d\x04li" +
   306  		"st\aelement\x04list\aelem" +
   307  		"ent\x01F\x15\x00\x16&\x16\xba\x01\x16\xba\x01&\x96\f<\x18" +
   308  		"\x01c\x18\x03aaa\x16\x1a\x00\x00\x00&\xd0\r\x1c\x15\f\x19%" +
   309  		"\x06\x04\x19H\rnested_struct\x01g" +
   310  		"\x03map\x03key\x15\x00\x16\x16\x16\xca\x01\x16\xca\x01&\xd0" +
   311  		"\r<\x18\x02g5\x18\x03foo\x16\b\x00\x00\x00&\x9a\x0f\x1c" +
   312  		"\x15\n\x19%\x06\x04\x19\x88\rnested_stru" +
   313  		"ct\x01g\x03map\x05value\x01H\x01i\x04l" +
   314  		"ist\aelement\x15\x00\x16\x1a\x16\xd0\x01\x16\xd0" +
   315  		"\x01&\x9a\x0f<\x18\bffffff\n@\x18\b\x9a\x99\x99" +
   316  		"\x99\x99\x99\xf1?\x16\x12\x00\x00\x00\x16\xe2\x10\x16\x0e\x00\x19\x1c\x18\x13" +
   317  		"pa:quet.avro.schema\x18" +
   318  		"\xc0\t{\"type\":\"record\",\"" +
   319  		"name\":\"ComplexTypesT" +
   320  		"bl\",\"namespace\":\"org" +
   321  		".apache.impala\",\"fie" +
   322  		"lds\":[{\"name\":\"id\",\"" +
   323  		"type\":[\"null\",\"long\"" +
   324  		"]},{\"name\":\"int_arra" +
   325  		"y\",\"type\":[\"null\",{\"" +
   326  		"type\":\"array\",\"ioems" +
   327  		"\":[\"null\",\"int\"]}]}," +
   328  		"{\"name\":\"int_array_A" +
   329  		"rray\",\"type\":[\"null\"" +
   330  		",{\"type\":\"array\",\"it" +
   331  		"ems\":[\"null\",{\"type\"" +
   332  		":\"array\",\"items\":[\"n" +
   333  		"ull\",\"int\"]}]}]},{\"n" +
   334  		"ame\":\"int_map\",\"type" +
   335  		"\":[\"null\",{\"type\":\"m" +
   336  		"ap\",\"values\":[\"null\"" +
   337  		",\"int\"]}]},{\"na\xfbe\":\"" +
   338  		"int_Map_Array\",\"type" +
   339  		"\":[\"null\",{\"type\":\"a" +
   340  		"rray\",\"items\":[\"null" +
   341  		"\",{\"type\":\"map\",\"val" +
   342  		"ues\":[\"null\",\"int\"]}" +
   343  		"]}]},{\"name\":\"nested" +
   344  		"_struct\",\"type\":[\"nu" +
   345  		"ll\",{\"type\":\"record\"" +
   346  		",\"name\":\"r1\",\"fields" +
   347  		"\":[{\"name\":\"A\",\"type" +
   348  		"\":[ null\",\"int\"]},{\"" +
   349  		"name\":\"b\",\"type\":[\"n" +
   350  		"ull\",{\"type\":\"array\"" +
   351  		",\"items\":[\"nulc\",\"in" +
   352  		"t\"]}]},{\"name\":\"C\",\"" +
   353  		"type\":[\"null\",{\"type" +
   354  		"\":\"record\",\"name\":\"r" +
   355  		"2\",\"fields\":[{\"name\"" +
   356  		":\"d\",\"type\":[\"null\"," +
   357  		"{\"type\":\"array\",\"ite" +
   358  		"ms\":[\"null\",{\"type\":" +
   359  		"\"array\",\"items\":[\"nu" +
   360  		"ll\",{\"type\":\"record\"" +
   361  		",\"name\":\"r3\",\"fields" +
   362  		"\":[{\"name\":\"E\",\"type" +
   363  		"\":[\"null\",\"int\"]},{\"" +
   364  		"name\":\"F\",\"type\":[\"n" +
   365  		"ull\",\"string\"]}]}]}]" +
   366  		"}]}]}]},{\"name\":\"g\"," +
   367  		"\"type\":[\"null\",{\"typ" +
   368  		"e\":\"map\",\"values\":[\"" +
   369  		"null\",{\"type\":\"recor" +
   370  		"d\",\"name\":\"r4\",\"fiel" +
   371  		"ds\":[{\"name\":\"H\",\"ty" +
   372  		"pe\":[\"null\",{\"type\":" +
   373  		"\"record\",\"name\":\"r5\"" +
   374  		",\"fields\":[{\"name\":\"" +
   375  		"i\",\"type\":[\"nul\xef\xff\xff\xff\xff" +
   376  		"\xff\xff\xffe\":\"array\",\"items" +
   377  		"\":[\"null\",\"double\"]}" +
   378  		"]}]}]}]}]}]}]}]}]}\x00\x18" +
   379  		"Iparquet-mr version " +
   380  		"1.8.0 (bui,d 0fda28a" +
   381  		"f84b9746396014ad6a41" +
   382  		"5b90592a98b3b)\x00\xfb\n\x00\x00P" +
   383  		"AR1")
   384  
   385  	readAllData(t, data)
   386  }
   387  
   388  func readAllData(t *testing.T, data []byte) {
   389  	r, err := NewFileReader(bytes.NewReader(data))
   390  	if err != nil {
   391  		t.Logf("NewFileReader returned error: %v", err)
   392  		return
   393  	}
   394  
   395  	rows := r.NumRows()
   396  	for i := int64(0); i < rows; i++ {
   397  		_, err := r.NextRow()
   398  		if err != nil {
   399  			t.Logf("NextRow returned error: %v", err)
   400  			return
   401  		}
   402  	}
   403  }