tupleのinsert/update/delete

・insertの処理
insertは,ExecProcNodeで新しいタプルを作成後,ExecInsertでタプルをinsertする。


ExecutePlan
ExecProcNode
ExecResult
ExecProject
ExecTargetList
ExecStoreTuple
ExecInsert
ExecConstraints
heap_insert
RelationGetBufferForTuple
RelationPutHeapTuple
XLogInsert

ExecTargetListのループで,ExecEvalExprが実行されタプルが作られる。
insertのvaluesに定数を指定した場合,ExecEvalExprでExecEvalConstが実行される。
ループが終わったら,heap_formtupleでHeapTupleに変換する。

ExecStoreTupleで,slotにtupleがセットされる。
ExecConstraintsで,contraintのチェックを行う。
heap_insertで,Oidを設定やHeapTupleHeader(Xmin, Cmin, Xmax, Cmax)を
設定する。

・updateの処理
updateは,ExecProcNodeで変更後のタプルを取得するような検索を実行後,
ExecUpdateで新しいタプルをinsertし,古いタプルをdeleteするような処理を行う。


ExecutePlan
ExecBSUpdateTriggers
ResetPerTupleExprContext
ExecProcNode
ExecSeqScan
ExecScan
ResetExprContext
ExecQual
ExecProject
ExecTargetList
ExecEvalExpr(ExecEvalVar/ExecEvalConst)
ExecGetJunkAttribute
ExecRemoveJunk
ExecUpdate
heap_update
ExecARUpdateTriggers
ExecASUpdateTriggers

ExecScanでtableをスキャンし,ExecQualで検索条件に一致したら,ExecProjectで
新しいタプルを作成する。(このタプルにはctidのカラムがある)
ExecProjectではExecTargetListで新しいタプルを作る。ExecTargetListでは,
変更しないカラムは,ExecEvalVarで取得する。変更するカラムは定数だったら
ExecEvalConstで取得する。
ExecScanから戻されるタプルは,変更後のタプルになる。

ExecGetJunkAttributeで,タプルのctidカラムを取得する。
ctidはExecutePlanのローカル変数にコピーしている。(このタプルは,後続の
ExecStoreTupleの実行で,メモリが開放されるから)
ExecRemoveJunkで,ctidを削除したタプルを作成して,ExecStoreTupleでslotに
セットする。

・deleteの処理
deleteは,ExecProcNodeで削除するタプルを取得後,ExecDeleteで削除する。
ExecProcNodeで取得するタプルのカラムはctidのみ。


ExecutePlan
ExecBSDeleteTriggers
ResetPerTupleExprContext
ExecProcNode
ExecSeqScan
ExecScan
ExecProject
ExecTargetList
ExecStoreTuple
ExecGetJunkAttribute
ExecRemoveJunk
ExecStoreTuple
ExecDelete
heap_delete
ExecARDeleteTriggers
ExecASDeleteTriggers