PostgreSQL DBA(57) - Could not choose a best candidate operator
发表于:2025-11-08 作者:千家信息网编辑
千家信息网最后更新 2025年11月08日,本节内容来源于客户现场反馈的一个问题.Question创建了integer到text的cast后,为何执行字符串连接"||"操作报错?testdb=# drop table if exists t_c
千家信息网最后更新 2025年11月08日PostgreSQL DBA(57) - Could not choose a best candidate operator
本节内容来源于客户现场反馈的一个问题.
Question
创建了integer到text的cast后,为何执行字符串连接"||"操作报错?
testdb=# drop table if exists t_cast ;DROP TABLEtestdb=# create table t_cast (id int);CREATE TABLEtestdb=# insert into t_cast values(1),(2),(3);INSERT 0 3testdb=# create cast(integer as text) with inout as implicit;CREATE CASTtestdb=# select id||'X' from t_cast;psql: ERROR: operator is not unique: integer || unknownLINE 1: select id||'X' from t_cast; ^HINT: Could not choose a best candidate operator. You might need to add explicit type casts.Answer
PostgreSQL处理操作符时分为以下两个步骤:
1.从系统目录pg_operator中找出匹配该操作符和操作数的候选函数(数据行);
2.根据隐式转换规则选择合适的operator.
原生PG
通过分析和跟踪代码,第一步,从pg_operator中选出的后续函数OID为374/2780
testdb=# select oid,oprname,oprleft::regtype,oprright::regtype testdb-# from pg_operator testdb-# where oid in (374,2780); oid | oprname | oprleft | oprright ------+---------+-------------+---------- 374 | || | anyelement | anyarray 2780 | || | anynonarray | text(2 rows)而'X'可视为text,最终PostgreSQL会选择OID = 2780的operator,因此不会出错.
创建integer -> text转换
而创建了integer -> text的cast后,从pg_operator中选出的后续函数OID为654/2779/374/2780
testdb=# select oid,oprname,oprleft::regtype,oprright::regtype testdb-# from pg_operator testdb-# where oid in (654,2779,374,2780); oid | oprname | oprleft | oprright ------+---------+-------------+------------- 374 | || | anyelement | anyarray 654 | || | text | text 2779 | || | text | anynonarray 2780 | || | anynonarray | text(4 rows)因为integer可以转换为text,PostgreSQL无法在2779和2780之间无法做出选择,因此出现错误:Could not choose a best candidate operator.
参考资料
PostgreSQL 源码解读(209)- 隐式类型转换(func_select_candidate)
PostgreSQL 源码解读(210)- 隐式类型转换(func_match_argtypes)
函数
选择
操作符
源码
类型
选出
合适
两个
之间
代码
内容
参考资料
字符
字符串
客户
操作数
数据
时分
来源
步骤
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
数据库如何提高网速
北京邮电大学软件开发项目
重庆包装行业erp软件开发
如何安装git服务器
金税盘出现数据库信息失败
数据库去重处理用什么函数
苹果官网服务器
桐乡政务大厅叫号软件开发商
软件开发公司中文模板网站
网络安全证书培训学校
福建深耕七年网络技术有限公司
无锡网络营销软件开发哪家好
畅达车联(北京)网络技术
聊城翔宇网络技术有限公司
侦查数据库
万达软件开发公司
b612软件开发者
网络安全工程师电脑包
上市公司分红数据库
济南微网互联网络科技有限公司
网络安全隔离卡价格
小学生网络安全宣传手册
数据库安全审计系统+开源
软件开发工程师工作辛苦吗
明日之后服务器更新到几点
干软件开发适合什么样的人
连接到权限管理服务器
软件开发后要怎么确认
数据库工程师升职空间
目前最流行的软件开发模型