浅析pg创建domain源码

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。

你可能感兴趣的:(数据库)