(&self, args: TableFunctionArgs)
| 323 | |
| 324 | impl TableFunctionImpl for ParquetMetadataFunc { |
| 325 | fn call_with_args(&self, args: TableFunctionArgs) -> Result<Arc<dyn TableProvider>> { |
| 326 | let exprs = args.exprs(); |
| 327 | let filename = match exprs.first() { |
| 328 | Some(Expr::Literal(ScalarValue::Utf8(Some(s)), _)) => s, // single quote: parquet_metadata('x.parquet') |
| 329 | Some(Expr::Column(Column { name, .. })) => name, // double quote: parquet_metadata("x.parquet") |
| 330 | _ => { |
| 331 | return plan_err!( |
| 332 | "parquet_metadata requires string argument as its input" |
| 333 | ); |
| 334 | } |
| 335 | }; |
| 336 | |
| 337 | let file = File::open(filename.clone())?; |
| 338 | let reader = SerializedFileReader::new(file)?; |
| 339 | let metadata = reader.metadata(); |
| 340 | |
| 341 | let schema = Arc::new(Schema::new(vec![ |
| 342 | Field::new("filename", DataType::Utf8, true), |
| 343 | Field::new("row_group_id", DataType::Int64, true), |
| 344 | Field::new("row_group_num_rows", DataType::Int64, true), |
| 345 | Field::new("row_group_num_columns", DataType::Int64, true), |
| 346 | Field::new("row_group_bytes", DataType::Int64, true), |
| 347 | Field::new("column_id", DataType::Int64, true), |
| 348 | Field::new("file_offset", DataType::Int64, true), |
| 349 | Field::new("num_values", DataType::Int64, true), |
| 350 | Field::new("path_in_schema", DataType::Utf8, true), |
| 351 | Field::new("type", DataType::Utf8, true), |
| 352 | Field::new("stats_min", DataType::Utf8, true), |
| 353 | Field::new("stats_max", DataType::Utf8, true), |
| 354 | Field::new("stats_null_count", DataType::Int64, true), |
| 355 | Field::new("stats_distinct_count", DataType::Int64, true), |
| 356 | Field::new("stats_min_value", DataType::Utf8, true), |
| 357 | Field::new("stats_max_value", DataType::Utf8, true), |
| 358 | Field::new("compression", DataType::Utf8, true), |
| 359 | Field::new("encodings", DataType::Utf8, true), |
| 360 | Field::new("index_page_offset", DataType::Int64, true), |
| 361 | Field::new("dictionary_page_offset", DataType::Int64, true), |
| 362 | Field::new("data_page_offset", DataType::Int64, true), |
| 363 | Field::new("total_compressed_size", DataType::Int64, true), |
| 364 | Field::new("total_uncompressed_size", DataType::Int64, true), |
| 365 | ])); |
| 366 | |
| 367 | // construct record batch from metadata |
| 368 | let mut filename_arr = vec![]; |
| 369 | let mut row_group_id_arr = vec![]; |
| 370 | let mut row_group_num_rows_arr = vec![]; |
| 371 | let mut row_group_num_columns_arr = vec![]; |
| 372 | let mut row_group_bytes_arr = vec![]; |
| 373 | let mut column_id_arr = vec![]; |
| 374 | let mut file_offset_arr = vec![]; |
| 375 | let mut num_values_arr = vec![]; |
| 376 | let mut path_in_schema_arr = vec![]; |
| 377 | let mut type_arr = vec![]; |
| 378 | let mut stats_min_arr = vec![]; |
| 379 | let mut stats_max_arr = vec![]; |
| 380 | let mut stats_null_count_arr = vec![]; |
| 381 | let mut stats_distinct_count_arr = vec![]; |
| 382 | let mut stats_min_value_arr = vec![]; |
nothing calls this directly
no test coverage detected