GaussDB函数类型解析

从系统表pg_proc中选择所有可能被选到的函数。如果使用了一个不带模式修饰的函数名称,那么认为该函数是那些在当前搜索路径中的函数。如果给出一个带修饰的函数名,那么只考虑指定模式中的函数。

如果搜索路径中找到了多个不同参数类型的函数。将从中选择一个合适的函数。

早在去年,华为云便发布了《云原生2.0白皮书》,阐述了云原生2.0定义、价值及参考架构,解读了“资源高效、应用敏捷、业务智能、安全可信”四大价值以及预测未来发展趋势。而今年的《云原生2.0架构白皮书》,围绕架构升级,重点诠释了云原生2.0技术特征与架构设计模式,以云原生技术力量推动企业数字化转型升级。

查找和输入参数类型完全匹配的函数。如果找到一个,则用之。如果输入的实参类型都是unknown类型,则不会找到匹配的函数。

如果未找到完全匹配,请查看该函数是否为一个特殊的类型转换函数。

寻找最优匹配。

  • 抛弃那些输入类型不匹配并且也不能隐式转换成匹配的候选函数。unknown文本在这种情况下可以转换成任何东西。如果只剩下一个候选项,则用之,否则继续下一步。
  • 遍历所有候选函数,保留那些输入类型匹配最准确的。此时,域被看作和它们的基本类型相同。如果没有一个函数能准确匹配,则保留所有候选。如果只剩下一个候选项,则用之,否则继续下一步。
  • 遍历所有候选函数,保留那些需要类型转换时接受首选类型位置最多的函数。如果没有接受首选类型的函数,则保留所有候选。如果只剩下一个候选项,则用之,否则继续下一步。
  • 如果有任何输入参数是unknown类型,检查剩余的候选函数对应参数位置的类型范畴。在每一个能够接受字符串类型范畴的位置使用string类型(这种对字符串的偏爱是合适的,因为unknown文本确实像字符串)。另外,如果所有剩下的候选函数都接受相同的类型范畴,则选择该类型范畴,否则抛出一个错误(因为在没有更多线索的条件下无法作出正确的选择)。现在抛弃不接受选定的类型范畴的候选函数,然后,如果任意候选函数在那个范畴接受一个首选类型,则抛弃那些在该参数位置接受非首选类型的候选函数。如果没有一个候选符合这些测试则保留所有候选。如果只有一个候选函数符合,则使用它;否则,继续下一步。
  • 如果同时有unknown和已知类型的参数,并且所有已知类型的参数有相同的类型,假设unknown参数也是这种类型,检查哪个候选函数可以在unknown参数位置接受这种类型。如果正好一个候选符合,那么使用它。否则,产生一个错误。

GaussDB函数示例

示例1:圆整函数参数类型解析。只有一个round函数有两个参数(第一个是numeric,第二个是integer)。所以下面的查询自动把第一个类型为integer的参数转换成numeric类型。

postgres=# SELECT round(4, 4); round-------- 4.0000(1 row)

实际上它被分析器转换成:

postgres=# SELECT round(CAST (4 AS numeric), 4);

因为带小数点的数值常量初始时被赋予numeric类型,因此下面的查询将不需要类型转换,并且可能会略微高效一些:

postgres=# SELECT round(4.0, 4);

示例2:子字符串函数类型解析。有好几个substr函数,其中一个接受text和integer类型。如果用一个未声明类型的字符串常量调用它,系统将选择接受string类型范畴的首选类型(也就是text类型)的候选函数。

postgres=# SELECT substr('1234', 3); substr-------- 34(1 row)

如果该字符串声明为varchar类型,就像从表中取出来的数据一样,分析器将试着将其转换成text类型:

postgres=# SELECT substr(varchar '1234', 3); substr-------- 34(1 row)

被分析器转换后实际上变成:

postgres=# SELECT substr(CAST (varchar '1234' AS text), 3);

说明:分析器从pg_cast表中了解到text和varchar是二进制兼容的,意思是说一个可以传递给接受另一个的函数而不需要做任何物理转换。因此,在这种情况下,实际上没有做任何类型转换。

而且,如果以integer为参数调用函数,分析器将试图将其转换成text类型:

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

被分析器转换后实际上变成:

postgres=# SELECT substr(CAST (1234 AS text), 3); substr-------- 34(1 row)

GaussDB函数常见问题解答

GaussDB函数常见问题解答

  • GaussDB数据库是否支持SSL连接?

    GaussDB数据库支持多种连接协议,包括SSL连接。具体请参见SSL连接处的SSL连接方式。

  • 如何将GaussDB数据库实例资源解冻?

    欠费冻结:用户可通过续费或充值来解冻资源,恢复实例正常使用。欠费冻结的实例允许续费、释放或删除;已经到期的包周期实例不能发起退订,未到期的包周期实例可以退订。

  • 冻结、解冻、释放GaussDB数据库实例资源时对业务的影响?

    1.资源冻结时:

    资源将被限制访问和使用,会导致您的业务中断。例如实例被冻结时,会使得用户无法再连接至数据库。

    包周期资源被冻结后,将被限制进行变更操作。

    资源被冻结后,可以手动进行退订/删除。

    2.资源解冻时:资源将被解除限制,用户可以连接至数据库。

    3.资源释放时:资源将被释放,实例将被删除,删除前将依据用户策略决定是否执行回收站备份。

  • GaussDB数据库实例权限如何设置?

    GaussDB数据库实例部署时通过物理区域划分,为项目级服务。授权时,“作用范围”需要选择“区域级项目”,然后在指定区域(如华北-北京1)对应的项目(cn-north-1)中设置相关权限,并且该权限仅对此项目生效;如果在“所有项目”中设置权限,则该权限在所有区域项目中都生效。访问GaussDB时,需要先切换至授权区域。

  • GaussDB数据库权限策略是什么?

    根据授权精细程度分为角色和策略

    角色:IAM最初提供的一种根据用户的工作职能定义权限的粗粒度授权机制。该机制以服务为粒度,提供有限的服务相关角色用于授权

    IAM最新提供的一种细粒度授权的能力,可以精确到具体服务的操作、资源以及请求条件等。基于策略的授权是一种更加灵活的授权方式,能够满足企业对权限最小化的安全管控要求。

  • GaussDB数据库实例被锁怎么处理?

    因为某些操作可能导致数据库实例被锁,可以通过一些步骤进行解锁,详情请参见数据库实例被锁怎么处理?

GaussDB函数优质文章锦集