11.7. 类型兼容性

LightDB 支持字符串和数字类型之间的特殊兼容性。 当隐式转换规则不能找到合适的运算符或函数(Section 11.2Section 11.3)时, 将自动应用显式类型转换,并应用类型优先级来选择适当的运算符或函数。

这个特殊的兼容性特性包括9个类型,并默认按优先级排序。每个类型都支持隐式类型转换到其他类型。

以下是默认的9个类型(按优先级降序排列):

numeric > double precision > real > bigint > integer > smallint > text > varchar > char

您可以使用ALTER TYPE修改或添加类型的优先级,内置类型无法修改,请参阅ALTER TYPE

Note

优先级的值必须为正数。

Example 11.15. 修改或添加类型优先级

ALTER TYPE varchar2 set (priority=200)


兼容性类型解析

  1. 在遵循Section 11.2Section 11.3中描述的规则之后,执行以下流程。

  2. 忽略所有具有伪类型参数的候选项。

  3. 所有的unknown-type将被视为text类型。

  4. 运行所有候选项,并保留输入类型上显示转换最少的那些。如果只剩下一个候选项,则使用它;否则保留所有剩余的候选项并继续下一步操作。

  5. 运行所有剩余的候选项,如果所有显式转换位置都具有相同的参数类型,则候选项的优先级将与参数类型的优先级相同。 如果候选项的显式转换位置有多个参数类型,则优先级将低于所有类型。 在运算符中,如果一个参数是数字,另一个参数是字符串,则数字类型的优先级将高于所有类型。

  6. 运行所有剩余的候选项,保留那些最多位置是精确匹配的候选项。如果只剩下一个候选项,则使用它;否则继续下一步操作。

  7. 运行所有剩余的候选项,从左到右比较候选项在相同位置上的参数类型优先级,保留具有最高优先级的候选项。

Example 11.16. 自动应用显式转换。

select |/'20'::text;

     ?column?     
------------------
 4.47213595499958
(1 row)

在这个例子中,text类型不能隐式转换为double precision类型, 但是根据类型兼容性规则,数字和字符串类型之间可以自动应用显式转换。


Example 11.17. 类型优先级

select ~ '20';

 ?column? 
----------
      -21
(1 row)

在这个例子中,输入类型是未知类型,因此将输入类型视为文本类型, 并选择具有最高优先级参数的候选项,使用~ bigint

如果输入值无法转换为bigint,将报告类型转换错误。

select ~ 'a';

ERROR:  invalid input syntax for type bigint: "a"
LINE 1: select ~ 'a';


Example 11.18. 子字符串函数类型解析

如果使用integer类型的参数调用substr函数, LightDB 将尝试将其转换为text类型:

SELECT substr(1234, 3);
 substr 
--------
 34
(1 row)


Example 11.19. 参数列表优先级

create function testfun(text,integer) 
  returns text as $$ select 'text,integer' $$ language sql;

create function testfun(integer,text) 
  returns text as $$ select 'integer,text' $$ language sql;

select testfun('1'::text, '1'::text);

没有一个参数更适合,因此从左到右比较参数的优先级。现在第一个参数是整数和文本,整数优先于文本,使用testfun(integer,text)


Example 11.20. 插入和更新

create table tb(name varchar, age int);

insert into tb(name,age) values(1223, '23'::varchar);
INSERT 0 1

update tb set name=1343,age='24'::text;
UPDATE 1

select * from tb;
 name | age 
------+-----
 1343 |  24
(1 row)

列类型和值类型不匹配,并且LightDB默认情况下没有值类型和列类型之间的隐式转换规则。 但是,根据兼容性规则,LightDB可以在其上使用显式转换规则。


Note

类型兼容性适用于运算符、函数、插入和更新。不适用于SELECT UNION,CASESection 11.5)。