淮北市网站建设_网站建设公司_自助建站_seo优化
2025/12/24 18:33:39 网站建设 项目流程

德哥发表了一篇文章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

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询