polyglot

SQL aus 34 verschiedenen Dialekten in DuckDB-SQL transpilieren

Maintainer: tobilg

Installation und Laden

INSTALL polyglot FROM community;
LOAD polyglot;

Beispiel

-- Transpile a PostgreSQL query to DuckDB SQL
D SELECT polyglot_transpile('SELECT NOW()', 'postgresql');
┌──────────────────────────────────────────────────┐
│ polyglot_transpile('SELECT NOW()', 'postgresql') │
varchar
├──────────────────────────────────────────────────┤
SELECT CURRENT_TIMESTAMP │
└──────────────────────────────────────────────────┘
-- Transpile a Snowflake query to DuckDB SQL
D SELECT polyglot_transpile('SELECT DATEDIFF(''day'', ''2020-01-01'', ''2025-10-12'')', 'snowflake');
┌──────────────────────────────────────────────────────────────────────────────────────────────────┐
│ polyglot_transpile('SELECT DATEDIFF(''day'', ''2020-01-01'', ''2025-10-12'')', 'snowflake') │
varchar
├──────────────────────────────────────────────────────────────────────────────────────────────────┤
SELECT DATE_DIFF('DAY', CAST('2020-01-01' AS DATE), CAST('2025-10-12' AS DATE)) │
└──────────────────────────────────────────────────────────────────────────────────────────────────┘
-- Transpile between two non-DuckDB dialects
D SELECT polyglot_transpile('SELECT DATEDIFF(''day'', ''2020-01-01'', ''2025-10-12'')', 'snowflake', 'postgresql');
-- Validate SQL syntax
D SELECT polyglot_validate('SELECT 1', 'generic');
┌────────────────────────────────────────────────────────────┐
│ polyglot_validate('SELECT 1', 'generic') │
│ struct(valid boolean, message varchar, line integer, ...) │
├────────────────────────────────────────────────────────────┤
│ {'valid': true, 'message': , 'line': 0, 'col': 0} │
└────────────────────────────────────────────────────────────┘
-- Parse SQL into an AST (JSON)
D SELECT polyglot_parse('SELECT 1', 'generic');
-- Optimize a SQL statement
D SELECT polyglot_optimize('SELECT a FROM t WHERE b = 1', 'generic');
-- List all supported SQL dialects
D SELECT * FROM polyglot_dialects() LIMIT 5;
┌──────────────┐
│ dialect_name │
varchar
├──────────────┤
│ generic │
│ postgresql │
│ mysql │
│ bigquery │
│ snowflake │
└──────────────┘
-- Transpile and execute a query from another dialect
D SELECT * FROM polyglot_query('SELECT 1 AS a, 2 AS b', 'postgresql');
┌───────┬───────┐
│ a │ b │
│ int32 │ int32 │
├───────┼───────┤
12
└───────┴───────┘
-- Trace column lineage through a SQL statement
D SELECT * FROM polyglot_lineage('SELECT a FROM t', 'generic', 'a');
┌───────────┬──────────────┐
│ node_name │ source_table │
varcharvarchar
├───────────┼──────────────┤
│ a │ │
t.a │ │
└───────────┴──────────────┘
-- Diff two SQL statements at the AST level
D SELECT * FROM polyglot_diff('SELECT a FROM t', 'SELECT b FROM t', 'generic');
┌───────────┬────────────┐
│ edit_type │ expression │
varcharvarchar
├───────────┼────────────┤
remove │ a │
insert │ b │
└───────────┴────────────┘

Über polyglot

Die polyglot-Erweiterung ermöglicht SQL-Transpilation aus 34 verschiedenen SQL-Dialekten in DuckDB-kompatibles SQL, angetrieben von der Crate polyglot-sql. Sie kann SQL-Abfragen transpilieren, validieren, parsen, optimieren und ausführen sowie Spalten-Lineage nachverfolgen und SQL-Anweisungen vergleichen.

Unterstützte Dialekte

Die Erweiterung unterstützt 34 SQL-Dialekte: athena, bigquery, clickhouse, cockroachdb, databricks, datafusion, doris, dremio, drill, druid, duckdb, dune, exasol, fabric, generic, hive, materialize, mysql, oracle, postgresql, presto, redshift, risingwave, singlestore, snowflake, solr, spark, sqlite, starrocks, tableau, teradata, tidb, trino, tsql.

Einige Dialekte akzeptieren auch Aliasse (z. B. postgres für postgresql, mssql oder sqlserver für tsql, memsql für singlestore).

Skalarfunktionen

polyglot_transpile(sql, from_dialect [, to_dialect])

Transpiliert SQL-Abfragen aus einem angegebenen Dialekt in DuckDB-kompatibles SQL. Ein optionaler dritter Parameter erlaubt die Angabe eines anderen Zieldialekts als DuckDB.

Parameter:

  • sql (VARCHAR): Die zu transpilierende SQL-Abfragezeichenfolge
  • from_dialect (VARCHAR): Der Name des Quell-SQL-Dialekts
  • to_dialect (VARCHAR, optional): Der Name des Ziel-SQL-Dialekts (Standard: DuckDB)

Rückgabe: VARCHAR - Das transpilierte SQL

Beispiele:

SELECT polyglot_transpile('SELECT NOW()', 'postgresql');
-- Returns: SELECT CURRENT_TIMESTAMP
SELECT polyglot_transpile('SELECT DATEDIFF(''day'', ''2020-01-01'', ''2025-10-12'')', 'snowflake', 'postgresql');

polyglot_validate(sql, dialect)

Validiert SQL-Syntax gegen die Grammatik eines Dialekts und gibt ein Struct mit Gültigkeitsstatus und Fehlerdetails zurück.

Parameter:

  • sql (VARCHAR): Die zu validierende SQL-Abfragezeichenfolge
  • dialect (VARCHAR): Der Name des SQL-Dialekts

Rückgabe: STRUCT(valid BOOLEAN, message VARCHAR, line INTEGER, col INTEGER)

Beispiele:

SELECT polyglot_validate('SELECT 1', 'generic');
-- Returns: {'valid': true, 'message': , 'line': 0, 'col': 0}
SELECT polyglot_validate('SLECT 1', 'generic');
-- Returns: {'valid': false, 'message': ..., 'line': 0, 'col': 0}

polyglot_parse(sql, dialect)

Parst SQL in einen AST (Abstract Syntax Tree) und gibt ihn als JSON-Array zurück.

Parameter:

  • sql (VARCHAR): Die zu parsende SQL-Abfragezeichenfolge
  • dialect (VARCHAR): Der Name des SQL-Dialekts

Rückgabe: VARCHAR - JSON-Zeichenfolge, die den AST darstellt

Beispiel:

SELECT polyglot_parse('SELECT 1', 'generic');

polyglot_optimize(sql, dialect)

Wendet Vereinfachungs- und Kanonisierungs-Optimierungspässe auf eine SQL-Anweisung an.

Parameter:

  • sql (VARCHAR): Die zu optimierende SQL-Abfragezeichenfolge
  • dialect (VARCHAR): Der Name des SQL-Dialekts

Rückgabe: VARCHAR - Die optimierte SQL-Zeichenfolge

Beispiel:

SELECT polyglot_optimize('SELECT a FROM t WHERE b = 1', 'generic');

Tabellenfunktionen

polyglot_dialects()

Gibt eine Tabelle mit allen 34 unterstützten SQL-Dialektnamen zurück.

Rückgabe: Eine Tabelle mit der Spalte dialect_name (VARCHAR)

Beispiel:

SELECT * FROM polyglot_dialects();

polyglot_query(sql, from_dialect)

Transpiliert eine SQL-Abfrage aus einem angegebenen Dialekt in DuckDB-SQL und führt sie aus. Die Ergebnisse haben ein dynamisches Schema, das den Abfragespalten entspricht.

