polyglot插件github存储库地址 :https://github.com/tobilg/duckdb-polyglot/
这个插件能把33种SQL方言翻译成DuckDB,如果duckdb数据库中有相应的数据,还可以用polyglot_query函数直接输出执行结果。
- 安装
sql
D INSTALL polyglot FROM community;
D LOAD polyglot;
D SELECT polyglot_transpile('SELECT NOW()', 'postgresql');
┌──────────────────────────────────────────────────┐
│ polyglot_transpile('SELECT NOW()', 'postgresql') │
│ varchar │
├──────────────────────────────────────────────────┤
│ SELECT CURRENT_TIMESTAMP │
└──────────────────────────────────────────────────┘
- 用它来翻译一个sql脚本中的语句。
有一个脚本文件pgctetree.txt, 内容如下:
sql
WITH RECURSIVE search_tree(id, link, data, path) AS (
SELECT t.id, t.link, t.data, ARRAY[ROW(t.f1, t.f2)]
FROM tree t
UNION ALL
SELECT t.id, t.link, t.data, path || ROW(t.f1, t.f2)
FROM tree t, search_tree st
WHERE t.id = st.link
)
SELECT * FROM search_tree ORDER BY path;
可以用read_text读出它的内容到content列,然后把content列传递给polyglot_transpile函数。
sql
D .mode duckbox
D select * from read_text('pgctetree.txt');
┌───────────────┬───────────────────────────────────────────────────────────────────┬───────┬──────────────────────────┐
│ filename │ content │ size │ last_modified │
│ varchar │ varchar │ int64 │ timestamp with time zone │
├───────────────┼───────────────────────────────────────────────────────────────────┼───────┼──────────────────────────┤
│ pgctetree.txt │ WITH RECURSIVE search_tree(id, link, data, path) AS (\r\n SE... │ 302 │ 2026-02-17 03:00:49+08 │
└───────────────┴───────────────────────────────────────────────────────────────────┴───────┴──────────────────────────┘
D SELECT polyglot_transpile(content,'postgresql')from read_text('pgctetree.txt');
┌──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ polyglot_transpile("content", 'postgresql') │
│ varchar │
├──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ WITH RECURSIVE search_tree(id, link, data, path) AS (SELECT t.id, t.link, t.data, [ROW(t.f1, t.f2)] FROM tree t UN... │
└──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
它自动去掉了换行符。
3.存在问题
- 不能识别不同方言中同一个运算符的差异,比如 postgresql中的/表示整除,而duckdb中的/表示普通除法。
sql
D SELECT * FROM polyglot_query('SELECT 1/2', 'postgresql');
┌─────────┐
│ (1 / 2) │
│ double │
├─────────┤
│ 0.5 │
└─────────┘
- 不能识别变量和字面常量, 字面常量1和2显然不会为NULL, 它做了多余的判断。
sql
D SELECT polyglot_transpile('SELECT decode(1,2,3,4)', 'oracle');
┌───────────────────────────────────────────────────────────────────────┐
│ polyglot_transpile('SELECT decode(1,2,3,4)', 'oracle') │
│ varchar │
├───────────────────────────────────────────────────────────────────────┤
│ SELECT CASE WHEN 1 = 2 OR (1 IS NULL AND 2 IS NULL) THEN 3 ELSE 4 END │
└───────────────────────────────────────────────────────────────────────┘