PostgreSQL源码解读(2)——插入数据# 2 (RelationPutHeapTuple)

  

本文简单介绍了PG插入数据部分的源码,主要内容包括RelationPutHeapTuple函数的实现逻辑。

  

一、数据结构/宏定义/通用函数

  

RelationPutHeapTuple函数在hio.c文件中,相关的数据结构,宏定义如下:

  
 <代码> 1,关系
  数据表数据结构封装
  typedef struct RelationData
  {
  RelFileNode rd_node;*//*关系的物理标识符/*使用“结构”来避免需要包括smgr。h: */struct SMgrRelationData * rd_smgr;/*缓存文件句柄,或者零*/int rd_refcnt;/* */引用计数
  BackendId rd_backend;/*拥有后端id,如果临时关系*/bool rd_islocaltemp;/* rel是这次会议的临时rel */bool rd_isnailed;*//* rel钉在缓存
  bool rd_isvalid;有效*//* relcache条目
  char rd_indexvalid;/* rd_indexlist状态:0=无效,1=*有效,2=暂时迫使*/bool rd_statvalid;/* rd_statlist有效吗?*//*
  * rd_createSubid rel子事务最高的ID
  *幸存到;或零如果rel没有创建在当前
  *事务。这可以依赖,而在此之前,它可以
  *被“遗忘”在早期版本。同样,rd_newRelfilenodeSubid
  *最高的子事务ID relfilenode变化
  *幸存下来,或零如果没有改变在当前事务(或我们
  *忘记了改变它)。rd_newRelfilenodeSubid可以被遗忘
  *当一个关系有多个新relfilenodes在单一
  *交易,其中一个发生在随后中止
  *子事务,例如开始;截断t;保存点保存;截断t;
  *滚到保存;——rd_newRelfilenode现在忘记了
  */SubTransactionId rd_createSubid;/*当前xact rel成立于*/SubTransactionId rd_newRelfilenodeSubid;/*新relfilenode分配
  当前xact */*
  
  Form_pg_class rd_rel;/*关系元组*/TupleDesc rd_att;*//*元组描述符
  Oid rd_id;*//*关系的对象id
  LockInfoData rd_lockInfo;/* */锁下的信息锁定关系
  RuleLock * rd_rules;/* */重写规则
  MemoryContext rd_rulescxt;/*私有内存cxt rd_rules,如果任何*/TriggerDesc * trigdesc;/*触发信息,或NULL如果rel没有*//*使用“结构”来避免需要包括rowsecurity。h: */struct RowSecurityDesc * rd_rsdesc;/*行安全政策,或零*//*数据由RelationGetFKeyList: */* rd_fkeylist列表;/* ForeignKeyCacheInfo列表(见下文)*/bool rd_fkeyvalid;/*如果列表计算*/MemoryContext rd_partkeycxt;/*私有内存cxt低于*/struct PartitionKeyData * rd_partkey;/*分区键,或零*/MemoryContext rd_pdcxt;为partdesc *//*私人上下文
  struct PartitionDescData * rd_partdesc;/*分区,或零*/* rd_partcheck列表;检查一些这样*//*分区/*数据由RelationGetIndexList: */* rd_indexlist列表;/* oid列表的索引关系*/Oid rd_oidindex;/* OID OID的惟一索引,如果任何*/Oid rd_pkindex;/* OID的主键,如果任何*/Oid rd_replidindex;/* OID复制品身份的索引,如果任何*//*数据由RelationGetStatExtList: */* rd_statlist列表;/* oid的扩展列表统计*//*数据由RelationGetIndexAttrBitmap: */Bitmapset * rd_indexattr;*//*列用于non-projection索引
  Bitmapset * rd_projindexattr;*//*列投影中使用索引
  Bitmapset * rd_keyattr;/*关口,裁判会通过外键*/Bitmapset * rd_pkattr;/*关口包含在主键*/Bitmapset * rd_idattr;/*包括在副本身份指数*/Bitmapset * rd_projidx;*//* oid投影的索引
  
  PublicationActions * rd_pubactions;/* */出版行为/*
  * rd_options设置每当rd_rel加载到relcache条目。
  *请注意,你不能看着rd_rel这个数据。零意味着“使用
  *违约”。
  */bytea * rd_options;/* pg_class进行解析。reloptions *//*这是只非空的指数关系:*/Form_pg_index rd_index;/* pg_index元组描述这个索引*//*使用“结构”来避免需要包括htup。h: */struct HeapTupleData * rd_indextuple;/* pg_index元组*//*
  *索引访问支持信息(仅用于索引的关系)
  *
  *注意:只缓存,每个opclass的默认支持效果
  *那些lefttype righttype等于opclass opcintype。的
  *支持函数数字索引数组,它是一个足够了
  鉴于限制*标识符。
  *
  *注:rd_amcache可供指数AMs私人数据缓存
  *一个索引。这一定是只是一个缓存,因为它可能会在任何时间重置
  *(特别是,它将被relcache重置inval消息
  *指数)。如果使用,它必须指向一个内存块palloc会
  * rd_indexcxt。relcache重置将包括块和释放
  *设置rd_amcache=NULL。
  */Oid rd_amhandler;/* OID的指数是处理函数*/null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null

PostgreSQL源码解读(2)——插入数据# 2 (RelationPutHeapTuple)