Skip to content

fix(ingestion): resolve OpenLineage column-lineage FQNs by real store… - #31651

Open
romsharon98 wants to merge 2 commits into
open-metadata:mainfrom
romsharon98:fix/openlineage-column-lineage-case-and-resolution
Open

fix(ingestion): resolve OpenLineage column-lineage FQNs by real store…#31651
romsharon98 wants to merge 2 commits into
open-metadata:mainfrom
romsharon98:fix/openlineage-column-lineage-case-and-resolution

Conversation

@romsharon98

@romsharon98 romsharon98 commented Aug 17, 2026

Copy link
Copy Markdown
Contributor

fix(ingestion): resolve OpenLineage column-lineage FQNs by real stored column case
_get_column_lineage unconditionally lowercased OpenLineage field names when
building column FQNs. Destinations whose real stored columns are uppercase
(e.g. Snowflake) got column FQNs matching no real column, so the server
silently dropped the columnsLineage entry even though the client sent a
populated one. Now resolves the real column name case-insensitively from the
resolved Table entity instead of blindly lowercasing.

Also extends the backtick-stripping from #30240 to _parse_slash_table_name
(Azure Kusto naming), which shares the same unstripped-backtick pattern that
was fixed for _parse_glue_table_name but not applied here.

Verified end-to-end against a live OpenMetadata 1.13.1 instance: after this
fix, a synthetic OpenLineage event for a real silver (Glue, lowercase
columns) -> gold (Snowflake, uppercase columns) edge produced correct
columnsLineage with real stored casing, where it previously landed empty.

Describe your changes:

Fixes #

I worked on ... because ...

Type of change:

  • Bug fix
  • Improvement
  • New feature
  • Breaking change (fix or feature that would cause existing functionality to not work as expected)
  • Documentation

High-level design:

N/A — small change.

Tests:

Use cases covered

Unit tests

Backend integration tests

Ingestion integration tests

Playwright (UI) tests

Manual testing performed

UI screen recording / screenshots:

Not applicable.

Checklist:

  • I have read the CONTRIBUTING document.
  • My PR title is Fixes <issue-number>: <short explanation>
  • My PR is linked to a GitHub issue via Fixes #<issue-number> above.
  • I have commented on my code, particularly in hard-to-understand areas.
  • For JSON Schema changes: I updated the migration scripts or explained why it is not needed.
  • For UI changes: I attached a screen recording and/or screenshots above.
  • I have added tests (unit / integration / Playwright as applicable) and listed them above.

Greptile Summary

This PR updates OpenLineage parsing and column-lineage FQN construction to strip Azure Kusto backticks and preserve the casing of stored columns.

  • Adds case-insensitive matching against resolved Table entities.
  • Extends slash-delimited table-name normalization.
  • Adds regression and fallback unit tests.

Confidence Score: 4/5

The PR should not merge until column-bearing Table entities are supplied to the new matcher, otherwise the reported uppercase-column failure remains reachable.

The matcher correctly preserves stored casing only when table.columns is populated, while its production lookup path does not request that non-default field and may return an earlier field-less cached entity.

Files Needing Attention: ingestion/src/metadata/ingestion/source/pipeline/openlineage/metadata.py

Important Files Changed

Filename Overview
ingestion/src/metadata/ingestion/source/pipeline/openlineage/metadata.py Adds stored-case column matching and Kusto backtick normalization, but the matcher receives Tables whose non-default columns field was not requested.
ingestion/tests/unit/topology/pipeline/test_openlineage.py Adds casing and unavailable-entity coverage, but mocked Tables conceal the production lookup's missing columns field.

Reviews (1): Last reviewed commit: "Merge branch 'main' into fix/openlineage..." | Re-trigger Greptile

Greptile also left 1 inline comment on this PR.

…d column case

_get_column_lineage unconditionally lowercased OpenLineage field names when
building column FQNs. Destinations whose real stored columns are uppercase
(e.g. Snowflake) got column FQNs matching no real column, so the server
silently dropped the columnsLineage entry even though the client sent a
populated one. Now resolves the real column name case-insensitively from the
resolved Table entity instead of blindly lowercasing.

Also extends the backtick-stripping from open-metadata#30240 to _parse_slash_table_name
(Azure Kusto naming), which shares the same unstripped-backtick pattern that
was fixed for _parse_glue_table_name but not applied here.

Verified end-to-end against a live OpenMetadata 1.13.1 instance: after this
fix, a synthetic OpenLineage event for a real silver (Glue, lowercase
columns) -> gold (Snowflake, uppercase columns) edge produced correct
columnsLineage with real stored casing, where it previously landed empty.
@romsharon98
romsharon98 requested a review from a team as a code owner August 17, 2026 17:40
@github-actions

Copy link
Copy Markdown
Contributor

Hi there 👋 Thanks for your contribution!

The OpenMetadata team will review the PR shortly! Once it has been labeled as safe to test, the CI workflows
will start executing and we'll be able to make sure everything is working as expected.

Let us know if you need any help!

@gitar-bot

gitar-bot Bot commented Aug 17, 2026

Copy link
Copy Markdown
Code Review ✅ Approved

Resolves OpenLineage column-lineage FQNs case-insensitively using real stored table column names instead of unconditionally lowercasing them, and extends backtick-stripping to Azure Kusto table names. No issues found.

Options

Display: compact → Showing less information.

Comment with these commands to change the behavior for this request:

Compact
gitar display:verbose         

Was this helpful? React with 👍 / 👎 | Powered by Gitar — free for open source

@github-actions

Copy link
Copy Markdown
Contributor

❌ PR checklist incomplete

This PR cannot be merged until the following are addressed on its linked issue:

  • No GitHub issue is linked. Link an issue in the Development section of the PR (or add Fixes #12345 to the description). For a same-org cross-repo issue, add Fixes open-metadata/<repo>#123 to the description.

The fields live on the linked issue in the Shipping project (open the issue → right sidebar → Projects). After you set them, re-run this check (or push a commit) — issue/project changes do not re-trigger it automatically.

Maintainers can bypass this check by adding the skip-pr-checks label.

Comment on lines +537 to +539
for column in getattr(table, "columns", None) or []:
if column.name.root.lower() == lower:
return column.name.root

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.

P1 Column data is never loaded

When an OpenLineage field's case differs from the stored column, the Table lookups do not request the non-default columns field, so _match_column_name falls back to the lowercased event field and the server can continue dropping the resulting nonexistent column FQN.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant