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 SQLD SELECT polyglot_transpile('SELECT NOW()', 'postgresql');┌──────────────────────────────────────────────────┐│ polyglot_transpile('SELECT NOW()', 'postgresql') ││ varchar │├──────────────────────────────────────────────────┤│ SELECT CURRENT_TIMESTAMP │└──────────────────────────────────────────────────┘
-- Transpile a Snowflake query to DuckDB SQLD 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 dialectsD SELECT polyglot_transpile('SELECT DATEDIFF(''day'', ''2020-01-01'', ''2025-10-12'')', 'snowflake', 'postgresql');
-- Validate SQL syntaxD 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 statementD SELECT polyglot_optimize('SELECT a FROM t WHERE b = 1', 'generic');
-- List all supported SQL dialectsD SELECT * FROM polyglot_dialects() LIMIT 5;┌──────────────┐│ dialect_name ││ varchar │├──────────────┤│ generic ││ postgresql ││ mysql ││ bigquery ││ snowflake │└──────────────┘
-- Transpile and execute a query from another dialectD SELECT * FROM polyglot_query('SELECT 1 AS a, 2 AS b', 'postgresql');┌───────┬───────┐│ a │ b ││ int32 │ int32 │├───────┼───────┤│ 1 │ 2 │└───────┴───────┘
-- Trace column lineage through a SQL statementD SELECT * FROM polyglot_lineage('SELECT a FROM t', 'generic', 'a');┌───────────┬──────────────┐│ node_name │ source_table ││ varchar │ varchar │├───────────┼──────────────┤│ a │ ││ t.a │ │└───────────┴──────────────┘
-- Diff two SQL statements at the AST levelD SELECT * FROM polyglot_diff('SELECT a FROM t', 'SELECT b FROM t', 'generic');┌───────────┬────────────┐│ edit_type │ expression ││ varchar │ varchar │├───────────┼────────────┤│ 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-Abfragezeichenfolgefrom_dialect(VARCHAR): Der Name des Quell-SQL-Dialektsto_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-Abfragezeichenfolgedialect(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-Abfragezeichenfolgedialect(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-Abfragezeichenfolgedialect(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-Abfragezeichenfolgefrom_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-Abfragezeichenfolgedialect(VARCHAR): Der Name des SQL-Dialektscolumn_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-Abfragetarget_sql(VARCHAR): Die geänderte SQL-Abfragedialect(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.