函数无法识别_PostgreSQL找不到最佳函数问题解析

最近给项目做支持,由于函数类型问题,加了几条函数定义。

用户使用函数场景是func('string', 'string')。当时给用户添加了一条函数定义:func(text, text)。后来由于和其他函数冲突改成了func(varchar, varchar)。varchar和text同样都是字符串类型,而且用的相同的结构体,我的感知是效果是相同的,然后在使用过程中还是发生错误:

ERROR:  function func(unknown, unknown) is not unique
LINE 1: select func('****','****');^
HINT:  Could not choose a best candidate function. You might need to add explicit type casts.

这里的问题是,使用varchar,unknown不会默认转为varchar。而当参数类型是text时,就会默认转为text,然后在进行查找,这很奇怪了。开始定位原因,发现在执行函数func_select_candidate,会有不同。func_select_candidate代码非常长,这里就不贴出来了,大家可以自行看下,我在这里简单对代码进行介绍:

/* * 函数正式由于存在unknown type,所以无法准确定位到目标函数,* 所以这个函数主要用来处理带有unknown type的函数查询*/
func_select_candidate()
{
/* Step 1 */
处理有一个或多个unknown type的函数,尽可能匹配到相同类型的函数,
如果候选者只有一个则返回,否则进入下一步;
如果没有候选者,则返回NULL;
/* Step 2 */
如果还是有多个候选函数,那么通过查找最优先类型函数(typispreferred为true的类型),
如果候选者只有一个则返回,否则进入下一步;
如果没有候选者,则返回NULL;
/* Step 3 */
如果还是有多个候选函数,那么尝试将unknown type尝试转换为最优先类型函数;
如果候选者只有一个则返回,否则进入下一步;
如果没有候选者,则返回NULL;
/* Step 4 */
如果上一步确认可以转到最优先类型,则尝试进行使用最优先类型进行匹配函数;
如果候选者只有一个则返回,否则进入下一步;
如果没有候选者,则返回NULL;
/* Step 5 */
如果还是没有找到最有函数,并且unknown type参数个数少于总的参数个数,
则尝试将所有的unknown type转换为已知的类型接收,并且查看是否可以将已知类型转换为函数类型,
一旦找到即返回,否则返回NULL;
}

这里的typispreferred和typcategory引起了我的注意,可以查看文档:

typcategory:typcategoryis an arbitrary classification of data types that is used by the parser to determine which implicit casts should be“preferred”. SeeTable 51.64.
typispreferred:True if the type is a preferred cast target within itstypcategory

查看系统表:

postgres=# select oid,typname,typcategory,typispreferred from pg_type where oid=1043 or oid = 25 or oid = 705; oid  | typname | typcategory | typispreferred 
------+---------+-------------+----------------25 | text    | S           | t705 | unknown | X           | f1043 | varchar | S           | f
(3 rows)

text是typcategory为‘S’的preferred类型。

我定义的func(text, text),进入了func_select_candidate的part3和4,完成了匹配,而如果是func(varchar, varchar)由于不满足part3、4、5,直接返回NULL,返回无法找到最优函数的错误。这也就是类型使用text能够完成函数识别而varchar不能的原因。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/383054.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Xshell链接不上云服务器的解决方案

1.ssh拒绝请求 先该配置文件 https://blog.csdn.net/u012206617/article/details/83026777?ops_request_misc&request_id&biz_id102&utm_termssh%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%8B%92%E7%BB%9D%E4%BA%86%E5%AF%86%E7%A0%81%20%E8%AF%B7%E5%86%8D%E8%AF%95%E4%B8…

框架controller找不到_SpingBoot框架知识详解

Spring boot框架1、什么是Spring Boot?​ Spring Boot是Spring开源组织下的子项目,是Spring组件一站式解决方案,主要是简化了使用Spring的难度,简省了繁重的配置,提供了各种启动器,开发者能快速上手。Sprin…

架构的演变

基本概念 在介绍架构之前,为了避免部分读者对架构设计中的一些概念不了解,下面对几个最基础的概念进行介绍。 1.什么是分布式? 系统中的多个模块在不同服务器上部署,即可称为分布式系统,如Tomcat和数据库分别部署在…

axure8.0导出页面打不开问题_excel怎么转pdf?excel打不开?转换成PDF就行了

excel转pdf怎么做?年底最后一天了,我都被一堆的Excel文件搞得头疼,在这些时间里,要让我对几个G的文件进行操作,我已经是忙得不可开交,而在最后的最后,我的主管还说他的电脑无法打开我的Excel 了…

质数相关问题

试除法判定质数 题目描述 给定n个正整数ai,判定每个数是否是质数。 输入格式 第一行包含整数n。 接下来n行,每行包含一个正整数ai。 输出格式 共n行,其中第 i 行输出第 i 个正整数ai是否为质数,是则输出“Yes”&#xff0c…

python怎么爬虫理数据_Python神技能 | 使用爬虫获取汽车之家全车型数据

最近想在工作相关的项目上做技术改进,需要全而准的车型数据,寻寻觅觅而不得,所以就只能自己动手丰衣足食,到网上获(窃)得(取)数据了。汽车之家是大家公认的数据做的比较好的汽车网站…

