5.4. 查询目标

查询目标类型分析

  1. 查找与目标准确的匹配.

  2. 否则,试着将表达式直接转换成目标类型. 如果已知该两种类型是二进制兼容的,或者存在一个转换函数, 那么这样做就可以.如果表达式是一个未知类型文本, 该文本字串的内容将交给目标类型的输入转换过程.

  3. 如果目标是定长类型(如 char 或定义了长度的 varchar) 则试着为目标类型找一个测长函数. 测长函数是一个与类型同名的函数,有两个参数, 第一个参数类型为名称,第二个参数是整数,返回同种类型. 如果找到一个,用之,把该字段声明的长度做为第二个参数传递.

5.4.1. 例子

5.4.1.1. 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)
这里真正发生的事情是两个 unknown 文本解析缺省成 text, 这样就允许 || 操作符解析成 text 连接. 然后操作符的 text 结果转换成 varchar 以匹配目标字段类型. (不过,因为分析器知道 text 和 varchar 是二进制兼容的, 这样的转换是隐含的并且实际上不做任何函数调用.) 最后,在系统表里找到测长函数 varchar(varchar,int4) 并且应用于该操作符的结果并存储字段长.这个类型相关的函数执行所需要的截断.