LightDB 支持字符串和数字类型之间的特殊兼容性。 当隐式转换规则不能找到合适的运算符或函数(Section 11.2,Section 11.3)时, 将自动应用显式类型转换,并应用类型优先级来选择适当的运算符或函数。
这个特殊的兼容性特性包括9个类型,并默认按优先级排序。每个类型都支持隐式类型转换到其他类型。
以下是默认的9个类型(按优先级降序排列):
numeric > double precision > real > bigint > integer > smallint > text > varchar > char
您可以使用ALTER TYPE
修改或添加类型的优先级,内置类型无法修改,请参阅ALTER TYPE。
优先级的值必须为正数。
Example 11.15. 修改或添加类型优先级
ALTER TYPE varchar2 set (priority=200)
兼容性类型解析
在遵循Section 11.2和Section 11.3中描述的规则之后,执行以下流程。
忽略所有具有伪类型参数的候选项。
所有的unknown-type
将被视为text
类型。
运行所有候选项,并保留输入类型上显示转换最少的那些。如果只剩下一个候选项,则使用它;否则保留所有剩余的候选项并继续下一步操作。
运行所有剩余的候选项,如果所有显式转换位置都具有相同的参数类型,则候选项的优先级将与参数类型的优先级相同。 如果候选项的显式转换位置有多个参数类型,则优先级将低于所有类型。 在运算符中,如果一个参数是数字,另一个参数是字符串,则数字类型的优先级将高于所有类型。
运行所有剩余的候选项,保留那些最多位置是精确匹配的候选项。如果只剩下一个候选项,则使用它;否则继续下一步操作。
运行所有剩余的候选项,从左到右比较候选项在相同位置上的参数类型优先级,保留具有最高优先级的候选项。
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可以在其上使用显式转换规则。
类型兼容性适用于运算符、函数、插入和更新。不适用于SELECT UNION,CASE
(Section 11.5)。