# 64.3.B树支持函数

如图所示表38.9,btree定义了一个必需的和四个可选的支持功能。五种用户定义的方法是:

顺序

对于btree运算符族为其提供比较运算符的每个数据类型组合,它必须提供一个在中注册的比较支持函数安普罗克酒店支持功能1和amproclefttype/AmprocrowtType等于用于比较的左数据类型和右数据类型(即,匹配运算符在中注册的相同数据类型)阿莫普)。比较函数必须采用两个非空值*A.B并返回一个int32价值就是< 0,0> 0什么时候A.* < B, A. = BA. > *B*分别地不允许出现空结果:数据类型的所有值都必须具有可比性。看见src/backend/access/nbtree/nbtcompare。C例如。

如果比较的值是可折叠的数据类型,则将使用标准PG_GET_COLLATION()机械装置

sortsupport

可选地,btree操作符系列可以提供分类支持功能,登记在支持功能编号2下。这些函数允许以比简单地调用比较支持函数更有效的方式实现排序目的的比较。中定义了其中涉及的APIsrc/include/utils/sortsupport。H.

范围内

可选地,btree操作符系列可以提供在里面_范围支持功能,登记在支持功能编号3下。这些在btree索引操作期间不使用;相反,它们扩展了运算符族的语义,以便它能够支持包含范围 抵消 之前的范围 抵消 下列的帧绑定类型(请参见第4.2.8节).基本上,提供的额外信息是如何增加或减少*抵消*以与家庭的数据顺序兼容的方式进行评估。

范围内函数必须有签名

in_range(val type1, base type1, offset type2, sub bool, less bool)
returns bool

*瓦尔基础必须为同一类型,这是运算符系列支持的类型之一(即,它提供排序的类型)。然而抵消可能是另一种类型,也可能是家族不支持的类型。例如,内置的时间家庭提供了一个范围内具有抵消类型间隔.一个家庭可以提供范围内任何支持的类型和一个或多个抵消*类型。每个范围内函数应该输入到安普罗克酒店具有amproclefttype相当于类型1AmprocrowtType相当于类型2.

语言的基本语义范围内函数依赖于两个布尔标志参数。它应该加或减*基础抵消,然后比较瓦尔*结果如下:

  • 如果!附属的!较少的回来瓦尔 >= (基础 + 抵消)

  • 如果!附属的较少的回来瓦尔 <= (基础 + 抵消)

  • 如果*附属的!较少的回来瓦尔* >= (基础 - 抵消)

  • 如果*附属的较少的回来瓦尔* <= (基础 - 抵消)

    在执行此操作之前,函数应检查*抵消*:如果小于零,则引发错误错误代码\u无效\u前\u或\u后\u大小(22013)带有错误文本,如“窗口函数中的前后大小无效”。(这是SQL标准所要求的,尽管非标准运算符族可能会选择忽略此限制,因为它似乎没有什么语义上的必要性。)这一要求被委托给范围内函数,这样核心代码就不需要理解“小于零”对于特定数据类型的含义。

    另一个期望是范围内如果可行,函数应该避免在以下情况下抛出错误:基础 + 抵消基础 - *抵消*会溢出。即使该值超出数据类型的范围,也可以确定正确的比较结果。请注意,如果数据类型包含“无穷大”或“NaN”等概念,则可能需要格外小心,以确保范围内的结果与运算符族的正常排序顺序一致。

    调查结果范围内功能必须与操作员系列施加的排序顺序一致。准确地说,给定*抵消附属的*,然后:

  • 如果范围内具有*较少的对某些人来说是真的val1基础,这对每个人来说都是真的val2* <= val1同样基础.

  • 如果范围内具有*较少的对某些人来说,真是假val1基础,它对每个人来说都是假的val2* >= val1同样基础.

  • 如果范围内具有*较少的对某些人来说是真的瓦尔base1,这对每个人来说都是真的二进制数字系统* >= base1同样瓦尔.

  • 如果范围内具有*较少的对某些人来说,真是假瓦尔base1,它对每个人来说都是假的二进制数字系统* <= base1同样瓦尔.

    当条件相反时,类似的陈述成立*较少的*=错。

    如果要订购的型号(类型1)是可折叠的,则相应的排序规则OID将传递给范围内函数,使用标准PG_收到_COLLATION()机制。

