修改一个触发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,代码片段如下。

sql 复制代码
SELECT   
        board,  
        -- 初始化行掩码:确保 SUM 结果被强制转为 int  
        (SELECT array_agg(m) FROM (  
            SELECT COALESCE(SUM(1 << (val - 1)), 0)::int as m  
            FROM generate_series(0, 8) r  
            LEFT JOIN LATERAL (SELECT substring(board, r*9 + i, 1) as ch FROM generate_series(1, 9) i) s ON ch <> '.'
            CROSS JOIN LATERAL (SELECT (ch::text)::int as val) v  
            GROUP BY r ORDER BY r  
        ) s) as rows
    FROM sudoku_puzzles WHERE id = 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

相关推荐
IvorySQL17 小时前
PostgreSQL 日报 |PostgreSQL 19 Beta 4 发布(9 月 25 日)
数据库·postgresql
做运维的阿瑞18 小时前
多表查询基础:INNER JOIN、LEFT JOIN、RIGHT JOIN
数据库·sql·mysql·算法
IvorySQL19 小时前
PostgreSQL 日报 | 可见性映射数据损坏修复(9 月 26 日)
数据库·postgresql
Seraphina3619 小时前
DVWA(SQL注入-low,medium,XSS反射-low)
前端·数据库·笔记·sql·网络安全·web·xss
一直在努力学习的菜鸟19 小时前
PostgreSQL PITR实现时间点误删除恢复
postgresql
IvorySQL20 小时前
PostgreSQL 日报| relchecks 溢出导致表无法删除(9 月 28 日)
数据库·人工智能·ai·postgresql·区块链
韩曙亮1 天前
【JavaEE】MyBatis 基本用法 ⑤ ( 单条件查询 | 多条件查询 | 多条件动态查询 | 单条件动态查询 )
java·sql·java-ee·mybatis·mapper·sql映射
阳光九叶草LXGZXJ1 天前
达梦数据库-学习-71-存过执行过程中重建存过影响验证
linux·运维·数据库·sql·学习
cpolar技术支持2 天前
本地数据库客户端只能自己用?用 cpolar 安全访问 NAS 上的 PostgreSQL 管理台
postgresql·内网穿透·cpolar·nas·pgadmin
2501_933670792 天前
2027届大数据管理与应用求职数字化转型顾问:项目、SQL、业务理解怎么排优先级
数据库·sql