duckdb polyglot 插件的使用

polyglot插件github存储库地址 :https://github.com/tobilg/duckdb-polyglot/

这个插件能把33种SQL方言翻译成DuckDB,如果duckdb数据库中有相应的数据,还可以用polyglot_query函数直接输出执行结果。

  1. 安装
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                         │
└──────────────────────────────────────────────────┘
  1. 用它来翻译一个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.存在问题

  1. 不能识别不同方言中同一个运算符的差异,比如 postgresql中的/表示整除,而duckdb中的/表示普通除法。
sql 复制代码
D SELECT * FROM polyglot_query('SELECT 1/2', 'postgresql');
┌─────────┐
│ (1 / 2) │
│ double  │
├─────────┤
│   0.5   │
└─────────┘
  1. 不能识别变量和字面常量, 字面常量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 │
└───────────────────────────────────────────────────────────────────────┘
相关推荐
阿里云大数据AI技术20 小时前
一条 SQL 生成广告:Hologres 如何实现素材生成到投放分析一体化
人工智能·sql
x***r1511 天前
dbeaver-ce-24.1.3-x86_64-setup安装步骤详解(附DBeaver数据库管理与SQL编写教程)
数据库·sql
Java&Develop1 天前
pgsql 根据一个查询sql 生成 修改sql
数据库·sql
@小柯555m1 天前
MySql(高级查询--查找GPA最高值)
数据库·sql·mysql
黄俊懿1 天前
复合索引设计指南:最左前缀 & 字段排座次
数据库·sql·mysql·adb·性能优化·dba·db
桃花键神1 天前
【2026精品项目】基于SpringBoot3+Vue3的旧物置换系统(包含源码+项目文档+SQL脚本+部署教程)
数据库·spring boot·sql·vue
@小柯555m1 天前
MySql(正则表达式--电话号码格式校验)
数据库·sql·mysql·正则表达式
夕除1 天前
spring boot --07
数据库·sql
麦聪聊数据1 天前
SQL与数据库开发(五):纯 SQL 解决“连续签到”与“用户留存”问题
数据库·sql·数据库开发
l1t1 天前
DeepSeek总结的无需编译器:编写纯 SQL 的 Postgres 扩展
数据库·sql·postgresql