エクゼキュータ。ネストループ結合(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()の関数に渡される。