关于oushudb-hawq:OushuDB-用户指南类型转换之函数

2次阅读

共计 1824 个字符,预计需要花费 5 分钟才能阅读完成。

在一次函数调用中应用的特定函数由以下几个步骤决定。
函数类型解析

  1. 从零碎表 pg_proc 中抉择要思考的函数。如果应用了一个不带模式润饰的函数名字,那么认为该函数是那些在以后搜寻门路中名字和参数个数都匹配的函数(参阅「模式搜寻门路」- http://www.oushu.com/docs/ch/…)。如果给出一个带润饰的函数名,那么只思考指定模式中的函数。
    a. 如果搜寻门路中找到了多个雷同参数类型的函数,那么只思考最早呈现在门路中的那一个。然而不同参数类型的函数将被平等对待,而不论它们在门路中的地位如何。
  2. 查找准确承受输出参数类型的函数。如果找到一个(在一组被思考的函数中,可能只存在一个准确匹配的),则用之。蕴含 unknown 类型的函数调用绝不会在此处找到匹配。
  3. 如果没有找到准确的匹配,则看看函数调用是否须要一个非凡的类型转换。如果函数调用只有一个参数并且函数名与某些数据类型的外部名称雷同,那么就会呈现这种状况。另外,该函数的参数必须是一个未知类型的文本,或者与某个已命名数据类型二进制兼容。当这些条件满足时,函数参数能够在没有任何理论函数调用的时候转换为已命名的数据类型。
  4. 查找最佳匹配。
    a. 摈弃那些输出类型不匹配并且也不能隐式转换成匹配的候选函数。unknown 文本在这种状况下能够转换成任何货色。如果只剩下一个候选项,则用之,否则持续下一步。
    b. 遍历所有候选函数,保留那些输出类型匹配最精确的。此时,域被看作和他们的根本类型雷同。如果没有一个函数能精确匹配,则保留所有候选。如果只剩下一个候选项,则用之,否则持续下一步。
    c. 遍历所有候选函数,保留那些须要类型转换时承受 (属于输出数据类型的类型领域的) 首选类型地位最多的函数。如果没有承受首选类型的函数,则保留所有候选。如果只剩下一个候选项,则用之,否则持续下一步。
    d. 如果有任何输出参数是 unknown 类型,查看残余的候选函数对应参数地位的类型领域。在每一个可能承受字符串类型领域的地位应用 string 类型(这种对字符串的偏爱是适合的,因为 unknown 文本的确像字符串)。另外,如果所有剩下的候选函数都承受雷同的类型领域,则抉择该类型领域,否则抛出一个谬误(因为在没有更多线索的条件下无奈作出正确的抉择)。当初摈弃不承受选定的类型领域的候选函数,而后,如果任意候选函数在那个领域承受一个首选类型,则摈弃那些在该参数地位承受非首选类型的候选函数。
    a. 如果正好一个候选合乎,那么应用它。否则,产生一个谬误。
    请留神,”最佳匹配”规定对操作符和对函数的类型剖析都是一样的。上面是一些例子。
    例. 圆整函数参数类型解析
    只有一个 round 函数有两个参数 (第一个是 numeric,第二个是 integer)。所以上面的查问主动把第一个类型为 integer 的参数转换成 numeric 类型:
    SELECT round(4, 4);round——–4.0000(1 row)
    实际上它被分析器转换成:
    SELECT round(CAST (4 AS numeric), 4);
    因为带小数点的数值常量初始时被赋予 numeric 类型,因而上面的查问将不须要类型转换,并且可能会稍微高效一些:
    SELECT round(4.0, 4);
    例. 子字符串函数类型解析
    有好几个 substr 函数,其中一个承受 text 和 integer 类型。如果用一个未声明类型的字符串常量调用它,零碎将抉择承受 string 类型领域的首选类型 (也就是 text 类型)的候选函数。
    SELECT substr(‘1234’, 3);substr——–34(1 row)
    如果该字符串申明为 varchar 类型,就像从表中取出来的数据一样,分析器将试着将其转换成 text 类型:
    SELECT substr(varchar ‘1234’, 3);substr——–34(1 row)
    Note
    分析器从 pg_cast 表中理解到 text 和 varchar 是二进制兼容的,意思是说一个能够传递给承受另一个的函数而不须要做任何物理转换。因而,在这种状况下,实际上没有做任何类型转换。
    而且,如果以 integer 为参数调用函数,分析器将试图将其转换成 text 类型:
    SELECT substr(1234, 3);substr——–34(1 row)
    事实上变成:
    SELECT substr(CAST (1234 AS text), 3);
    这种主动转换可行是因为有一个从 integer 到 text 的隐式转换。
正文完
 0