linux运算_CentOS「linux」学习笔记22:算术运算符、逻辑运算符、关系运算符

​linux基础操作:主要介绍啦算术运算符、逻辑运算符、关系运算符1.算术运算符[主要用来计算数值]注意使用expr运算时运算符和数值之间需要有空格,其他方式运算时不能有空格。常用算术运算符号:表示相加,-表示相减&…

python实现小型搜索引擎设计_基于JAVA的中小型饭店餐饮管理系统的设计与实现...

好程序设计擅长JAVA(SSM,SSH,SPRINGBOOT)、PYTHON(DJANGO/FLASK)、THINKPHP、C#、安卓、微信小程序、MYSQL、SQLSERVER等,欢迎咨询今天将为大家分析一个中小型饭店餐饮管理系统(俗话说“民以食为天”,中国的饮食文化有着久远的历史。“吃”不仅仅指的是填饱肚子,它早…

评估报告有效期过期了怎么办_托福成绩过期了怎么办?

托福成绩是有期限的,考生申请美国大学的时候也只能在托福成绩有效期内。所以考托福的时候一定要关注一下托福成绩什么时候过期,以及大学申请的截止日期,提前做好安排。下面我们一起看看关于托福成绩有效期的相关问题。托福成绩有效期是多久&a…

sql语句的经典练习

表结构 –1.学生表 Student(s_id,s_name,s_birth,s_sex) –学生编号,学生姓名, 出生年月,学生性别 –2.课程表 Course(c_id,c_name,t_id) – –课程编号, 课程名称, 教师编号 –3.教师表 Teacher(t_id,t_name) –教师编号,教师姓名 –4.成绩表 Score(s_id,c_id,s_score…

四阶龙格库塔法的基本思想_数值常微分方程-欧拉法与龙格-库塔法

大三时候在跳蚤市场闲逛,从一位数学院的学长那里买了一些闲书,最近翻出来刚好有李荣华、刘播老师的《微分方程数值解法》和王仁宏老师的《数值逼近》,结合周善贵老师的《计算物理》课程,整理一下笔记。本文整理常微分方程数值求解…

OC中的类

OC中类 OC中类的定义 在Xcode中创建一个新的类,会自动给你生成两个文件一个是.h另外一个是.m文件,你新创建的类默认继承了NSObject类,因为有一些方法都需要基类中的方法。比如alloc分配内存 OC中用来描述类的使用interface 类名:父类来进行…

装配组件_基于Haption力反馈系统的交互式装配仿真

在一个新工业产品的设计过程中,装配规划是非常重要的任务。如果规划不好将造成很大的资金浪费,致使组件不能正确地集成。例如典型问题:移动一个组件到指定位置但空间不足;使用工具够不到螺丝;操作者没有足够的视域以保…

OC中的基本容器和基本数据类型

基本数据类型 NSRange 是一个结构体,里面有两个数据成员数据类型都为NSUInteger 就是c语言中的无符号整形,一个是location表示集合的起始地址,另外一个变量是length表示从起始地址开始算多少个元素。 NSRange的三种创建方式 //1.NSRange r…

python程序开发总结_python开发总结

两本不错的书:《Python参考手册》:对Python各个标准模块,特性介绍的比较详细。《Python核心编程》:介绍的比较深入,关键是,对Python很多高级特性都有介绍。一个开源代码:openstack,关…

Centos7通过yum安装jsoncpp库

拒绝下载软件包 一堆网上下载安装包,为了编译暗转包又下载插件,是真麻烦 看看有没有jsoncpp的相关库 $ yum list | grep jsoncpp-devel然后执行这两句,就完了 yum install jsoncpp.x86_64 yum install jsoncpp.devel.x86-64多简单

作为唯一索引_Mysql什么情况下不走索引?

本文基于Mysql5.7版本和InnoDB存储引擎。1、InnoDB索引组织表在InnoDB引擎中,表都是按照主键顺序组织存放的,这种存放方式的表称为索引组织表。InnoDB存储引擎中的表,都有主键,如果没有显式声明主键,则采取以下措施&am…

python捕获全局异常统一管理_python中如何用sys.excepthook来对全局异常进行捕获、显示及输出到error日志中...

使用sys.excepthook函数进行全局异常的获取。1. 使用MessageDialog实现异常显示;2. 使用logger把捕获的异常信息输出到日志中;步骤:定义异常处理函数, 并使用该函来替换掉系统的内置处理函数;对于threading.py的异常捕…

r语言系统计算上是奇异的_R语言实现并行计算

Python作为多线程的编程语言在并行方面相对于R语言有很大的优势,然而作为占据统计分析一席之地的R语言自然不能没有并行计算的助力。那么我们来看下在R语言中有哪些并行的包:隐式并行:OpenBLAS,Intel MKL,NVIDIA cuBLA…

cansina 目录_dirmap - 一个高级web目录、文件扫描工具-华盟网

Dirmap一个高级web目录扫描工具,功能将会强于DirBuster、Dirsearch、cansina、御剑需求分析经过大量调研,总结一个优秀的web目录扫描工具至少具备以下功能:并发引擎能使用字典能纯爆破能爬取页面动态生成字典能fuzz扫描自定义请求自定义响应结…