pg中domain是个可以包含约束条件的自定义类型,具体使用规则可参考官网案例:
CREATE DOMAIN us_postal_code AS TEXT
CHECK(
VALUE ~ '^\d{5}$'
OR VALUE ~ '^\d{5}-\d{4}$'
);
CREATE TABLE us_snail_addy (
address_id SERIAL PRIMARY KEY,
street1 TEXT NOT NULL,
street2 TEXT,
street3 TEXT,
city TEXT NOT NULL,
postal us_postal_code NOT NULL
);
现通过create domain myint int;这个最简单的案例来创建一个新的domain,入口函数是DefineDomain,调用逻辑如下
DefineDomain(create domain myint int;)
QualifiedNameGetCreationNamespace 获取创建domain的命名空间(public)
GetSysCacheOid2 检查pg_type中是否已经存在相同名称的type,domain本质上就是一个type
typenameType 获取domain的基础类型,这里是基于int创建myint,所以基类型是int。返回的是pg_type的一条记录
TypeCreate 创建myint类型
为pg_type表的每个字段构建nulls/values数组
heap_form_tuple 生成pg_type表的一条待插入记录
CatalogTupleInsert 往pg_type插入一条记录
TypeCreate 创建_myint类型,_myint是myint的数组类型
从创建domain的函数分析可以得到,一个domain在底层实际就是一个type。此外,当创建一个type xxx时,pg还会默认为其创建一个元素类型为xxx的数组的type。