Skip to content

[feat] add Parquet metadata TVF - #58972

Merged
morningman merged 51 commits into
apache:masterfrom
xylaaaaa:impl_parquet_metadata
Dec 23, 2025
Merged

morningman merged 51 commits into
apache:masterfrom
xylaaaaa:impl_parquet_metadata

Conversation

@xylaaaaa

@xylaaaaa xylaaaaa commented Dec 11, 2025 •

Copy link
Copy Markdown
Contributor

What problem does this PR solve?

Expose Parquet file metadata via a table-valued function for inspection and debugging.

Issue Number: close #xxx

Related PR: #xxx

Problem Summary:

  • Add a Parquet metadata TVF so users can query Parquet file metadata via SQL.
  • Backend adds a Parquet metadata reader and scan path; frontend wires the TVF definition.
  • Enables easy inspection of partitions/row groups/column stats to aid troubleshooting.

Release note

None

Check List (For Author)

  • Test

    • Regression test
    • Unit Test
    • Manual test (add detailed scripts or steps below)
    • No need to test or manual test. Explain why:
      • This is a refactor/code format and no logic has been changed.
      • Previous test can cover this change.
      • No code files have been changed.
      • Other reason
  • Behavior changed:

    • No.
    • Yes.
  • Does this need documentation?

    • No.
    • Yes.

@Thearas

Thearas commented Dec 11, 2025

Copy link
Copy Markdown
Contributor

Thank you for your contribution to Apache Doris.
Don't know what should be done next? See How to process your PR.

Please clearly describe your PR:

  1. What problem was fixed (it's best to include specific error reporting information). How it was fixed.
  2. Which behaviors were modified. What was the previous behavior, what is it now, why was it modified, and what possible impacts might there be.
  3. What features were added. Why was this function added?
  4. Which code was refactored and why was this part of the code refactored?
  5. Which functions were optimized and what is the difference before and after the optimization?

@xylaaaaa
xylaaaaa marked this pull request as draft December 11, 2025 10:55
@xylaaaaa xylaaaaa changed the title Impl parquet metadata [feat] add Parquet metadata TVF Dec 11, 2025
META_STATISTICS_MAX
};

std::string join_path(const std::vector<std::string>& items) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Use join() in be/src/util/string_util.h

}

std::string encodings_to_string(const std::vector<tparquet::Encoding::type>& encodings) {
std::ostringstream oss;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

use fmt lib instead of std::ostringstream

@morningman
morningman requested a review from Copilot December 15, 2025 10:09

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot encountered an error and was unable to review this pull request. You can try again by re-requesting a review.

}

template <typename ColumnType, typename T>
void insert_numeric_impl(MutableColumnPtr& column, T value) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There are some util method in be/src/exec/schema_scanner/schema_scanner_helper.cpp. You can reuse them

}
}

std::string physical_type_to_string(tparquet::Type::type type) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

extract these xx_to_xx methods to a new file parquet_utils.h. So that they can be used in other places, maybe.

Comment on lines +502 to +503

} // namespace

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

All methods in this namespaces should be moved to somewhere else, like parquet_utils.h

explicit ParquetSchemaModeHandler(RuntimeState* state) : ModeHandler(state) {}

