You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

hstore(text[], text[])函数是否具有确定性?重复键处理规则确认

Hstore数组构造函数的重复键行为解析

场景复现

当使用hstore(text[], text[])构造函数,传入含重复键的数组时:

select hstore(array[1,1,2]::text[], array[3,2,4]::text[]);

返回结果固定为:

1 => 3, 2 => 4

可见函数保留了首次出现的键对应的值,自动忽略后续重复键。


文档与行为一致性说明

PostgreSQL官方文档未明确描述hstore(text[], text[])处理重复键的行为,但该函数的实现逻辑是确定的:按数组顺序遍历,遇到已存在的键直接跳过,因此始终保留第一个出现的键值对。

而直接通过字符串字面量转换(如SELECT 'a=>1,a=>2'::hstore;)的方式,因字符串解析逻辑不同,文档明确标注重复键的取值无法保证,这两种构造方式的行为并不一致。


可验证的测试方法

通过多组测试用例可验证该函数的确定性:

  1. 不同位置的重复键测试

    -- 中间插入重复键
    select hstore(array['a','b','a','c']::text[], array['1','2','3','4']::text[]);
    -- 预期结果:"a"=>"1", "b"=>"2", "c"=>"4"
    
    -- 末尾追加重复键
    select hstore(array['x','y','x']::text[], array['foo','bar','baz']::text[]);
    -- 预期结果:"x"=>"foo", "y"=>"bar"
    
  2. 重复执行一致性测试
    多次执行同一含重复键的构造查询,检查结果是否完全一致:

    select hstore(array['k1','k2','k1','k3']::text[], array['v1','v2','v3','v4']::text[]);
    

    每次执行结果都应为"k1"=>"v1", "k2"=>"v2", "k3"=>"v4",证明行为稳定。

  3. 源码层面验证
    查看PostgreSQL的hstore扩展源码(hstore.c中的hstore_from_arrays函数),可明确看到遍历数组时会检查键是否已存在,若已存在则跳过当前条目,仅保留首次出现的键值对。


内容的提问来源于stack exchange,提问作者emote_control

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 21:18:32