范围内函数不需要处理空输入,通常会被标记为strict。

均衡图像

可选地,btree操作符系列可以提供均衡图像(“相等意味着图像相等”)支持函数,注册在支持函数编号4下。这些函数允许核心代码确定何时可以安全地应用btree重复数据消除优化。目前,均衡图像函数仅在构建或重建索引时调用。

均衡图像函数必须有签名

equalimage(opcintype oid) returns bool

返回值是关于运算符类和排序规则的静态信息。返回符合事实的表明顺序运算符类的函数保证只返回0(“参数相等”)当*A.B*参数也可以互换,不会丢失任何语义信息。没有注册均衡图像功能还是返回错误的表示无法假定此条件成立。

这个*opcintype争论才是关键``pg_型老太太运算符类索引的数据类型的。这是一种方便,允许重用相同的底层应用程序均衡图像函数跨越运算符类。如果opcintype*是可折叠的数据类型,相应的排序规则OID将传递给均衡图像函数,使用标准PG_GET_COLLATION()机械装置

就运算符类而言,返回符合事实的指示重复数据消除是安全的(或对于其OID已传递给其用户的排序规则是安全的)均衡图像功能)。但是,核心代码仅在以下情况下才会认为索引的重复数据消除是安全的:每一个索引列使用一个运算符类来注册均衡图像函数,每个函数实际上都返回符合事实的打电话的时候。

形象平等是几乎与简单的位相等条件相同。有一个细微的区别:在为varlena数据类型编制索引时,两个图像相等基准的磁盘表示可能不按位相等,这是因为在输入端不一致地应用TOAST压缩。正式地说,当一个操作符类均衡图像函数返回符合事实的,可以安全地假设基准_图像_eq()C函数将始终与运算符类一致顺序函数(前提是将相同的排序规则OID传递给均衡图像顺序功能)。

核心代码基本上无法根据同一数据类型族中其他运算符类的详细信息推断出多个数据类型族中运算符类的“相等意味着图像相等”状态。此外,运算符族注册交叉类型也是不明智的均衡图像函数,尝试这样做将导致错误。这是因为“相等意味着图像相等”状态不仅仅取决于排序/相等语义,排序/相等语义或多或少是在运算符族级别定义的。通常,一个特定数据类型实现的语义必须单独考虑。

PostgreSQL核心发行版中包含的运算符类遵循的约定是注册一个股票,即泛型均衡图像作用大多数运算符类都注册btequalimage(),这表明重复数据消除是无条件安全的。可折叠数据类型的运算符类,例如文本登记btvarstrequalimage(),这表明使用确定性排序规则进行重复数据消除是安全的。第三方扩展的最佳实践是注册自己的自定义函数以保留控制权。

选项

可选地,B-树运算符族可以提供选项(“操作员类特定选项”)支持功能,在支持功能编号5下注册。这些函数定义了一组用户可见的参数,用于控制运算符类的行为。

选项支持功能必须有签名

options(relopts local_relopts *) returns void

函数被传递一个指向本地重新选择struct,它需要填充一组特定于运算符类的选项。可以使用从其他支持功能访问这些选项PG_有_OPCLASS_选项()PG_GET_OPCLASS_OPTIONS()宏。

目前,没有B-树运算符类具有选项支持功能。B-树不允许灵活地表示GiST、SP GiST、GIN和BRIN do等键。所以选项在当前的B树索引访问方法中可能没有太多应用。然而,为了统一起见,这个支持函数被添加到了B-tree中,并且可能会在PostgreSQL中B-tree的进一步发展过程中得到使用。