これは、関数の挿入であるheapam_tuple_insert完成。
1、タプル値のスロットから除去された最初のニーズ、HeapTupleTableSlot.tuple
2、OID挿入される記録テーブルから得られた関係:relation-> rd_id、及びスロット - > tts_tableOidとtuple-> t_tableOid更新OID用
3、タプルはヒープのページを挿入heap_insertを呼び出して、このプロセスは、WALバッファに書き込みWALログを生成します。
1)トランザクションIDを生成する:XID
2)関数を呼び出すheap_prepare_insert:設定tup-> T_DATA t_infomaskとt_infomask2; tup-> t_data-> t_choice.t_heap.t_xmin XIDの。
(tup-> T_DATA) - > t_choice.t_heap.t_field3.t_cid为入参CID
(tup-> T_DATA) - > t_choice.t_heap.t_xmax为0
トランザクションIDを挿入することがxmin、xmaxは0
3)メモリにロードされ、データ・ページとデータページを満たすためにスペースを見つけるFSMからRelationGetBufferForTupleを呼び出し、ブロック番号は、バッファメモリブロックを返します
4)CheckForSerializableConflictIn分離レベルの処理
最後のページから5)のコールRelationPutHeapTupleと空きスロットにレコードを挿入します。空きスロットを見つけるために、どのように、完全なPageAddItemExtended。
6)この時間pd_flags&PD_ALL_VISIBLEでページ、すなわち、可視ページ内のすべてのレコードが、レコードが挿入されている今回場合、ラベルはクリアされる必要があります。
7)バッファは、その後のブラシ汚れたチェックポイントのために、ダーティ・ページをマークされています
8)生成WAL日志,并将WAL日志写入WAL BUFFER
9)将此时lsn写入页头pd_lsn
4、更新tuple->t_self为slot->tts_tid,即记录在页内位置。
如何在页内找一个free slot由函数PageAddItemExtended完成。
1、计算出pd_linp数组的最大值后新增一个后的个数:
limit=[pg_lower-sizeof(PageHeader)]/Sizeof(ItemIdData)+1
2、如果页头中pd_flags & PD_HAS_FREE_LINES为TRUE,即该数组中有free slot,那么首先从这个数组中找一个可用的ItemIdData,从pd_linp[0]开始一个一个的进行判断,一旦(itemId)->lp_flags == LP_UNUSED && (itemId)->lp_len != 0,表明这个slot可用,那么取这个offsetNumber返回
3、如果该页中没有free slot,则在pd_linp[limit-1]当前最后一个ItemIdData后面添加一个ItemIdData,设置该ItemIdData的值将其lp_off指向pd_upper位置并调整其lp_len=tuple->t_len,lp_flags = LP_NORMAL