void init_slot_pos_map(const std::vector<SlotDescriptor*>& slots) override {
std::unordered_map<std::string, int> name_to_pos = _build_name_to_pos_map(slots);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
std::unordered_map<std::string, int> name_to_pos = _build_name_to_pos_map(slots);
const auto& name_to_pos = _build_name_to_pos_map(slots);

if (params.__isset.file_type) {
_file_type = params.file_type;
} else if (!_paths.empty()) {
std::string lower_path = to_lower(_paths.front());

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the file_type should be handled on FE side. No need to handle it on BE side

case TASKS:
return TasksTableValuedFunction.getColumnIndexFromColumnName(columnName, params);
case PARQUET:
return null;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why return null?

}
StorageProperties storageProperties = null;
if (Strings.isNullOrEmpty(scheme) || "file".equalsIgnoreCase(scheme)) {
this.fileType = TFileType.FILE_LOCAL;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We have LocalProperties, so I don't think we need this if..else

if (Strings.isNullOrEmpty(rawPath)) {
throw new AnalysisException("Property 'path' is required for parquet_metadata");
}
List<String> parsedPaths = Arrays.stream(rawPath.split(","))

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think we don't need file list with comma, only:

  1. full file name
  2. file name with wildcard

}

// Expand any glob patterns (e.g. *.parquet) to concrete file paths.
normalizedPaths = expandGlobPaths(normalizedPaths, storageProperties, this.fileType);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You can simply refer to BrokerUtil.parseFile(path, brokerDesc, fileStatuses);.
See parseFile() method in ExternalFileTableValuedFunction

Comment thread sbe Outdated
@@ -0,0 +1,7 @@
#!/bin/bash

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remove this file

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 12 out of 13 changed files in this pull request and generated 11 comments.


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread sbe Outdated

unset http_proxy
unset https_proxy
cd /mnt/disk1/chenjunwei/doris_build/doris/output/be

Copilot AI Dec 15, 2025

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This file appears to be a personal development script with a hardcoded path (/mnt/disk1/chenjunwei/doris_build/doris/output/be) that should not be committed to the repository. This poses several issues: it exposes the developer's username and local directory structure, won't work on other machines, and is unrelated to the Parquet metadata feature being added.

Suggested change
cd /mnt/disk1/chenjunwei/doris_build/doris/output/be
# Set BE_DIR from first argument, environment variable, or default to current directory
BE_DIR="${1:-${BE_DIR:-$(pwd)}}"
cd "$BE_DIR"

Copilot uses AI. Check for mistakes.
String rawMode = normalizedParams.getOrDefault(MODE, MODE_METADATA);
mode = rawMode.toLowerCase();
if (!SUPPORTED_MODES.contains(mode)) {
throw new AnalysisException("Unsupported mode '" + rawMode + "' for parquet_metadata");

Copilot AI Dec 15, 2025

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The error message references 'parquet_metadata' but the actual function name is 'parquet_meta'. This should be updated for consistency with the function name users actually invoke.

Copilot uses AI. Check for mistakes.
expanded.addAll(expandSingleGlob(path, storageProperties, fileType));
}
if (expanded.isEmpty()) {
throw new AnalysisException("No files matched parquet_metadata path patterns: " + inputPaths);

Copilot AI Dec 15, 2025

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The error message references 'parquet_metadata' but the actual function name is 'parquet_meta'. This should be updated for consistency with the function name users actually invoke.

Suggested change
throw new AnalysisException("No files matched parquet_metadata path patterns: " + inputPaths);
throw new AnalysisException("No files matched parquet_meta path patterns: " + inputPaths);

Copilot uses AI. Check for mistakes.
case AZURE:
return TFileType.FILE_S3;
default:
throw new AnalysisException("Unsupported storage type for parquet_metadata: " + type);

Copilot AI Dec 15, 2025

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The error message references 'parquet_metadata' but the actual function name is 'parquet_meta'. This should be updated for consistency with the function name users actually invoke.

Suggested change
throw new AnalysisException("Unsupported storage type for parquet_metadata: " + type);
throw new AnalysisException("Unsupported storage type for parquet_meta: " + type);

Copilot uses AI. Check for mistakes.
Status ParquetMetadataReader::_init_from_scan_range(const TMetaScanRange& scan_range) {
if (!scan_range.__isset.parquet_params) {
return Status::InvalidArgument(
"Missing parquet parameters for parquet_metadata table function");

Copilot AI Dec 15, 2025

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The error message references 'parquet_metadata table function' but the actual function name is 'parquet_meta'. For consistency and clarity, the error message should use 'parquet_meta' to match the function name users actually invoke.

Suggested change
"Missing parquet parameters for parquet_metadata table function");
"Missing parquet parameters for parquet_meta table function");

Copilot uses AI. Check for mistakes.

private:


Copilot AI Dec 15, 2025

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There are two consecutive blank lines after the 'private:' access specifier. This is inconsistent with typical C++ style guides which recommend a single blank line. Consider removing one of the blank lines to maintain consistent formatting.

Suggested change

Copilot uses AI. Check for mistakes.
));
String rawPath = normalizedParams.get(PATH);
if (Strings.isNullOrEmpty(rawPath)) {
throw new AnalysisException("Property 'path' is required for parquet_metadata");

Copilot AI Dec 15, 2025

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The error message references 'parquet_metadata' but the actual function name is 'parquet_meta' (as defined in line 64). This inconsistency could confuse users. All error messages should consistently use 'parquet_meta' to match the actual function name used in SQL queries.

Copilot uses AI. Check for mistakes.
Comment on lines +161 to +162
throw new AnalysisException(
"Failed to parse storage properties for parquet_metadata: " + e.getMessage(), e);

Copilot AI Dec 15, 2025

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The error message references 'parquet_metadata' but the actual function name is 'parquet_meta'. This should be updated for consistency with the function name users actually invoke.

Copilot uses AI. Check for mistakes.
Comment on lines +173 to +174
throw new AnalysisException(
"Failed to normalize parquet_metadata paths: " + e.getMessage(), e);

Copilot AI Dec 15, 2025

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The error message references 'parquet_metadata' but the actual function name is 'parquet_meta'. This should be updated for consistency with the function name users actually invoke.

Copilot uses AI. Check for mistakes.
}
const TParquetMetadataParams& params = scan_range.parquet_params;
if (!params.__isset.paths || params.paths.empty()) {
return Status::InvalidArgument("Property 'path' must be set for parquet_metadata");

Copilot AI Dec 15, 2025

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The error message references 'parquet_metadata' but the actual function name is 'parquet_meta'. For consistency and clarity, the error message should use 'parquet_meta' to match the function name users actually invoke.

Suggested change
return Status::InvalidArgument("Property 'path' must be set for parquet_metadata");
return Status::InvalidArgument("Property 'path' must be set for parquet_meta");

Copilot uses AI. Check for mistakes.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 12 out of 13 changed files in this pull request and generated 7 comments.


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +56 to +61
/**
* Table-valued function for reading Parquet metadata.
* Currently works in two modes:
* - parquet_metadata: row-group/column statistics similar to DuckDB parquet_metadata()
* - parquet_schema: logical schema similar to DuckDB parquet_schema()
*/

Copilot AI Dec 15, 2025

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The class documentation describes modes as "parquet_metadata" and "parquet_schema" which matches the internal implementation, but the function name is "parquet_meta" (line 64). Consider updating the documentation to clarify that the function is called "parquet_meta" and accepts a "mode" parameter with values "parquet_metadata" or "parquet_schema".

Copilot uses AI. Check for mistakes.

private:


Copilot AI Dec 15, 2025

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There are extra blank lines between the private access specifier and the first private method declaration. Remove one of the blank lines for consistency with the codebase style.

Suggested change

Copilot uses AI. Check for mistakes.
Comment thread sbe Outdated
Comment on lines +1 to +7
#!/bin/bash
set -euo pipefail

unset http_proxy
unset https_proxy
cd /mnt/disk1/chenjunwei/doris_build/doris/output/be
./bin/start_be.sh --daemon

Copilot AI Dec 15, 2025

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This file appears to be a personal development script with hardcoded paths (e.g., /mnt/disk1/chenjunwei/doris_build/doris/output/be) and should not be included in the PR. It should be removed from the repository.

Suggested change
#!/bin/bash
set -euo pipefail
unset http_proxy
unset https_proxy
cd /mnt/disk1/chenjunwei/doris_build/doris/output/be
./bin/start_be.sh --daemon

Copilot uses AI. Check for mistakes.
Comment on lines +258 to +265
try {
backend = Env.getCurrentSystemInfo().getBackendsByCurrentCluster().values().stream()
.filter(Backend::isAlive)
.findFirst()
.orElse(null);
} catch (AnalysisException e) {
throw e;
}

Copilot AI Dec 15, 2025

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The catch block unnecessarily catches and re-throws the same AnalysisException without adding any value. The try-catch block should be removed since getBackendsByCurrentCluster() already throws AnalysisException which will propagate naturally.

Suggested change
try {
backend = Env.getCurrentSystemInfo().getBackendsByCurrentCluster().values().stream()
.filter(Backend::isAlive)
.findFirst()
.orElse(null);
} catch (AnalysisException e) {
throw e;
}
backend = Env.getCurrentSystemInfo().getBackendsByCurrentCluster().values().stream()
.filter(Backend::isAlive)
.findFirst()
.orElse(null);

Copilot uses AI. Check for mistakes.
case AZURE:
return TFileType.FILE_S3;
default:
throw new AnalysisException("Unsupported storage type for parquet_metadata: " + type);

Copilot AI Dec 15, 2025

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Error messages reference "parquet_metadata" instead of the actual function name "parquet_meta". This inconsistency appears in multiple error messages (lines 125, 132, 139, 162, 174, 207, 226, 338). All error messages should use the actual function name "parquet_meta" for clarity.

Suggested change
throw new AnalysisException("Unsupported storage type for parquet_metadata: " + type);
throw new AnalysisException("Unsupported storage type for parquet_meta: " + type);

Copilot uses AI. Check for mistakes.
Comment on lines +787 to +791
"Missing parquet parameters for parquet_metadata table function");
}
const TParquetMetadataParams& params = scan_range.parquet_params;
if (!params.__isset.paths || params.paths.empty()) {
return Status::InvalidArgument("Property 'path' must be set for parquet_metadata");

Copilot AI Dec 15, 2025

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Error messages in the backend reference "parquet_metadata" instead of the actual function name "parquet_meta". This is inconsistent with the function name defined on the frontend (NAME = "parquet_meta"). Update these error messages to use "parquet_meta" for consistency.

Suggested change
"Missing parquet parameters for parquet_metadata table function");
}
const TParquetMetadataParams& params = scan_range.parquet_params;
if (!params.__isset.paths || params.paths.empty()) {
return Status::InvalidArgument("Property 'path' must be set for parquet_metadata");
"Missing parquet parameters for parquet_meta table function");
}
const TParquetMetadataParams& params = scan_range.parquet_params;
if (!params.__isset.paths || params.paths.empty()) {
return Status::InvalidArgument("Property 'path' must be set for parquet_meta");

Copilot uses AI. Check for mistakes.
Comment on lines +117 to +187
public ParquetMetadataTableValuedFunction(Map<String, String> params) throws AnalysisException {
Map<String, String> normalizedParams = params.entrySet().stream().collect(Collectors.toMap(
entry -> entry.getKey().toLowerCase(),
Map.Entry::getValue,
(value1, value2) -> value2
));
String rawPath = normalizedParams.get(PATH);
if (Strings.isNullOrEmpty(rawPath)) {
throw new AnalysisException("Property 'path' is required for parquet_metadata");
}
List<String> parsedPaths = Arrays.stream(rawPath.split(","))
.map(String::trim)
.filter(token -> !token.isEmpty())
.collect(Collectors.toList());
if (parsedPaths.isEmpty()) {
throw new AnalysisException("Property 'path' must contain at least one location");
}
List<String> normalizedPaths = parsedPaths;

String rawMode = normalizedParams.getOrDefault(MODE, MODE_METADATA);
mode = rawMode.toLowerCase();
if (!SUPPORTED_MODES.contains(mode)) {
throw new AnalysisException("Unsupported mode '" + rawMode + "' for parquet_metadata");
}

String firstPath = parsedPaths.get(0);
String scheme = null;
try {
scheme = new URI(firstPath).getScheme();
} catch (URISyntaxException e) {
scheme = null;
}
StorageProperties storageProperties = null;
if (Strings.isNullOrEmpty(scheme) || "file".equalsIgnoreCase(scheme)) {
this.fileType = TFileType.FILE_LOCAL;
this.properties = Collections.emptyMap();
} else {
Map<String, String> storageParams = new HashMap<>(normalizedParams);
// StorageProperties detects provider by "uri", we also hint support by scheme.
storageParams.put("uri", firstPath);
forceStorageSupport(storageParams, scheme.toLowerCase());
try {
storageProperties = StorageProperties.createPrimary(storageParams);
} catch (RuntimeException e) {
throw new AnalysisException(
"Failed to parse storage properties for parquet_metadata: " + e.getMessage(), e);
}
this.fileType = mapToFileType(storageProperties.getType());
Map<String, String> backendProps = storageProperties.getBackendConfigProperties();
try {
List<String> tmpPaths = new ArrayList<>(parsedPaths.size());
for (String path : parsedPaths) {
tmpPaths.add(storageProperties.validateAndNormalizeUri(path));
}
normalizedPaths = tmpPaths;
} catch (UserException e) {
throw new AnalysisException(
"Failed to normalize parquet_metadata paths: " + e.getMessage(), e);
}
if (this.fileType == TFileType.FILE_HTTP && !backendProps.containsKey("uri")) {
backendProps = new HashMap<>(backendProps);
backendProps.put("uri", normalizedPaths.get(0));
}
this.properties = backendProps;
}

// Expand any glob patterns (e.g. *.parquet) to concrete file paths.
normalizedPaths = expandGlobPaths(normalizedPaths, storageProperties, this.fileType);

this.paths = ImmutableList.copyOf(normalizedPaths);
}

Copilot AI Dec 15, 2025

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The new ParquetMetadataTableValuedFunction lacks test coverage. Given that other table-valued functions in the repository have test coverage (e.g., ExternalFileTableValuedFunctionTest.java), unit tests should be added to verify the function's behavior, including parameter validation, path expansion, mode handling, and error cases.

Copilot uses AI. Check for mistakes.
// TINYINT/SMALLINT also need conversion via LittleIntPhysicalConverter.
switch (type) {
case TYPE_BOOLEAN:
case TYPE_TINYINT:

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why adding these new types?

Comment thread cloud/src/main.cpp
std::stringstream ss;
// clang-format off
// clang-format off
#if defined(NDEBUG)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

do not change this

if (!Strings.isNullOrEmpty(envDorisHome)) {
securePrefixCandidates.add(envDorisHome);
}
// 兜底:用路径所在目录作为前缀尝试剥离(针对在安全目录内的绝对路径)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

English

Map.Entry::getValue,
(value1, value2) -> value2
));
String rawPath = normalizedParams.get(PATH);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Use ExternalFileTableValuedFunction.URI_KEY instead of PATH

