GSP SQLFlow Install now →
Problem Proof Issues How it works FAQ Install now →
Works alongside OpenMetadata · pip install · 60 seconds

OpenMetadata's SQL parser silently
drops MSSQL stored procedure lineage.

OpenMetadata's three-parser chain (sqlglotsqlfluffsqlparse) silently skips stored procedures, temp tables, MERGE, and square bracket identifiers — losing column-level lineage without warning. gsp-openmetadata-sidecar recovers it.

5
Open issues — since June 2024
3
Distinct failure patterns solved
12
Column mappings recovered per procedure
Works alongside
The problem

Your MSSQL lineage graph is silently empty.

OpenMetadata extracts lineage by passing SQL through three parsers in sequence: sqlglot, sqlfluff, and sqlparse (via collate-sqllineage). If all three fail, the statement is silently skipped — no error, no warning, just empty lineage.

MSSQL stored procedures aren't plain SQL. They use CREATE PROCEDURE, BEGIN/END, DECLARE, temp tables, and MERGE — standard T-SQL patterns that none of the three parsers can handle.

-- Issue #16737 / #17586: Stored procedure wrapper CREATE PROCEDURE myproc AS BEGIN INSERT INTO test2 SELECT * FROM test1 END
collate-sqllineage result: 0 lineage edges — all 3 parsers reject CREATE PROCEDURE
-- Issue #25299: 3-hop through temp table CREATE PROCEDURE schName.procName AS BEGIN INSERT INTO #tempTable SELECT columnName FROM schName.sourceTable INSERT INTO schName.targetTable SELECT columnName FROM #tempTable END
collate-sqllineage result: 0 lineage — temp table chain completely invisible
-- Issue #16424: Cross-database bracket identifiers CREATE VIEW [ReportDB].[dbo].[vw_Orders] AS SELECT [SalesDB].[dbo].[Customers].[CustomerID], [SalesDB].[dbo].[Orders].[OrderDate] FROM [SalesDB].[dbo].[Customers] JOIN [SalesDB].[dbo].[Orders] ON ...
Greedy regex r"\[(.*)\]" matches across brackets — identifiers mangled
-- MERGE upsert pattern (common MSSQL ETL) MERGE [dbo].[customer_summary] AS target USING #staged AS source ON target.id = source.id WHEN MATCHED THEN UPDATE SET target.name = source.name WHEN NOT MATCHED THEN INSERT (id, name) VALUES (source.id, source.name);
collate-sqllineage result: 0 lineage — MERGE not supported by parser chain
The proof

Same stored procedure. Dramatically different results.

OpenMetadata default (3-parser chain)
0
column-level relationships
collate-sqllineage
With gsp-openmetadata-sidecar
12
column-level relationships
GSP SQLFlow engine

Same stored procedure. Same 4 tables. 0 vs 12 column-level relationships.

Open issues

These issues have been open for years. The sidecar solves them today.

Issue Problem Pattern Status
#16737 Data Lineage Not Reflected for MSSQL Stored Procedure BEGIN/END blocks Open since June 2024
#25299 Stored Procedure lineage not supported for MS SQL connector Temp tables + BEGIN/END Release backlog
#17586 MS SQL Procedures Lineage Not Picked Up CREATE PROCEDURE filter Partially fixed
#16710 SQL Server ingestion fails on stored procs with % Special characters Open
#16424 Square bracket syntax breaks lineage Cross-database identifiers Open
How it works

3 steps. 60 seconds. No OpenMetadata changes.

1

Install

One pip command. No Docker, no infra changes, no OpenMetadata plugins.

pip install gsp-openmetadata-sidecar
2

Parse with SQLFlow

Point the sidecar at your SQL files. Gudu SQLFlow parses T-SQL natively — stored procedures, temp tables, MERGE, square brackets, all handled.

gsp-openmetadata-sidecar --sql-file proc.sql --dry-run
3

Push to OpenMetadata

Column-level lineage is pushed to OpenMetadata via PUT /api/v1/lineage. Your lineage graph is complete — no fork, no redeploy.

gsp-openmetadata-sidecar --sql-file proc.sql --om-server http://localhost:8585/api --om-token eyJ...
Choose your backend

Four backends. Pick your comfort level.

Every backend uses the same GSP SQLFlow engine. The only difference is where SQL gets parsed.

Anonymous

Free · No signup
  • 50 calls/day per IP
  • Cloud-parsed, not logged
  • Great for evaluation
Get started →

Self-Hosted / Local JAR

On-premise · Unlimited
  • SQL never leaves your network
  • No rate limits
  • Docker or standalone JAR
  • Enterprise support
Talk to us →
FAQ

Common questions.

Does this replace OpenMetadata's lineage parser?

No. The sidecar complements OpenMetadata's existing parser. OpenMetadata still runs its three-parser chain (sqlglot, sqlfluff, sqlparse) for standard SQL — it handles straightforward queries well. The sidecar only re-parses statements where all three parsers fail, recovering the lineage that would otherwise be silently lost.

Does this modify OpenMetadata's code?

No. The sidecar uses OpenMetadata's public REST API only (PUT /api/v1/lineage and GET /api/v1/tables). No forks, no plugins, no code changes. It runs as a standalone CLI tool alongside your OpenMetadata installation.

Which SQL dialects are supported?

MSSQL (T-SQL) is the primary focus, but the underlying GSP SQLFlow engine supports 20+ dialects including BigQuery, Snowflake, Oracle PL/SQL, Hive, Spark SQL, DB2, and more. The sidecar works with any dialect that SQLFlow can parse.

Do tables need to exist in OpenMetadata first?

Yes. The sidecar creates lineage edges between existing entities — it does not create tables, databases, or schemas. Run OpenMetadata's metadata ingestion first so your tables are registered, then run the sidecar to add the lineage that was missed.

Is my SQL sent to a third party?

Depends on your backend. Anonymous and Authenticated modes parse SQL via Gudu Software's cloud API (processed in memory, never logged or stored). Self-hosted mode runs the GSP engine on your infrastructure — SQL never leaves your network. The local JAR mode needs no network at all.

What's the licensing model?

The sidecar tool itself is open source (Apache 2.0). The Anonymous backend is free (50 calls/day). The Authenticated backend provides 10k calls/month with a personal API key. Self-hosted and local JAR deployments require a commercial SQLFlow license — contact us for pricing.

Install in 60 seconds. See what you've been missing.

One command. Every missing column-level relationship back in OpenMetadata.

$ pip install gsp-openmetadata-sidecar Copy

Open source on GitHub · Apache 2.0 license · Also available: gsp-datahub-sidecar for DataHub