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;)的方式,因字符串解析逻辑不同,文档明确标注重复键的取值无法保证,这两种构造方式的行为并不一致。
可验证的测试方法
通过多组测试用例可验证该函数的确定性:
不同位置的重复键测试
-- 中间插入重复键 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"重复执行一致性测试
多次执行同一含重复键的构造查询,检查结果是否完全一致:select hstore(array['k1','k2','k1','k3']::text[], array['v1','v2','v3','v4']::text[]);每次执行结果都应为
"k1"=>"v1", "k2"=>"v2", "k3"=>"v4",证明行为稳定。源码层面验证
查看PostgreSQL的hstore扩展源码(hstore.c中的hstore_from_arrays函数),可明确看到遍历数组时会检查键是否已存在,若已存在则跳过当前条目,仅保留首次出现的键值对。
内容的提问来源于stack exchange,提问作者emote_control
相关产品推荐
相关产品推荐

