regoper
操作符名称
当前查看 PostgreSQL 18.6。
PG10–20 核心源码清单。类型转换与操作符类列出源码显式声明的关系;缺少记录不能排除通过其他机制进行转换或使用索引。
定义
操作符名称
regoper
- 目录名称
- pg_catalog.regoper
- 类型 OID
- 2203
- 类型种类
- 基础类型
- 声明长度
- 4 字节
- 存储策略
- plain
- 输入函数
- regoperin
- 输出函数
- regoperout
- 手册中的声明
- regoper
- 参考资料
- pg_operator
- 手册说明
- 操作符名称
- 示例值
- +
中文手册
阅读来源定义
8.19. 对象标识符类型
8.19. 对象标识符类型
对象标识符(OID)在 PostgreSQL 内部被用作若干系统表的主键。类型 oid 表示一个对象标识符。此外还有若干 oid 的别名类型,其名称均形如 reg。表 8.26给出了概要说明。something
oid 目前实现为无符号四字节整数,因此在大型数据库中,甚至在单张大型表中,都不足以保证数据库范围内的唯一性。
oid 类型本身除比较之外几乎没有其他操作。不过,它可以转换为整数,然后再用标准整数操作符进行处理。(这样做时要注意有符号与无符号可能造成的混淆。)
除专用输入/输出例程外,OID 别名类型没有自己的运算。这些例程能够接受和显示系统对象的符号名称,而非 oid 类型使用的原始数值。别名类型可简化对象 OID 的查找。例如,要查看表 mytable 对应的 pg_attribute 行,可以写成:
SELECT * FROM pg_attribute WHERE attrelid = 'mytable'::regclass;
而不是:
SELECT * FROM pg_attribute WHERE attrelid = (SELECT oid FROM pg_class WHERE relname = 'mytable');
虽然这样看起来也不算太糟,但其实仍然过于简化。如果不同模式中有多个名为 mytable 的表,就必须写一个复杂得多的子查询来选出正确的 OID。regclass 的输入转换器会按照模式路径设置来处理表查找,因此能够自动完成“正确的事情”。同样,把表的 OID 转换成 regclass,也很适合用来以符号形式显示数值 OID。
表 8.26. 对象标识符类型
| 名字 | 参考资料 | 说明 | 示例值 |
|---|---|---|---|
oid |
任意 | 数字形式的对象标识符 | 564182 |
regclass |
pg_class |
关系名称 | pg_type |
regcollation |
pg_collation |
排序规则名称 | "POSIX" |
regconfig |
pg_ts_config |
文本检索配置 | english |
regdictionary |
pg_ts_dict |
文本检索词典 | 简单 |
regnamespace |
pg_namespace |
命名空间名称 | pg_catalog |
regoper |
pg_operator |
操作符名称 | + |
regoperator |
pg_operator |
带参数类型的操作符 | *(integer,integer) 或 -(NONE,integer) |
regproc |
pg_proc |
函数名称 | sum |
regprocedure |
pg_proc |
带参数类型的函数 | sum(int4) |
regrole |
pg_authid |
角色名 | smithee |
regtype |
pg_type |
数据类型名称 | integer |
所有按命名空间分组的对象对应的 OID 别名类型,都接受模式限定名称;如果某对象在当前搜索路径下未经限定就无法找到,则其输出也会显示为模式限定名称。例如,myschema.mytable 可作为 regclass 的输入(前提是确有此表)。该值输出时可能是 myschema.mytable,也可能只是 mytable,具体取决于当前搜索路径。regproc 和 regoper 只接受唯一(未重载)的输入名称,因此用途有限;多数情况下,regprocedure 或 regoperator 更合适。对于 regoperator,可以通过在未使用的操作数位置写入 NONE 来表示一元操作符。
这些类型的输入函数允许在各个词元之间插入空白,并且会把大写字母折叠为小写,双引号内除外;这样做是为了让语法规则更接近 SQL 中书写对象名的方式。反过来,如果需要让输出成为有效的 SQL 标识符,输出函数会自动加上双引号。例如,一个名为 Foo(大写 F)且带两个整数参数的函数,其 OID 可以写成 ' "Foo" ( int, integer ) '::regprocedure。输出则会是 "Foo"(integer,integer)。函数名和参数类型名也都可以带模式限定。
许多内置的 PostgreSQL 函数接受表的 OID 或其他数据库对象的 OID。为了方便,这些函数会被声明为接受 regclass(或相应的 OID 别名类型)参数。这意味着你不必手工查找对象的 OID,只需把对象名写成字符串字面值即可。例如,nextval(regclass) 函数接受一个序列关系的 OID,因此可以这样调用:
nextval('foo') operates on sequence foo
nextval('FOO') same as above
nextval('"Foo"') operates on sequence Foo
nextval('myschema.foo') operates on myschema.foo
nextval('"myschema".foo') same as above
nextval('foo') searches search path for foo
注意
当你把这类函数的参数写成未经修饰的字符串字面值时,它会变成 regclass(或相应类型)的常量。由于这实际上只是一个 OID,所以即便对象后来被重命名、重新分配到其他模式等,它仍会持续指向最初识别到的对象。这种“早绑定”行为,通常很适合列默认值和视图中的对象引用。但有时你可能希望得到“后绑定”行为,也就是在运行时再解析对象引用。要实现后绑定,请强制把该常量存储为 text 常量,而不是 regclass:
nextval('foo'::text) foo is looked up at runtime
to_regclass() 及其同类函数也可用于执行运行时查找。参见表 9.76。
regclass 的另一个实际用途,是查找 information_schema 视图中列出的表的 OID,而这些视图本身并不直接提供此类 OID。例如,你可能想调用 pg_relation_size() 函数,而它需要表的 OID。综合上述规则,正确的写法是:
SELECT table_schema, table_name,
pg_relation_size((quote_ident(table_schema) || '.' ||
quote_ident(table_name))::regclass)
FROM information_schema.tables
WHERE ...
quote_ident() 函数会在需要时为标识符添加双引号。看起来似乎更简单的写法
SELECT pg_relation_size(table_name) FROM information_schema.tables WHERE ...
并不推荐,因为对于搜索路径之外的表,或者名字需要加引号的表,它都会失败。
大多数 OID 别名类型还有一个附加特性,就是会创建依赖关系。如果这些类型的常量出现在存储的表达式中(例如列默认表达式或视图),它就会对被引用对象建立依赖。例如,如果某列的默认表达式是 nextval('my_seq'::regclass),PostgreSQL 就会知道该默认表达式依赖于序列 my_seq,因此系统不允许在尚未移除该默认表达式时删除序列。改用 nextval('my_seq'::text) 则不会建立依赖。(regrole 是这一特性的例外:该类型的常量不允许出现在存储表达式中。)
系统使用的另一种标识符类型是 xid,即事务(缩写为 xact)标识符。系统列 xmin 和 xmax 使用这种数据类型。事务标识符是 32 位数值。在某些场景中,使用其 64 位变体 xid8。与 xid 值不同,xid8 值严格单调递增,且在数据库集群的整个生命周期内不会被重用。详见第 67.1 节。
系统使用的第三种标识符类型是 cid,也就是命令标识符。这是系统列 cmin 和 cmax 的数据类型。命令标识符同样是 32 位量。
系统使用的最后一种标识符类型是 tid,也就是元组标识符(行标识符)。这是系统列 ctid 的数据类型。一个元组 ID 是一对值(块号、块内元组索引),用来标识该行在其所属表中的物理位置。
(系统列的更多说明见第 5.6 节。)
系统目录属性
此构建的源码初始化值。字段含义参见 pg_type 。包含头文件默认值;依赖构建的常量保留符号形式,不作为服务器运行时实测。
oid2203descrregistered operatortypacl_null_typlen4typelem0typnameregopertypsendregopersendtyptypebtypalignityparray0typbyvalttypdelim','typinputregoperintypmodin-typndims0typownerPOSTGREStyprelid0typmodout-typoutputregoperouttyptypmod-1typanalyze-typdefault_null_typnotnullftypreceiveregoperrecvtypstorageptypbasetype0typcategoryNtypcollation0typisdefinedttypnamespacepg_catalogtypsubscript-typdefaultbin_null_array_type_oid2208typispreferredfarray_type_name_regoper
类型转换 9
与此类型相关的显式 pg_cast 记录。PostgreSQL 还支持 pg_cast 之外的类型转换,缺少记录不能证明转换不可能。
版本比较
PostgreSQL 17.11 → 18.6。属性比较不包含构建标识和说明正文;原始目录字段与源描述保留原文。
这两个样本的系统目录和结构化属性没有变化。
这些构建的文档也有差异,请查看对应版本的手册定义。
文档与源码
- 构建
- 18.6 · https://ftp.postgresql.org/pub/source/v18.6/postgresql-18.6.tar.bz2
- 指纹
555610c24d53e4316da5b7d3fc25c279d96856d5e0e23ee308c328c5fa881d9f
相关条目
全部数据类型 · 下载此版本 JSON · 最早收录的样本不代表该类型的实际引入版本。