GBase 8c 函数与操作符——28-类型转换 | 操作符

1、概述

SQL是一种强类型语言,即每个数据项都有一个相关的数据类型,数据类型决定其行为和允许的用法。GBase 8c提供一种可扩展的通用规则来管理类型转换,这种做法允许使用混合类型的表达式。

语法解析器将语法元素分解为五个基本种类:整数、非整数数字、字符串、标识符、关键字。大多数非数字类型常量首先被分类为字符串,例如查询:

SELECT text 'Origin' AS "label", point '(0,0)' AS "value";

 label  | value
--------+-------
 Origin | (0,0)
(1 row)

文字常量text和point没有被指定类型,初始会分别分配一个占位符类型unknown。
在SQL解析器里,有四种基本的SQL结构有独立的类型转换规则:

  • 函数调用:PostgreSQL允许函数重载,函数名本身并不唯一的标识将要被调用的函数,解析器必须根据提供的参数类型选择正确的的函数。
  • 操作符:PostgreSQL允许带有前缀和后缀的单参数(一元)操作符表达式,也允许两个参数(二元)操作符。像函数一样,操作符也可以被重载,因此解析器必须根据提供的参数类型选择正确的操作符。
  • 值存储:INSERT和UPDATE语句将表达式的结果插入表中,语句中表达式类型必须和目标列的类型一致(或可以被转换为一致)。
  • UNION、CASE和相关结构:因为一个UNION的SELECT语句中的所有查询结果必须在一个列集中显示,所以每个SELECT子句的结果类型必须能项目匹配并被转换成一个统一的集合。CASE、ARRAY、GREATEST和LEAST函数要求与UNION相同。

关于哪些数据类型之间存在哪种转换类型以及如何执行这些转换的信息,都存储在系统目录中。其他转换用户可以通过CREATE CAST命令增加。

解析器负责在具有隐式转换的类型组中对其类型进行恰当的隐式转换。数据类型可以分为以下几个基本的类型分类:boolean、numeric、string、bitstring、datetime、timespan、geometric、network和用户自定义。每个分类中,可以有一个或多个首选类型。

类型转换的基本规则:

  • 隐式转换不能有意外或不可预见的输出
  • 不需要隐式转换的查询,解析器不能有额外的开销。
  • 如果查询通常要求为某个函数进行隐式类型转换,而用户定义了一个有正确参数类型的新函数,解析器应使用新函数而不再做隐式转换来使用旧函数。

2、操作符

操作符的类型转换规则和优先级如下:

  1. 从系统目录pg_operator中选出要考虑的操作符:如果是不带模式限定的操作符,则该操作符被认定为在当前搜索路径中可见并有匹配名字和参数个数的操作符(如果有多个匹配,则使用第一个);如果是带模式限定的操作符,则以模式限定为准。
  2. 查找一个正好接受输入参数类型的操作符:
    a) 如果二元操作符调用中有一个参数是unknown类型,则默认其与另外一个参数类型相同;如果全部为unknown类型,则将无法找到匹配;
    b) 如果二元操作符调用中一个参数时unknown类型而另一个是域类型,下一次检查会查看是否有操作符可以两边都接受该域类型,如果有则使用它。
  3. 寻找最优匹配:
    a) 将输入类型不匹配且不能转换为匹配类型的操作符抛弃;
    b) 如果输入的参数时域类型,则后续所有步骤都为该域的基类型;
    c) 遍历所有候选操作符,保留在输入类型上匹配最准确的;如果没有操作符能准确匹配,则保留所有候选;如果只能下一个候选操作符,则直接使用,否则继续下一步;
    d) 遍历所有候选操作符,保留在最多个需要类型转换的位置上接受首选类型的操作符;
    e) 如果有任何输入参数是unknown类型,检查被剩余候选操作符在那些参数位置上接受的类型分类;
    f) 如果既有unknown参数也有已知类型的参数,并且所有已知类型参数具有相同的类型,则假定该unknown参数也是那种类型的,并且检查哪些候选操作符可以在该unknown参数的位置上接受那个类型。如果正好有一个候选者通过了这个测试,则使用之;否则失败。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值