浅析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。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值