String tmpBloomColumn = null;
String tmpBloomLiteral = null;
if (MODE_BLOOM_PROBE.equals(mode)) {
tmpBloomColumn = normalizedParams.get(COLUMN);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

what is different between COLUMN and COLUMN_NAME?

if (Strings.isNullOrEmpty(scheme) || "file".equalsIgnoreCase(scheme)) {
storageParams.put(StorageProperties.FS_LOCAL_SUPPORT, "true");
} else {
forceStorageSupport(storageParams, scheme.toLowerCase());

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think we need to force set fs.xx.support.
torageProperties.createPrimary can find the real storage type

if (parsedPath.isEmpty()) {
throw new AnalysisException("Property 'path' must contain at least one location");
}
List<String> parsedPaths = Collections.singletonList(parsedPath);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There is only one path, so no need to use List

Map<String, String> storageParams,
TFileType fileType) throws AnalysisException {
if (fileType == TFileType.FILE_LOCAL) {
return globLocal(pattern);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why not reuse LocalTableValuedFunction.getFileListFromBackend() to get file list?

@xylaaaaa

Copy link
Copy Markdown
Contributor Author

run buildall

@hello-stephen

Copy link
Copy Markdown
Contributor

Cloud UT Coverage Report

Increment line coverage 🎉

Increment coverage report
Complete coverage report

Category Coverage
Function Coverage 79.85% (1752/2194)
Line Coverage 65.74% (30771/46806)
Region Coverage 66.53% (15375/23111)
Branch Coverage 56.87% (8174/14374)

@hello-stephen

Copy link
Copy Markdown
Contributor

FE UT Coverage Report

Increment line coverage 2.48% (5/202) 🎉
Increment coverage report
Complete coverage report

@doris-robot

Copy link
Copy Markdown

BE UT Coverage Report

Increment line coverage 0.00% (0/913) 🎉

Increment coverage report
Complete coverage report

Category Coverage
Function Coverage 53.34% (18834/35309)
Line Coverage 39.12% (174354/445746)
Region Coverage 33.74% (135022/400190)
Branch Coverage 34.59% (58133/168087)

@xylaaaaa

Copy link
Copy Markdown
Contributor Author

run buildall

@doris-robot

Copy link
Copy Markdown

Cloud UT Coverage Report

Increment line coverage 🎉

Increment coverage report
Complete coverage report

Category Coverage
Function Coverage 79.82% (1752/2195)
Line Coverage 65.72% (30763/46809)
Region Coverage 66.51% (15371/23112)
Branch Coverage 56.83% (8169/14374)

@hello-stephen

Copy link
Copy Markdown
Contributor

FE UT Coverage Report

Increment line coverage 2.30% (5/217) 🎉
Increment coverage report
Complete coverage report

@hello-stephen

Copy link
Copy Markdown
Contributor

BE UT Coverage Report

Increment line coverage 0.00% (0/1046) 🎉

Increment coverage report
Complete coverage report

Category Coverage
Function Coverage 53.32% (18833/35321)
Line Coverage 39.13% (174572/446080)
Region Coverage 33.73% (135085/400468)
Branch Coverage 34.60% (58213/168228)

@xylaaaaa

Copy link
Copy Markdown
Contributor Author

run buildall

@hello-stephen

Copy link
Copy Markdown
Contributor

Cloud UT Coverage Report

Increment line coverage 🎉

Increment coverage report
Complete coverage report

Category Coverage
Function Coverage 79.72% (1757/2204)
Line Coverage 65.37% (30893/47256)
Region Coverage 66.04% (15408/23333)
Branch Coverage 56.56% (8195/14490)

@doris-robot

Copy link
Copy Markdown

BE UT Coverage Report

Increment line coverage 16.08% (169/1051) 🎉

Increment coverage report
Complete coverage report

Category Coverage
Function Coverage 53.37% (18939/35483)
Line Coverage 39.22% (175560/447574)
Region Coverage 33.81% (135822/401712)
Branch Coverage 34.70% (58593/168834)

@hello-stephen

Copy link
Copy Markdown
Contributor

BE Regression && UT Coverage Report

Increment line coverage 73.45% (772/1051) 🎉

Increment coverage report
Complete coverage report

Category Coverage
Function Coverage 73.87% (25621/34686)
Line Coverage 61.26% (273392/446298)
Region Coverage 56.19% (228060/405905)
Branch Coverage 58.01% (98281/169412)

@hello-stephen

Copy link
Copy Markdown
Contributor

FE Regression Coverage Report

Increment line coverage 64.59% (135/209) 🎉
Increment coverage report
Complete coverage report

@github-actions github-actions Bot added the approved Indicates a PR has been approved by one committer. label Dec 23, 2025
@github-actions

Copy link
Copy Markdown
Contributor

PR approved by at least one committer and no changes requested.

@hello-stephen

Copy link
Copy Markdown
Contributor

BE Regression && UT Coverage Report

Increment line coverage 73.45% (772/1051) 🎉

Increment coverage report
Complete coverage report

Category Coverage
Function Coverage 73.87% (25621/34686)
Line Coverage 61.26% (273422/446298)
Region Coverage 56.20% (228127/405905)
Branch Coverage 58.04% (98321/169412)

@morningman
morningman merged commit d102aee into apache:master Dec 23, 2025
26 of 29 checks passed
github-actions Bot pushed a commit that referenced this pull request Dec 23, 2025
### What problem does this PR solve?

Expose Parquet file metadata via a table-valued function for inspection
and debugging.

### Issue Number: close #xxx

### Related PR: #xxx

### Problem Summary:
- Add a Parquet metadata TVF so users can query Parquet file metadata
via SQL.
- Backend adds a Parquet metadata reader and scan path; frontend wires
the TVF definition.
- Enables easy inspection of partitions/row groups/column stats to aid
troubleshooting.
yiguolei pushed a commit that referenced this pull request Jan 12, 2026
### What problem does this PR solve?

Expose Parquet file metadata via a table-valued function for inspection
and debugging.

### Issue Number: close #xxx

### Related PR: #xxx

### Problem Summary:
- Add a Parquet metadata TVF so users can query Parquet file metadata
via SQL.
- Backend adds a Parquet metadata reader and scan path; frontend wires
the TVF definition.
- Enables easy inspection of partitions/row groups/column stats to aid
troubleshooting.
xylaaaaa added a commit to xylaaaaa/doris that referenced this pull request Mar 16, 2026
### What problem does this PR solve?

Expose Parquet file metadata via a table-valued function for inspection
and debugging.

### Issue Number: close #xxx

### Related PR: #xxx

### Problem Summary:
- Add a Parquet metadata TVF so users can query Parquet file metadata
via SQL.
- Backend adds a Parquet metadata reader and scan path; frontend wires
the TVF definition.
- Enables easy inspection of partitions/row groups/column stats to aid
troubleshooting.
xylaaaaa added a commit to xylaaaaa/doris that referenced this pull request Mar 16, 2026
### What problem does this PR solve?

Expose Parquet file metadata via a table-valued function for inspection
and debugging.

### Issue Number: close #xxx

### Related PR: #xxx

### Problem Summary:
- Add a Parquet metadata TVF so users can query Parquet file metadata
via SQL.
- Backend adds a Parquet metadata reader and scan path; frontend wires
the TVF definition.
- Enables easy inspection of partitions/row groups/column stats to aid
troubleshooting.
xylaaaaa added a commit to xylaaaaa/doris that referenced this pull request Mar 16, 2026
### What problem does this PR solve?

Expose Parquet file metadata via a table-valued function for inspection
and debugging.

### Issue Number: close #xxx

### Related PR: #xxx

### Problem Summary:
- Add a Parquet metadata TVF so users can query Parquet file metadata
via SQL.
- Backend adds a Parquet metadata reader and scan path; frontend wires
the TVF definition.
- Enables easy inspection of partitions/row groups/column stats to aid
troubleshooting.
morningman pushed a commit to xylaaaaa/doris that referenced this pull request Mar 16, 2026
### What problem does this PR solve?

Expose Parquet file metadata via a table-valued function for inspection
and debugging.

### Issue Number: close #xxx

### Related PR: #xxx

### Problem Summary:
- Add a Parquet metadata TVF so users can query Parquet file metadata
via SQL.
- Backend adds a Parquet metadata reader and scan path; frontend wires
the TVF definition.
- Enables easy inspection of partitions/row groups/column stats to aid
troubleshooting.
morningman pushed a commit to morningman/doris that referenced this pull request Mar 17, 2026
Expose Parquet file metadata via a table-valued function for inspection
and debugging.

- Add a Parquet metadata TVF so users can query Parquet file metadata
via SQL.
- Backend adds a Parquet metadata reader and scan path; frontend wires
the TVF definition.
- Enables easy inspection of partitions/row groups/column stats to aid
troubleshooting.
xylaaaaa added a commit to xylaaaaa/doris that referenced this pull request Mar 18, 2026
Expose Parquet file metadata via a table-valued function for inspection
and debugging.

- Add a Parquet metadata TVF so users can query Parquet file metadata
via SQL.
- Backend adds a Parquet metadata reader and scan path; frontend wires
the TVF definition.
- Enables easy inspection of partitions/row groups/column stats to aid
troubleshooting.
xylaaaaa added a commit to xylaaaaa/doris that referenced this pull request Mar 18, 2026
Expose Parquet file metadata via a table-valued function for inspection
and debugging.

- Add a Parquet metadata TVF so users can query Parquet file metadata
via SQL.
- Backend adds a Parquet metadata reader and scan path; frontend wires
the TVF definition.
- Enables easy inspection of partitions/row groups/column stats to aid
troubleshooting.
xylaaaaa added a commit to xylaaaaa/doris that referenced this pull request Mar 19, 2026
Expose Parquet file metadata via a table-valued function for inspection
and debugging.

- Add a Parquet metadata TVF so users can query Parquet file metadata
via SQL.
- Backend adds a Parquet metadata reader and scan path; frontend wires
the TVF definition.
- Enables easy inspection of partitions/row groups/column stats to aid
troubleshooting.
morningman pushed a commit that referenced this pull request Mar 19, 2026
) (#61474)

Replacement for #61446 because the original PR head branch could not be
updated from this environment.

This branch contains:
- [feat] add Parquet metadata TVF (#58972)
- [fix](regression) stabilize parquet_meta tvf assertions across s3
buckets (#60938)
- [fix] remove useless const_cast and explain const_cast for vec (4)
(#56603)
- [fix] fix parquet metadata TVF compile on branch-4.1

Please review this PR instead of #61446.

---------

Co-authored-by: admiring_xm <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

approved Indicates a PR has been approved by one committer. dev/4.1.0-merged reviewed

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants