示例1:阶乘操作符类型解析。在系统表中里只有一个阶乘操作符(后缀!),它以bigint作为参数。扫描器给下面查询表达式的参数赋予bigint的初始类型:
SELECT 40 ! AS "40 factorial";
40 factorial
--------------------------------------------------
815915283247897734345611269596115894272000000000
(1 row)
分析器对参数做类型转换,查询等效于:
SELECT CAST(40 AS bigint) ! AS "40 factorial";示例2:字符串连接操作符类型分析。一种字符串风格的语法既可以用于字符串也可以用于复杂的扩展类型。未声明类型的字符串将被所有可能的候选操作符匹配。有一个未声明的参数的例子:
SELECT text 'abc' || 'def' AS "text and unknown";
text and unknown
------------------
abcdef
(1 row)
本例中分析器寻找两个参数都是text的操作符。确实有这样的操作符,两个参数都是text类型。
下面是连接两个未声明类型的值:
SELECT 'abc' || 'def' AS "unspecified";
unspecified
-------------
abcdef
(1 row)
说明:因为查询中没有声明任何类型,所以本例中对类型没有任何初始提示。因此,分析器查找所有候选操作符,发现既存在接受字符串类型范畴的操作符也存在接受位串类型范畴的操作符。因为字符串类型范畴是首选,所以选择字符串类型范畴的首选类型text作为解析未知类型文本的声明类型。
示例3:绝对值和取反操作符类型分析。GaussDB 200操作符表里面有几条记录对应于前缀操作符@,它们都用于为各种数值类型实现绝对值操作。其中之一用于float8类型,它是数值类型范畴中的首选类型。因此,在面对unknown输入的时候, GaussDB 200会使用该类型:
SELECT @ '-4.5' AS "abs";
abs
-----
4.5
(1 row)
此处,系统在应用选定的操作符之前隐式的转换unknown类型的文字为float8类型。
示例4:数组包含操作符类型分析。这里是解决一个操作符带有一个已知和一个未知类型输入的例子:
SELECT array[1,2] <@ '{1,2,3}' as "is subset";
is subset
-----------
t
(1 row)
说明:GaussDB 200操作符表有几条记录对应于中缀操作符<@,但是只有两个可以在左侧接受一个整数数组的操作符是数组包含(anyarray <@ anyarray) 和范围包含(anyelement <@ anyrange)的。因为没有多态的伪类型(参阅伪类型)是首选的,所以解析器不能解决这个基础上的歧义。然而,最后一个解析规则告诉用户,假设未知类型的文字是和另外一个输入相同的类型,也就是,整数数组。现在只有两个操作符中的一个可以匹配,所以选择数组包含。(如果用户选择了范围包含,用户将得到一个错误,因为字符串没有正确的格式成为范围的文字。)
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69959250/viewspace-3158876/ ,如需转载,请注明出处,否则将追究法律责任。