广告
返回顶部
首页 > 资讯 > 数据库 >PostgreSQL隐式类型转换中使用哪些操作符实现函数
  • 665
分享到

PostgreSQL隐式类型转换中使用哪些操作符实现函数

2024-04-02 19:04:59 665人浏览 薄情痞子
摘要

这篇文章主要讲解了“postgresql隐式类型转换中使用哪些操作符实现函数”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Postgresql隐式类型转换中

这篇文章主要讲解了“postgresql隐式类型转换中使用哪些操作符实现函数”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Postgresql隐式类型转换中使用哪些操作符实现函数”吧!

一、数据结构

FuncCandidateList
该结构体存储检索得到的所有可能选中的函数或操作符链表.


typedef struct _FuncCandidateList
{
    struct _FuncCandidateList *next;
    //用于namespace检索内部使用
    int         pathpos;        
    //OID
    Oid         oid;            
    //参数个数 
    int         nargs;          
    //variadic array的参数个数
    int         nvargs;         
    //默认参数个数
    int         ndargs;         
    //参数位置索引
    int        *argnumbers;     
    //参数类型
    Oid         args[FLEXIBLE_ARRAY_MEMBER];    
}          *FuncCandidateList;

二、源码解读

func_match_argtypes
给定候选函数列表(正确的函数名称/参数个数匹配)和输入数据类型OIDs数组,生成实际可匹配输入数据类型(完全匹配或可转换)的候选函数链表,然后符合条件的候选函数个数.


int
func_match_argtypes(int nargs,
                    Oid *input_typeids,
                    FuncCandidateList raw_candidates,
                    FuncCandidateList *candidates)  
{
    FuncCandidateList current_candidate;//当前候选
    FuncCandidateList next_candidate;//下一候选
    int         ncandidates = 0;
    *candidates = NULL;
    for (current_candidate = raw_candidates;
         current_candidate != NULL;
         current_candidate = next_candidate)//遍历候选函数
    {
        next_candidate = current_candidate->next;
        if (can_coerce_type(nargs, input_typeids, current_candidate->args,
                            COERCioN_IMPLICIT))//可匹配输入数据类型(完全匹配或可转换)
        {
            current_candidate->next = *candidates;
            *candidates = current_candidate;
            ncandidates++;
        }
    }
    return ncandidates;
}                               

在pg_operator中,输入参数类型与operator的参数类型匹配或可转换,可进入候选函数链表.

三、跟踪分析

测试脚本

create cast(integer as text) with inout as implicit;
select id||'X' from t_cast;

跟踪分析

(gdb) c
Continuing.
Breakpoint 2, oper_select_candidate (nargs=2, input_typeids=0x7ffeb9cca190, candidates=0x13Db8a0, operOid=0x7ffeb9cca22c)
    at parse_oper.c:330
330     ncandidates = func_match_argtypes(nargs, input_typeids,
(gdb) p *candidates
$1 = {next = 0x13db870, pathpos = 0, oid = 3284, nargs = 2, nvargs = 0, ndargs = 0, argnumbers = 0x0, args = 0x13db8c8}
(gdb) p *candidates->next
$2 = {next = 0x13db840, pathpos = 0, oid = 3681, nargs = 2, nvargs = 0, ndargs = 0, argnumbers = 0x0, args = 0x13db898}
(gdb) p *candidates->next->next
$3 = {next = 0x13db810, pathpos = 0, oid = 3633, nargs = 2, nvargs = 0, ndargs = 0, argnumbers = 0x0, args = 0x13db868}
(gdb) p *candidates->next->next->next
$4 = {next = 0x13db7e0, pathpos = 0, oid = 2780, nargs = 2, nvargs = 0, ndargs = 0, argnumbers = 0x0, args = 0x13db838}
(gdb) p *candidates->next->next->next->next
$5 = {next = 0x13db7b0, pathpos = 0, oid = 374, nargs = 2, nvargs = 0, ndargs = 0, argnumbers = 0x0, args = 0x13db808}
(gdb) p *candidates->next->next->next->next->next
$6 = {next = 0x13db780, pathpos = 0, oid = 349, nargs = 2, nvargs = 0, ndargs = 0, argnumbers = 0x0, args = 0x13db7d8}
(gdb) p *candidates->next->next->next->next->next->next
$7 = {next = 0x13db750, pathpos = 0, oid = 375, nargs = 2, nvargs = 0, ndargs = 0, argnumbers = 0x0, args = 0x13db7a8}
(gdb) p *candidates->next->next->next->next->next->next->next
$8 = {next = 0x13db720, pathpos = 0, oid = 1797, nargs = 2, nvargs = 0, ndargs = 0, argnumbers = 0x0, args = 0x13db778}
(gdb) p *candidates->next->next->next->next->next->next->next->next
$9 = {next = 0x13db6f0, pathpos = 0, oid = 2779, nargs = 2, nvargs = 0, ndargs = 0, argnumbers = 0x0, args = 0x13db748}
(gdb) p *candidates->next->next->next->next->next->next->next->next->next
$10 = {next = 0x13db6c0, pathpos = 0, oid = 654, nargs = 2, nvargs = 0, ndargs = 0, argnumbers = 0x0, args = 0x13db718}
(gdb) p *candidates->next->next->next->next->next->next->next->next->next->next
$11 = {next = 0x0, pathpos = 0, oid = 2018, nargs = 2, nvargs = 0, ndargs = 0, argnumbers = 0x0, args = 0x13db6e8}
(gdb) p *candidates->next->next->next->next->next->next->next->next->next->next->next
Cannot access memory at address 0x0
(gdb) n
334     if (ncandidates == 0)
(gdb) 
339     if (ncandidates == 1)
(gdb) 
349     candidates = func_select_candidate(nargs, input_typeids, candidates);
(gdb) p ncandidates
$12 = 2
(gdb) p *candidates
$13 = {next = 0x13db810, pathpos = 0, oid = 374, nargs = 2, nvargs = 0, ndargs = 0, argnumbers = 0x0, args = 0x13db808}
(gdb) p *candidates->next
$14 = {next = 0x0, pathpos = 0, oid = 2780, nargs = 2, nvargs = 0, ndargs = 0, argnumbers = 0x0, args = 0x13db838}
(gdb) p *candidates->next->next
Cannot access memory at address 0x0
(gdb)

感谢各位的阅读,以上就是“PostgreSQL隐式类型转换中使用哪些操作符实现函数”的内容了,经过本文的学习后,相信大家对PostgreSQL隐式类型转换中使用哪些操作符实现函数这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

您可能感兴趣的文档:

--结束END--

本文标题: PostgreSQL隐式类型转换中使用哪些操作符实现函数

本文链接: https://www.lsjlt.com/news/63803.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • PostgreSQL隐式类型转换中使用哪些操作符实现函数
    这篇文章主要讲解了“PostgreSQL隐式类型转换中使用哪些操作符实现函数”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“PostgreSQL隐式类型转换中...
    99+
    2022-10-18
  • PostgreSQL隐式类型转换中选择操作符的实现函数是什么
    这篇文章主要讲解了“PostgreSQL隐式类型转换中选择操作符的实现函数是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“PostgreSQL隐式类型转...
    99+
    2022-10-18
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作