Parameter:

  • sql (VARCHAR): Die zu transpilierende und auszuführende SQL-Abfragezeichenfolge
  • from_dialect (VARCHAR): Der Name des Quell-SQL-Dialekts

Rückgabe: Tabelle mit dynamischem Schema basierend auf den Ergebnis-Spalten der Abfrage

Beispiel:

SELECT * FROM polyglot_query('SELECT 1 AS a, 2 AS b', 'postgresql');

polyglot_lineage(sql, dialect, column_name)

Verfolgt den Abhängigkeitsgraphen einer benannten Spalte durch eine SQL-Anweisung und gibt jeden Knoten und seine Quelltabelle zurück.

Parameter:

  • sql (VARCHAR): Die zu analysierende SQL-Abfragezeichenfolge
  • dialect (VARCHAR): Der Name des SQL-Dialekts
  • column_name (VARCHAR): Der nachzuverfolgende Spaltenname

Rückgabe: Eine Tabelle mit den Spalten node_name (VARCHAR) und source_table (VARCHAR)

Beispiel:

SELECT * FROM polyglot_lineage('SELECT a FROM t', 'generic', 'a');

polyglot_diff(source_sql, target_sql, dialect)

Vergleicht zwei SQL-Anweisungen auf AST-Ebene und gibt jede Änderung als Zeile mit einem Edit-Typ und dem betroffenen Ausdruck aus.

Parameter:

  • source_sql (VARCHAR): Die ursprüngliche SQL-Abfrage
  • target_sql (VARCHAR): Die geänderte SQL-Abfrage
  • dialect (VARCHAR): Der Name des SQL-Dialekts

Rückgabe: Eine Tabelle mit den Spalten edit_type (VARCHAR) und expression (VARCHAR). Edit-Typen umfassen: insert, remove, move, update, keep.

Beispiel:

SELECT * FROM polyglot_diff('SELECT a FROM t', 'SELECT b FROM t', 'generic');

Hinzugefügte Funktionen

function_name function_type description comment examples
polyglot_transpile scalar Transpiles SQL queries from a specified dialect into DuckDB-compatible SQL. Optionally accepts a third parameter for a target dialect other than DuckDB. NULL [SELECT polyglot_transpile(‘SELECT NOW()’, ‘postgresql’);]
polyglot_validate scalar Validates SQL syntax against a dialect’s grammar and returns a struct with validity status and error details. NULL [SELECT polyglot_validate(‘SELECT 1’, ‘generic’);]
polyglot_parse scalar Parses SQL into an AST (Abstract Syntax Tree) and returns it as a JSON array. NULL [SELECT polyglot_parse(‘SELECT 1’, ‘generic’);]
polyglot_optimize scalar Applies simplification and canonicalization optimization passes to a SQL statement. NULL [SELECT polyglot_optimize(‘SELECT a FROM t WHERE b = 1’, ‘generic’);]
polyglot_dialects table Returns a table listing all 34 supported SQL dialect names. NULL [SELECT * FROM polyglot_dialects();]
polyglot_query table Transpiles a SQL query from a specified dialect and executes it, returning results with a dynamic schema. NULL [SELECT * FROM polyglot_query(‘SELECT 1 AS a, 2 AS b’, ‘postgresql’);]
polyglot_lineage table Traces a named column’s dependency graph through a SQL statement, returning each node and its source table. NULL [SELECT * FROM polyglot_lineage(‘SELECT a FROM t’, ‘generic’, ‘a’);]
polyglot_diff table Compares two SQL statements at the AST level and emits each change as a row with an edit type and the affected expression. NULL [SELECT * FROM polyglot_diff(‘SELECT a FROM t’, ‘SELECT b FROM t’, ‘generic’);]

Überladene Funktionen

Diese Erweiterung fügt keine Funktionsüberladungen hinzu.

Hinzugefügte Typen

Diese Erweiterung fügt keine Typen hinzu.

Hinzugefügte Einstellungen

Diese Erweiterung fügt keine Einstellungen hinzu.