エクゼキュータ。ネストループ結合(Nested Loop Join)
ネストループ結合はExecNestLoop()で実行される。
TupleTableSlot * ExecNestLoop(NestLoopState *node)
気づいたこと書いてみる(順番は関係ない)。
- outerとinnerをスキャンして比較項目が合致したらそれをTupleTableSlotとして返す。
- 返すのは1件だけ。(呼び出し元で1件ずつ処理するので。outerがNULLを返すまでこの関数は何度でも呼ばれる。)
ExecNestLoop()では内側のループしかない。外側のループは呼び出し元になるのだと思う。例えばExecNestLoop()のループとか。innerがNULLを返したらExecNestLoop()のループを抜けずに次のouterを読んでた。- 1つのouterのタプルにつきinnerをNULLが返されるまで何度もスキャンする。
- 内部結合のときはinnerがNULLを返したら次のouterを読もうとするが、外部結合のときは処理をつづける。
- outerをスキャンした後、innerを先頭からスキャンする前にExecReScan()を呼ぶ。ReはResetのReらしい。innerのスキャン結果を保持するところなどを初期化しているよう。
- 射影をしてから返す。
- 結合の比較は演算子に対応する関数(int4eq()など)で行われる。
- outerやinnerのタプルはExprContextというstructに保持される。ExprContextはExecReScan()やExecQual()の関数に渡される。