赞
踩
+---------------------+---------------+----------------+
| HeapTupleHeaderData | nulls bitmap | padding |
+------------+--------+---------------+----------------+
| object ID | value1 value2 value3 ... |
+------------+-----------------------------------------+
(1) HeapTupleHeaderData
(2)nulls bitmap
这是个可选项,当t_infomask有HEAP_HASNULL标志的话,这个数组就会有值
(3) padding
前面null bitmap的长度不确定,为了后面数据能对齐,这里对HeapTupleHeaderData+nulls bitmap 字节对齐,这里会有留空。
(4) OID值,这是个可选项,当t_infomask有HEAP_HASOID_OLD时,会有此值
(5)用户数据,就是各列的数据;
主要函数为如下五个:
step1. ExecInsert
step2. ExecMaterializeSlot
step3. ExecCopySlotTuple——拼装入口
step4. heap_form_tuple——根据values和isnull拼装tuple
step5. heap_fill_tuple——根据desc把数据填到正确的位置
执行器会把tuple包装成tuple table slot来处理,相当于给HeapTuple包装了一层:TupleTableSlots
代码里会见到很多tts = TupleTableSlots,结构如下:
typedef struct TupleTableSlot { NodeTag type; bool tts_isempty; /* true = slot is empty */ bool tts_shouldFree; /* should pfree tts_tuple? */ bool tts_shouldFreeMin; /* should pfree tts_mintuple? */ bool tts_slow; /* saved state for slot_deform_tuple */ HeapTuple tts_tuple; /* physical tuple, or NULL if virtual */ TupleDesc tts_tupleDescriptor; /* slot's tuple descriptor */ MemoryContext tts_mcxt; /* slot itself is in this context */ Buffer tts_buffer; /* tuple's buffer, or InvalidBuffer */ int tts_nvalid; /* # of valid values in tts_values */ Datum *tts_values; /* current per-attribute values */ bool *tts_isnull; /* current per-attribute isnull flags */ MinimalTuple tts_mintuple; /* minimal tuple, or NULL if none */ HeapTupleData tts_minhdr; /* workspace for minimal-tuple-only case */ long tts_off; /* saved state for slot_deform_tuple */ } TupleTableSlot;
于普通tuple来说,ExecInsert的第一件事就是“物化”Tuple Slot:
【slot】 ----组装----> 【materialized slot】
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。