polyglot插件github存储库地址
:https://github.com/tobilg/duckdb-polyglot/
/>这个插件能把33种SQL方言翻译成DuckDB,如果duckdb数据库中有相应的数据,还可以用polyglot_query函数直接输出执行结果。
- 安装
DINSTALL
polyglotFROMcommunity;DLOADpolyglot;DSELECTpolyglot_transpile('SELECT
NOW()','postgresql');┌──────────────────────────────────────────────────┐
polyglot_transpile('SELECT
NOW()','postgresql')│
├──────────────────────────────────────────────────┤
│SELECTCURRENT_TIMESTAMP│
└──────────────────────────────────────────────────┘
- 用它来翻译一个sql脚本中的语句。
内容如下:
start="2">
WITHRECURSIVEsearch_tree(id,link,data,path)AS(SELECTt.id,t.link,t.data,ARRAY[ROW(t.f1,t.f2)]FROMtree
tUNIONALLSELECTt.id,t.link,t.data,path||ROW(t.f1,t.f2)FROMtree
stWHEREt.id=st.link)SELECT*FROMsearch_treeORDERBYpath;
可以用read_text读出它的内容到content列,然后把content列传递给polyglot_transpile函数。
D.modeduckboxDselect*fromread_text('pgctetree.txt');┌───────────────┬───────────────────────────────────────────────────────────────────┬───────┬──────────────────────────┐
filename
│varchar│varchar│
int64
│timestampwithtimezone
├───────────────┼───────────────────────────────────────────────────────────────────┼───────┼──────────────────────────┤
search_tree(id,link,data,path)AS(\r\n
SE…
│302│2026-02-1703:00:49+08│
└───────────────┴───────────────────────────────────────────────────────────────────┴───────┴──────────────────────────┘
DSELECTpolyglot_transpile(content,'postgresql')fromread_text('pgctetree.txt');┌──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
polyglot_transpile("content",'postgresql')│
├──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
search_tree(id,link,data,path)AS(SELECTt.id,t.link,t.data,[ROW(t.f1,t.f2)]FROMtree
UN…
└──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
它自动去掉了换行符。
3.存在问题
- 不能识别不同方言中同一个运算符的差异,比如
postgresql中的/表示整除,而duckdb中的/表示普通除法。
DSELECT*FROMpolyglot_query('SELECT1/2'
,'postgresql');┌─────────┐│(1/2)│
├─────────┤
start="2">
不能识别变量和字面常量,字面常量1和2显然不会为NULL,
它做了多余的判断。
DSELECTpolyglot_transpile('SELECTdecode(1,2,3,4)'
,'oracle');┌───────────────────────────────────────────────────────────────────────┐polyglot_transpile('SELECT
decode(1,2,3,4)','oracle')│
├───────────────────────────────────────────────────────────────────────┤
│SELECTCASEWHEN1=2OR(1ISNULLAND2ISNULL)THEN3ELSE4END│
└───────────────────────────────────────────────────────────────────────┘


