↑↓ 选择↵ 打开⌫ 切换范围完整搜索

PG.CENTER 连接 PostgreSQL 文档、百科与生态知识。由 Pigsty 维护。

已结束支持的版本: 7.0 / 6.5
历史版本。 PostgreSQL 6.5 已结束支持。 请参阅 当前版本手册.

6.3. 函数

函数求值

  1. 在 pg_proc 系统目录中检查精确匹配。

  2. 寻找最佳匹配。

    1. 列出所有同名且参数个数相同的函数。

    2. 如果列表中只有一个函数,输入类型可强制转换时就使用它,类型不能强制转换时就报错。

    3. 保留类型显式匹配最多的函数。如果没有显式匹配则全部保留并进入下一步。如果只剩一个候选,类型可强制转换时就使用它。

    4. 如果有输入参数是"unknown",把输入的候选参数归类为 boolean、numeric、string、geometric 或用户自定义。如果类别混合,或者用户定义类型多于一个,就报错,因为没有更多线索就无法推断出正确的选择。如果只有一个类别,就把"首选类型"赋给先前为"unknown"的输入列。

    5. 选择类型精确匹配最多且与上一步中每个列类别的 "首选类型"匹配的候选。如果候选仍多于一个,或者一个也没有,就报错。

6.3.1. 示例

6.3.1.1. 阶乘函数

pg_proc 目录中只定义了一个阶乘函数。因此下面的查询自动把 int2 参数转换为 int4:

tgl=> select int4fac(int2 '4');
int4fac
-------
     24
(1 row)

并且实际上被解析器变换为

tgl=> select int4fac(int4(int2 '4'));
int4fac
-------
     24
(1 row)

6.3.1.2. 子串函数

pg_proc 中声明了两个 substr 函数。但只有一个接受两个参数,类型是 text 和 int4。

如果用未指定类型的字符串常量调用,该类型会直接与唯一的候选函数类型匹配:

tgl=> select substr('1234', 3);
substr
------
    34
(1 row)

如果该字符串被声明为 varchar 类型(例如它来自一张表时就是这种情况),则解析器会试图把它强制转换成 text:

tgl=> select substr(varchar '1234', 3);
substr
------
    34
(1 row)

它被解析器变换成

tgl=> select substr(text(varchar '1234'), 3);
substr
------
    34
(1 row)

注意

解析器中有一些启发式规则来优化 char、varchar 和 text 类型之间的关系。在这个例子中,substr 直接用 varchar 字符串调用,而不是插入显式的转换调用。

而且,如果用 int4 调用该函数,解析器会试图把它转换成 text:

tgl=> select substr(1234, 3);
substr
------
    34
(1 row)

实际执行为

tgl=> select substr(text(1234), 3);
substr
------
    34
(1 row)

报告文档问题

阅读 上游文档. 反馈更正前请先核对 当前版本手册.