news 2026/5/16 11:58:17

修改一个触发PostgreSQL 17.2 bug的SQL

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
修改一个触发PostgreSQL 17.2 bug的SQL

德哥发表了一篇文章DBA挑战AI: 一条SQL解数独,
其中最后一个SQL在PostgreSQL 15上能正确执行,但在PostgreSQL 17.2上报错,84: ERROR: wrong varnullingrels (b 3) (expected (b)) for Var 1/1,这里84是sql最后一行,并不是出错的位置,我在网上搜索这个错误,有下面两个有用的信息。

  1. https://www.postgresql.org/message-id/1948671.1686748004%40sss.pgh.pa.us 这个网页提到,2023年就有相关的错误。
  2. https://github.com/citusdata/citus/issues/7899 提出这个问题的人说
The query executes successfully if: Use INNER JOIN instead of LEFT OUTER JOIN ranged_partition table is not distributed Use PG15 & Citus12.1.6

这提供了修改的思路,我在代码中找到了LEFT,代码片段如下。

SELECTboard,-- 初始化行掩码:确保 SUM 结果被强制转为 int(SELECTarray_agg(m)FROM(SELECTCOALESCE(SUM(1<<(val-1)),0)::intasmFROMgenerate_series(0,8)rLEFTJOINLATERAL(SELECTsubstring(board,r*9+i,1)aschFROMgenerate_series(1,9)i)sONch<>'.'CROSSJOINLATERAL(SELECT(ch::text)::intasval)vGROUPBYrORDERBYr)s)asrowsFROMsudoku_puzzlesWHEREid=4

LEFT改为INNER,果真不报错了,也能算出结果,但有一个漏洞,如果某行全空,left join能保留右侧为NULL的结果,inner join则不能。
将ch为’.‘替换为’0’,然后将COALESCE(SUM(1 << (val - 1)), 0)::int改为SUM(case when val>0 then 1 << (val - 1)else 0 end)就可以了。
经验算,结果正确,放到PostgreSQL 15上也能正确执行,效率相同。

后来试验其他版本,发现17.4已经修复了这个bug

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/10 0:37:12

8个AI论文软件推荐,专科生轻松搞定毕业论文!

8个AI论文软件推荐&#xff0c;专科生轻松搞定毕业论文&#xff01; AI 工具如何助力专科生轻松完成毕业论文 对于许多专科生而言&#xff0c;撰写毕业论文是一项既复杂又耗时的任务。从选题、查资料到撰写、修改&#xff0c;每一个环节都可能成为阻碍。而如今&#xff0c;随着…

作者头像 李华
网站建设 2026/5/1 9:16:40

2025最新!自考必看10个AI论文平台测评,写论文不再愁

2025最新&#xff01;自考必看10个AI论文平台测评&#xff0c;写论文不再愁 2025年自考论文写作工具测评&#xff1a;为何需要一份权威榜单&#xff1f; 随着人工智能技术的不断进步&#xff0c;越来越多的自考学生开始依赖AI论文平台来提升写作效率和论文质量。然而&#xff0…

作者头像 李华
网站建设 2026/5/13 4:18:36

在戴尔Precision Max Slim本地部署KAG,把AI 问答系统卷出天际

当大厂们还在财报季里秀肌肉的时候,我们已经把他们的财报数据喂给了AI——不是普通的AI,是能"动脑筋"的那种。传统知识库面对"某大厂在AI领域的资源倾斜方向"这类问题时,基本上就是个"复读机":找得到现成答案就复述,找不到就摆烂。但今天,我们要…

作者头像 李华
网站建设 2026/5/15 3:07:51

测试覆盖率99%≠高质量:我们到底该追求什么样的覆盖率?

被数字遮蔽的真相‌在每日站会、迭代评审与质量报告中&#xff0c;“测试覆盖率”&#xff08;通常指代码覆盖率&#xff09;是一个高频词汇。管理层视其为进度的标尺&#xff0c;团队将其作为完成的证明。达到95%以上常被视为一项值得庆祝的成就。然而&#xff0c;一个冷酷的现…

作者头像 李华