pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
查询目标类型解析
检查是否与目标类型精确匹配。
否则,尝试把表达式强制转换成目标类型。如果两个 类型已知二进制兼容,或者存在转换 函数,转换就会成功。如果表达式是未知类型的字面量,就把 字面字符串的内容送给目标类型的 输入转换例程。
如果目标是定长类型(例如声明了长度的 char 或 varchar), 则尝试为目标类型寻找一个尺寸调整函数。尺寸调整函数是一个与类型 同名的函数, 接受两个参数,第一个是该类型,第二个是 integer,并返回同一类型。如果找到了这样的函数,就应用它, 把列的声明长度作为第二个参数传递。
varchar 存储对于声明为 varchar(4) 的目标列,下面的查询 确保目标的大小正确:
tgl=> CREATE TABLE vv (v varchar(4)); CREATE tgl=> INSERT INTO vv SELECT 'abc' || 'def'; INSERT 392905 1 tgl=> SELECT * FROM vv; v ------ abcd (1 row)
这里真正发生的是:两个未知字面量默认被解析成 text,使 || 运算符被 解析为文本串接。然后运算符的文本 结果被强制转换成 varchar 以匹配目标列类型。(但由于 解析器知道 text 和 varchar 二进制兼容,这个强制转换 是隐式的,不会插入任何真实的函数调用。)最后, 在系统目录中找到尺寸调整函数 varchar(varchar,int4), 应用到操作符的结果和存储的列长度上。这个 类型特定的函数执行所需的截断。
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。