Skip to content

Commit 6a9631a

Browse files
Deepak Majetiwesm
authored andcommitted
PARQUET-793: Do not return incorrect statistics
Author: Deepak Majeti <deepak.majeti@hpe.com> Closes apache#239 from majetideepak/FixStats and squashes the following commits: 948c9b9 [Deepak Majeti] fix failing test ea0693f [Deepak Majeti] review comments dbb8569 [Deepak Majeti] minor fix 75d392a [Deepak Majeti] format e89f85f [Deepak Majeti] stats test and comments 800e239 [Deepak Majeti] added tests 92f31cd [Deepak Majeti] Return only Signed stats feeeb88 [Deepak Majeti] Update Version and add checkCorrectStatistics Change-Id: Id8e86893e0987849cf08e20793daf9fbefcb9f37
1 parent ee62a34 commit 6a9631a

5 files changed

Lines changed: 271 additions & 80 deletions

File tree

cpp/src/parquet/column/statistics-test.cc

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
#include "parquet/file/reader.h"
3333
#include "parquet/file/writer.h"
3434
#include "parquet/schema.h"
35+
#include "parquet/thrift.h"
3536
#include "parquet/types.h"
3637
#include "parquet/util/memory.h"
3738

@@ -167,6 +168,7 @@ class TestRowGroupStatistics : public PrimitiveTypedTest<TestType> {
167168
auto file_reader = ParquetFileReader::Open(source);
168169
auto rg_reader = file_reader->RowGroup(0);
169170
auto column_chunk = rg_reader->metadata()->ColumnChunk(0);
171+
if (!column_chunk->is_stats_set()) return;
170172
std::shared_ptr<RowGroupStatistics> stats = column_chunk->statistics();
171173
// check values after serialization + deserialization
172174
ASSERT_EQ(null_count, stats->null_count());
@@ -308,5 +310,49 @@ TYPED_TEST(TestNumericRowGroupStatistics, Merge) {
308310
this->TestMerge();
309311
}
310312

313+
TEST(CorruptStatistics, Basics) {
314+
ApplicationVersion version("parquet-mr version 1.8.0");
315+
SchemaDescriptor schema;
316+
schema::NodePtr node;
317+
std::vector<schema::NodePtr> fields;
318+
// Test Physical Types
319+
fields.push_back(schema::PrimitiveNode::Make(
320+
"col1", Repetition::OPTIONAL, Type::INT32, LogicalType::NONE));
321+
fields.push_back(schema::PrimitiveNode::Make(
322+
"col2", Repetition::OPTIONAL, Type::BYTE_ARRAY, LogicalType::NONE));
323+
// Test Logical Types
324+
fields.push_back(schema::PrimitiveNode::Make(
325+
"col3", Repetition::OPTIONAL, Type::INT32, LogicalType::DATE));
326+
fields.push_back(schema::PrimitiveNode::Make(
327+
"col4", Repetition::OPTIONAL, Type::INT32, LogicalType::UINT_32));
328+
fields.push_back(schema::PrimitiveNode::Make("col5", Repetition::OPTIONAL,
329+
Type::FIXED_LEN_BYTE_ARRAY, LogicalType::INTERVAL, 12));
330+
fields.push_back(schema::PrimitiveNode::Make(
331+
"col6", Repetition::OPTIONAL, Type::BYTE_ARRAY, LogicalType::UTF8));
332+
node = schema::GroupNode::Make("schema", Repetition::REQUIRED, fields);
333+
schema.Init(node);
334+
335+
format::ColumnChunk col_chunk;
336+
col_chunk.meta_data.__isset.statistics = true;
337+
auto column_chunk1 = ColumnChunkMetaData::Make(
338+
reinterpret_cast<const uint8_t*>(&col_chunk), schema.Column(0), &version);
339+
ASSERT_TRUE(column_chunk1->is_stats_set());
340+
auto column_chunk2 = ColumnChunkMetaData::Make(
341+
reinterpret_cast<const uint8_t*>(&col_chunk), schema.Column(1), &version);
342+
ASSERT_FALSE(column_chunk2->is_stats_set());
343+
auto column_chunk3 = ColumnChunkMetaData::Make(
344+
reinterpret_cast<const uint8_t*>(&col_chunk), schema.Column(2), &version);
345+
ASSERT_TRUE(column_chunk3->is_stats_set());
346+
auto column_chunk4 = ColumnChunkMetaData::Make(
347+
reinterpret_cast<const uint8_t*>(&col_chunk), schema.Column(3), &version);
348+
ASSERT_FALSE(column_chunk4->is_stats_set());
349+
auto column_chunk5 = ColumnChunkMetaData::Make(
350+
reinterpret_cast<const uint8_t*>(&col_chunk), schema.Column(4), &version);
351+
ASSERT_FALSE(column_chunk5->is_stats_set());
352+
auto column_chunk6 = ColumnChunkMetaData::Make(
353+
reinterpret_cast<const uint8_t*>(&col_chunk), schema.Column(5), &version);
354+
ASSERT_FALSE(column_chunk6->is_stats_set());
355+
}
356+
311357
} // namespace test
312358
} // namespace parquet

cpp/src/parquet/file/file-metadata-test.cc

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -181,13 +181,29 @@ TEST(Metadata, TestV1Version) {
181181
ASSERT_EQ(ParquetVersion::PARQUET_1_0, f_accessor->version());
182182
}
183183

184-
TEST(FileVersion, Basics) {
185-
FileMetaData::Version version("parquet-mr version 1.2.8");
184+
TEST(ApplicationVersion, Basics) {
185+
ApplicationVersion version("parquet-mr version 1.7.9");
186+
ApplicationVersion version1("parquet-mr version 1.8.0");
187+
ApplicationVersion version2("parquet-cpp version 1.0.0");
188+
ApplicationVersion version3("");
186189

187190
ASSERT_EQ("parquet-mr", version.application);
188191
ASSERT_EQ(1, version.version.major);
189-
ASSERT_EQ(2, version.version.minor);
190-
ASSERT_EQ(8, version.version.patch);
192+
ASSERT_EQ(7, version.version.minor);
193+
ASSERT_EQ(9, version.version.patch);
194+
195+
ASSERT_EQ("parquet-cpp", version2.application);
196+
ASSERT_EQ(1, version2.version.major);
197+
ASSERT_EQ(0, version2.version.minor);
198+
ASSERT_EQ(0, version2.version.patch);
199+
200+
ASSERT_EQ(true, version.VersionLt(version1));
201+
202+
ASSERT_FALSE(version1.HasCorrectStatistics(Type::INT96));
203+
ASSERT_TRUE(version.HasCorrectStatistics(Type::INT32));
204+
ASSERT_FALSE(version.HasCorrectStatistics(Type::BYTE_ARRAY));
205+
ASSERT_TRUE(version1.HasCorrectStatistics(Type::BYTE_ARRAY));
206+
ASSERT_TRUE(version3.HasCorrectStatistics(Type::FIXED_LEN_BYTE_ARRAY));
191207
}
192208

193209
} // namespace metadata

0 commit comments

Comments
 (0)