PostgreSQL执行SQL出现Value out of range: overflow错误的原因咨询
为什么包含子查询的CASE条件会触发pow函数溢出,而常量条件不会?
这是PostgreSQL优化器的**常量折叠(Constant Folding)**机制导致的差异:
对于
when 0=1这种纯常量表达式,优化器在解析阶段就能确定它永远为false,会直接把CASE语句优化成else分支的结果(也就是10),then分支里的pow(999,9999)根本不会被执行,自然不会触发溢出。而
when (select 0)=1这种包含子查询的表达式,优化器不会将其视为完全的常量——哪怕子查询返回的是固定值,它仍然属于需要动态执行的子查询表达式。此时优化器无法提前跳过then分支的计算,会先求值CASE的两个分支,再根据条件判断取哪个结果。所以pow(999,9999)会被执行,计算出的数值远超PostgreSQL数值类型的存储范围,直接触发了溢出错误。
你可以通过EXPLAIN ANALYZE查看两个查询的执行计划来验证:第二个查询的计划里完全不会出现pow函数相关的操作,而第一个查询会显示执行了该函数。
内容的提问来源于stack exchange,提问作者kawarizma
相关产品推荐
相关产品推荐

