PostgreSQL 14 会破坏其官方的.NET 和 Java 驱动

2022 年 7 月 9 日 InfoQ

作者 | Jonathan Allen
译者 | 盖磊
策划 | 丁晓昀
审校 | 冬雨

PostgreSQL 14 中的新语法,尤其是使用 BEGIN ATOMIC ... END 创建 SQL 函数,在某些情况下会破坏其官方的.NET 和 Java 数据库驱动。但只要不通过 Npgsql 或 PgJDBC 修改数据库模式,就不会出现问题。

对于 Java 的 JDBC 和.NET 的 ADO.NET 数据库驱动框架,它们存在一个共同点,那就是都支持使用分号实现 SQL 语句批处理。批处理对提高性能是十分必要的。如果客户端一次只发送一个命令,那么每个命令就必须要付出通信延迟代价。但如果使用批处理一次执行一批语句,那么只需付出一次通信代价。

事实上,SQL Server 等数据库将批处理语句作为一个庞大的 SQL 字符串整体发送。但 PostgreSQL 的 wire 通信协议工作机制有别如此。虽然批处理语句依然整体发送,但客户端需将语句拆分为各条独立的命令。

原始实现可简单地假设每个分号标识一条语句的终止处。当然,分号也可能是一条语句字符串中的内容,而非一条语句的结尾。Npgsql 和 PgJDBC 解析器对此做了考虑。

这曾经工作得很好。但现在新建 SQL 函数体中可以定义多条语句,那么应如何处理?当然这也不是问题,因为函数体使用“$...$”标记做转义。在“$...$”标记对内的分号,与其它字符串文字的处理方式无异。

进而 PostgreSQL 14 添加了称为“SQL 标准语法”的“BEGIN ATOMIC ... END”语句。对此发行说明中给出如下解释。

使用 SQL 标准语法编写的函数或过程能快速解析,并存储为解析树形式。这可更好地追踪函数的依赖关系,并具有更好的安全性。

由于分号可能并非出现在引号引起的字符串中,而是会出现在 BEGIN ATOMIC ... END 语句块内的任何位置,如果解析器使用当前的方法,就无法确定批处理中语句的拆分位置。完全支持语句拆分或是要去更改 API,或是要去新建一个更复杂的解析器。

Npgsql 已关注当前解析器的开销问题,决定更改 API。在 Npgsql 的库中增加了一种称为“原始 SQL(raw SQL mode)”的模式。此模式没有使用命名参数,需要使用位置(positional)参数。

而 PgJDBC 团队尚未决定采用何种方法。其进展可关注软件缺陷报告“新的 PG14 SQL 标准函数破坏了 PgJDBC 解析器(New PG14 SQL-standard function bodies break our SQL parser)”。

作者简介:

Jonathan Allen 在上世纪 90 年代后期为一家健康诊所实施 MIS 项目,实现从 Access 和 Excel 逐步升级为企业解决方案。在金融部门编写五年自动交易系统后,他成为多个项目的顾问,其中包括机器人仓库 UI、癌症研究软件中间层,以及解决一家大型房地产保险公司的大数据需求。在空闲时间,他喜欢研习 16 世纪的武术。

点击底部阅读原文 访问 InfoQ 官网,获取更多精彩内容!

今日好文推荐

GitLab 技术选型为何如此不同:坚持用过气 Web 框架十多年、坚决不用微服务

首个冲刺科创板的国产数据库:78 岁老教授打磨四十年,每一行代码都自主可控

为什么 Rust 是初创公司的绝佳选择?

达梦冲刺国产数据库第一个 IPO;特斯拉自动驾驶部门裁员约 200 人;微信推出图片大爆炸功能

点个在看少个 bug 👇

登录查看更多
0

相关内容

PostgreSQL 是自由的对象-关系数据库服务器(数据库管理系统),在灵活的 BSD 风格许可证下发行。
【干货书】Python参考手册,210页pdf
专知会员服务
63+阅读 · 2021年4月30日
专知会员服务
72+阅读 · 2021年1月12日
【2020新书】C++20快速语法参考,第4版,209页pdf
专知会员服务
71+阅读 · 2020年8月5日
【干货】大数据入门指南:Hadoop、Hive、Spark、 Storm等
专知会员服务
95+阅读 · 2019年12月4日
Keras作者François Chollet推荐的开源图像搜索引擎项目Sis
专知会员服务
29+阅读 · 2019年10月17日
Java 18 新功能:默认字符集为 UTF-8
CSDN
0+阅读 · 2022年4月18日
“C不再是一种编程语言”
AI前线
1+阅读 · 2022年4月2日
gRPC 与.NET 入门
InfoQ
0+阅读 · 2022年2月17日
IntelliJ 平台彻底停用 Log4j 组件!
CSDN
0+阅读 · 2022年2月14日
Log4j 漏洞还没忙完,新的漏洞又出现了!
已删除
将门创投
18+阅读 · 2019年2月18日
国家自然科学基金
0+阅读 · 2014年12月31日
国家自然科学基金
0+阅读 · 2014年12月31日
国家自然科学基金
0+阅读 · 2013年12月31日
国家自然科学基金
0+阅读 · 2013年12月31日
国家自然科学基金
0+阅读 · 2012年12月31日
国家自然科学基金
0+阅读 · 2012年12月31日
国家自然科学基金
0+阅读 · 2012年12月31日
国家自然科学基金
0+阅读 · 2012年12月31日
国家自然科学基金
0+阅读 · 2009年12月31日
国家自然科学基金
0+阅读 · 2009年12月31日
pPython for Parallel Python Programming
Arxiv
0+阅读 · 2022年8月31日
Arxiv
0+阅读 · 2022年8月30日
Arxiv
17+阅读 · 2021年1月21日
已删除
Arxiv
32+阅读 · 2020年3月23日
Arxiv
21+阅读 · 2019年8月21日
Arxiv
21+阅读 · 2018年5月23日
Arxiv
11+阅读 · 2018年5月13日
VIP会员
相关VIP内容
相关资讯
Java 18 新功能:默认字符集为 UTF-8
CSDN
0+阅读 · 2022年4月18日
“C不再是一种编程语言”
AI前线
1+阅读 · 2022年4月2日
gRPC 与.NET 入门
InfoQ
0+阅读 · 2022年2月17日
IntelliJ 平台彻底停用 Log4j 组件!
CSDN
0+阅读 · 2022年2月14日
Log4j 漏洞还没忙完,新的漏洞又出现了!
已删除
将门创投
18+阅读 · 2019年2月18日
相关基金
国家自然科学基金
0+阅读 · 2014年12月31日
国家自然科学基金
0+阅读 · 2014年12月31日
国家自然科学基金
0+阅读 · 2013年12月31日
国家自然科学基金
0+阅读 · 2013年12月31日
国家自然科学基金
0+阅读 · 2012年12月31日
国家自然科学基金
0+阅读 · 2012年12月31日
国家自然科学基金
0+阅读 · 2012年12月31日
国家自然科学基金
0+阅读 · 2012年12月31日
国家自然科学基金
0+阅读 · 2009年12月31日
国家自然科学基金
0+阅读 · 2009年12月31日
相关论文
pPython for Parallel Python Programming
Arxiv
0+阅读 · 2022年8月31日
Arxiv
0+阅读 · 2022年8月30日
Arxiv
17+阅读 · 2021年1月21日
已删除
Arxiv
32+阅读 · 2020年3月23日
Arxiv
21+阅读 · 2019年8月21日
Arxiv
21+阅读 · 2018年5月23日
Arxiv
11+阅读 · 2018年5月13日
Top
微信扫码咨询专知VIP会员