-
Notifications
You must be signed in to change notification settings - Fork 3.7k
[fix](parquet) Fix struct column reading error when all queried fields are missing after schema evolution #59586
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[fix](parquet) Fix struct column reading error when all queried fields are missing after schema evolution #59586
Conversation
|
Thank you for your contribution to Apache Doris. Please clearly describe your PR:
|
|
run buildall |
TPC-H: Total hot run time: 32200 ms |
TPC-DS: Total hot run time: 172719 ms |
ClickBench: Total hot run time: 26.98 s |
BE UT Coverage ReportIncrement line coverage Increment coverage report
|
BE Regression && UT Coverage ReportIncrement line coverage Increment coverage report
|
This commit introduces tests for handling mixed case field names in struct schema evolution. It includes the creation of test tables with mixed case fields, schema evolution operations, and corresponding data insertions for both Parquet and ORC formats. The tests verify that case sensitivity is correctly managed during schema evolution and querying operations.
|
run external |
|
run buildall |
TPC-H: Total hot run time: 31406 ms |
TPC-DS: Total hot run time: 172802 ms |
|
PR approved by at least one committer and no changes requested. |
|
PR approved by anyone and no changes requested. |
kaka11chen
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM
|
run check_coverage |
…s are missing after schema evolution (#59586) ### What problem does this PR solve? - relate pr: #57204 **Problem Summary:** When querying struct fields in Iceberg tables after schema evolution, if all queried struct fields are missing in old Parquet files, the code fails with error: ``` File column name 'removed' not found in struct children ``` **Root Cause:** When all queried struct sub-fields are missing in the old Parquet file (e.g., newly added fields after schema evolution), the code needs to find a reference column from the file schema to get repetition level (RL) and definition level (DL) information. However, if the reference column (e.g., `removed`) was dropped from the table schema, calling `root_node->get_children_node_by_file_column_name()` will fail because the column doesn't exist in `root_node`. **Scenario:** 1. Create table with struct containing: `removed`, `rename`, `keep`, `drop_and_add` 2. Insert data (creates Parquet file with these fields) 3. Perform schema evolution: DROP `a_struct.removed`, DROP then ADD `a_struct.drop_and_add` (gets new field ID), ADD `a_struct.added` 4. Query `struct_element(a_struct, 'drop_and_add')` or `struct_element(a_struct, 'added')` on the old file 5. The query fails because: - All queried fields (`drop_and_add`, `added`) are missing in the old file - Code tries to use `removed` as reference column (it exists in file but was dropped from table schema) - Accessing `removed` via `root_node` fails because it doesn't exist in table schema ### Solution: Use `TableSchemaChangeHelper::ConstNode::get_instance()` instead of looking up from `root_node` for the reference column. Since the reference column is only used to get RL/DL information (not for schema mapping), using `ConstNode` is safe and avoids the issue where the reference column doesn't exist in `root_node`. ### Release note None ### Check List (For Author) - Test <!-- At least one of them must be included. --> - [ ] 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 <!-- Add your reason? --> - Behavior changed: - [ ] No. - [ ] Yes. <!-- Explain the behavior change --> - Does this need documentation? - [ ] No. - [ ] Yes. <!-- Add document PR link here. eg: apache/doris-website#1214 --> ### Check List (For Reviewer who merge this PR) - [ ] Confirm the release note - [ ] Confirm test cases - [ ] Confirm document - [ ] Add branch pick label <!-- Add branch pick label that this PR should merge into -->
What problem does this PR solve?
Problem Summary:
When querying struct fields in Iceberg tables after schema evolution, if all queried struct fields are missing in old Parquet files, the code fails with error:
Root Cause:
When all queried struct sub-fields are missing in the old Parquet file (e.g., newly added fields after schema evolution), the code needs to find a reference column from the file schema to get repetition level (RL) and definition level (DL) information. However, if the reference column (e.g.,
removed) was dropped from the table schema, callingroot_node->get_children_node_by_file_column_name()will fail because the column doesn't exist inroot_node.Scenario:
removed,rename,keep,drop_and_adda_struct.removed, DROP then ADDa_struct.drop_and_add(gets new field ID), ADDa_struct.addedstruct_element(a_struct, 'drop_and_add')orstruct_element(a_struct, 'added')on the old filedrop_and_add,added) are missing in the old fileremovedas reference column (it exists in file but was dropped from table schema)removedviaroot_nodefails because it doesn't exist in table schemaSolution:
Use
TableSchemaChangeHelper::ConstNode::get_instance()instead of looking up fromroot_nodefor the reference column. Since the reference column is only used to get RL/DL information (not for schema mapping), usingConstNodeis safe and avoids the issue where the reference column doesn't exist inroot_node.Release note
None
Check List (For Author)
Test
Behavior changed:
Does this need documentation?
Check List (For Reviewer who merge this PR)