@@ -596,6 +596,8 @@ unique_ptr<ParquetColumnSchema> ParquetReader::ParseSchema() {
596596 if (root.type .id () != LogicalTypeId::STRUCT) {
597597 throw InvalidInputException (" Root element of Parquet file must be a struct" );
598598 }
599+ // parse the column orders (if any)
600+ ParseColumnOrders (root, *file_meta_data);
599601 D_ASSERT (next_schema_idx == file_meta_data->schema .size () - 1 );
600602 D_ASSERT (file_meta_data->row_groups .empty () || next_file_idx == file_meta_data->row_groups [0 ].columns .size ());
601603 if (parquet_options.file_row_number ) {
@@ -611,6 +613,33 @@ unique_ptr<ParquetColumnSchema> ParquetReader::ParseSchema() {
611613 return make_uniq<ParquetColumnSchema>(root);
612614}
613615
616+ void ParquetReader::ParseColumnOrdersRecursive (ParquetColumnSchema &column_schema,
617+ const duckdb_parquet::FileMetaData &file_meta_data,
618+ idx_t &column_order_idx) {
619+ if (column_order_idx >= file_meta_data.column_orders .size ()) {
620+ // exhausted the column order set
621+ return ;
622+ }
623+ if (column_schema.children .empty ()) {
624+ // root schema - read the order
625+ auto &order = file_meta_data.column_orders [column_order_idx];
626+ if (order.__isset .IEEE_754_TOTAL_ORDER ) {
627+ column_schema.type_order = ParquetTypeOrder::IEEE_754_TOTAL_ORDER;
628+ }
629+ column_order_idx++;
630+ return ;
631+ }
632+ for (auto &child_schema : column_schema.children ) {
633+ ParseColumnOrdersRecursive (child_schema, file_meta_data, column_order_idx);
634+ }
635+ }
636+
637+ void ParquetReader::ParseColumnOrders (ParquetColumnSchema &column_schema,
638+ const duckdb_parquet::FileMetaData &file_meta_data) {
639+ idx_t column_order_idx = 0 ;
640+ ParseColumnOrdersRecursive (column_schema, file_meta_data, column_order_idx);
641+ }
642+
614643MultiFileColumnDefinition ParquetReader::ParseColumnDefinition (const FileMetaData &file_meta_data,
615644 ParquetColumnSchema &element) {
616645 MultiFileColumnDefinition result (element.name , element.type );
0 commit comments