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 }